Forum: OnBoard Diagnose (OBD) Téma: Projekt: OBD direkt im FIS / MFA anzeigen (nur VAG 3LB) --------------------------------------------------------------- ZZottel: Wäre es nicht cool, während der Fahrt ein paar OBD-Messwertblöcke im Blick zu haben? Warum kann man sich sowas nicht auf seinem Kombiinstrument anzeigen lassen, wenn sich dort doch schon ein Display (FIS oder MFA genannt) befindet? Kurze Antwort: Wenn man will, geht das. Als nächste "Evolutionsstufe" von meinem Bastelprojekt "FIS-Control" (siehe auch http://www.car-pc.info/phpBB2/viewtopic.php?t=22735 und meine Homepage), möchte ich jetzt das Auslesen von Messwertblöcken per OBD einbauen. Als Proof-of-Concept kann ich mir schonmal die Initialisierung der KWP1281-Verbindung auf meinem FIS ansehen. Das sieht zwar erstmal unspektakulär aus, wer sich mit dem Thema aber schon etwas beschäftigt hat weiß, dass die größten Hürden damit schon überwunden sind... MillenChi: hyper... gleich mal abonieren!! wenn du nen tester brauchst, sag bescheid!! Torro: Also ich würde auch einiges tun, damit mein Display in der Mitte mehr anzeigt...Brauchst du Hilfe, vorausgesetzt ich kann es, las es mich wissen. Christoph1: Jo istecht ne coole Idee, vom R32-club.de hat jemand so ne MFA Anzeige gebastelt. Bei Kufatec gibts sowas auch, aber mit externen Sensoren. Aber beim Golf läuft das ja über CAN oder ? Hier mal nen Bild http://www.r32-club.de/galerie/albums/userpics/11982/CIMG4003.jpg Falls du nen Tester brauchst einfach melden:) ZZottel: Bin wieder einen Schritt weiter. Jetzt kann ich mir schon die Geräteidentifikation anzeigen lassen (hier am Beispiel von meinem Kombiinstrument). Die OBD-Schnittstelle ist echt pingelig was Timing angeht. Ich hatte auf meinem ATmega32 einen Timer-Interrupt konfiguriert, der alle halbe Sekunde eine Variable setzt. Allein das hat gereicht, damit ich öfter Verbindungsabbrüche hatte. ZZottel: Messwertblöcke gehen jetzt auch. Fehlt eigentlich nur noch Fehlerspeicher anzeigen/löschen. Am meisten Arbeit dürfte noch das Gestalten einer ordentlichen Menüführung sein. Plan ist, jede der acht Textzeilen konfigurierbar zu machen. Ich will also wählen können, welcher Messwert aus welcher Gruppe in einer Zeile angezeigt wird, oder ob dort ein statischer Text stehen soll. Im Bild ist der MWB 2 von meinem Kombi zu sehen. Bitte nicht über die "seltsamen" Werte wundern. Das Kombi ist nicht im Fahrzeug verbaut, daher sind praktisch alle Sensorwerte unrealistisch. MillenChi: Klasse!! Wie siehts mit Ladedruck und Öltemp aus?? Ich hab im FIS ja auch nur noch die oberste Zelle frei. Klappt das dann auch? Christoph1: Kommt drauf an obs über die OBD ausgeben wird. Bei meinem A3 1,8T (bj10/2000) wird beides noch nicht über die OBD ausgegeben Cupra-driver: Ladedruck wäre eh über OBD schwachsinnig, weil es glaub ich nur jede Sekunde aktualisiert wird. Der richtige Ansatz wäre ein eigener Drucksensor (elektr) in Verbindung mit nem Microcontroller.. MillenChi: nur 1x pro Sek is echt blöd. Na gut, damit isses dann egal. Dann halt doch Phidgets ;) ZZottel: Ich weiß nicht, wie oft pro Sekunde die Steuergeräte ihre Messwerte aktualisieren. Ich kann mir durchaus vorstellen, dass es da auch Unterschiede je nach STG und betrachtetem Wert gibt. Mit meinem FIS-Control lese ich aktuell 3x pro Sekunde neue Werte vom Steuergerät ein. Die maximale theoretische Aktualisierungsrate ist schon durch das KW1281-Protokoll bedingt. Typische Baudrate ist z.B. 9600 oder 10400. Effektive Bitrate ist etwas niedriger da Startbit, Stoppbit und Paritätsbit keine Nutzdaten sind. Dann kommt noch dazu, dass die Kommunikation zwischen Controller und STG auf einer Leitung bidirektional läuft. Sender und Empfänger tauschen also ständig ihre Rolle. Bei jedem Wechsel wird eine "Interbyte Pause" eingefügt. Die kann zwar je nach STG fast 0 sein, liegt aber üblicherweise zwischen 2 und 5 ms. Manche STGs scheinen gar nur in einem 10ms-Raster zu senden (Quelle: http://www.freediag.org/opendiag/1651.html). Mit diesen ganzen Annahmen komme ich in die Gegend von 5 Aktualisierung eines MWBs pro Sekunde. Für das FIS-Control kommt noch dazu, dass ich ja auch das Display im Kombiinstrument entsprechend häufig aktualisieren muss. Da das Display (zumindest meines) relativ träge ist, also die Pixel recht lange nachleuchten ist eine Ansteuerung mit mehr als 3 Hz nicht sinnvoll. @MillenChi: Ich fahre selbst einen Turbo... es geht nix über eine analoge Anzeige des Ladedrucks. Da ist die Zeigerposition nämlich schön synchron mit den Mundwinkeln. ZZottel: Die erste Software für mein "FIS-Control OBD" ist jetzt fertig... es sind zwar noch nicht alle Funktionen drin, die ich geplant habe. Aber zumindest einen beliebigen MWB kann man sich schonmal im FIS anzeigen lassen (kurzen Video-Clip gibt es auf meiner Homepage). Wer das "FIS-Control OBD" testen will meldet sich bei mir. Idealerweise sollte schon das normale "FIS-Control" aufgebaut sein und funktionieren. Außerdem braucht man noch ein K-Line-Interface, z.B. das von Blafusel: http://www.blafusel.de/obd/obd2_kw-interf.html Das Interface besteht im Wesentlichen aus einem MAX232 und einem MC33290. Wer den MC33290 direkt auf die FIS-Control-Platine integriert, spart sich aber beide MAX232-Pegelwandler. Wenn jemand Lust hat, kann er mein Eagle-Layout vom FIS-Control entsprechend für OBD anpassen. Würde mich freuen, wenn mir jemand diese Arbeit abnimmt... Edit: Link repariert Torro: Ich bin dabei...normales "FIS-Control" vorhanden. Dein Link zu Blafusel geht bei mir nicht. Wie siehts bei anderen aus ? MfG Christoph1: http://www.blafusel.de/bilder/obd2/kw1281_sch.png Wo hast die K-Line abgegriffen ? Direkt an der Diagnose Buchse ? Wenn du mir sagst wo du Rx Tx für die OBD Schaltung angeschlossen hast (am Atmega) Dann würd ich mal versuchen das Layout anzupassen. Den MC33290 gibts wohl nur als SMD Version oder ? gruß Christoph ZZottel: @Christoph1: Ja, K-Line habe ich mir im Auto von der Diagnose-Buchse geholt. Am Schreibtisch hole ich mir die K-Line natürlich direkt vom KI. RX vom MC33290 (Pin 6) kommt an RX vom ATmega (Pin 14). TX vom MC33290 (Pin 5) kommt an TX vom ATmega (Pin 15). Habe den MC33290 bisher auch nur als SMD-Version gesehen. ZZottel: Software ist jetzt soweit fertig. Eine Option zum Fehlerspeicher auslesen baue ich vielleicht noch rein. Einen Videoclip von dem "FIS-Control OBD" in Aktion gibt es hier: http://zzottel.de/joomla/index.php/car/fis-control-obd Das abgeänderte Platinenlayout ist auch fertig. ZZottel: Tester gesucht! Das FIS-Control OBD ist fertig und läuft bei mir schonmal prächtig. Jetzt suche ich noch Tester, die die Schaltung bei sich ausprobieren wollen. Ich habe eine fertig aufgebaute Platine hier, die ich dazu bereitstellen würde. Voraussetzungen: Einen Audi oder VW mit "großem" Bordcomputer. Das Display im Kombiinstrument muss per 3-Leiter-Bus ansteuerbar sein, außerdem muss der Tacho auf das Ausstattunsgmerkmal "Navigation" codiert sein. Bitte meldet euch nur, wenn ihr euch zutraut Spannungsversorgung, 3-Leiter-Bus und die OBD-Leitung im Fahrzeug abzugreifen und entsprechende Kabel zur FIS-Control-Platine zu verlegen. Torro: Ich würde die Software testen, die Schaltung ist vorhanden,muß nur noch den MC33290 besorgen und einlöten, brauche deine also nicht Vw Golf mit FIS 1J5 920 846 A mit Navi vorhanden. Wo kriegeich den MC33290 auf die schnelle her... Torro mikado: Würd gern testen. Bei mir läuft nur schon alles über CAN. Aber wenn du in die Richtung mal was machst bin ich dabei. ZZottel: @torro: Welche Schaltung hast du? Die alte FIS-Control-Schaltung, oder schon die neue FIS-Control OBD? Den MC33290 habe ich mir von Blafusel bestellt. @mikado: Solange wie ich kein Auto mit CAN habe, wird da von mir nix kommen. Welches Auto hast du denn? mikado: Fahr im mom nen A3 2.0TDI Modell 2004 Torro: Nein ich habe mir noch die Platine mit FIS-Controll damals bestellt und auch fertig bestückt...zum Glück alles mit Fassung. Habe schon beide Layouts verglichen,ein Umbau auf Mc33299 ist problemlos möglich(eventuell sogar mit Adapterplatine, um beide Schaltkreise nutzen zu können) edit Habe mir eben fix den Chip bei Herrn Schäfer bestellt. MfG ZZottel: @mikado: Beim Audi A3 8P gibt es keinen 3LB mehr fürs Kombi. Ohne CAN geht also tatsächlich nix. @Torro: Ich habe bis vor kurzem ja auch alles mit dem "original" FIS-Control gemacht. Dazu hatte ich einfach das serielle K-Line-Interface (http://blafusel.de/obd/obd2_kw-interf.html) vom Blafusel an den UART-Anschluss gehängt. Pegelwandlung von TTL auf RS-232 und zurück ist zwar doppelt gemoppelt, aber gehen tut das ohne Probleme. @alle: Wer schon ein normales FIS-Control aufgebaut hat, kann das mit einem seriellen OBD-Interface zu einem "FIS-Control OBD" upgraden. Torro: Genau darauf bin ich noch gar nicht gekommen. Ein serielles Interface von Blafusel habe ich auch noch irgendwo liegen.Naja der Chip ist bestellt,dann wird wieder gebastelt. Kannst du mir den OBD-Controll Code mal schicken ? ZZottel: @Torro: Hast ne PN. ZZottel: Update: Mittlerweile geht aus das Auslesen des Fehlerspeichers von den Steuergeräten. Allerdings muss für die neue Software der ATMega32 auf der FIS-Control-OBD-Platine gegen einen ATMega644P ausgetauscht werden (auf 32K konnte ich das nicht mehr eindampfen). Torro: Habe mich mal auf die Suche nach einem Atmega644P gemacht...Da ich sowieso noch Bauteile bestellen wollte,kann ich mir ja gleich einen mitbestellen. :D Bei Reichelt habe ich folgendes gefunden Atmega 644-20PU zum Preis von 5,55 Euro. Flash Memory 64kb EEprom 2kb Ram 4kb Ist das der Richtige ? Ein schönes Wochenende noch. Torro ZZottel: Nein, der ATMEGA 644P-20PU ist der richtige. Der ist sogar noch ein paar Cent günstiger :-) Torro: Hm den scheint es bei Reichelt garnicht zu geben.Hast du noch andere Bezugsquellen ? Danke ZZottel: Doch, den gibt es bei Reichelt. Bestellnummer ist "ATMEGA 644P-20PU". Slavi: http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=A363;GROUPID=2959;ARTICLE=88482 Torro: Gut Danke habe ihn zwischenzeitlich schon gefunden... Christoph1: Weiss jemand wo ich die MFA Tasten abgreifen kann ? Sind die irgendwo gesteckt? Hab nen A3 8L Slavi: na wenst das raus gefunden hast kriegst von mir ne Medaille Ich schaffe es am Passat nicht Christoph1: hehe hab selber was gefunden geht wohl direkt aufs Kombiinstrument... http://www.passatplus.de/umbauten/kombiinstrument/mfa-kabel.htm Torro: Ja ist richtig die sind genau am Kombi zu finden Christoph1: Hmm ok wollt das ganze eigentlich steckbar machen ohne irgendwas was zu löten oder so *g* Mal schaun vielleicht kommt man auch einfach an den stecker am lenkrad ZZottel: Kennt ihr das auch? Da baut man sich extra einen CarPC ins Auto, nur um unterwegs Tetris zocken zu können... aber das muss nicht sein: Mit FIS-TRIS. (Nein, leider ist das ganze momentan noch nicht spielbar) swf2001: LOL. Zu geil! Wenn das noch spielbar wäre... :-) (dann würde ich mich beim Autofahren wohl zu oft ablenken lassen... ;)) W201: Hallo, @ZZottel Ich hätte demnächst Interesse und hätte noch ein paar fragen. Fahre einen A8 D2 Mit Naviplus,CD-Wechsler,TMC usw.Habe vor demnächst einen CAR-PC einzupflanzen mit Radio empfang mit dem umgebauten Traffic Ford Radio. Werden die Navi pfeile wie gehabt angezeigt(wie im Naviplus),werden auch die Radio sender,CD Tracks und das FIS weiterhin angezeigt wie gehabt. Und zusätzlich mit einer OBD-SW einige MWB. Habe ich das richtig verstanden. Mfg ZZottel: @W201: Ohne das "Navi plus" wirst du keine Navipfeile im FIS mehr haben, weil dein CarPC vermutlich weder 3-Leiter-Bus noch CAN-Bus hat. Das gleiche gilt für die Radiosender-Anzeige. Da ließe sich aber eventuell noch was basteln, da man dem FIS-Control die Radiosender auch per serieller Schnittstelle schicken kann. W201: ZZottel hat folgendes geschrieben: @W201: Ohne das "Navi plus" wirst du keine Navipfeile im FIS mehr haben, weil dein CarPC vermutlich weder 3-Leiter-Bus noch CAN-Bus hat. Woher weißt du das?? Hallo, @ZZottel, in meinem Beitrag oben habe ich doch schon erwähnt das ich TMC usw.habe. Mein Fahrzeug ist von 2002 und hat CAN-BUS. Mfg ZZottel: @W201: Ich hatte dich so verstanden, dass du das "Navi plus" durch einen CarPC ersetzen willst. Bisher sendet das "Navi plus" die Abbiegepfeile an das FIS-Display. W201: ZZottel hat folgendes geschrieben: @W201: Ich hatte dich so verstanden, dass du das "Navi plus" durch einen CarPC ersetzen willst. Bisher sendet das "Navi plus" die Abbiegepfeile an das FIS-Display. Hallo, @ZZottel, doch du hast richtig verstanden. Ich möchte das NaviPlus austauschen gegen einen CarPC. Und würde dein FIS-CONTROL evtl.kaufen. Meine Frage war eigentlich,ob man mit dem FIS-CONTROL die Pfeile,FIS,Lenkradbedienung,CDtracks und die Radioanzeige beibehalten könnte. Und dazu noch einige MWB von dem jeweiligen Steuergeräten mit OBD. Geht das mit dem FIS-Control. Mfg ZZottel: @W201 Für dein Vorhaben ist das FIS-Control nicht geeignet. Vor allem fehlt dir auch die passende Software auf deinem CarPC. Du müsstest die Navi-Software und den Media-Player anzapfen, um an die entsprechenden Daten zu kommen. Und danach müssten die Daten noch passend für die Anzeige im FIS-Display aufbereitet werden. Als Diagnose-Interface könntest du das FIS-Control zwar schon benutzen. Aber für diesen Zweck gibt es günstigere Lösungen. W201: Hallo, @ZZottel Was kann man da machen damit über Carpc die gleichen Funktionen wie im NaviPlus angezeogt bekommen. Für Tipps oder Unterstürtzung würde ich mich freuen. Mfg ZZottel: @W201 Fertige Lösungen dafür kenne ich nicht. Selbermachen ist für einen allein sicherlich zu zeitaufwändig. Sascha1271991: Hi, du wirst mir wahrscheinlich nicht verraten, wie das 3LB Protocoll funktioniert oder? :) Bin zwar auf einige Informationen wie FIS Fool gestoßen, aber die Seiten existieren schon gar nicht mehr, sodass ich auch keinen Quellcode für Projekte gefunden habe. Würde halt gern die oberen zwei Zeilen ansteuern können und wenns geht auch das ganze Display Pixel für Pixel. Hab auch erfahrung mit C und dem programmieren von Atmegas. Hab auch bereits Grafikdisplays angesteuert. Nur zu dem 3LB find ich halt quasi nichts. Hab auch leider kein Navi da was 3LB unterstützt, sonst würd ich den Datenverkehr einfach mitloggen. Mit freundlichem Gruß Sascha vegfokic: Hi Anybody has the basic source code for atmega to use the first two line of the FIS display? I have a Passat B5.5 cluster and I want to show some text on it via enable, data, clock wires. ZZottel: I posted some BASCOM source code for this here: http://www.car-pc.info/phpBB2/viewtopic.php?p=267222#267222 I also did an improved code for the ATMEGA in C: http://nefariousmotorsports.com/forum/index.php?PHPSESSID=qm6gkicd2i06hihs87pq9n4q03&topic=8787.msg78125#msg78125 vegfokic: @ZZottel I tried the bascom code in your first link but nothing happened. I dont know where is the problem. The upper part of the FIS display is still blank. My cluster coding begin with 21 this consist of the+16 navigation, I think it has to be set if I want that the cluster would be able to get the messages via 3LB. I use atmega8 running at 8Mhz internal frequency supplied at 5V. The atmega pins are a little bit different than in your code. I connected the FIS clock to PD2, FIS data to PD3, FIS en to PD4 and they are also modified in the first part of bascom code. May I do something wrong? The second link source code also running on atmega8 but also nothing happened. I can not send text or caracter to the cluster via serial.only some caracter come off from the atmega to the PC in terminal windows. ZZottel: The coding is not correct. The example uses the "Radio protocol" not the "Navigation protocol". Don't set the coding to +16. The source code I have posted in the other forum does not use the UART. I post it here again. Beacuse you are using ATMEGA8 with different clock, you will have to change the Timers. Code: /*  * Program: avr_to_fis  * Target: ATMega32 @ 11.0592 MHz  * IDE: WinAVR-20100110  * Compiler: avr-gcc (WinAVR 20100110) 4.3.3  * Author: Stefan Bieger  * Website: www.fis-control.de  * Date: 2015-07-26  */ #include <avr> #include <avr> #include <avr> #include <util> #include <string> #define CLK 0x20 // Portd.5 #define DAT 0x10 // Portd.4 #define ENA 0x08 // Portd.3 char string[17] = {0}; uint8_t update = 0; void init_gpio(void) {    PORTD = CLK | DAT;    DDRD = CLK | DAT | ENA; // ENA is really unidirectional in radio mode (not like the 3LB for nav) } void init_timer(void) {    TCCR1B = (1<<WGM01) | (1<<CS10); // CTC mode, no prescaler    TIMSK = (1<<OCIE1A); // enable CTC interrupt    OCR1A = 0xFFFF; // initialize to some value } uint8_t calc_checksum(const uint8_t* const data) {    uint8_t i;    uint8_t checksum = 0xFF;    for (i=0; i<17; i++)    {       checksum -= data[i];    }    return (checksum); } void write_to_fis(const char* const text) {    update = 0;    strncpy(string, text, 16);    update = 1; } int main(void) {    wdt_disable();    init_gpio();    init_timer();    sei();    while (1)    {       write_to_fis("12345678ABCDEFGH");       _delay_ms(1000);       write_to_fis("HALLO   WELT");       _delay_ms(1000);    } } ISR(TIMER1_COMPA_vect) {    static uint8_t state = 0;    static uint8_t byte = 0;    static uint8_t bit = 0;    static uint8_t array[18] = {0};    switch (state)    {       case 0:          if (update)          {             update = 0;             array[0] = 0xF0;             memset(&array[1], 0x20, 16); // fill with blanks             memcpy(&array[1], string, strlen(string));             array[17] = calc_checksum(array);          }          if (array[0] == 0xF0)          {             PORTD = CLK | DAT | ENA; // ENA high             TCCR1B = (1<<WGM01) | (1<<CS10); // CTC mode, no prescaler             OCR1A = 1106 - 1; // next interrupt in 100 us             byte = 0;             bit = 7;             state = 1;          }          break;       case 1:          PORTD &= ~ENA; // ENA low          state = 2;          break;       case 2:          PORTD |= ENA;          OCR1A = 553 - 1; // next interrupt in 50 us          state = 3;          break;       case 3:          if (array[byte] & (1<<bit))          {             PORTD &= ~DAT;          }          else          {             PORTD |= DAT;          }          OCR1A = 365 - 1; // next interrupt in 33 us          state = 4;          break;       case 4:          PORTD &= ~CLK;          OCR1A = 730 - 1; // next interrupt in 66 us          state = 5;          break;       case 5:          PORTD |= CLK;          OCR1A = 365 - 1; // next interrupt in 33 us          if (bit)          {             bit--;             state = 3;          }          else if (byte < 17)          {             bit = 7;             byte++;             state = 3;          }          else          {             state = 6;          }          break;       case 6:          PORTD |= DAT;          OCR1A = 166 - 1; // next interrupt in 15 us          state = 7;          break;       case 7:          PORTD &= ~ENA; // ENA low          TCCR1B = (1<<WGM01) | (1<<CS12); // CTC mode, prescaler 256          OCR1A = 21600 - 1; // next interrupt in 500 ms          state = 0;          break;    } } vegfokic: Thanks for the code I modyfied the cluster coding and the bascom code works well :) After that I tried the C code with some modyfication to mach atmega8 but something wrong. In the interrupts value of OCR1A changed 11.0592/8=1,38 times smaller because I use 8Mhz instead of 11,05MHz. The problem is that the atmega8 dont has WGM01 than the atmega32 therefore I used WGM12 and WGM13 to CTC mode. I dont know whether it is good or not or any other problem there is. Code: #include <util> #include <avr> #include <avr> #include <string> #include <avr> #define CLK 0x02 // Portb.1 OC1A #define DAT 0x04 // Portb.2 OC1B #define ENA 0x20 // Portd.5 INT1 char string[17] = {0}; uint8_t update = 0; void init_gpio(void) { PORTB = CLK | DAT; DDRB = CLK | DAT; // ENA is really unidirectional in radio mode (not like the 3LB for nav) DDRD = ENA; // ENA is really unidirectional in radio mode (not like the 3LB for nav) } void init_timer(void) { TCCR1B = (1<<WGM12) | (1<<CS10) | (1<<WGM13); // CTC mode, no prescalerTCCR1B = (1<<WGM01) | (1<<CS10>1 mind kettőbe ctc mód TIMSK = (1<<OCIE1A); // enable CTC interrupt OCR1A = 0xFFFF; // initialize to some value } uint8_t calc_checksum(const uint8_t* const data) { uint8_t i; uint8_t checksum = 0xFF; for (i=0; i<17; i++) { checksum -= data[i]; } return (checksum); } void write_to_fis(const char* const text) { update = 0; strncpy(string, text, 16); update = 1; } int main(void) { wdt_disable(); init_gpio(); init_timer(); sei(); while (1) { write_to_fis("12345678ABCDEFGH"); _delay_ms(1000); write_to_fis("HALLO WELT"); _delay_ms(1000); } } ISR(TIMER1_COMPA_vect) { static uint8_t state = 0; static uint8_t byte = 0; static uint8_t bit = 0; static uint8_t array[18] = {0}; switch (state) { case 0: if (update) { update = 0; array[0] = 0xF0; memset(&array[1], 0x20, 16); // fill with blanks memcpy(&array[1], string, strlen(string)); array[17] = calc_checksum(array); } if (array[0] == 0xF0) { PORTB = CLK | DAT; // ENA high PORTD = ENA; // ENA high TCCR1B = (1<<WGM12) | (1<<CS10) | (1<<WGM13); // CTC mode, no prescaler OCR1A = 800 - 1; // next interrupt in 100 us byte = 0; bit = 7; state = 1; } break; case 1: PORTD &= ~ENA; // ENA low state = 2; break; case 2: PORTD |= ENA; OCR1A = 400 - 1; // next interrupt in 50 us state = 3; break; case 3: if (array[byte] & (1<<bit)) { PORTB &= ~DAT; } else { PORTB |= DAT; } OCR1A = 264 - 1; // next interrupt in 33 us state = 4; break; case 4: PORTB &= ~CLK; OCR1A = 528 - 1; // next interrupt in 66 us state = 5; break; case 5: PORTB |= CLK; OCR1A = 264 - 1; // next interrupt in 33 us if (bit) { bit--; state = 3; } else if (byte < 17) { bit = 7; byte++; state = 3; } else { state = 6; } break; case 6: PORTB |= DAT; OCR1A = 120 - 1; // next interrupt in 15 us state = 7; break; case 7: PORTD &= ~ENA; // ENA low TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<WGM13); // CTC mode, prescaler 256 OCR1A = 15625 - 1; // next interrupt in 500 ms state = 0; break; } } ZZottel: I think the (1<<WGM13) is wrong. Just don't set it. Rest looks good to me. vegfokic: Does not work without (1<<WGM13) also. I noticed that when youpaste your code the first some lines which consist of #includedid not appear fully (avr.interreupt.h, avr.wdt.h, avr.io.h) I was in trouble but I solved the missing parts. I think they were in the bracket. There is no problem during compiler but he displayis still blank. Whether is there any missing parts from your code because of paste loos? ZZottel: I will upload the source code as attachment later this evening. ZZottel: Here it is. vegfokic: Thanks