Forum: Mikrocontroller und Digitale Elektronik Direkte Adressierbarkeit von Registern


von Benedikt S. (-beni-)


Lesenswert?

Hallo,

ich frage mich schon lange, warum beim 8-bit RISC ARR die Register 0 - 
15 nicht direkt mit z.B. LDI verwendet werden können, sondern nur die 
Register 16-31. Das Einzige, was mir mal gesagt wurde war, es seien 
architektonische Gründe, aber weiß jemande welche?
Vielen Dank schon mal!

Gruß Beni

von Xenu (Gast)


Lesenswert?

Du hast in einem Befehlswort nur eine bestimmte Anzahl Bits.
Und jeder Mikroprozessordesigner muss sich entscheiden, welche Befehle 
er damit umsetzt. Wenn Du LDI mit allen Registern haben willst, brauchst 
Du ein Bit mehr. Das fehlt dann woanders.
Also müssen dann andere Befehle beschnitten oder ganz weggelassen 
werden. Oder Du nimmst ein Bit bei der Konstante bei LDI weg.
Anstatt 0-255 könntest Du dann nur 0-127 als Wert bei LDI benutzen.

von Rolf Magnus (Gast)


Lesenswert?

LDI ist 16 bit breit. Für den Wert werden 8 Bits benötigt. Wenn du nun 
alle 32 Register ansprechen können willst, brauchst du für die 
Registernummer nochmals 5 Bits. Es bleiben also nur noch 3 Bits für den 
Opcode übrig. Das ist zu mager. Es gibt ja noch andere Befehle dieser 
Art (z.B. ANDI, ORI, SUBI, SBCI). So wäre fast kein Platz mehr für die 
ganzen anderen Befehle übrig.

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


Lesenswert?

Die eine zusätzliche Zeile Code für die unteren Register ist doch zu 
verschmerzen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

kommt immer drauf an:

ldi tmp, 123
mov r0, tmp

kann z.B. durch nen Interupt unterbrochen werden!

also müßte man eigentlich schreiben:

cli
ldi tmp, 123
mov r0, tmp
sei

und ganz eiogentlich:

cli
push tmp
ldi tmp, 123
mov r0, tmp
pop tmp
sei


Läßt sich natürlich alles durch saubere programmierung verhindern und 
"hinbiegen" ;)

von Hannes L. (hannes)


Lesenswert?

Läubi Mail@laeubi.de wrote:
> kommt immer drauf an:
>
> ldi tmp, 123
> mov r0, tmp
>
> kann z.B. durch nen Interupt unterbrochen werden!

Na und? Wenn die ISR sauber programmiert ist stört das nicht weiter.

>
> also müßte man eigentlich schreiben:
>
> cli
> ldi tmp, 123
> mov r0, tmp
> sei

Nööö, man muss nur in der ISR alle verwendeten Register sichern 
(push/pop) und das SREG sichern, damit das Auftreten des Int zwischen 
einem flagbeeinflussendem Befehl (Operation, Vergleich) und der darauf 
folgenden bedingten Verzweigung (brXX) keine Flags verändert.

>
> und ganz eiogentlich:
>
> cli
> push tmp
> ldi tmp, 123
> mov r0, tmp
> pop tmp
> sei

Nöö, auch nicht, das muss in der ISR geschehen.

Allerdings gibt es Fälle, wo das Sperren des Interrupts nötig ist, 
nämlich dann, wenn Main und ISR auf dieselben (I/O-)Register zugreifen. 
Suche mal nach "atomar", da bekommst Du gute Erklärungen von PeDa. Auch 
beim Setzen des Brennimpulses beim (internen) EEPROM muss der Interrupt 
gesperrt werden, damit er nicht zwischen Aufhebung des Schreibschutzes 
(eemwe) und Schreiben (eewe) auftreten kann, was den Schreibschutz (der 
gilt nur 4 Takte) deaktivieren könnte.

>
>
> Läßt sich natürlich alles durch saubere programmierung verhindern und
> "hinbiegen" ;)

Richtig, saubere Programmierung ist oberstes Gebot. Es gelingt mir aber 
auch nicht immer... ;-)

...

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


Lesenswert?

Zum Glück kann keiner in die Controller ´reingucken, um die "dreckigen" 
Programmecken zu sehen ;-) (bei gesetzten LockBits). Mit einiger 
Erfahrung sind die AVRs aber recht einfach zu den an sie gestellten 
Aufgaben zu bewegen.

von Willi (Gast)


Lesenswert?

Hallo

> cli
> push tmp
> ldi tmp, 123
> mov r0, tmp
> pop tmp
> sei

Wofür soll das gut sein ?
tmp hat hinterher den gleichen Wert wie vorher.

MfG Willi

von Willi (Gast)


Lesenswert?

Oh Sorry,

habs schon gesehen.
Ich nehme alles zurück.
Hatte wohl gerade einen Aussetzter zwischen den Ohren.

Mfg Willi

von Benedikt S. (-beni-)


Lesenswert?

Vielen Dank für eure Erklärungen :-)

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.