PIC16F84A Mikrocontroller: Architektur, Speicher & Assembler-Befehle

Eingeordnet in Informatik

Geschrieben am in Deutsch mit einer Größe von 12,96 KB

Was ist ein Mikrocontroller?

Ein Mikrocontroller ist ein geschlossenes, programmierbares System, das ein vollständiges digitales System in einem einzigen integrierten Schaltkreis (IC) enthält. Er ist dafür vorgesehen, eine einzige, dedizierte Aufgabe zu steuern, die oft nicht verändert werden kann. Er beinhaltet die CPU, Speicher (Programm- und Daten), Taktgeber sowie periphere Ein-/Ausgänge (I/O).

Interne Architektur des PIC16F84A

Die Architektur des PIC16F84A zeichnet sich durch folgende Merkmale aus:

  • Programmspeicher: Flash ROM.
  • Datenspeicher: Unterteilt in RAM und EEPROM.
  • CPU: 8-Bit-ALU und Arbeitsregister W.
  • Ports: Zwei Ports zur Kommunikation mit der Außenwelt (PORTA, 5 Bit; PORTB, 8 Bit).
  • Programm-Zähler (PC): 13-Bit-Adressierung, die theoretisch 4K Programmworte ermöglicht.
  • Architekturtyp: Harvard-Architektur, segmentiertes RISC-Befehlssystem.
  • Speicherorganisation: Orthogonale Architektur, basierend auf Speicherbänken.

Speicherorganisation

Programmspeicher (Flash ROM)
Enthält die Anweisungen für die Anwendung. Er ist nicht-flüchtig, d.h., der Inhalt bleibt auch bei unterbrochener Stromversorgung erhalten.
RAM (Daten)
Speichert Variablen und temporäre Daten. Er ist flüchtig, d.h., die Daten gehen bei Verlust der Stromversorgung verloren.
EEPROM-Speicher
Ein nicht-flüchtiger Speicherbereich für Daten. Die Informationen bleiben auch nach einem Reset erhalten. Er ermöglicht Lese- und Schreibvorgänge während der Laufzeit.

Der Programm-Zähler (PC)

Der Programm-Zähler ist ein internes Register, das zur direkten Steuerung der Programmausführung dient. Es enthält die Adresse der nächsten auszuführenden Anweisung und wird automatisch inkrementiert, um eine lineare Ausführungsreihenfolge des Programms zu gewährleisten.

Datenspeicher (RAM)

Der RAM-Datenspeicher ist in zwei Hauptbereiche unterteilt:

  1. Special Function Registers (SFR): Dies sind die ersten Register, die jeweils einen speziellen Zweck zur Steuerung des Mikrocontrollers haben.
  2. General Purpose Registers (GPR): Dies sind Allzweck-Register, die zur temporären Speicherung von Programmdaten während der Ausführung verwendet werden können.

Speicherbänke und Adressierung

Der Datenspeicher ist in zwei Speicherbänke (Bank 0 und Bank 1) organisiert:

  • Die SFR-Register sind in Bank 0 (Adressen 00h bis 0Bh) und Bank 1 (Adressen 80h bis 8Bh) gruppiert.
  • Die GPR-Register bestehen aus 68 Positionen in Bank 0. Bank 1 bildet die GPRs von Bank 0 ab (Mapping).

Wichtige Register (Ports und Status)

PORTA (Adresse 05h, Bank 0)
5-Bit-Port (RA4:RA0) für Ein- und Ausgabe. Die Richtung der Pins wird durch das TRISA-Register gesteuert.
PORTB (Adresse 06h, Bank 0)
8-Bit-Port (RB7:RB0) für Ein- und Ausgabe. Die Richtung der Pins wird durch das TRISB-Register gesteuert.
TRISA (Adresse 85h, Bank 1)
Konfigurationsregister für Port A. Eine 0 setzt den Pin als Ausgang, eine 1 als Eingang.
TRISB (Adresse 86h, Bank 1)
Konfigurationsregister für Port B. Eine 0 setzt den Pin als Ausgang, eine 1 als Eingang.
Arbeitsregister W
Das wichtigste Register, das an den meisten Anweisungen beteiligt ist. Es befindet sich in der CPU.
STATUS Register (Adresse 03h/83h)
Die Bits (genannt Flags) zeigen den Status der letzten arithmetischen oder logischen Operation, die Ursache des Resets und das Bank-Select-Bit für den Datenspeicher an.

Programmierung und Assembler

Maschinensprache
Die einzige Sprache, die der Mikrocontroller versteht. Sie besteht aus Nullen und Einsen (Binärsystem).
Assembler (Sprache)
Sie nutzt Mnemonics (Gruppen alphanumerischer Zeichen), die Befehle darstellen.
Assembler (Programm)
Die Software, die für die Übersetzung der in Mnemonics geschriebenen Assemblersprache in den Maschinencode verantwortlich ist.

