Warum sendet mir der UART ein ü zurück?

Gast #680976
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
Gast #680998
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 ü.
Gast #681018
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.
Gast #681064
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
Gast #681238
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.
Angehängte Dateien:
Gast #681263
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.
Gast #681276
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.
Gast #681322
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren