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
Hi Wo ist deine Baudrateneinstellung? PC und AVR müssen, um kommunizieren zu können, auf die gleiche Baudrate eingestellt sein. MfG Spess
.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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.