Struktur des Assembler-Codes

Code (Anweisungen)
Die zweite Spalte im Assembler-Code. Die Anweisungen werden direkt in Maschinencode übersetzt.
Operanden
Die dritte Spalte, die die Operanden der Anweisung enthält. Operanden können Konstanten, Adressen oder Labels darstellen.

Wichtige Assembler-Direktiven

EQU (Equate)
Eine Zuweisungsdirektive. EQU-Zuweisungen werden typischerweise am Anfang des Programms platziert.
ORG (Origin)
Diese Direktive weist den Assembler an, ab welcher Programmspeicheradresse der Quellcode kompiliert werden soll.
CONFIG
Diese Direktive legt die Konfiguration des Mikrocontrollers fest (z.B. Oszillator-Typ, Watchdog-Status, Code-Schutz). Beispiel: Aktivierung des Power-Up-Resets und Verwendung des Quarz-Oszillators.

Timing und Verzögerungen

Der Maschinenzyklus

Der Maschinenzyklus ist die grundlegende Zeiteinheit, die vom Mikrocontroller verwendet wird. Beim PIC16F84A entspricht ein Maschinenzyklus 4 Oszillator-Taktzyklen (4 * TOsz). Die meisten Anweisungen benötigen einen Maschinenzyklus zur Ausführung, Sprunganweisungen benötigen zwei.

Generierung von Verzögerungen (Timeouts)

Es ist oft notwendig, programmierte Verzögerungen (Timeouts) zu generieren. Dies wird typischerweise durch Unterprogramme erreicht, die auf der Wiederholung von Anweisungen basieren.

Da die Ausführungszeit jeder Anweisung bekannt ist, kann die Verzögerung berechnet werden. Hierfür muss der Startwert eines Zählregisters (z.B. R_ContA) ermittelt werden. Die Formel zur Berechnung der Zeitverzögerung (T) unter Verwendung des Timer0 lautet:

$$T = 4 \times T_{osc} \times Presc \times (256 - V_{tmr0})$$

Steuerungsmechanismen

Reset (Neustart)

Ein Reset verursacht einen Neustart der Ausführung, wobei die internen Geräte des Mikrocontrollers einen definierten Zustand annehmen. Der Reset-Pin des Mikrocontrollers, genannt Master Clear (MCLR), wird typischerweise durch eine niedrige Logik ausgelöst.

Unterprogramme (Subroutines)

Ein Unterprogramm ist ein Satz von Anweisungen, der von überall im Hauptprogramm aufgerufen werden kann. Vorteile sind die modulare Programmstruktur, die Reduzierung der Entwicklungszeit und die einfachere Fehlererkennung. Oft werden mehrere Unterprogramme in sogenannten Subroutinen-Bibliotheken bereitgestellt.

Call und Return

Die CALL-Anweisung bewirkt, dass die Programmausführung zur Routine übertragen wird. Die RETURN-Anweisung bewirkt die Rückkehr zum Hauptprogramm, wobei die Rücksprungadresse vom Stack abgerufen wird.

Wichtige PIC-Befehle (Auszug)

Arithmetische Anweisungen

Addition

ADDLW k
Addiert die Konstante k zum Inhalt des W-Registers. Das Ergebnis wird in W gespeichert. Das Carry Flag (C) wird bei einem Übertrag auf 1 gesetzt.
ADDWF f, d
Addiert den Inhalt des W-Registers zum Inhalt des Registers f. Das Ergebnis wird in W gespeichert, wenn d=0, oder in f, wenn d=1. Das Carry Flag (C) wird bei einem Übertrag auf 1 gesetzt.

Subtraktion

SUBLW k
Subtrahiert den Inhalt des W-Registers von der Konstante k (unter Verwendung des 2er-Komplements). Das Ergebnis wird in W gespeichert.
SUBWF f, d
Subtrahiert den Inhalt des W-Registers vom Inhalt des Registers f (unter Verwendung des 2er-Komplements). Das Ergebnis wird in W gespeichert, wenn d=0, oder in f, wenn d=1.

Inkrementieren und Dekrementieren

DECF f, d
Dekrementiert den Inhalt des Registers f um eins. Das Ergebnis wird in W gespeichert, wenn d=0, oder in f, wenn d=1. Das Zero Flag (Z) wird auf 1 gesetzt, wenn das Ergebnis 0 ist.
INCF f, d
Inkrementiert den Inhalt des Registers f um eins. Das Ergebnis wird in W gespeichert, wenn d=0, oder in f, wenn d=1. Das Zero Flag (Z) wird auf 1 gesetzt, wenn das Ergebnis 0 ist.

