Moin! Es geht um einen ATTiny 25 (4Mhz Quarz) der nun kein UART mitbringt und wofür ich mir eine Software UART geschrieben habe. Die UART soll nur senden (8N1). Ich habe mir dazu das Diagram auf Wikipedia angeguckt und es in ASM nachgebaut. Leider erscheint auf dem Display immer das gleiche Zeichen (Pfeil nach oben) oder sonstiger Salat. Ich hab also den verdacht, dass irgendwo ein Fehler sitzt. Der ATTiny ist richtig konfiguriert (Flags) Die Software UART ist simpel aufgebaut: Startbit senden, 104µS warten, Bit für Bit senden (jeweils eine nach rechts schieben und gucken ob das zu sendende Bit 1 oder 0 ist), nach jedem gesendetem Bit 104µS warten und zuletzt das partitybit und das Stoppbit senden. Schaut momentan so aus (die vielen NOPs machen das Timing exakt) Lg, Frank
Hallo, so auf die Schnelle erkenne ich nicht, 1. wie/wo die Parität berechnet wird. 2. Das Stoppbit hat immer den Zustand des letzten Daten-Bit. Schau dir das nochmal an. Gruss
Ich kann Dir für solche Fälle nur VMLab empfehlen. Da kann man auf die Tasten der Tastatur NRZ-Sequenzen legen und so sein Programm sehr komfortabel debuggen.
Also ich hab keine Lust, die ganzen NOPs abzuzählen. Warum nimmst Du denn nicht einfach nen Timerinterrupt? Hier mal Sende-UART in Assembler oder C: http://www.mikrocontroller.net/attachment/36636/i2csniff.zip Du brauchst nur die Konstanten für Baudrate und Quarz richtig definieren, den Rest rechnet die Initroutine selber aus. Peter
Hallo, Danke für die Hinweise. Der Hund liegt aber ganz woanders begraben. Auf PORTB, 0 kommt immer, wenn der Pin mit sbi auf "1" gesetzt wurde der Quarztakt (4Mhz) heraus. Laut Datenblatt ist das unter anderem Timer Compare Match. Muss ich morgen mal gucken, ob der per default an ist (bzw. gleich im vorraus abschalten). Daher auch der Zeichensalat (neben 2 ASM-Fehlern). Jeder High-Impuls hat "Unterimpulse". Aber wenn wer spontan aus Erfahrung weiß, woran das liegt, nehm ich die Hinweise gerne entgegen ;) Grüße, Frank
1 | ;------------------------------------------------------------------------ |
2 | ; Transmit char |
3 | ; in: r29 = char |
4 | ; use: r29-r31 |
5 | |
6 | putc: ldi r31, 10 ;number of bits |
7 | clc ;start bit |
8 | putc1: brcs putc2 ; 1 2 |
9 | cbi PORTB, TX ; 2 - |
10 | rjmp putc3 ; 2 |
11 | putc2: sbi PORTB, TX ; - 2 |
12 | nop ; - 1 = 5 |
13 | putc3: ldi r30, (F_OSC/BAUD - 10)/3 ; 1 |
14 | putc4: dec r30 ; 0 |
15 | brne putc4 ; -1 |
16 | sec ; 1 |
17 | ror r29 ; 1 |
18 | dec r31 ; 1 |
19 | brne putc1 ; 2 = 5 |
20 | putc9: ret |
Frank wrote: > Die UART soll nur senden (8N1). [...] > und zuletzt das partitybit und das Stoppbit senden. Nach meinem Verständnis steht "N" für "keine Parität".
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.