Attiny Soft-UART Problem

Gast #939076
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
Angehängte Dateien:
Gast #939826
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
#939838
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren