Forum: Mikrocontroller und Digitale Elektronik ADMUX direkt an RS232 ausgeben


von Paul (Gast)


Lesenswert?

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?

von mg (Gast)


Lesenswert?

ersetzte "ldi" mal durch "mov" dann müsste es funktionieren

von Paul (Gast)


Lesenswert?

das gefällt ihm nicht :)

Fehler ==>     mov  temp1, ADMUX       ; Wert
[analog.asm,85] 018: Registerwert undefiniert!

von Matthias (Gast)


Lesenswert?

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)

von Sirko P. (poehli)


Lesenswert?

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.

von Joerg X. (Gast)


Lesenswert?

>> 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 !

von johnny.m (Gast)


Lesenswert?

> 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.

von johnny.m (Gast)


Lesenswert?

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...

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.