Forum: Mikrocontroller und Digitale Elektronik Können Register auch anderweitig durch irgendwelche Prozeduren geändert werden?


von Thomas F. (tfreal10)


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

von crazy horse (Gast)


Lesenswert?

solche Bruchstücke (Recompilate) sagen nicht allzuviel aus.
Allerdings kann sich der Wert von r16 natürlich durch eine 
Interruptfunktion geändert werden.

von Spess53 (Gast)


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

von Thomas F. (tfreal10)


Lesenswert?

Ahh super

und was genau führt nun zur Änderung? Bzw. wo kann ich nachsehen welche 
Interrupt Routinen auf welche Register zugreifen und was und warum sie 
dort was wie machen?

von Spess53 (Gast)


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

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.