Forum: Mikrocontroller und Digitale Elektronik ATMega324P und USART Probleme


von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

Hallo zusammen,

bin auf neuen µC umgestiegen und damit mit einigen Herausforderungen, 
konkret: der USART (einer von beiden)

Habe in dem Beitrag meinen Code angehangen, wenn ich Daten an den µC 
sende sollte ich die gleichen Daten zurueck erhalten. Leider empfaengt 
er sie nicht oder sendet "Muell" zurueck.

Was ich probiert habe: Quarz 4Mhz betrieben - war aber aus irgendeinem 
Grund zu langsam, die LED 2 an/aus...warum?
Getauscht gegen 16Mhz und 20Mhz, mit und ohne den 2 27pF Kondensatoren 
getestet - LED blinkt nun im Sekundentakt. Sowie den internen Oszillator 
verwendet - keine Chance den kann man nicht so einfach programmieren wie 
den Mega8 (kann mir eingr erklaeren wie man den in 8Mhz betreiben 
kann?). Im Anfangteil vom Programm lasse ich eine LED blinken um mich zu 
vergewissern, dass der Takt der richtige ist. Am Terminal eingestellt: 
9600;N;1

-Mehrere Controller probiert
-Verschiedene USB-RS232 Konverter probiert
-verschiedene Quarze probiert
-verschiedene PC´s probiert
-verschiedene Terminals probiert
-verschiedene FUSE Bits probiert
-CKDIV8 auf High (deaktiviert)
-verschiedene Baudraten probiert

Ich verstehe das ueberhaupt nicht... wer es weiss oder mir hilfreichen 
Tipp gibt der bekommt von mir ein Doener gezahlt, versprochen!
1
.include "m324pdef.inc"
2
3
   sbi   DDRB,0 
4
   
5
   ;LED blinken lassen
6
   sbi   PINB,0   
7
   rcall wait_1s
8
   sbi   PINB,0
9
   rcall wait_1s
10
   sbi   PINB,0
11
   rcall wait_1s
12
   sbi   PINB,0
13
   rcall wait_1s
14
   sbi   PINB,0
15
   rcall wait_1s
16
17
    ; Stackpointer 
18
19
   ldi     r16, HIGH(RAMEND)
20
   out     SPH, r16
21
   ldi     r16, LOW(RAMEND)
22
   out     SPL, r16
23
24
    ; Baudrate, 20Mhz 9600 Bps
25
26
   ldi     r16, HIGH(129)
27
   sts     UBRR0H,r16
28
   ldi     r16, LOW(129)
29
   sts     UBRR0L, r16
30
31
  ;USART
32
33
   ldi     r16,((1<<UMSEL01)|(1<<UCSZ01)|(1<<UCSZ00))
34
   sts     UCSR0C, r16
35
36
   lds     r16, (1<<RXEN0)|(1<<TXEN0)
37
   sts     UCSR0B, r16
38
39
40
   ldi   r16, 'A'     ; Sollte gesendet werden
41
Loop:
42
   lds   r17, UCSR0A
43
   sbrs  r17, UDRE0   
44
   rjmp  Loop
45
   sts   UDRE0,r16     
46
   rcall wait_1s
47
   inc   r16
48
49
   rjmp loop
50
51
52
  wait_1s:
53
; 1 Sekunde Verzoegerung
54
          ldi  R17, $53
55
WGLOOP0:  ldi  R18, $FB
56
WGLOOP1:  ldi  R19, $FF
57
WGLOOP2:  dec  R19
58
          brne WGLOOP2
59
          dec  R18
60
          brne WGLOOP1
61
          dec  R17
62
          brne WGLOOP0
63
ret

von S. Landolt (Gast)


Lesenswert?

> ldi     r16,((1<<UMSEL01)|(1<<UCSZ01)|(1<<UCSZ00))

UMSEL01 gesetzt? Also bei mir steht da "(Reserved)" im Datenblatt.

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

ja stimmt er schreibt ins UCSRnC Register. Kann ich den weglassen oder 
besser:

 ldi    r16,((0<<UMSEL00)|(0<<UMSEL01)|(1<<UCSZ01)|(1<<UCSZ00))

-> Asynchron

von S. Landolt (Gast)


Lesenswert?

Ich fasse UCSR0C nur an, wenn ich den USART als Master-SPI verwende.

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

Und wie konfigurierst du die Bitrate? Wovon geht der Controller aus wenn 
man nichts in das UCSR0C Register setzt?

von S. Landolt (Gast)


Lesenswert?

Der "Initial Value" passt doch normalerweise mit der Einstellung 
'8-bit'.
Was hat die Bitrate mit UCSR0C zu tun?

von H.Joachim S. (crazyhorse)


Lesenswert?

// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud Rate: 9600
UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) | 
(0<<UPE0) | (0<<U2X0) | (0<<MPCM0);
UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (1<<RXEN0) | (1<<TXEN0) 
| (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) | 
(0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0);
UBRR0H=0x00;
UBRR0L=0x81;

funktioniert.

von PZ (Gast)


Lesenswert?

Codevision rules lol

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

H.Joachim S. schrieb:

> funktioniert.

Sieht gut aus, konnte es kompilieren und die Funktion ist besser, leider 
aber nicht perfekt es wird mehr Muell zurueckgesendet als den String den 
ich zum µC sende

von S. Landolt (Gast)


Lesenswert?

Also da hat's noch zwei Fehler (sowie Ungereimtheiten):

>    lds     r16, (1<<RXEN0)|(1<<TXEN0)
'lds'?

>  sts   UDRE0,r16
'UDRE0'?

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

S. Landolt schrieb:
> Also da hat's noch zwei Fehler (sowie Ungereimtheiten):
>
>>    lds     r16, (1<<RXEN0)|(1<<TXEN0)
> 'lds'?

bei neuen µC´s funktioniert in nicht, fuer out muss sts verwendet werden
>
>>  sts   UDRE0,r16
> 'UDRE0'?

was sonst?

von S. Landolt (Gast)


Lesenswert?

>was sonst?
'ldi' sowie 'UDR0'

von BaeumeKommunizierenElektromagnetisch (Gast)


Angehängte Dateien:

Lesenswert?

Passt das mit dem Fusebit?
Wo ist der Unterschied zwischen 1K CK und 16K CK?

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

S. Landolt schrieb:
>>was sonst?
> 'ldi' sowie 'UDR0'

Kommt nach dem Kompilieren immer das selbe bei raus, habe ich bereits 
100 mal getestet wenn es reicht..

von S. Landolt (Gast)


Lesenswert?

Da zu Beginn sekundenlang geblinkt wird, spielt die Start-up-time wohl 
keine Rolle.
Noch zu vorhin:
1
   ldi     r16, (1<<RXEN0)|(1<<TXEN0)
2
   sts     UCSR0B, r16
3
...
4
   rjmp  loop
5
   sts   UDR0,r16     
6
   rcall wait_1s
Noch das Setzen von UCSR0C weglassen, und zumindest bei mir läuft es.

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

H.Joachim S. schrieb:

> UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) |
> (0<<UPE0) | (0<<U2X0) | (0<<MPCM0);

Ich habe das setzen in das UCSR0A ausgelassen - nun bekomme ich nach 
jedem senden etwas zurueck, das ist schonmal gut. Was fehlt noch?

Ist momentan getaktet von einem 20Mhz Quarz ohne Kondensatoren.

von S. Landolt (Gast)


Lesenswert?

Etwas zäh das Ganze, oder? Also hier das komplette Programm mit den drei 
korrigierten Fehlern:
1
.include "m324pdef.inc"
2
3
   sbi   DDRB,0 
4
   
5
   ;LED blinken lassen
6
   sbi   PINB,0   
7
   rcall wait_1s
8
   sbi   PINB,0
9
   rcall wait_1s
10
   sbi   PINB,0
11
   rcall wait_1s
12
   sbi   PINB,0
13
   rcall wait_1s
14
   sbi   PINB,0
15
   rcall wait_1s
16
17
    ; Stackpointer 
18
19
   ldi     r16, high(RAMEND)
20
   out     SPH, r16
21
   ldi     r16, low(RAMEND)
22
   out     SPL, r16
23
24
    ; Baudrate, 20Mhz 9600 Bps
