Forum: Mikrocontroller und Digitale Elektronik UART Problem


von Benedikt (Gast)


Lesenswert?

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

von Ralph Dillhardt (Gast)


Lesenswert?

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

von Benedikt (Gast)


Lesenswert?

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 !

von Toto (Gast)


Angehängte Dateien:

Lesenswert?

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

von Toto (Gast)


Angehängte Dateien:

Lesenswert?

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

von Benedikt (Gast)


Lesenswert?

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 !

von Toto (Gast)


Lesenswert?

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

von Benedikt (Gast)


Lesenswert?

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)...

von Toto (Gast)


Lesenswert?

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.

von Benedikt (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.