Aufbau- und Funktionsmerkmale von MikrocontrollernStrukturvergleich Eingebetteter Systeme
Mikro-Prozessor Memory
HostInter-face
MemInter-face
IDE/ATAInter-face
GrafikInter-face
PCIInter-face
USBInter-faceLANInter-face
I/O-control
Memory-control
Chip-satz
Universelles Computersystem
Prozessor-Einheit
Memory
I/O-control
AnalogEingabe
AnalogAusgabe
Dig.Ein/AusDig.Ein/Aus
Dig.Ein/Aus
SeriellEin/Aus
Mikrocontroller
Mikro-Prozessor
Memory(Hauptspeicher)
I/O-Control
Memory-Control
AnalogEingabe
AnalogAusgabe
Dig.Ein/AusDig.Ein/Aus
Dig.Ein/Aus
SeriellEin/Aus
Feldbus (z.B. PROFIBUS)
zentrale Prozessor-Einheit
dezentraleI/O-Einheiten
(racks=Rahmen)mit I/O-Modulen
Eingebetteter Industrie-Computermit Ausgliederung der I/O-Komponenten
Mikro-Pro-zes-sor
Me-mory
Ana-logEin-gabe
Ana-log
Aus-gabe
Dig.Ein/Aus
Dig.Ein/Aus
Hutschienen-Bus
Eingebetteter Industrie-Computermit kompakter Modularisierung der I/O-Komponenten
CPU
Von der Einbettungin Anlagen zur Einbettungin Geräte
Interne Mikrocontroller-Struktur
Memory
InterruptcontrolEinheit
timercontrolEinheit
ProzessorEinheit
interner Datenbus
I/O-Port A I/O-Port M
I/O-Port B I/O-Port N
...
...
Alle internen Einheiten trans-ferieren ihre Daten über einen einzigen internen Datenbus.
Signale von und zur umgebenden Schaltung wirken über Ports mit je 8 Einzelsignalen, deren Funktion (in, out, analog, digital) eingestellt werden kann.
Die Interrupt-control-Einheit ist im µC, weil die wichtigsten Interrupt-Requests im µC entstehen.
Dazu gehört besonders die Timer-control-Einheit, die zeitbezogene Ereignisse erzeugen kann.
Das Adressierungsproblem
ProgramMemory
DataMemory
InterruptcontrolEinheit
timercontrolEinheit
ProzessorEinheit
I/O-Port A I/O-Port M
I/O-Port B I/O-Port N
...
...
Nur eine einzige Einheit kann adressieren: die Prozessoreinheit.
Es wird zwischen Program-Memory und Data-Memoryunterschieden.
Im Data-I/O-Memory werden die Register des Prozessor-Register-satzes, die I/O-Register (I/O-Ports, timer-control, interrupt-control) und die Speicherzellen für die Variablen (Data Memory = RAM) zusammengefasst.Die bisher beschriebenen Merkmale gelten für alle Mikrocontroller. Die folgenden vertiefen die AVR-Architektur, speziell den ATmega169.
Die Adressierung des Data-I/O-MemoryDer Mikrocontroller ATmega169 ist ein 8Bit-Controller, d.h. die Register und die SRAM-Speicherwörter haben 8 Bit.
Bei den Standard-Prozessoren werden die Prozessor-Register nicht in den allgemeinen Adressraum eingeordnet. Das ist aber bei Mikrocontrollern sinnvoll, wie sich gleich zeigt.Die Zuordnung der I/O-Register entspricht dem memory-mapped-i/o der Standard-Prozessoren.
Die grundsätzliche Zuordnung erfasst zuerst 32 generalpurpose Register und darauf folgend eine Basisgruppe von 64 I/O-Registern. Bei diesem Typ folgt dann die Zuordnung von 160 (extended) I/O-Registern und darauf folgend 1024 Speicherwörter des internen SRAM.
Die Adressierung des Program-Memory
Immer dann, wenn die Programmablaufsteuerung mit Hilfe des Instruction-Pointer zum Memoryzugreift, gibt sie einem Auswahlsignal den Wert, der Program-Memory auswählt, sonst den Wert, der Data-I/O-Memory auswählt.
Die Trennung ist notwendig, weil Programme und Daten unterschiedlich gespeichert werden, die einen in Flash-Memories, die anderen in SRAMs.
Man muss nun nicht die Speicherwortbreite beim Befehlszugriff gleich derjenigen beim Datenzugriff machen. Tatsächlich ist hier die Wortbreite beim Zugriff zum Program-Memory 16 Bit. Die Maschinenbefehle sind 16 Bit oder 32 Bit lang, brauchen also 1 oder zwei Speicherzugriffe.
Der Adressraum umfasst 8K Adressen (13 Bit Instruction Pointer) und einen Speicherraum von 16 KByte Flash-Memory.
Flash-Memory - im System wieder programmierbar
Grundstruktur wie beim NMOS-Transistor, aber am Gate ist zwischen der Gateglasschicht(insulator) und einer zusätzlichen Glasschicht (tunnel oxide) eine Zwischenschicht eingezogen.Diese ist im Grundzustand elektrisch neutral. Beim Schreiben (program) wird der Zustand nur in den Zellen in den „geladenen“ Zustand geändert, die den zum neutralen Zustand entgegen gesetzten Zustand haben sollen. Man muss also einen Flash zuerst vollkommen löschen (erase), bevor man ihn neu programmiert. Für den Flash im ATmega169 werden 10000 Write/Erase-Zyklen angegeben.
Beim Programmieren treibt man mit Hilfe der angelegten Spannungen Elektronen in die Zwischenschicht, die dort bleiben, solange man die normalen Spannungen anlegt.
Sharp
EEPROM getrennt von Program- und Data-Memory
Außer dem nicht-flüchtigen Flash-Program-Memory gibt es noch einen nicht-flüchtigen EEPROM-Speicher von 512 Byte.
Er ist über vier spezielle I/O-Register erreichbar: das EEPROM-Control- , das EEPROM-Daten- und die beiden EEPROM-Adress-Register.
Sobald beim Speicherzugriff das EEPROM-Adressregister verwendet wird, wird das Auswahlsignal für den EEPROM-Speicher erzeugt; die Adressbits können als normale Adresssignale angelegt werden, die für den Zugriff zum Data-Memory verwendet werden.
Für das Löschen und „Programmieren“ des Flashs oder des EEPROMs werden spezielle Befehle verwendet, da die beiden Vorgänge nichts mit dem normalen Lesen oder Schreiben zu tun haben.
Im Folgenden wird das Mapping aller Basis-I/O-Register zusammengestellt.
Die Basis-I/O-Register - mapping
Stackpointer
EEPROM-Adressierung
Timer/Counter0
Serial Peripheral Interface
Prozessor-Status
Microcontroller Control Unit
Analog Comparator ControlOn Chip Debug Related Register
Die Basis-I/O-Register - mapping
Port A
Port B
Port C
Port D
Port E
Port F
Port G
Interrupt-Controller
ProgramMemory
DataMemory
InterruptcontrolEinheit
timercontrolEinheit
serialperipheralInterface
ProzessorEinheit
I/O-Port A I/O-Port C
I/O-Port DI/O-Port BI/O-Port E
I/O-Port F
AnalogDigital
I/O-Port G
Der Überblick über die Einheiten der I/O-BasisregisterATmega169
Instruction fetch
InstructionDecoder
InstructionRegister
ProgramCounter
StackPointer
GeneralpurposeRegister
XYZ
ALU
StatusRegister
ProgramFlash
Data MemorySRAM
Adressen
Daten
Processing Unit
Wenn der Instruction Pointer (hier Program Counter) die Adresse beim Speichzugriff liefert, wird der Program Flash selektiert und liefert 1 oder 2 16Bit-Wörter in das Instruction Register.
Der Instruction Decoder erzeugt die internen Steuersignale für die ausführenden Schaltungen (Adressierung der general-purpose-Register, Einstellung der arithmetisch-logischen Einheit, usw.).
Instruction execute
InstructionDecoder
InstructionRegister
ProgramCounter
StackPointer
GeneralpurposeRegister
XYZ
ALU
StatusRegister
ProgramFlash
Data MemorySRAM
Adressen
Daten
Processing Unit
1
2
3
5
4
Das Holen der Operanden erfolgt:
als Konstante aus dem Befehl (1), durch Registerauswahl aus den general purpose Registern (2),durch direkte Adressierung mit der Adresse im Befehl (3),durch indirekte Adressierung mit den Adressen in den Registern X oder Y oder Z (4),durch den Stack-Pointer (5).
Die Speicherzugriffe selektieren das Data-Memory (SRAM).
Das Ergebnis einer Operation (Ausgang der ALU) wird in den ersten Operanden transferiert.
Das Statusregister wird gemäß dem Ergebnis eingestellt.
General Purpose Registersatz
Der Entwurf des Mikrocontrollers erfolgte nach dem Prinzip des Reduced Instruction Set (RISC). Dabei werden die Befehle in ihrer Komplexität so begrenzt, dass sie möglichst in einem einzigen Prozessortakt ausgeführt werden können.
Ein wichtiger Beitrag dazu wird von der Zugriffstechnik zum Registersatz geleistet, wenn sie das Liefern des/der Operanden und die Übernahme des Ergebnisses in einem Takt schafft, was eine schaltungstechnische Optimierung bedeutet für folgende Zugriffsfälle:einen 8Bit-Operanden liefern und ein 8Bit-Ergebnis speichern, zwei 8Bit-Operanden liefern und ein 8Bit-Ergebnis speichern, zwei 8Bit-Operanden liefern und ein 16Bit-Ergebnis speichern, einen 16Bit-Operanden liefern und ein 16Bit-Ergebnis speichern.
Das bedeutet auch, dass die ALU ihre Operation in einem Takt schafft.
Die General-Purpose-Register bekommen die niederwertigen Adressen im allgemeinen Daten-I/O-Adressraum. Das bedeutet nicht, dass sie im SRAM realisiert sind. Sie sind Prozessor-Register.
General Purpose Registersatz
Die letzten Register R26 bis R31 haben zu ihrer allgemeinen Funktion noch einebesondere: sie können als 16Bit-Pointer-Register verwendet werden, um zum Data-Memory (SRAM) zuzugreifen.
Nur mit ihnen kann man zum SRAM zugreifen. Sie werden X-, Y- und Z-Register genannt.
AVR-Architektur
InstructionDecoder
InstructionRegister
ProgramCounter
StackPointer
GeneralpurposeRegister
XYZ
ALU
StatusRegister
ProgramFlash
Data MemorySRAM
Adressen
Daten
Processing Unit
InterruptUnit
SPIUnit
WatchdogTimer
AnalogComparator
I/O Modul 1
I/O Modul n
Die zentralen Funktionen werden ergänzt:
Interrrupt-Controller-Unit,Serial Peripheral Interface für einen synchronen bitseriellen Datentransfer hoher Übertragungsgeschwindigkeit,Timer-Unit für Zähler mit Takten, deren Perioden skalierbar sind, und I/O-Modulen für die digitale Ein-oder Ausgabe.
Befehlssatz des ATmega169Im Folgenden werden die wichtigsten Befehle für den ATmega169 vorgestellt. Der vollständige Befehlssatz wird in den Übungsunterlagen bereitgestellt.
Er ist eine Untermenge der Befehle, die insgesamt für die AVR-Architektur gelten.
Beim Erlernen des Befehlssatzes ist es wichtig, dass man dessen grundsätzliche Struktur erkennt und aus diesem Wissen die Befehlsform assoziiert. Dann kann man sich bei der Anwendung an das Prinzip erinnern, wenn man unsicher ist.
Also merkt man sich die grundsätzliche Gliederung in die Operationsgruppen und merkt sich dazu die Prinzipien der Adressierung, die für jede Operationsgruppe gelten.
Deshalb werden im Folgenden die Befehle in einer Matrix vorgestellt. Die Spalten geben die Operationsgruppen wieder. Diese sind in den Zeilen gemäß ihren Adressierungs-möglichkeiten gegliedert.
Die Operationen der Befehle sind englische Kürzel, die eigentlich sehr einprägsam sind. Hier wird die Funktion aber deutsch beschrieben, um die Funktion ohne Übersetzung schneller erfassen zu können.
Besonders bei den verknüpfenden Befehlen erkennt man die Ungleichartigkeit der Adressierungsmöglichkeiten. Es wäre zum Lernen einfacher, wenn (wie beim Standardprozessor) überall die gleichen Adressierungen möglich wären. Beim Controller-Entwurf hätte das sicher seine Kosten bezogen auf das RISC-Konzept gehabt. Die Ungleichartigkeit erzwingt mehr Übung, um damit sicher umzugehen.
Prägen Sie sich zuerst die Prinzipien ein, bevor Sie mit der Anwendung loslegen.
Adressierung bei Transferbefehlen
PUSH Rd2
POP Rd2
OUT port, Rd1
IN Rd, port1
MOV Rd,Rr1
Register-Register-Transfer, 0<r<31, 0<d<31, 0<port<63
SDD Rp+k6, Rd2
LDD Rd, Rp+k62
SRAM indirekt mit decrement Rpzuvor, Rp = X/Y/Z
ST Rp+, Rd2
LD Rd,Rp+2
ST Rp, Rd2
LD Rd, Rp2
STS Rd, k162
LDS Rd, k162
SRAM indirekt mit displacement-Konstante, Rp = Y/Z
SRAM indirekt mit Rp = X/Y/Z
ST –Rp, Rd2
LD Rd,-Rp2
SRAM indirekt mit increment Rphinterher, Rp = X/Y/Z
Der Befehlssatz des Mikrocontrollers ist darauf ausgelegt, dass man mit den internen Registern arbeitet. Man erkennt bei jedem Befehl rechts unten die Taktzahl, die der Befehl benötigt. Wenn das SRAM nicht beteiligt ist bzw. keine 16Bit-Operation verwendet wird, braucht ein Befehl nur einen Taktzyklus.Was man bei Standardprozessoren als wichtiges Merkmal hat (nämlich die Flexibilität beim Adressieren), ist hier nicht gefragt. Hier geht es u.a. um einfach verifizierbare kurze Ablaufzeiten, die man anhand von Befehl-Abzählen = Takt-Abzählen feststellen kann.Variable im SRAM müssen für die Verarbeitung mit einem Ladebefehl gezielt in ein Register geladen werden bzw. nach der Verarbeitung aus dem Register in das SRAM gespeichert werden. LD für Load, ST für Store,0<k16<65535,0<k6<63.
SRAM direkt
Funktion der Transferbefehle
lade Register Rd auf den Stack
hole Register Rd vom Stack
speichere Register Rd in das I/O-Register port
lade das I/O-Register port in das Register Rd
kopiere Register Rr in das Register Rd
speichere Register Rd indirekt adressiert in den Datenspeicher, Pointer = Rp + k6, Rp = Y/Z
dekrementiere zuerst Rp, lade dann Register Rd indirekt adressiert aus dem Datenspeicher, Pointer = Rp = X/Y/Z
speichere das Register Rd indirekt adressiert in den Datenspeicher, Pointer = Rp = X/Y/Z, inkrementiere dann Rp
speichere das Register Rd indirekt adressiert in den Datenspeicher, Pointer = Rp = X/Y/Z
speichere das Register Rd direkt adressiert in den Datenspeicher, Pointer = k16
lade Register Rd indirekt adressiert aus dem Datenspeicher, Pointer=Rp + k6,Rp =Y/Z
dekrementiere zuerst Rp, lade dann Register Rd indirekt adressiert aus dem Datenspeicher, Pointer = Rp = X/Y/Z
lade Register indirekt adressiert aus dem Datenspeicher, Pointer = Rp = X/Y/Z , inkrementiere danach Rp
lade Register Rd indirekt adressiert aus dem Datenspeicher, Pointer = Rp = X/Y/Z
lade Register Rd direkt-adressiert aus dem Datenspeicher, Pointer = k16
PUSH Rd
POP Rd
OUT port, Rd
IN Rd, port
MOV Rd,Rr
SDD Rp+k6, Rd
ST –Rp, Rd
ST Rp+, Rd
ST Rp, Rd
STS Rd, k16
LDD Rd, Rp+k6
LD Rd,-Rp
LD Rd,Rp+
LD Rd, Rp
LDS Rd, k16
Adressierung bei arithmetisch/logischen Befehlen
NEG Rd1
COM Rd1
TST Rd1
DEC Rd1
INC Rd1
Register/Registerpaar-Konstante Adressierung 24<p<30, 16<d<31, 0<K6<63, 0<K8<255
Register-Register-Adressierung, 0<d<31, 0<r<31
CPI Rd,K81
CPC Rd,Rr1
CP Rd,Rr1
EOR Rd,Rr1
SBIW Rp,K62
ADIW Rp,K62
SBC Rd,Rr1
ADC Rd,Rr1
SBCI Rd,K81
ORI Rd,K81
OR Rd,Rr1
Register-Adressierung, 0<d<31
ANDI Rd,K81
SUBI Rd,K81
AND Rd,Rr1
SUB Rd,Rr1
ADD Rd,Rr1
Die folgende Notation der Funktion legt die Verknüpfung und den Transfer des Ergebnisses fest.
Rd ← Inversion von Rd, 1-KomplementCOM RdRd ← Rd Exklusiv-ODER RrEOR Rd,RrRd ← Rd ODER K8, 0<K8<255 ORI Rd,K8
Rd UND RdTST RdRd ← Rd ODER RrOR Rd,Rr
Rd – K8, 0<K8<255 , Flags zeigen >/</= 0CPI Rd, K8
Rd ← Inversion von Rd +1, 2-Komplement
Rd ← Rd UND K8, 0<K8<255 Rd ← Rd UND Rr
Rd – Rr -C, Flags zeigen >/</= 0
Rd – Rr, Flags zeigen >/</= 0
Rd ← Rd - 1
Rd+1:Rd ← Rd+1:Rd - K6, 0<K6<63, Rp= high-Byte:low-Byte = Rd+1:Rd
Rd ← Rd – K8 -C, 0<K8<255
Rd ← Rd – K8, 0<K8<255
Rd ← Rd – Rr -CRd ← Rd - RrRd ← Rd +1
Rd+1:Rd ← Rd+1:Rd + K6, 0<K6<63, Rp= high-Byte:low-Byte = Rd+1:Rd
Rd ← Rd + Rr +CRd ← Rd + Rr
NEG Rd
ANDI Rd,K8AND Rd,Rr
CPC Rd,Rr
CP Rd,Rr
DEC Rd
SBIW Rp,K6
SBCI Rd,K8
SUBI Rd,K8
SBC Rd,RrSUB Rd,RrINC Rd
ADIW Rp,K6ADC Rd,RrADD Rd,Rr
Schieben und Multiplizieren
Register-Register-Adressierung16<d<23, 16<r<23
Register-Adressierung0<d<31
arithmeticshift right
ASR Rd1
swapnibbles
SWAP Rd1
MULSU Rd,Rrmul signed withunsigned
2
rotate rightrotate leftlogical shiftright
logical shiftleft
MULS Rd,Rrmul signed
2
ROR Rd1
MUL Rd, Rrmul unsigned
2
ROL Rd1
LSR Rd1
LSL Rd1
Adressierung bei Verzweigungsbefehlen
ICALLindirekt mit Z 3
IJMP2
RCALL k123
RJMP k122
RETI4
RET4
indirekt mit Z
relativ: -2048<k12<+2047
Unbedingte Verzweigungen
PC (16 Bit)
+
k (12Bit)
PC (16 Bit) Z (16 Bit)
Fragen: Welche Zahlendarstellung liegt der relativen Adresse zugrunde?
Worin unterscheiden sich RET und RETI?
Adressierung bei Verzweigungsbefehlen
BR xx k7 : Verzweige (Branch), wenn Bedingung xx erfüllt, nach PC ← PC + k7 +1, sonst PC ← PC + 1, -64<k<+63
xx=EQ: equalNE: not equalCS carry setCC carry clearedSH same/higherLO lowerMI minusPL plusGE greater/equal 0LT less than 0 usw. !/2
Bedingte Verzweigungen Bedingtes Überspringen eines Befehls
SBxx: Überspringe (Skip) nächsten Befehl, wenn Bedingung xx erfüllt, sonst nicht; 0<port<63, 0<b<7, 0<d<31, 0<r<31
SBRC Rd, b: Skip, wenn Bit b in Rd gleich 0SBRS Rd, b: Skip, wenn Bit b in Rd gleich1SBIC port, b: Skip, wenn Bit b in port gleich 0SBIS port, b: Skip, wenn Bit b in port gleich 1
CPSE Rd, Rr : Vergleiche durch Rd – Rr und Skip, wenn Rd = Rr
!/2/3
Ausnahmen zur normalen Ablaufsteuerung
Warten auf Interrupt-Request 1SLEEP
Watchdog Rücksetzen 1WDR
No Operation 1NOP
Setzen und Rücksetzen von Statusbits
I: Global Interrupt EnableT: Copy Storage
H: Half Carry FlagS: Sign
V: 2-Complement OverflowN: Negative
Z: ZeroC: Carry
SEi, wobei für i der Flag-Name einzusetzen ist, bedeutet: Setzen des Flags.
CLi bedeutet „Clearen“ des Flags.
Bits in Registern Setzen bzw. RücksetzenRd ← 255, alle Bits in Rd 1 setzen 1 SER Rd
Rd ← 0, alle Bits in Rd 0 setzen 1CLR Rd
0<K8<255, 16<d<31Rd ← K8 1LDI Rd,K8
Setze Bit b in port auf 0 1CBI port, b
0<port<63, 0<b<7Setze Bit b in port auf 1 1SBI port, b
Rd ← Rd UND (Inversion von K8) Setze die Bits, die in K8 1 sind, in Rd auf 0. 1
CBR Rd, K8
16<d<31, 0<K8<255Rd ← Rd ODER K8 Setze die Bits, die in K8 1 sind, in Rd auf 1. 1
SBR Rd, K8
Mikrocontroller für die Einstiegsübungen
Die ersten Übungen sollen Sie mit dem Befehlssatz vertraut machen. Dazu testen Sie die von Ihnen ent-wickelten Programme mit einem Simulator, der den Programmablauf mit allen Zustandsänderungen des Controllers und Speichers nach-bildet.
Die Simulation einer strukturell einfachen Version des Mikro-controllers, die befehlskompatibel zum ATmega169 ist, garantiert beim Test einen schnellen Überblick. Deshalb fiel die Wahl auf den AT90S2313, der alle Befehle wie vorgestellt enthält, bis auf die Multiplikationsbefehle.
Der Strukturplan gibt den Überblick: die Vereinfachung der Struktur liegt in weniger I/O-Funktionen und geringeren Speicherräumen.
StackpointerProzessor-Status
Microcontroller Control Unit
Timer/Counter0
Timer/Counter1
Timer/Counter1
Interrupt-Controller
Watchdog
Das Register-Mapping des Mikrocontrollers AT90S2313
Das Register-Mapping des Mikrocontrollers AT90S2313
EEPROM-Adressierung
Port B
Port D
UART
Analog Comparator Control
Die Zuordnung zwischen den I/O-Registern und dem Daten-I/O-Adressbereich ist für die einzelnen Typen der AVR-Architektur unterschiedlich. Die Struktur und Funktion der Register für die einzelnen Funktionseinheiten ist aber gleich. Solange man die symbolischen Namen für die Register verwendet, kann der Übersetzer die Adressen einsetzen, die für den jeweiligen Typ gelten. Ansonsten muss man sich selbst die Mühe der Anpassung machen.
Top Related