25
26
   ldi     r16, high(129)
27
   sts     UBRR0H,r16
28
   ldi     r16, low(129)
29
   sts     UBRR0L, r16
30
31
  ;USART
32
33
   ldi     r16,((1<<UMSEL01)|(1<<UCSZ01)|(1<<UCSZ00))
34
;   sts     UCSR0C, r16
35
36
   ldi     r16, (1<<RXEN0)|(1<<TXEN0)
37
   sts     UCSR0B, r16
38
39
40
   ldi   r16, 'A'     ; Sollte gesendet werden
41
42
   sts   UDR0,r16     
43
44
45
loop:
46
   lds   r17, UCSR0A
47
   sbrs  r17, UDRE0   
48
   rjmp  loop
49
   sts   UDR0,r16     
50
   rcall wait_1s
51
   inc   r16
52
53
   rjmp loop
54
55
56
  wait_1s:
57
; 1 Sekunde Verzoegerung
58
          ldi  r17, $53
59
WGLOOP0:  ldi  r18, $FB
60
WGLOOP1:  ldi  r19, $FF
61
WGLOOP2:  dec  r19
62
          brne WGLOOP2
63
          dec  r18
64
          brne WGLOOP1
65
          dec  r17
66
          brne WGLOOP0
67
ret

von jo mei (Gast)


Lesenswert?

BaeumeKommunizierenElektromagnetisch schrieb:
> 20Mhz Quarz ohne Kondensatoren

Dann hast du Glück gehabt. Sicher funktionieren (Anschwing-
sicherheit) tut das nicht.

von S. Landolt (Gast)


Lesenswert?

Kommt drauf an: ohne Kondensatoren heißt ja nicht unbedingt ohne 
Kapazität - auf meinen Steckbrettern läuft es auch immer so.

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

S. Landolt schrieb:
> Etwas zäh das Ganze, oder? Also hier das komplette Programm mit
> den drei
> korrigierten Fehlern:.include "m324pdef.inc"

Ich bin seid 15 Stunden mit dem Thema liiert... zaeh waere mir lieber.

Wenn ich den Code flashe und etwas sende, dann antwortet mit der 324p 
mit dem Alphabet von a-z, dann A-Z und anschließend mit Sonderzeichen

??

von S. Landolt (Gast)


Lesenswert?

Ja ist doch prima! Genau das sehe ich hier auch, oder was hatten Sie 
erwartet von Ihrem Programm?

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

Genau das was ich sehe

S. Landolt schrieb:
> Ja ist doch prima! Genau das sehe ich hier auch, oder was hatten
> Sie
> erwartet von Ihrem Programm?

Genau das was ich sehe, ich kann nicht glauben das ich soviel Zeit damit 
verbracht habe um bit im UCSR0C Register zu setzen...

Das bedeutet im Lerneffekt: Das setzen von RXEN0 und TXEN0 im UCSR0B 
Register reicht aus um USART0 fuer 9600bps und einem Stoppbit zu 
initialisieren?

Das Datenblatt hat mich komplett in die Irre schwarze Materie gefuehrt.

von S. Landolt (Gast)


Lesenswert?

Ich meine: es wird zwar 'receive' aktiviert, aber es gibt keinen 
Programmteil, welcher empfängt; es wird ausschließlich gesendet, und 
zwar beginnend mit
>    ldi   r16, 'A'     ; Sollte gesendet werden
und dann wird im ASCII-Code hochgezählt
>    inc   r16

von S. Landolt (Gast)


Lesenswert?

Aha, jetzt verstehe ich.
Ja, nach dem Reset steht (beim ATmega324) der USART auf dem Format 8N1, 
und nein, die Baudrate muss gesetzt werden, da ist der 'initial value' 
für UBRR ja 0.

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

Herr Landolt,

vielen Dank!! Die Baudrate habe ich jetzt falsch herangezogen, ich 
meinte 8N1.

Haben Sie eine gueltige PP Mail fuer mich, ich verschulde mich bei Ihnen 
um einen Doener!

von S. Landolt (Gast)


Lesenswert?

Keine Ursache; und ich freue mich über jeden Assemblerprogrammierer.
Ein schönes Restwochenende wünsche ich
aus dem Schwarzen Wald.

