Forum: Mikrocontroller und Digitale Elektronik AVR128DB USART Transmit Buffer


von Peter S. (cbscpe)


Lesenswert?

Im Datenblatt vom AVR128DB steht nur etwas von einem Transmit Buffer 
aber nichts davon wie lang der ist. Auf dem ATMega1284P und dem 
ATMega1280 war der nur ein Byte gross und es gibt da leider eine 
Anwendung da spielt das eine Rolle und entsprechend gibt es Probleme als 
ich diese auf den AVR128DB migrierte. Aber so wie es aussieht hat der 
AVR128DB eine Transmit Buffer von 4 Bytes. Weiss jemand mehr darüber?

Peter

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Peter S. schrieb:
> Im Datenblatt vom AVR128DB steht nur etwas von einem Transmit Buffer
> aber nichts davon wie lang der ist.

Also ich interpretiere "The transmitter consists of a two-level write 
buffer"... als 2 Bytes.

Beim Empfänger steht "The USART receiver is doublebuffered".
Ich sehe keinen Grund, warum der Puffer des Senders dann größer sein 
sollte.

Aber ich gebe Dir Recht, das Datenblatt ist mal wieder sehr "Microchip 
like" :-/

Grüßle,
Volker

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Peter S. schrieb:
> Auf dem ATMega1284P und dem
> ATMega1280 war der nur ein Byte gross

Das reicht doch völlig aus. Man muß doch nur puffern, damit der 
Interrupt schon das nächste Byte aus dem FIFO lesen kann. Die Bytes 
werden dann lückenlos gesendet. Mit einem größeren Puffer geht es auch 
nicht schneller.

von Peter S. (cbscpe)


Lesenswert?

Peter D. schrieb:
> Peter S. schrieb:
>> Auf dem ATMega1284P und dem
>> ATMega1280 war der nur ein Byte gross
>
> Das reicht doch völlig aus. Man muß doch nur puffern, damit der
> Interrupt schon das nächste Byte aus dem FIFO lesen kann. Die Bytes
> werden dann lückenlos gesendet. Mit einem größeren Puffer geht es auch
> nicht schneller.

Das war ja auch nicht das Problem, ein Byte reicht. Probleme habe ich 
jetzt auf dem AVR128DB weil es eben mehr ist.

von Peter D. (peda)


Lesenswert?

Peter S. schrieb:
> Probleme habe ich
> jetzt auf dem AVR128DB weil es eben mehr ist.

Wo steht das?
Lt. Datenblatt ist das Verhalten gleich den standard AVRs, d.h. man kann 
max 2 Bytes in einem Rutsch schreiben, das 1. landet sofort im SRG, das 
2. im Puffer.

Aber im Unterschied zu den standard AVRs ist der RX-Puffer auch nur 1 
Byte groß. Die standard AVRs hatten ja noch 2 Byte RX-Puffer.
Die standard AVRs konnten also 3 Byte in einem Rutsch lesen (2 * Puffer 
+ SRG). Erst ab dem 4. Startbit kommt es zum Verlust des 3. Bytes.

von Falk B. (falk)


Lesenswert?

Peter S. schrieb:
> Das war ja auch nicht das Problem, ein Byte reicht. Probleme habe ich
> jetzt auf dem AVR128DB weil es eben mehr ist.

Sicher? Oder nur eine schlechte Programmierung im Original, welche, 
warum auch immer, jetzt fehlschlägt. Was geht denn nicht?

von Peter S. (cbscpe)


Lesenswert?

Es geht darum die Funktion eines alten seriellen Interfaces (DLV11 für 
eine PDP-11) abzubilden. Dieses serielle Interface hatte auch einen 
Transmit Buffer von einem Byte, und einen Transmit Buffer Empty 
Interrupt. Das passte eins zu eins zum USART eines ATMega mit dem DRE 
interrupt und so war es einfach nur ein Übersetzung der IO Adressen und 
der Status bits. Gewisse Treiber auf der PDP-11 Seite haben sich darauf 
verlassen, dass es nur ein Byte war und das funktioniert dann natürlich 
nicht wenn ich den Code auf einen AVR DA oder DB portiere. Die Programme 
auf dem PDP-11 anzupassen geht leider nicht, da nicht von allen Stellen 
im OS der Source Code verfügbar ist. Aber das war auch nicht die Frage, 
ich wollte einfach wissen ob es da eine offizielle Dokumentation gibt, 
die sagt dass der Transmitbuffer mehr als ein Byte hat. Dass ich die 
Emulation für eine AVR DA DB anpassen muss ist mir schon klar.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Peter D. schrieb:

> Aber im Unterschied zu den standard AVRs ist der RX-Puffer auch nur 1
> Byte groß.

Das DB sagt was anderes (Abschnitt 25.2):

> The transmitter consists of a single-write buffer, a Shift register,
> and control logic for different frame formats. The receiver consists
> of a two-level receive buffer and a Shift register

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Peter S. schrieb:

> ich wollte einfach wissen ob es da eine offizielle Dokumentation gibt,
> die sagt dass der Transmitbuffer mehr als ein Byte hat.

Nein. Aber es gibt ein offizielles Statement im DB, was besagt, dass es 
eben nur ein Byte ist (Abschnitt 25.2):

> The transmitter consists of a single-write buffer, a Shift register,
> and control logic for different frame formats.

Also eigentlich alles genau so wie bei den Classic-Megas (und den 
wenigen Classic-Tinys mit UART).

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Ob S. schrieb:

> Nein. Aber es gibt ein offizielles Statement im DB, was besagt, dass es
> eben nur ein Byte ist (Abschnitt 25.2):

Welches Datenblatt nutzt Du denn? Bei den mir vorliegenden Datenblättern 
für AVR128DB28/32/48/64 behandelt Kapitel 25 den TCD Timer. Der Usart 
wird in Kap. 27 behandelt. Und dort steht in Abs. 27.2.:
"The transmitter consists of a two-level write buffer, a Shift register, 
and control logic for different frame formats. The receiver consists of 
a two-level receive buffer and a Shift register."

Grüßle,
Volker

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Volker B. schrieb:

> Welches Datenblatt nutzt Du denn?

Rev. A - 03/2020 (initial release)

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Ob S. schrieb:
> Volker B. schrieb:
>
>> Welches Datenblatt nutzt Du denn?
>
> Rev. A - 03/2020 (initial release)

Hab' mir gerade das aktuelle gezogen und die Revision History 
durchgesehen. Eine diesbezüglich Änderung der UART-Eigenschaften ist 
darin nirgendwo erwähnt.

Typisch MC. Mit deren Datenblättern kann man sich nur noch den Arsch 
abwischen, für mehr taugen die nicht. Ich will Atmel zurück.

von Mario M. (thelonging)


Angehängte Dateien:

Lesenswert?

Das Blockdiagramm im Datenblatt zeigt auch einen zweistufigen Puffer. 
Man könnte in der Senderoutine einfach auf TXC warten, statt auf DRE. 
Außer es stört, dass u.U. Lücken zwischen den Bytes sind.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Mario M. schrieb:
> Das Blockdiagramm im Datenblatt zeigt auch einen zweistufigen Puffer.
> Man könnte in der Senderoutine einfach auf TXC warten, statt auf DRE.
> Außer es stört, dass u.U. Lücken zwischen den Bytes sind.

Ich habe mir beispielhaft andere DBs der aktuellen AVR8-Generation 
angesehen, die reden ebenfalls alle von einem zweistufigen TX-Buffer. 
Wird also vermutlich korrekt sein.

Wenn ich das nächste Mal so ein Teil am Debugger habe, werde ich 
trotzdem mal ein kleines Testprogramm schreiben, mit dem man das 
zweifelsfrei herausbekommen kann. Ist ja kein großes Ding, sowas zu 
schreiben.

von Falk B. (falk)


Lesenswert?

Im Zweifelsfall programmiert man sich ein kleines Testprogramm mit ein 
paar Testpins und mißt mit dem Oszi, was abgeht.

von Peter S. (cbscpe)


Lesenswert?

Ja da steht immer nur etwas von einem TX Buffer und ein solcher ist auch 
dargestellt. Aber ich habe mir jetzt ein kleines Testprogram gemacht und 
DREIF wird erst nach dem vierten Character gelöscht und es geht kein 
Zeichen verloren. Der hat definitiv mehr als ein Byte. Ja ich werde wohl 
den TXC Interrupt nehmen müssen und den 1 Byte Buffer für die PDP-11 in 
Software emulieren müssen. Ich kann später mit einem echten DLV-11 
vergleichen, dann sehe ich ob das wirklich viel ausmacht. Die Lücke 
dürfte ja nicht sehr gross werden. Der AVR ist ja recht flott. U.U. ist 
er sogar schneller als die original IC ein CDP6402 oder DC319, die 
brauchen ja auch etwa die Zeitmfür ein halbes bit bis der Buffer 
übertragen ist. Bei 115200baud sind das 5usec. Das schafft der AVR auch.

von S. L. (sldt)


Lesenswert?

1
  ldi    tmp0,'A'
2
  put    USART1_TXDATAL,tmp0
3
  ldi    tmp0,'B'
4
  put    USART1_TXDATAL,tmp0
5
  ldi    tmp0,'C'
6
  put    USART1_TXDATAL,tmp0
7
  ldi    tmp0,'D'
bringt "AB" auf einem AVR128DB28; übrigens genauso wie auf einem 
AVR128DA28, obwohl in dessen aktuellem Datenblatt unter '25.2 Overview' 
steht:
'The transmitter consists of a two-level write buffer, a shift register, 
and control logic for different frame formats.'

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Peter S. schrieb:

> Aber ich habe mir jetzt ein kleines Testprogram gemacht und
> DREIF wird erst nach dem vierten Character gelöscht

D.h.: auch die aktuellen Datenblätter stimmen nicht!

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

S. L. schrieb:
>
1
>   ldi    tmp0,'A'
2
>   put    USART1_TXDATAL,tmp0
3
>   ldi    tmp0,'B'
4
>   put    USART1_TXDATAL,tmp0
5
>   ldi    tmp0,'C'
6
>   put    USART1_TXDATAL,tmp0
7
>   ldi    tmp0,'D'
8
>
> bringt "AB" auf einem AVR128DB28; übrigens genauso wie auf einem
> AVR128DA28, obwohl in dessen aktuellem Datenblatt unter '25.2 Overview'
> steht:
> 'The transmitter consists of a two-level write buffer, a shift register,
> and control logic for different frame formats.'

Das würde bedeuten: doch nur eine Pufferstufe. Steht aber im Konflikt zu 
dem, was der TO herausbekommen haben will. Und im Konflikt zum aktuellen 
DB sowieso.

von Falk B. (falk)


Lesenswert?

Ob S. schrieb:
> Das würde bedeuten: doch nur eine Pufferstufe. Steht aber im Konflikt zu
> dem, was der TO herausbekommen haben will. Und im Konflikt zum aktuellen
> DB sowieso.

Naja, sooo schnell geht es glaube ich auch nicht. Wo steht, daß der 
Puffer mit nahezu CPU-Takt gefüttert werden kann? Man sollte wenigstens 
das DREIF Flag zwischendurch prüfen. Vor allem, weil das realistisch 
ist. Kann sein, daß der Puffer sie wenigen Takte extra braucht, um echt 
puffern zu können.

von S. L. (sldt)


Lesenswert?

> Naja,...

Stimmt: zweimal 'rjmp pc+1', also 4 Takte, zwischengeschaltet, erscheint 
"ABC".

von Peter S. (cbscpe)


Angehängte Dateien:

Lesenswert?

