Soll ich hier was dazu schreiben?
Ja bitte! Ich bin dankbar für jegliche Hilfe..
Ok, im Mega32-Datenblatt auf Seite drei das Blockschema des Controllers.
Den Datenbus als dicken Pfeil. Dieser verbindet die Peripherie (die Beine oben und unten, die digitalen Schnittstellen, Timer usw - aber auch SRAM und Eeprom) mit der Eigentlichen CPU (der extra eingerahmte Bereich links).
Im CPU-Block erkennst Du den Programm-Counter, Instruction-Register und -Dekoder, die 32 Rechenregister (General Purpose Register), die ALU und das Statusregister.
Nach einem Reset zeigt der Programmcounter auf Adresse null im Flash, dessen Inhalt wird als erstes in den Instruction-Decoder geladen. Mit jedem weiteren Takt wird nun eine Instruktion abgearbeitet, und die nächste geladen (jaja, vereinfacht, nicht alle Instruktionen kommen mit einem Takt aus...).
Läuft der Programmcounter auf null über, wird eben da weitergemacht.
Soll das Programm in irgendeiner Form verzweigt werden, muß (mit einer entsprechenden Instruktion) eben die entsprechende Adresse in den Programmcounter geladen werden.
Ich hatte oben bereits die Instruktion NOP angedeutet - hier mal eine Zusammenfassung aller Instruktionen - was kann so'ne AVR-CPU eigentlich?
Dem Instruction Set folgend beginne ich mit den
arithmetischen/logischen Operationen. Allgemein formuliert nimmt die ALU den Inhalt eines oder zweier Rechenregister, rechnet damit irgendwas, und legt das Ergebnis (meist) im ersten der beiden Register ab. Dabei werden (fast) jedesmal irgendwelche Bits im Statusregister manipuliert, die in weiteren Operationen miteinbezogen bzw ausgewertet werden können.
Also los, die ALU kann:
- zwei Register miteinander Addieren (ADD), es kann ein vorher ermittelter Überlauf (das Carry aus dem SREG) miteinbezogen werden (ADC).
- analog dazu zwei Register subtrahieren, ggf auch hier mit Carry (SUB bzw SBC)
- von einem Register eine Konstante abziehen, auch hier ggf mit Carry (SUBI, SBCI)
- auf ein Doppelregister (16bit) eine Konstante addieren (ADIW) bzw von dort subtrahieren (SBIW)
- zwei Register bitweise logisch verknüpfen (AND, OR, EOR)
- ein Register mit einer Konstante bitweise logisch verANDen (ANDI) bzw verORen (ORI)
- von einem Register das Einer- (COM) bzw Zweierkomplement (NEG) bilden
- ein Register inkrementieren (INC) bzw dekrementieren (DEC)
- zwei Register multiplizieren, und zwar beide unsigned (MUL), beide signed (MULS) oder eins singned und eines unsigned (MULSU)
- analog dazu fraktionelle Multiplikation (FMUL, FMULS, FMULSU)
- (Bei XMEGAS kann mit DES ein Iterationsschritt im Data Encryption Standard ausgelöst werden)
Hierher gehören eigentlich auch noch folgende Bit-Funktionen, die ALU kann:
- die Bits eines Registers logisch nach links (LSL) oder rechts (LSR) schieben, dabei rutscht eine null auf die leere Stelle, das rausgeschobene Bit fällt ins Carry
- statt der null kann auch das Carry auf die leere stelle gerollt werden (ROL bzw ROR)
- die Bits eines Registers arithmetisch nach rechts schieben (ASR, Integerdivision durch zwei)
Und der Vollständigkeit halber noch die drei Vergleiche - das sind in Wirklichkeit nur Subtraktionen ohne Zurückschreiben des Ergebnisses. Trotzdem wird das SREG manipuliert:
- CP vergleicht (subtrahiert) zwei Register
- CPC subtrahiert zusätzlich das Carry
- CPI subtrahiert eine Konstante vom Register
Streng genommen haben wir damit alle Instruktionen, in denen die ALU durch eine Operation Bits im SREG manipuliert.
(hinter SBR verbirgt sich in Wirklichkeit ORI, hinter CBR ANDI, CLR ist eigentlich ein EOR, SER ein LDI (also gar keine Rechenoperation, deswegen kommt auch das Zero nicht), TST ist ein AND)
Verzweigungen kommen morgen (denk ich - bitte freilassen)