Forum: Mikrocontroller und Digitale Elektronik Warum sendet mir der UART ein ü zurück?


von Simon (Gast)


Lesenswert?

Ich sende ein L ueber die PC Schnittstelle und dem MAX232
an einen AtMega16 bekomme jedoch anstelle des L ein ü zurück.

Egal was ich sende, es kommt jedesmal ein ü.
Hat irgend einer hier ne Idee wie das entsteht?

        ; Frame-Format: 8 Bit
        ldi temp, (1<<URSEL)|(3<<UCSZ0)
        out UCSRC, temp

        sbi UCSRB, RXEN                   ; RX (Empfang) aktivieren
        sbi UCSRB, TXEN

receive_loop:
        sbis UCSRA, RXC                   ; warten bis ein Byte 
angekommen ist
        rjmp receive_loop
        in temp, UDR
        ldi r16, 0xFC           ; AN schalten PB0 und PB1
        out PORTB, r16
        mov temp2, temp
        rcall serout
       rjmp receive_loop                 ; zurück zum Hauptprogramm


serout:
        cbi UCSRB, RXEN                         ; RX aus
        sbis UCSRA,UDRE                   ; Warten bis UDR für das 
nächste
                                          ; Byte bereit ist
        rjmp serout
        out UDR, temp2
        sbi UCSRB, RXEN                         ; RX an
        ret

von Spess53 (Gast)


Lesenswert?

Hi

Wo ist deine Baudrateneinstellung? PC und AVR müssen, um kommunizieren 
zu können, auf die gleiche Baudrate eingestellt sein.

MfG Spess

von Simon (Gast)


Lesenswert?

.equ CLOCK = 11059200
 .equ BAUD = 19200
 .equ UBRR_VAL = CLOCK/(BAUD*16)-1

        ldi temp, HIGH(UBRR_VAL)
        out UBRRH, temp
        ldi temp, LOW(UBRR_VAL)
        out UBRRL, temp


Ich kann ja wunderbar von controller an pc senden in dem ich:

    ldi temp2, 'e'
    rcall serout

eintrage, sobald ich jedoch
        mov temp2, temp
        rcall serout

verwende sendet er mir nicht das vom pc gesendete zurück sondern
nur ein ü.

von Spess53 (Gast)


Lesenswert?

Hi

Welches Register ist temp?

MfG Spess

von Simon (Gast)


Lesenswert?

r16

von Spess53 (Gast)


Lesenswert?

Hi

Da du r16 mit $FC lädst, kann nichts anderes ankomnmen. Nur als Tip 
gewöhne dir diesen temp-Unsinn möglichst schnell wieder ab. Nicht alles 
was im Tut steht ist sinnvoll.

MfG Spess

von Simon (Gast)


Lesenswert?

funzt bestens, oh man ich idiot :)

Danke für eure Hilfe!

Ist das eigentlich normal, dass man RX abschalten muss um senden zu 
koennen.
Ich habe das problem das in dem moment in dem ich in UDR schreibe um zu 
senden auch ein RX interupt ausgeloest wird.

von Spess53 (Gast)


Lesenswert?

Hi

Nein!

MfG Spess

von winne (Gast)


Lesenswert?

Ich schätze mal
temp oder temp2 wird zwischenzeitlich überschrieben.

ich würde zumindest zum Test eine "global char testchar" exklusiv für 
die echofunktion verwenden.

von winne (Gast)


Lesenswert?

oops war ich wohl zu langsam;-)))

von winne (Gast)


Lesenswert?

Anmerkung eine liste mit variablen und registern hilft derartiges zu 
vermeiden.
und entweder ich nutze Register oder Variablen oder ich trenne die 
Bereiche strikt.

von Spess53 (Gast)


Lesenswert?

Hi

@winne: Das ist Assembler. Da gibt es keine lokale oder globale 
Variablen. 'Temp' ist nur eine Namenszuweisung für ein Register. Das 
Register kann weiterhin mit 'rxy' angesprochen werden. Und das führt 
dann zu obigen Fehlern. Bei einer durchgängigen Benutzung der 
Registerbezeichner wäre Simon der Fehler wahrscheinlich selbst 
aufgefallen.

MfG Spess

von Simon (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

Jetzt habe ich das naechste Problem,

Der source funzt wunderbar, sobald ich jedoch "sei" verwende, und der 
timer einen overflow ausloest, kommen ab und zu merkwuerdige zeichen mit 
in die UART verbindung.
Ich habe hier im Forum schon einige diskussionen zum thema interupt und 
uart unterbrechung gelesen aber so recht kann ich mir das hier denoch 
nicht erklären.

von Simon (Gast)


Lesenswert?

Ich hab das nun nochmal mit dem Timer1 probiert, genau die selbe 
geschichte,
der Timer laeuft ab, danach schaltet der port B auf 0xFF als ob er main 
wieder beginnt, danach bekomme ich den port nicht mehr an, die signale 
vom pc verarbeitet er jedoch weiter normal und antwortet auch drauf.

von crazy horse (Gast)


Lesenswert?

Klingt so, als wenn du ein Problem mit den Interruptvektoren hättest. 
Hast du in der m8def.inc rumgepfuscht? Bzw. das ganze mal im AVR-Studio 
simuliert? Kannst das Häkchen  für den Timerinterrupt direkt setzen 
(TIFR), brauchst du nicht so lange zu warten:-)
Und dann siehst du doch, was das Programm veranstaltet. SIeht erstmal 
ganz i.O aus.

von Simon (Gast)


Lesenswert?

Vielen Dank, das Problem scheint geloest, ich weisz
aber nicht warum, der Source enthaellt keinerlei Fehler und funktioniert
jetzt einwandfrei.

Mein erstes Problem war m8def, ich verwende jedoch ein ATMega16.
Als ich dies geaendert habe bestand das Problem immernoch.

gavrasm scheint die Zeile sowieso zu ignorieren.

Warning 009: Include defs not necessary, using internal values!
  File: empf.asm, Line: 1
  Source line: .include "m16def.inc"
92 lines done.

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.