Forum: Mikrocontroller und Digitale Elektronik Uart auf dem Atmega8 wo könnte der fehler liegen?


von matze (Gast)


Lesenswert?

moinsen.

ich habe folgenden plan:

ein atmega soll langfristig midi (31250 Baud)  verarbeiten. bin gerade 
dabei mich da ran zu tasten. dazu habe ich einen 4 MHz Quarzoszillator 
dran gehänt und den µC entsprechend gefused. Um erstmal zu schauen ob 
uart überhaupt etwas macht, dachte ich, gebe ich mir das RXC (Uart 
receive complete) an nem port mit led aus und so könnte ich sehen, dass 
uart was empfangen hat.
nun, es funktioniert nicht!!!
Hab mal am oszilloskop ausgemessen, und der oszillator schwingt 
tatsächlich mit der angegebenen Frequenz. daran kanns also nicht liegen. 
ich muss halt auch sagen, ich bin jetzt noch relativ neu in dem thema. 
wahrscheinlich liegt der fehler in dem assembler-code. könnt ihr mir nen 
tipp geben?

hier ist der code:
1
.include "m8def.inc"
2
.def temp = r16
3
;
4
ldi temp, 0xFF        ;definiert Port B als ausgang
5
out DDRB, temp
6
;
7
ldi temp, (1<<RXEN)      ;setzt das receiver enable bit auf 1
8
out UCSRB, temp          ;-> uart kann empfangen
9
;
10
ldi temp, 0b00000111      ;läd das obere Baudratenregister
11
out UBRRH, temp
12
;
13
ldi temp, 0b11111111      ;läd das untere Baudratenregister
14
out UBRRL, temp
15
;
16
ldi r17, 0b10000000      ;läd vergleichswert in r17
17
;
18
loop:  
19
;
20
in temp, UCSRA            ;kopiert Uart control register A in temp
21
andi temp, 0b10000000      ;msb(Uart Receive Complete) wird maskiert
22
mov r18, temp             ;kopiert maskiertes bit in r18 für späteren vergleich
23
;
24
ror temp
25
ror temp                  ;verschiebt die 1 im msb zwei nach rechts, 
26
                          ;weil die beiden oberen bits von port b für den 
27
                          ;oszillator belegt sind :-(
28
;
29
out PortB, temp           ;wenn alles klappt sollte somit das RXC 
30
                          ;an bit 5 von port b anliegen
31
;
32
cp r17, r18
33
breq loop2                ;springt zu loop2 und bleibt da in ner 
34
                          ;dauerschleife, wenn das uart eine nachricht 
35
                          ;erfolgreich empfangen hat
36
rjmp loop                 ;das ganze nochmal von vorn, wenn keine 
37
                          ;nachricht empfangen wurde
38
;
39
loop2:
40
rjmp loop2                ;dauerschleife, wenn erfolgreich empfangen

von spess53 (Gast)


Lesenswert?

Hi

>ldi temp, 0b00000111      ;läd das obere Baudratenregister
>out UBRRH, temp
>;
>ldi temp, 0b11111111      ;läd das untere Baudratenregister
>out UBRRL, temp

Was soll das für eine Baudrate werden?

MfG Spess

von c-hater (Gast)


Lesenswert?

matze schrieb:

> ein atmega soll langfristig midi (31250 Baud)  verarbeiten. bin gerade
> dabei mich da ran zu tasten. dazu habe ich einen 4 MHz Quarzoszillator
> dran gehänt und den µC entsprechend gefused. Um erstmal zu schauen ob
> uart überhaupt etwas macht, dachte ich, gebe ich mir das RXC (Uart
> receive complete) an nem port mit led aus und so könnte ich sehen, dass
> uart was empfangen hat.
> nun, es funktioniert nicht!!!

> Hab mal am oszilloskop ausgemessen, und der oszillator schwingt
> tatsächlich mit der angegebenen Frequenz. daran kanns also nicht liegen.

Wenn du schon einen Oszi zu deiner Verfügung hast, dann wäre es ja wohl 
mehr als logisch, einfach mal eine kleine Anwendung zu programmieren, 
die über einen Pin einen einfachen Vmax-Toggle ausgibt und über die UART 
ein bestimmtes Muster. Dann braucht man nur diese beiden verschissenen 
Signal zu oszillografieren und weiß sofort folgendes:

1) Stimmen meine Fuse-Settings
2) Ist das UART Taktsystem korrekt initialisiert

> ich muss halt auch sagen, ich bin jetzt noch relativ neu in dem thema.
> wahrscheinlich liegt der fehler in dem assembler-code.

Nein, der Fehler liegt mit an Sicherheit grenzender Wahrscheinlichkeit 
daran, daß der Code nicht von dir geschrieben wurde und du nicht den 
Hauch einer Ahnung davon hast, was er tut.

Ändere das.

von Paul Baumann (Gast)


Lesenswert?

@Matze
Daß der Oszillator schwingt, ist noch keine Garantie dafür, daß die
Fuse-Bits richtig szehen. So ein Oszillator schwingt los, sobald
die Betriebsspannung dran ist. Ich nehme doch an, daß Du einen
solchen Kollegen verbaut hast?
https://de.wikipedia.org/wiki/Datei:Quarzoszillator.jpg

MfG Paul

von matze (Gast)


Lesenswert?

c-hater schrieb:
> Nein, der Fehler liegt mit an Sicherheit grenzender Wahrscheinlichkeit
> daran, daß der Code nicht von dir geschrieben wurde und du nicht den
> Hauch einer Ahnung davon hast, was er tut.

Falsch. Ich habe ihn geschrieben. ich weiß auch was er tuen sollte. und 
jetzt tut er auch was er soll. spess53 war ganz recht gelegen. da lag 
der fehler. da hatte ich mich verrechnet. vielen dank dafür spess53. hat 
mir wirklich viel geholfen dieser kleine tipp.

@c-hater: du solltest mal echt deine einstellung überdenken. gleich mal 
leute der völligen unwissenheit bezichtigen ist ja wohl das letzten. ich 
meine ich fange gerade erst damit an, ja aber ich hab mir den code nicht 
zusammengeklaut sondern selbst überlegt! ich muss gerade an mir halten, 
dass ich nicht ausfallend werden!

Paul Baumann schrieb:
> @Matze
> Daß der Oszillator schwingt, ist noch keine Garantie dafür, daß die
> Fuse-Bits richtig szehen.
ne, das ist mir klar. aber ich kann die fuse-bytes ja auch lesen und da 
hat schon alles gepasst. war ja letztlich nicht der fehler.

>So ein Oszillator schwingt los, sobald die Betriebsspannung dran ist.
jup hab ich auch gemerkt...

Ich nehme doch an, daß Du einen
> solchen Kollegen verbaut hast?
> https://de.wikipedia.org/wiki/Datei:Quarzoszillator.jpg
ne, ich hab nen quarz auf den sockel vom stk500 gesteckt.

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.