PIC16F84A Mikrocontroller: Architektur, Speicher und Assembler-Befehle

InformatikAktualisiert am 12,96 KB

Zusammenfassung

Das Dokument erläutert den Aufbau des PIC16F84A-Mikrocontrollers, insbesondere Speicherorganisation, Ports und Register sowie die Grundlagen der Assemblerprogrammierung. Außerdem werden Maschinenzyklen, Verzögerungen, Unterprogramme, wichtige Befehle, Timer0, Watchdog und Interrupts behandelt. Ein Student lernt damit die wichtigsten Konzepte zur Programmierung dieses Bausteins.

Kernpunkte

  • Ein Mikrocontroller enthält CPU, Speicher, Taktgeber und Ein-/Ausgänge in einem einzigen IC.
  • Der PIC16F84A hat Flash-ROM als Programmspeicher, RAM und EEPROM als Datenspeicher und folgt der Harvard-Architektur.
  • PORTA hat 5 Bit (Adresse 05h), PORTB hat 8 Bit (Adresse 06h); TRISA und TRISB bestimmen die Pinrichtung, wobei 0 Ausgang und 1 Eingang bedeutet.
  • Ein Maschinenzyklus entspricht 4 Oszillatortakten; die meisten Befehle benötigen einen Zyklus, Sprünge zwei.
  • Die Verzögerung mit Timer0 wird berechnet als T = 4 × Tosc × Presc × (256 − Vtmr0).
  • Ein Interrupt von Timer0 erfordert, dass die Bits TOIE und GIE im INTCON-Register auf 1 gesetzt sind.
  • Der Watchdog Timer erzeugt bei Überlauf einen Reset und dient dazu, Programmabstürze zu verhindern.

Stellen Sie sich auf die Probe

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.

Herunterladen

PDF Word HTML

Häufige Fragen

Wie werden Timer0-Verzögerungen auf dem PIC16F84A berechnet?

Die Verzögerung ergibt sich aus T = 4 × Tosc × Presc × (256 − Vtmr0). Dabei ist Vtmr0 der Startwert des Timers und Presc der Vorteiler (Prescaler).

Welche Bits müssen für einen Timer0-Interrupt gesetzt werden?

Im INTCON-Register müssen die Bits TOIE (Timer0 Interrupt Enable) und GIE (Global Interrupt Enable) auf 1 gesetzt werden.

Was passiert bei einem Reset des PIC16F84A?

Ein Reset startet die Programmausführung neu, und die internen Geräte nehmen einen definierten Zustand an. Der Reset wird über den Pin MCLR ausgelöst, typischerweise durch niedrigen Pegel.

Stellen Sie sich auf die Probe

Lernkarten

Tippen Sie auf eine Karte, um die Antwort zu sehen.

Test

1. Welche Architektur besitzt der PIC16F84A?
2. Wie viele Bit hat PORTB des PIC16F84A?
3. Was bedeutet eine 1 im TRISA-Register für einen Pin?
4. Wie viele Oszillatortakte umfasst ein Maschinenzyklus beim PIC16F84A?
5. Welcher Speicher ist nicht-flüchtig und kann während der Laufzeit beschrieben werden?
6. Was bewirkt die Anweisung BTFSC f, b?
7. Welche Struktur hat der Stack laut Dokument?

Mit KI aus dem Dokument erstellte Fragen: Prüfen Sie die Antworten anhand des Textes.