Können Register auch anderweitig durch irgendwelche Prozeduren geändert werden?

OP #823026
Lesenswert?
• ▲
▼
Habe ein Programm in Hex Code im AVR Studio geöffnet. Dieses soll 
eigentlich IR-Signale erkennen und per USB an den PC melden! Ich möchte 
mir dieses Programm umschreiben um direkt (ohne USB) Ausgänge am µC zu 
schalten!

Bin noch ganz am Anfang was µC angeht!

So wie ich dass beobachten konnte wird in diesem Programm anfangs ein 
paar einstellungen vorgenommen wie Pullup Widerstände einschalten und 
solche Sachen. Anschließend wartet das Program sozusagen darauf dass R16 
den Wert 2 oder 3 annimmt


+0000006F:   9BB0        SBIS    0x16,0           Skip if bit in I/O 
register set
+00000070:   C005        RJMP    PC+0x0006        Relative jump
+00000071:   3002        CPI     R16,0x02         Compare with immediate
+00000072:   F069        BREQ    PC+0x0E          Branch if equal
+00000073:   3003        CPI     R16,0x03         Compare with immediate
+00000074:   F041        BREQ    PC+0x09          Branch if equal
+00000075:   CFF9        RJMP    PC-0x0006        Relative jump
+00000076:   EF4F        SER     R20              Set Register
+00000077:   99B0        SBIC    0x16,0           Skip if bit in I/O 
register cleared
+00000078:   CFF6        RJMP    PC-0x0009        Relative jump
+00000079:   954A        DEC     R20              Decrement
+0000007A:   F7E1        BRNE    PC-0x03


allerdings verstehe ich nicht warum das abgefragt wird der wert in R16 
kann sich doch nicht einfach so ändern wenn ständig nur dieser 
Programmteil ausgeführt wird.

Eigentliche Frage:
können Register auch noch anderweitig beschrieben werden? Ohne dass im 
Programm direkt durch Programmieren etwas in R16 geschrieben wird? Also 
ich stell mir dass jetzt so vor: Irgendeine Schnittstelle empfängt was 
und schreibt dann eben in R16 was rein. Ist dies so? Wenn ja welche und 
warum?!?
Gast #823030
Lesenswert?
• ▲
▼
Hi

Ja. Zum Beispiel in Interrupt-Routinen. Interrupts unterbrechen das 
laufende Programm, führen die Interrupt-Routine aus, und kehren dann an 
die Stelle zurück, an der das Programm unterbrochen wurde. Innerhalb der 
ISR können natürlich Register geändert werden. Auf diese Änderung kann 
das Hauptprogramm beispielsweise reagieren.

MfG Spess
Gast #823036
Lesenswert?
• ▲
▼
Hi

Im Datenblatt des Controllers ist die Interruptsprungtabelle enthalten, 
die am Anfang des Programms steht. Von dort springt das Programm in die 
entsprechenden Routinen. Interruptroutinen enden immer mit einem 'reti'.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren