Hat wirklich nich niemand den AVR mit einem 9bit UART verwendet ? Hier das ganze Testprogramm. Wenn das 9.Bit gesetzt ist müsste Port A an High gehen, ansonsten auf Low. Er ist immer Low. .include "8515def.inc" .def null=r14 .def voll=r17 .def temp=r20 .org 000 rjmp Initialisierung .org URXCaddr ; Interruptvektor für UART-Empfang in temp, UCR in RX, UDR sbrc temp, 1 rjmp uart out porta, null reti uart: out porta, voll reti Initialisierung: ser voll clr null out ddra, voll out ddrb, voll out ddrc, voll out PORTA, voll out PORTB, voll ; Stackpointer initialisieren ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ; Baudrate einstellen ldi temp, 3 out UBRR, temp sbi UCR, RXCIE ; Interrupt bei Empfang sbi UCR, RXEN ; RX (Empfang) aktivieren sbi UCR, CHR9 ; 9bit aktivieren sei Main: rjmp Main
Hi, ich habe mit dem AT90S8515, 8MHz angefangen mit 9bit UART zu arbeiten. Meine Tests mit dem Atmega161, Atmega162 und Atmega32 sind auch gut Verlaufen. Bei mir wird zwar kein Interrupt verwendet aber wenn Interresse besteht kann ich dir meine Konfigurationsdaten zusenden. Mit welchem Terminal-Programm soll den die 9Bit-Version Daten austauschen? MfG Ralph
Das 9. Bit dient als Befehl/Daten Unterscheidung bei der Kommunikation mit einem anderen uC. Könntest du mal über meinen Code schauen (ist ja nicht viel). Am RXD Pin liegt das 9. Bit auf jedenfall richtig an, aber das RXB8 ist immer gelöscht !
Hi Irgendwie kann ich nicht ganz nachvollziehen was du mit deinem Programm überhaupt erreichen willst.Schreib mal genauer was es überhaupt machen soll. Compilieren kannst du es so jedenfalls nicht. z.B. in der Zeile "in RX, UDR" .Du musst RX erst definieren .def RX=r16. Damit speicherst du dann das UDR Empfangsregister in der Variablen RX. Wozu du die ganzen Ports als Ausgang setzt ist mir auch schleierhaft. Den Interruptvektor hast du auch falsch gesetzt.Müsste so aussehen .org URXCaddr ; Interruptvektor für Empfang rjmp "Unterprogramm" so wie bei deiner Initialisierung Ich würde dir schwer empfehlen dich erstmal mit dem Tutorial hier auf dieser Seite zu beschäftigen. Ich hab mal das Beispiel zum UART-Empfang als Anlage kopiert.Simuliere das ganze mal im AVR-Studio dann wird vieles klarer. mfG Toto
Hi Hab dein Programm mal umgeschrieben.Wie ich es verstanden habe soll also wenn bit 9 gesetzt ist Port A auf high gehen.Wenn bit 9 gelöscht ist Port A auf low. Wenn das so gewollt ist funktioniert das angehängte Programm. mfG Toto
Mit dem Programm will ich nur das 9. bit testen. Da das eigentlichen Programm lief im 8bit Modus problemlos, aber mit 9bit nicht. Daher habe ich einfach den Rest zum Fehler suchen gelöscht, und so eben auch versehentlich das def RX... Daher sind die ganzen Ports noch als Ausgang definiert. Der Datenempfang geht, ich bekomme den richtigen Wert in RX, aber nicht das 9. Bit !
Dann liegt der Fehler wohl weniger am Programm sondern an einem Fehler bei der Übertragung zum AVR.Wie sendest du die Daten den zum MC.? Hyperterminal oder Ahnliches? Wenn ich das obige Programm Simuliere macht es genau das was ich oben geschrieben habe. Bit9=1 >>> PortA=high Bit9=0 >>> PortA=low
Dann ist wohl mein Simulationsprogramm nicht perfekt. Die Daten sende ich mit einem 8051uC im 9bit Modus und da kommen wirklich 9bit raus. Ich werde das mal in der Praxis ausprobieren (da hatte ich ja das Problem, dass der uC nicht auf das 9.bit reagiert)...
Mit dem 8051 kenne ich mich nicht aus. Vielleicht kommt es ja zu irgendwelchen Timingproblemen zwischen den beiden MC. Der AVR hat bei bestimmten Quarzfrequenzen einen gewissen Prozentualen Fehler. Schau mal in das Datenblatt vom 8515 das steht eine Tabelle drin wo der Fehler bei bestimmten Frequenzen aufgelistet ist. Kann sein das er beim 9bit ausserhalb der Toleranz liegt. Wenn der 8051 ähnliche Fehler aufweist addieren sie sich im schlimmsten Fall. Welchen Simulator verwendest du denn? Im AVR-Studio AVR Studio 4, 9, 0, 338 läufts auf jeden Fall und bisher sind mir da keine Bugs aufgefallen. Wenns garnicht läuft must du halt einen zusätzlichen Pin opfern und damit abfragen ob Daten oder Befehle gesendet werden.
Timing Probleme kann ich ausschließen, der Fehler beträgt bei beiden 0% (kann man ja im Simulator schön einstellen, selbst wenn es die krummen Quarzfrequenzen in der Realität nicht gibt.) Ich werds einfach mal in der Praxis testen. Wenns da geht reicht es mir, dann kann ich immerhin mal das 9. bit als Fehlerquelle ausschließen. Danke an alle die mir geholfen haben...
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.