Forum: Mikrocontroller und Digitale Elektronik Attiny Soft-UART Problem


von Frank (Gast)


Angehängte Dateien:

Lesenswert?

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

von Gast (Gast)


Lesenswert?

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

von jogi (Gast)


Angehängte Dateien:

Lesenswert?

hier ist ein beispiel

von Rüdiger K. (sleipnir)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

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
Noch kein Account? Hier anmelden.