von S. Landolt (Gast)


Lesenswert?

PS:
Auch der ATmega8 steht zu Beginn auf 8N1, man muss nur die Finger von 
UCSR0C lassen (das gilt wohl für alle Controller der Familie).

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

S. Landolt schrieb:
> PS:
> Auch der ATmega8 steht zu Beginn auf 8N1, man muss nur die Finger von
> UCSR0C lassen (das gilt wohl für alle Controller der Familie).

Vielen Dank fuer die Tipp´s!

Sollte man umgehend aus dem Tutorial entfernen, meinen Einstig habe ich 
uéber diese Seite begangen und seid dem davon ausgegangen das UCSR0C 
muss unbedingt gesetzt sein..

https://www.mikrocontroller.net/articles/AVR-Tutorial:_UART

Wenn es solche Leute wie Sie gibt, macht es viel mehr Spaß!
Wuensche auch schoenes Restwochenende.

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

Darf ich nochmal stoeren?

Versuche seid Stunden den Interrupt fuer USART0 zu initialisieren, 
richte mich dabei an das Datasheet nur funktioniert es nicht richtig (es 
werden wirre Zeichen gesendet). Der Interrupt wird ausgeloest da der 
Prozesor sich in der Schleife "OTP" ohne "" befindet, was fehlt noch?

Laut Datasheet:
Bit 7 – RXCIEn: RX Complete Interrupt Enable nWriting this bit to one 
enables interrupt on the RXCn Flag. A USART Receive Complete interrupt 
will be generated only if the RXCIEn bit is written to one, the Global 
Interrupt Flag in SREG is written to one and the RXCn bit in UCSRnA is 
set.
1
.include "m324pdef.inc"
2
   .org 0x0028            ;USART0 RX Adresse                   
3
        rjmp RX_INT
4
5
   ;Stackpointer 
6
7
   ldi     r16, high(RAMEND)
8
   out     SPH, r16
9
   ldi     r16, low(RAMEND)
10
   out     SPL, r16
11
12
   ;Baudrate, 20Mhz 9600 Bps
13
14
   ldi     r16, high(129)
15
   sts     UBRR0H,r16
16
   ldi     r16, low(129)
17
   sts     UBRR0L, r16
18
19
   ;USART
20
   ldi     r16, (1<<RXEN0)|(1<<TXEN0)
21
   sts     UCSR0B, r16
22
23
   ldi     r16, RXCIE0
24
   sts     UCSR0B, r16
25
26
   ldi     r16, RXC0
27
   sts     UCSR0A, r16
28
   sei
29
30
   OTP:
31
   rjmp OTP
32
33
RX_INT:
34
   lds   r16, UDR0 ;Empfangenes Byte zurueck senden
35
   sts   UDR0, r16     
36
   reti

von c-hater (Gast)


Lesenswert?

BaeumeKommunizierenElektromagnetisch schrieb:

> [avrasm]
> .include "m324pdef.inc"

Hier fehlt was, nämlich der Sprung zu init/main. also ungefähr hierhin:

>    ;Stackpointer
>
>    ldi     r16, high(RAMEND)
>    out     SPH, r16
>    ldi     r16, low(RAMEND)
>    out     SPL, r16
[...]

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

ok habe ich eingepflegt, Resultat ist das selbe.
1
.include "m324pdef.inc"
2
   .org 0x00
3
        rjmp main
4
   .org 0x0028            ;USART0 RX Adresse                   
5
        rjmp RX_INT
6
main:
7
   ;Stackpointer 
8
9
   ldi     r16, high(RAMEND)
10
   out     SPH, r16
11
   ldi     r16, low(RAMEND)
12
   out     SPL, r16

von c-hater (Gast)


Lesenswert?

BaeumeKommunizierenElektromagnetisch schrieb:

> ok habe ich eingepflegt, Resultat ist das selbe.

Dann stimmt der Takt und/oder die UART-Initialisierung nicht.

Was ist die Taktquelle des µC?

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

c-hater schrieb:
> BaeumeKommunizierenElektromagnetisch schrieb:
>
>> ok habe ich eingepflegt, Resultat ist das selbe.
>
> Dann stimmt der Takt und/oder die UART-Initialisierung nicht.
>
> Was ist die Taktquelle des µC?

20Mhz,

Ohne Interrupt funktioniert es wunderbar..

von S. Landolt (Gast)


Lesenswert?

hier wird der USART gleich wieder abgeschaltet:
1
   ldi     r16, RXCIE0
2
   sts     UCSR0B, r16

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

Hallo Herr Landolt,
Huch wie kommt es dazu, das Bit wird auf high gesetzt im UCSR0B 
Register, ist eine aequivalente Schreibweise wie diese hier:
1
   ldi     r16, (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)
2
   sts     UCSR0B, r16

Daten werden vom µC gesendet nur stimmen diese nicht, ausgeschaltet ist 
USART0 damit nicht, zumindest was ich sehe

von Jammerer (Gast)


Lesenswert?

S. Landolt schrieb:
> hier wird der USART gleich wieder abgeschaltet:

Da sieht man es wieder: Assembler ist einfach scheisse.

von S. Landolt (Gast)


Lesenswert?

Dies hier ist auch nicht richtig:
1
   ldi     r16, RXC0
2
   sts     UCSR0A, r16

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

S. Landolt schrieb:
> Dies hier ist auch nicht richtig:   ldi     r16, RXC0
>    sts     UCSR0A, r16

Das Datenblatt besagt bit 7 vom UCSR0A muss gesetzt sein.. Setze ich es 
nicht ist das Resultat das selbe.

von c-hater (Gast)


Lesenswert?

BaeumeKommunizierenElektromagnetisch schrieb:

> Huch wie kommt es dazu, das Bit wird auf high gesetzt im UCSR0B
> Register, ist eine aequivalente Schreibweise wie diese hier:
>
>
1
>    ldi     r16, (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)
2
>    sts     UCSR0B, r16
3
>

Nein, ist es nicht. Du hast erstens definitiv nicht den Unterschied 
zwischen Entwurfszeit und Laufzeit verstanden und zweitens nicht, wie 
man zur Laufzeit dasselbe (nämlich eine logische OR-Verknüpfung) 
bewerkstelligt...

Etwa so:

ldi     r16, (1<<RXEN0)|(1<<TXEN0)
sts     UCSR0B, r16

[... und später irgendwann]

lds     r16, UCSR0B
ori     r16,1<<RXCIE0    ;oder auch: sbr ...
sts     UCSR0B, r16

von S. Landolt (Gast)


Lesenswert?

Jammerer schrieb:
> S. Landolt schrieb:
>> hier wird der USART gleich wieder abgeschaltet:
>
> Da sieht man es wieder: Assembler ist einfach scheisse.

Pardon, aber: wäre in C genauso bei 'UCSR0B = RXCIE0;'.

von c-hater (Gast)


Lesenswert?

Jammerer schrieb:
> S. Landolt schrieb:
>> hier wird der USART gleich wieder abgeschaltet:
>
> Da sieht man es wieder: Assembler ist einfach scheisse.

Quatsch mit Soße. Du kannst exakt denselben Schwachsinn genausogut in C 
programmieren, wenn du so wenig Ahnung hast, wie du hast...

von Jammerer (Gast)


Lesenswert?

S. Landolt schrieb:
> Pardon, aber: wäre in C genauso bei 'UCSR0B = RXCIE0;'.

Da sieht man die Scheisse aber besser ...

Wenn ich da kein &= oder |= sehe schellen bei mir schon
die Alarmglocken.

von c-hater (Gast)


Lesenswert?

Jammerer schrieb:
> S. Landolt schrieb:
>> Pardon, aber: wäre in C genauso bei 'UCSR0B = RXCIE0;'.
>
> Da sieht man die Scheisse aber besser ...
>
> Wenn ich da kein &= oder |= sehe schellen bei mir schon
> die Alarmglocken.

Siehst du, bei gelernten Assemblerprogrammierern schrillen sie halt 
ebenfalls, wenn jemand einem IO-Register etwas zuweist, ohne es mit dem 
vorherigen Inhalt in irgendeiner Form zu verknüpfen.

Wo genau ist nun der Unterschied oder der Vorteil von C?

von S. Landolt (Gast)


Lesenswert?

an BaeumeKommunizierenElektromagnetisch:
Sie sollten sich auch den Unterschied zwischen 'n' und '1<<n' 
klarmachen.

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

> Nein, ist es nicht. Du hast erstens definitiv nicht den Unterschied
> zwischen Entwurfszeit und Laufzeit verstanden und zweitens nicht, wie
> man zur Laufzeit dasselbe (nämlich eine logische OR-Verknüpfung)
> bewerkstelligt...

Nicht verstanden ist die falsche Ausdrucksweise, ich habe mich damit 
noch nicht in der notwendigen ausfuehrlichen Form damit befasst.

Habe es nun folgendermassen gemacht und es funktioniert nun, danke euch 
beiden..!
1
  ;USART
2
   ldi     r16, (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<RXCIE0)
3
   sts     UCSR0B, r16
4
5
   ldi    r16, (1<<RXC0)
6
   sts    UCSR0A, r16
7
 
8
   sei

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

S. Landolt schrieb:
> 1<<n

Das ist mir bewusst, waerend der Prozedur Aneignung von 
Assemblerkenntnisen bin ich leider noch nicht darueber gestolpert

von S. Landolt (Gast)


Lesenswert?

Okay, Sie sind wieder ein Stück weiter, und die hinlänglich bekannte, 
unsägliche Diskussion hat ein rasches Ende gefunden - beides ein Grund, 
sich zu freuen.

von c-hater (Gast)


Lesenswert?

BaeumeKommunizierenElektromagnetisch schrieb:

>    ldi     r16, (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<RXCIE0)

Das kann nur Schwachsinn sein. Es macht keinen Sinn, ein und dasselbe 
Flag zweimal zu verodern...

In KEINER Sprache...

>    ldi    r16, (1<<RXC0)
>    sts    UCSR0A, r16

Und das ist ebenfalls sinnlos. Wenn dieses Flag gesetzt ist, läßt es 
sich nur durch Lesen von UDR0 löschen.

von S. Landolt (Gast)


Lesenswert?

> ... RXC0 ...
Nun ja, ist sicher nicht die letzte Wissenslücke; Rom wurde auch nicht 
an einem Tag erbaut.
  Aber zur Vollständigkeit sei das Datenblatt zitiert: "This flag bit is 
set when there are unread data in the receive buffer and cleared when 
the receive buffer is empty".

von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

> Das kann nur Schwachsinn sein. Es macht keinen Sinn, ein und dasselbe
> Flag zweimal zu verodern...

ist ein Kopierfehler.. setze das Flag nur einmal

>
> In KEINER Sprache...
>
>>    ldi    r16, (1<<RXC0)
>>    sts    UCSR0A, r16
>
> Und das ist ebenfalls sinnlos. Wenn dieses Flag gesetzt ist, läßt es
> sich nur durch Lesen von UDR0 löschen.

Inwiefern sinnlos, koennen Sie es mir genauer erklaeren? Das Datenblatt 
gibt es vor und die Funktion ist gegeben.

von S. Landolt (Gast)


Lesenswert?

PS:
Nochmal ins Datenblatt schauen: da steht für RXCn bei 'Read/Write' ein 
"R"!

von c-hater (Gast)


Lesenswert?

S. Landolt schrieb:

> Aber zur Vollständigkeit sei das Datenblatt zitiert: "This flag bit is
> set when there are unread data in the receive buffer and cleared when
> the receive buffer is empty".

Was allerdings nicht wirklich hilfreich ist, wenn man das Konzept der 
UART nicht kennt. In anderen Datenblättern ist das etwas hilfreicher 
formuliert. Nämlich ungefähr so, wie ich schrieb...

Aber um den Kreis zu schließen: Das Lesen von UDR0 sorgt dafür, dass der 
Empfangspuffer leer(er) wird. Aber nicht notwendigerweise leer. Denn er 
kann bis zu drei Stufen haben, beim 324A hat er sie. Genau genommen muss 
man also dreimal UDR lesen, bis man vollkomen sicher sein kann, dass das 
Flag nicht mehr gesetzt ist. Oder (i.d.R. deutlich sinnvoller) RXEN mal 
kurz löschen...

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.