Forum: Mikrocontroller und Digitale Elektronik ATmega128 RS232 Baudrate


von Fritz S. (bastler4)


Lesenswert?

Hallo Forum

Hab ein C-Control pro Käfer (mega128) und ein Projektboard von Conrad.

An dieses Board kam noch von mir eine ISP-Schnittstelle.
Dann löschte ich den M128 und wollte mit einer seriellen Verbindung
anfangen. Problem: ich kann das UBRR0H UBRR0L setzen wie ich will,
der zugehörige Portpin für TxD ist entweder viel zu schnell
oder zu langsam.
Bei 9600 Bd und senden von "U" (0x55) würde ein bit ca. 100 uS
brauchen. Da lo und hi sich abwechseln,wäre die Frequenz ca. 5 kHz
oder 200 uS.
Nun kam aber durch ausprobieren und herantasten entweder zuviel raus
oder es war wesentlich zu wenig, und das sprungartig!
Ich habe das Gefühl, das Baudraten-Register stimmt nicht.
oder hängt es am ISP- Anschluss, der (dummerweise) die gleichen Pins 
benutzt.

Da man den Quarz (fosc=14745600) wegen des Metall-Geäuses nicht 
kontaktieren kann, legte ich an einen gut zugänglichen Portpin ein 
Testmuster.
1
;gemessen  ergibt 0.85 uS bzw 1.176 Mhz an pin PG0 ===14745600 / 6 zyklen
2
ldi r16,0b0000_0011
3
sts ddrg,r16
4
tstlp3:
5
inc r16
6
andi r16,0b0000_0001
7
sts portg,r16
8
rjmp tstlp3
ergo läuft der M128 nur mit der halben Frequenz. (ca)
Hat jemand Erfahrung in der Richtung.

bastler4

von Spess53 (Gast)


Lesenswert?

Hi

>Nun kam aber durch ausprobieren und herantasten entweder zuviel raus
>oder es war wesentlich zu wenig, und das sprungartig!

In welcher Reihenfolge beschreibst du die beiden Register?

MfG Spess

von Fritz S. (bastler4)


Lesenswert?

Hallo Spess53
danke für die schnelle Reaktion

hier die Reihenfolge;
es war so
;ldi r17,byte2(fosc/16/BR)
;ldi r16,low(fosc/16/BR)
dann testweise so
ldi r17,1 ;high
ldi r16,2   ;low

; Set baud rate ??out UBRR0H, r17  out UBRR0L, r16
sts UBRR0H, r17
sts UBRR0L, r16
und hier ein Auszug aus dem .LST file, das AVR-Studio 4.18 gemacht hat
------------------------
000079 e011      ldi r17,1
00007a e002      ldi r16,2
                 ; Set baud rate ??out UBRR0H, r17  out UBRR0L, r16
00007b 9310 0090 sts UBRR0H, r17
00007d 9300 0009 sts UBRR0L, r16
--------------------------
am TxD-Pin dauert ein bit dann ca. 270 uS

mit freundlichem Gruß
bastler4

von amateur (Gast)


Lesenswert?

@Fritz

Kann es sein, das deine Teilerfaktoren 1 + 2 (258) daneben liegen?
Schau Dir mal die Teilerfaktoren auf Seite 195 im Manual an.

von spess53 (Gast)


Lesenswert?

Hi

>000079 e011      ldi r17,1
>00007a e002      ldi r16,2

Das passt nicht. Bei 14,756MHz ergibt sich bei 9600Bd ein Wert von $005F 
für UBRR.

MfG Spess

von amateur (Gast)


Lesenswert?

@Fritz

Ich habe nicht alle Makros in der Birne aber:
ldi r17,byte2(fosc/16/BR)
ldi r16,low(fosc/16/BR)
Taugt nix.

Versuchs mal mit:
... high()
... low()

Darüber hinaus ist Deine Formel verhunzt.

Zu viele Fehler in zu wenig Zeilen...

von spess53 (Gast)


Lesenswert?

Hi

Versuche es mal damit:
1
    .equ fosz = 14745600
2
    .equ BD   = 9600
3
4
; .....
5
    ldi r16, Low(fosz/(16*BD)-1)
6
    ldi r17,High(fosz/(16*BD)-1)

MfG Spess

von Fritz S. (bastler4)


Lesenswert?

Hi an ALLE
Problem gelöst
man ist gezwungen,die Register-Tabelle genau zu lesen  (IN,OUT | 
LDS,STS)
so funzts
1
.equ fosc=14745600
2
.set BR=38400
3
ldi r17,byte2(fosc/16/BR)
4
ldi r16,low(fosc/16/BR)
5
sts UBRR0H, r17
6
out UBRR0L, r16    ;<3f
Danke für die Antworten
Fritz

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.