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
.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 ü.
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
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.
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.
Anmerkung eine liste mit variablen und registern hilft derartiges zu
vermeiden.
und entweder ich nutze Register oder Variablen oder ich trenne die
Bereiche strikt.
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
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.
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.
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.
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.