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
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
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.
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.
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.
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?
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.
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
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).
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
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.
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.
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.
Im Zweifelsfall programmiert man sich ein kleines Testprogramm mit ein paar Testpins und mißt mit dem Oszi, was abgeht.
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.
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.'
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!
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.
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.
> Naja,...
Stimmt: zweimal 'rjmp pc+1', also 4 Takte, zwischengeschaltet, erscheint
"ABC".
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 |
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.
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?
Ob S. schrieb: > weit verkleinert wurden. Kannst du das bitte noch mal in > Originalauflösung posten? Natürlich als *.png, nicht als *.jpg...
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.
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.
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.
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.
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.
> ...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.
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
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.
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.