mikrocontroller.net

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


Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ü.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Welches Register ist temp?

MfG Spess

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
r16

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Nein!

MfG Spess

Autor: winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oops war ich wohl zu langsam;-)))

Autor: winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.