Mein Test Program macht wegen Tests und internen Traces etwas mehr und 
vor allem fragt es jedesmal das DREIF ab. Im Bild sieht man die gelben 
Impulse vom PA4, als ausser dem ersten sind das alles Pulse wenn er das 
Zeichen platziert. Man sieht ich kann 4 Characters absetzen und weitere 
erst wenn mindestens eines über die Leitung gerauscht ist. Es ist 
übrigens ein AVR128DB64 (ich brauchen eben mindestens 5 USART)
1
;
2
;  2  DREIx Test
3
;
4
report2:
5
  ldi  r17, USART_TXCIF_bm
6
  sts  USARTA+USART_STATUS_offset, r17
7
  sbi  b_PA4
8
report2_010:
9
  lds  r17, USARTA+USART_STATUS_offset
10
  sbrs  r17, USART_DREIF_bp
11
  rjmp  report2_010      ; Wait for all transmissions complete
12
  cbi  b_PA4
13
  ldi  r20, 10
14
  ldi  r21, 'A'
15
;
16
;  Start Break
17
;
18
  sbi  b_BRKA
19
;
20
;  Start sending Characters
21
;
22
report2_020:
23
;
24
;  First Report the USART_STATUS with Time-Stamp
25
;
26
  cli
27
  sbi  b_PA4
28
  lds  yl, extptr+0
29
  lds  yh, extptr+1
30
  movw  xh:xl, yh:yl
31
  adiw  xh:xl, 4
32
  andi  xh, 0xF
33
  sts  extptr+0, xl
34
  sts  extptr+1, xh
35
  subi  yl, low(exttrace)
36
  sbci  yh, high(-exttrace)
37
  ldi  r16, SLUTRACE_gm | SLUREAD_bm | SLUXCSR_gm | SLUB_bm
38
  st  Y+, r16
39
  lds  r17, USARTA+USART_STATUS_offset
40
  st  Y+, r17
41
  lds  r18, TCB2_CNTL
42
  lds  r19, TCB2_CNTH
43
  st  Y+, r18
44
  st  Y+, r19
45
  cbi  b_PA4
46
  sei
47
  sbrc  r17, USART_DREIF_bp
48
  rjmp  report2_040      ; Send characters until 
49
  cbi  b_BRKA        ; the TXBUFFER is busy
50
report2_030:
51
  lds  r17, USARTA+USART_STATUS_offset
52
  sbrs  r17, USART_DREIF_bp
53
  rjmp  report2_030
54
55
report2_040:
56
  sts  USARTA+USART_TXDATAL_offset, r21
57
  inc  r21
58
  dec  r20
59
  brne  report2_020      ; Loop
60
  ret          ; Finish after max characters

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Falk B. schrieb:

> Kann sein, daß der Puffer sie wenigen Takte extra braucht, um echt
> puffern zu können.

Ja, da ist was dran. Es ist nicht ungewöhnlich, dass solche Puffer 
irgendwie mit der IRQ-Logik gekoppelt sind, das ist im Gegenteil die 
Regel.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Peter S. schrieb:

> Mein Test Program macht wegen Tests und internen Traces etwas mehr und
> vor allem fragt es jedesmal das DREIF ab. Im Bild sieht man die gelben
> Impulse vom PA4, als ausser dem ersten sind das alles Pulse wenn er das
> Zeichen platziert. Man sieht ich kann 4 Characters absetzen und weitere
> erst wenn mindestens eines über die Leitung gerauscht ist.

Also ich kann das nicht wirklich sehen. Dazu ist das Bild vermutlich zu 
weit verkleinert wurden. Kannst du das bitte noch mal in 
Originalauflösung posten?

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Ob S. schrieb:

> weit verkleinert wurden. Kannst du das bitte noch mal in
> Originalauflösung posten?

Natürlich als *.png, nicht als *.jpg...

von Peter S. (cbscpe)


Angehängte Dateien:

Lesenswert?

Hier jetzt als PNG.

Und wie Falk geschrieben hat, natürlich lief das alles in Interrupts ab, 
schliesslich muss der AVR auch noch andere Dinge erledigen.

Die Fassung mit TXC Interrupt und dem emulierten TXBUFFER nimmt langsam 
Form an.
Grundsätzlich funktioniert jetzt transmit und receive. Der Delay 
zwischen den Zeichen vergrössert sich kaum (wir sprechen da von 
Mikrosekunden). Was jetzt noch harzt ist die Interaktion mit dem 
TXBUFFER und dem PDP-11 Interrupt.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Peter S. schrieb:

> Hier jetzt als PNG.

Danke, da kann man schon deutlich mehr sehen. Aber leider: Es ist immer 
noch nicht möglich, die relevanten Details genau genug zu sehen, um z.B. 
die Abzählung der Pufferstufen zu ermöglichen. Wobei auch interessant 
wäre, inwiefern sich die Verknispelung des Puffers mit der IRQ-Logik 
auswirkt. Denn das Testprogramm von S.L. hat ja gezeigt, dass die erste 
Stufe des Buffer durchaus etwas anders ist, als die nachfolgenden.

Sprich: wirklich aussagekräftig wäre ein Ausschnitt, in dem der Burst 
auf PA4 hinreichend fein dargestellt wird, um zumindest die IRQs 
abzählen zu können, idealerweise auch noch eine Aussage über deren 
Abstände zulassen.

Das sollte bei der verfügbaren Gesamtauflösung problemlos möglich sein, 
wenn man schon dort die Darstellung so wählt, dass sie eben diesen Burst 
und den ersten, vielleicht auch noch den zweiten "regularen" IRQ danach 
umfasst und nicht noch etliche weitere, die dem Informationsgehalt der 
Grafik dann eigentlich nichts mehr hinzufügen.

Kann doch nicht so schwer sein, eine entsprechen Grafik zu produzieren, 
wenn man wie du die Problematik kennt und deshalb weiß, worauf es wohl 
ankommen wird.

von Peter S. (cbscpe)


Lesenswert?

Es müsste reichen, wenn ich dir sage, dass am Anfang 4 Pulse sind.Die 
restlichen sechs siehst du ja schön. Daraus sieht man, dass in dem 
Moment in dem der Buchstabe J in den TXBUFFER geschrieben wird der USART 
damit begonnen hat den Character G zu senden. Daraus würde ich jetzt 
schliessen der TXBUFFER hat 3 Bytes. Etwas auffällig ist das die beiden 
ersten Buchstaben kurz hintereinander geschrieben werden können 
(geschrieben wird nur wen DREIF gesetzt ist) und nach einer Pause von 
4.5usec weitere zwei. Die Baudrate war übrigens 38400. Das entspricht 
der höchsten Baudrate des DLV11 Interfaces auf einer PDP-11.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Peter S. schrieb:

> Es müsste reichen, wenn ich dir sage

Bemüh' dich nicht weiter.

Ist halt so wie immer. Wenn du willst, das irgendwas richtig erledigt 
wird, musst du es selbst erledigen.

von Peter S. (cbscpe)


Lesenswert?

Ich wüsste nicht, was du noch helfen könntest. Die ursprüngliche Frage 
ist immer noch nicht beantwortet, d.h. die Doku hilft nicht weiter und 
nichts Genaues weiss man nicht. Andererseits hat der TXBUFFER des AVR DB 
definitiv nicht das gleiche Verhalten wie beim ATMega. Alles deutet 
darauf hin, dass es eben nicht nur ein Byte ist sondern mehr als ein 
Byte. Da haben wir jetzt mindestens zwei Code Beispiele die vermuten 
lassen, dass es mindestens drei sind. Damit funktioniert die DLV11 
Emulation mit dem bestehenden Code vom ATMega auf dem AVR DB nicht zu 
100%. D.h. ich muss die Emulation vom DRE Interrupt auf TXC Interrupt 
umschreiben und den TXBUFFER in Software nachbilden. Und wie du richtig 
geschrieben hast, das muss ich selber erledigen. Und damit bin ich schon 
ziemlich weit gekommen. In der Zwischenzeit Bootet RT-11 vom TU-58 
Emulator über die emulierte DLV11 Schnittstelle. Mindestens mit 38400 
Baud läuft das stabil, auch wenn der TU-58 Emulator manchmal meckert. 
Wobei ich da auch schon herausgefunden habe was die DLV11 Emulation noch 
falsch macht, ist eher kosmetischer Natur, muss aber trotzdem geflickt 
werden. Danach werde ich das ganze noch etwas tunen, weil ich es mit 
mindestens 115200 Baud laufen lassen will. Das original TU-58 konnte 
zwar nur 38400 Baud, aber der TU-58 Emulator kann so schnell wie es die 
serielle Schnittstelle zulässt.

von S. L. (sldt)


Lesenswert?

> ...dass es mindestens drei sind.

Ich verstehe die Diskussion nicht - es sind genau drei 'Stufen': zwei 
Puffer plus das Ausgaberegister, so wie es ja auch im (aktuellen) 
Datenblatt steht: 'The transmitter consists of a two-level write buffer, 
a shift register ...'.
  So weit waren wir doch schon vorgestern nachmittag.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

S. L. schrieb:

> Ich verstehe die Diskussion nicht - es sind genau drei 'Stufen': zwei
> Puffer plus das Ausgaberegister, so wie es ja auch im (aktuellen)
> Datenblatt steht: 'The transmitter consists of a two-level write buffer,
> a shift register ...'.
>   So weit waren wir doch schon vorgestern nachmittag.

Das versuche ich der lieben Gemeinde seit dem Beginn dieses Threads klar 
zu machen.
Beitrag "Re: AVR128DB USART Transmit Buffer"

Ich kann mir beim besten Willen nicht vorstellen, dass der Hersteller 
(bzw. dessen Marketing) ein oder zwei weitere Speicherstellen im Fifo 
verschweigen würde.

Aber, was wäre das Leben ohne endlose Diskussionen...

Grüßle,
Volker

von Falk B. (falk)


Lesenswert?

Volker B. schrieb:
> Das versuche ich der lieben Gemeinde seit dem Beginn dieses Threads klar
> zu machen.
> Beitrag "Re: AVR128DB USART Transmit Buffer"

Mag sein. Aber es erscheint ein wenig merkwürdig, daß man dem Sender 2 
Byte Puffer spendiert hat und dem Empfänger nur 1. Anders herum war es 
sinnvoller, denn wenn dem Sender die Daten ausgehen passiert nix 
schlimmes. Wenn der Empfänger aber nicht schnell genug lesen kann, dann 
schon.

von Peter S. (cbscpe)


Lesenswert?

So wie es aussieht habe ich mich zu fest darauf verlassen, dass der Link 
den Google zum Datenblatt liefert richtig ist. Geht man "langsam" 
vorwärts, also Microchip.com->Prodkute->.... bis hin zum AVR128DB64 dann 
bekommt man einen anderen Link zum Datenblatt und wirklich im 
"veralteten" Datenblatt aus dem Jahre 2020 vom Google-Link steht im 
Kapitel "27.2 Overview" "The transmitter consists of a single-write 
buffer," und im Datenblatt aus dem Jahre 2023 das bei Microchip auf der 
AVR128DB64 Seite verlinkt ist steht am gleichen Ort im Kapitel "27.2 
Overview" "The transmitter consists of a two-level write buffer," aber 
diese Änderung wird in der Revision History, wie auch schon angemerkt, 
nicht erwähnt.

von S. L. (sldt)


Lesenswert?

> Aber es erscheint ein wenig merkwürdig, daß man dem Sender
> 2 Byte Puffer spendiert hat und dem Empfänger nur 1.

?
Im Datenblatt steht doch, und wurde hier mehrfach zitiert: 'The
receiver consists of a two-level receive buffer and a shift register'.

Nur Peter Dannegger war anfangs anderer Meinung:
> Aber im Unterschied zu den standard AVRs ist der RX-Puffer
> auch nur 1 Byte groß. Die standard AVRs hatten ja noch 2
> Byte RX-Puffer.

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.