Logische Anweisungen

ANDLW k
Führt eine logische UND-Verknüpfung zwischen dem Inhalt des W-Registers und der Konstante k durch. Das Ergebnis wird in W gespeichert. Das Z-Flag wird auf 1 gesetzt, wenn das Ergebnis 0 ist.
ANDWF f, d
Führt eine logische UND-Verknüpfung zwischen dem Inhalt des W-Registers und dem Inhalt des Registers f durch. Das Ergebnis wird in W gespeichert, wenn d=0, oder in f, wenn d=1. Das Z-Flag wird auf 1 gesetzt, wenn das Ergebnis 0 ist.
XORLW k
Führt eine exklusive ODER-Verknüpfung (XOR) zwischen dem Inhalt des W-Registers und der 8-Bit-Konstante k durch. Das Ergebnis wird in W gespeichert. Das Z-Flag wird auf 1 gesetzt, wenn das Ergebnis 0 ist.
XORWF f, d
Führt eine exklusive ODER-Verknüpfung (XOR) zwischen dem Inhalt des W-Registers und dem Inhalt des Registers f durch. Das Ergebnis wird in W gespeichert, wenn d=0, oder in f, wenn d=1. Das Z-Flag wird auf 1 gesetzt, wenn das Ergebnis 0 ist.
SWAPF f, d
Tauscht die oberen vier Bits (High Nibble) des Registers f mit den unteren vier Bits (Low Nibble). Das Ergebnis wird in W gespeichert, wenn d=0, oder in f, wenn d=1.

Kontrollfluss und Energiesparen

SLEEP
Diese Anweisung versetzt den PIC in den energiesparenden Leerlauf- oder Low-Power-Modus. Der Haupttakt wird angehalten.
BTFSC f, b (Bit Test File Skip if Clear)
Testet Bit b im Register f. Ist das Bit 0 (Clear), wird die folgende Anweisung übersprungen.
BTFSS f, b (Bit Test File Skip if Set)
Testet Bit b im Register f. Ist das Bit 1 (Set), wird die folgende Anweisung übersprungen.

Schleifen und Stack

Schleifen (Loops)

Schleifen sind Programmfragmente, die eine endliche oder unendliche Anzahl von Malen wiederholt werden.

  • Endlosschleife (Infinite Loop): Wird durch einen unbedingten Sprung zu einer früheren Programmposition gebildet.

Der Stack (Stapel)

Der Stack ist ein Speicherbereich, der vom Programm- und Datenspeicher getrennt ist. Er hat eine LIFO-Struktur (Last-In, First-Out) und wird verwendet, um Rücksprungadressen bei Unterprogrammaufrufen zu speichern.

Strukturierte Programmierung

Bezeichnet die Aufteilung des Hauptprogramms in Module oder Prozeduren, die spezifische Aufgaben erfüllen.

Timer, Watchdog und Interrupts

Der Timer0

Der Timer0 ist ein Überlaufzähler, der zur Bestimmung genauer Zeitpunkte dient.

  • Als Zähler (Counter): Zählt externe Impulse (Ereignisse).
  • Als Zeitgeber (Timer): Bestimmt bestimmte Zeitintervalle.

Der Prescaler (Frequenzteiler)

Der Prescaler ist eine programmierbare Schaltung, die die Taktfrequenz teilt, um längere Zeitintervalle zu realisieren und die Dauer der TMR0-Impulse zu erhöhen.

Wichtige Register für Timer/Interrupts

INTCON (Adresse 0Bh/8Bh)
Das Interrupt Control Register.
OPTION Register
Steuert das Verhalten des Timer0 und des Prescalers.

Der Watchdog Timer (WDT)

Der WDT ist ein 8-Bit-Timer, dessen Ziel es ist, einen allgemeinen Reset zu generieren, wenn er überläuft. Er dient dazu, Programmabstürze zu verhindern.

Sein Timing ist unabhängig vom Hauptoszillator und basiert auf einem internen RC-Netzwerk (ca. 18 ms), dessen Frist durch die Nutzung des Prescalers verlängert werden kann.

Polling

Polling ist eine Technik zum Lesen von Eingängen des Mikrocontrollers, bei der der Status der Eingänge zyklisch überprüft wird.

Interrupts (Unterbrechungen)

Ein Mechanismus, durch den ein Ereignis die Ausführung des Hauptprogramms unterbrechen kann. Es erfolgt ein Sprung zu einem speziellen Unterprogramm (Interrupt Service Routine, ISR), das das Ereignis behandelt.

Zur Aktivierung eines Timer0-Interrupts müssen die Bits TOIE (Timer0 Interrupt Enable) und GIE (Global Interrupt Enable) im INTCON-Register auf 1 gesetzt werden.

Verwandte Einträge: