Hallo, wenn ich folgendes verwende: ldi temp1, 0x40 rcall transmit gibt es mir ein @ aus, wenn ich jedoch ldi temp1, ADMUX rcall transmit verwende so gibt der mir nichts gescheits wieder. ADMUX enthaellt 0x40 bekomme ich das irgendwie hin das der mir ein @ sendet wenn ADMUX 0x40 ist?
das gefällt ihm nicht :) Fehler ==> mov temp1, ADMUX ; Wert [analog.asm,85] 018: Registerwert undefiniert!
ldi temp1, 0x40 rcall transmit logisch geht das nicht, weil: LDI ist load immediate. Du lädst hier eine Konstante (hier 0x40) in temp1. und gibst die aus. ldi temp1, ADMUX rcall transmit Hier dasselbe. Du lädst eine Konstante, gespeichert unter dem Namen ADMUX ins temp1. Also hier die Adresse von ADMUX (siehe irgendeine h-datei.) Du musst aber den inhalt von ADMUX auslesen, also: LDS temp1, ADMUX oder IN temp1, ADMUX (eines von beiden geht nur, welches da müsste ich in der h-datei nachsehen)
LDS lädt vom SRAM, das passt also auch nicht. IN ist nur für die I/O-Ports. Die Register für für Freigabe und Sperrung der Interrups, Stackpointer und Statusregister zählen zu den I/O- Ports, damit solltest du also Erfolg haben.
>> Sirko Pöhlmann (poehli): >> LDS lädt vom SRAM, das passt also auch nicht ld und st (und somit auch lds, ldd, sts, std) können auf alle Daten-adressen zugreifen: Register, I/O interner und ggf. externer RAM !
> ld und st (und somit auch lds, ldd, sts, std) können auf _alle_ > Daten-adressen zugreifen Genau. Die I/O-Register liegen schließlich im SRAM. Für den Zugriff auf die unteren 64 I/O-Register gibts eben alternativ die (schnelleren) Befehle "in" und "out". Bei vielen AVRs gibt es weniger als 64 I/O-Register, weshalb man bei denen alle I/O-Register mit "in" und "out" ansprechen kann, während bei einigen größeren AVRs einige der I/O-Register im extended I/O Space liegen und nur über "lds" und "sts" ansprechbar sind.
Ach ja, der Zugriff über "in" und "out" verwendet die "Nummer" des betreffenden I/O-Registers (die Adresse im I/O Space), während "lds" und "sts" mit der absoluten RAM-Adresse gefüttert werden wollen. Deshalb funktioniert der Zugriff über "ldi" und "sts" auch nicht mit den in der Headerdatei definierten Makros. Da muss zur Adresse noch 0x20 addiert werden. Deshalb hat Matthias nicht ganz unrecht...
Datenblatt lesen bildet. Die Codebeispiele geben Aufschluß über die nötigen Programmierbefehle für die entsprechenden Register. Das ging an Dich, Paul.
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.