PIC_TUT_TOPIC_IMG-1038x386

PIC-Tutorial

Vorwort

Zuletzt bearbeitet am: 28.01.2014

Bevor Ihr mit dem Programmieren bzw. mit dem Arbeiten mit PIC Mikrocontrollern anfangt, emofehle ich Euch unbedingt ein paar Grundlagen zum Aufbau eines PIC zu lernen. Keine Sorge, das ist nicht schlimm, jedoch erleichtert es das spätere Arbeiten sehr. Schaut hierfür mal bei >> Sprut vorbei.

Dieses kleine PIC-Tutorial soll Einsteigern dabei helfen über die ersten Hürden beim Arbeiten mit PIC-Mikrocontrollern hinweg zu kommen. Des Weiteren dient es als Nachschlagewerk für diverse Themengebiete des PIC.

Was ist ein Mikrocontroller?

Ein Mikrocontroller ist im Grunde genommen ein PC in klein. Und hier bedeutet klein, dass sich alles auf einem einzigen Chip befindet. Die Komponenten reichen von der CPU über die digitale sowie analoe Ein- und Ausgabe bis hin zu Zeitbausteinen (Timer). Außerdem ist alles wesentlich kleiner ausgelegt als bei einem normalen PC. So stehen einem Mikrocontroller natürlich keine GByte oder gar TByte an Speicher zur Verfügung. Ein Mikrocontroller befindet sich eher im Bereich von KByte.

Wofür braucht man Mikrocontroller?

Der Verwendungsbereich für Mikrocontroller ist imenz. Mikrocontroller sind aus unserer Welt nicht mehr weg zu denken. Heut zu Tage ist in fast jedem elektronischem Gerät ein oder mehrere µC verbaut. Nur um mal ein paar Beispiele zu nennen: Toaster, Mp3-Player, Backofen, Handy, Kamera und noch vieles mehr. Man kann mit µC viele Aufgaben erledigen, welche sonst einen sehr großen Aufwand an entsprechenden logischen Bauteilen hätten (vgl. diskreter oder gar analoger Aufbau). Daher verwenden wir µC für Steuerungen und Regelungen jeglicher Art.

Was brauche ich alles?

Um mit Mikrocontrollern, speziell PICs, arbeiten zu können, müsst Ihr ein paar Anschaffungen im Vorfeld tätigen:

1. Entwicklungsumgebung

MPLABX

Als Entwicklungsumgebung bietet sich für PIC Mikrocontroller  besonders das Programm >> MPLABX IDE an. Hier können die Programme in Assembler sowie in C geschrieben und mit einem Programmiergerät direkt in den PIC übertragen werden. Wenn Ihr beabsichtigt nur in Assembler (ASM) zu programmieren müsst Ihr euch nur die IDE herunterladen. Die Software ist direkt auf der Homepage von Microchip zu finden (siehe Link). Wenn Ihr hingegen die PICs in C programmieren wollt, so empfehle ich Euch den Compiler >> XC8 zu benutzen.

2. Programmiergerät

PICkit3

Wenn Ihr ein Programm geschrieben habt wird aus dessen Datei(n) eine Datei in Maschinensprache generiert. Diese Datei hat die Dateiendung “hex”. Die Hex-Datei muss in den PIC hinein. Diesen Vorgang bezeichnet man als brennen oder flashen. Euer Programm wird in den Speicher des PIC geschrieben. Ich empfehle Euch das PICKit3. Es ist ein Brenner und Debugger in einem. Das bedeutet Ihr könnt neben der selbstverständlichen Funktion des flashens auch noch euren PIC in der fertigen Schaltung debuggen (Haltepunkte im Programmcode setzten und Variablen auslesen). Das PICKit3 ist das Tool für Einsteiger und Fortgeschrittene! Ein weiterer nicht zu unterschätzender Vorteil des PICkit3 ist, dass es zu 100% von MPLAB (X) IDE unterstützt wird, sprich das Schreiben und Brennen geschieht alles innerhalb von MPLAB und benötigt keine weitere Software.

3. Mikrocontroller

IC_BSP

Ihr benötigt natürlich auch noch den PIC selber. Wie ich schon weiter oben erwähnt habe, würde ich für das Programmieren in C die PIC18F empfehlen. Wenn Ihr euch für Assembler entschieden habt könnt Ihr auch mit den PIC16F anfangen. Als Bezugsquelle kann ich Euch das Versandhaus Reichelt empfehlen. Hier bekommt Ihr die PICs und entsprechendes Zubehör zu moderaten Preisen.

4. Motivation

Zu guter Letzt eine ordentlich Portion Motivation. Es kann schon mal vorkommen, dass es mehrere Tage dauert bis ein Programm läuft. Manchmal rauben einen die einfachsten Dinge den letzten Nerv. Doch dann ist es um so schöner zu sehen, dass das Programm an Ende funktioniert :-)

Tipp für Anfänger

Wer es besonders einfach und schnell haben möchte, kann sich auch ein so genanntes PIC Starterkit kaufen und sofort mit dem Programmieren loslegen. Diese Variante bietet sich besonders an, wenn Ihr nicht die Möglichkeit habt zu löten bzw. keine oder nur sehr wenig Grundlagen zur Elektrotechnik habt. Nachfolgend mal eine Auflistung verschiedener Entwicklungsboards:

  • Ready for PIC von MikoElectronika*
  • PIC18F Starterkit von Microchip
  • PICKit3 Debug Express von Microchip

* Mit unter 30€ sehr günstig und ist für gewöhnlich sehr gut dokumentiert. Standardmäßig wird hier mit einem anderen C Compiler gearbeitet als ich es tue. Das bedeutet jedoch nicht, dass dies ein Nachteil sein muss.

Meine Empfehlung

Kauft Euch das >> PICKit3 Debug Express von Microchip. Ihr habt neben dem PICKit3, das Ihr auch später noch zum Debuggen und Flashen von PICs verwenden könnt, zusätzlich eine kleine Platine mit ein paar Startmöglichkeiten (LEDs, Taster, …).

PICKit3_DeEx

Damit könnt Ihr schon eine Menge anstellen und braucht euch zu Beginn nicht mit dem Aufbau der Schaltung auseinandersetzen. Schritt für Schritt! Verwendet aber lieber das neue >> MPLABX statt der alten 8er Version. Falls Ihr mal nicht weiter kommt, dann meldet Euch einfach bei uns im >> Forum.

Welcher PIC ist der richtige?

Es gibt eine sehr große Auswahl an PIC Controllern, da ist es zu Beginn erst einmal nicht so einfach den richtigen PIC zu finden. Daher solltet Ihr euch zu Beginn eurer Programmiererfahrungen erst mal nur auf wenige PIC Typen festlegen und diese studieren. In den Datenblättern findet ihr alles, was ihr zu den PICs wissen müsst. Da die Datenblätter, wie Ihr vielleicht schon vermutet habt, in Englisch geschrieben sind, werdet Ihr nicht um Englisch herum kommen. Aber vieles erklärt sich mit der Zeit auch von allein.

Hier einmal zwei PICs, welche ich zum Beginn empfehlen möchte:

PIC18F1220 (DIP Gehäuse) PIC16F628 (DIP Gehäuse)
Geeignet(er) für C Geeignet(er) für Assembler
Programmspeicher: 4K Programmspeicher: 2K
Pins: 18 Pins: 18
I/O Pins: 16 I/O Pins: 16
ADC Eingänge: 7 ADC Eingänge: 7
Timer (Anzahl): 4 Timer (Anzahl): 4
Preis bei Reichelt: 2,95 € Preis bei Reichelt: 2,40 €

Wenn Ihr später mal einen anderen PIC verwenden möchtet, vielleicht weil die Ein- und/oder Ausgänge nicht mehr ausreichen, dann könnt Ihr mal >> hier oder >> hier rein schauen. Ihr könnt dort die Anforderungen an euren PIC eintragen und bekommt die in Frage kommenden PICs aufgelistet.

Es wird gerne gesagt: “Kannst du einen PIC, kannst du alle!”. Der Spruch ist natürlich etwas überspitzt aber er trifft den Nagel doch etwas auf den Kopf. Es gibt sehr viele verschiedene PIC. Aber die Unterschiede sind in der Regel nicht so gravierend. Oftmals hat ein PIC lediglich ein, zwei Funktionen mehr als ein anderer oder ist sogar identisch bis auf einen größeren bzw. kleineren Flash Speicher.

Die Peripherie für einen PIC

Der PIC ist zwar ein hochkomplexes Bauteil, benötigt zum Arbeiten aber noch die ein oder andere Beschaltung (Peripherie). Die normalen PICs von denen ich in diesem Tutorial reden werde, arbeiten mit einer Betriebsspannung von 5 Volt Gleichspannung (DC). Weiterhin benötigt der PIC einen Takt, damit er weiß, wann er einen Schritt machen muss. Während der PIC18F1220 zum Beispiel auch ohne (externen) Takt auskommen würde, da er einen internen Oszillator mit 8 Mhz hat, braucht der PIC16F628 in jedem Fall eine Taktquelle, denn dieser PIC kann keinen eigenen Takt erzeugen. Weiterhin ist zu entscheiden, ob man dem PIC eine Resetschaltung gönnt oder man den Pin MCLRE (Master Clear Reset) als Eingang benutzt. Würde man sich dafür entscheiden, keinen Reset Schalter benutzen zu wollen, so ist der freie Pin als Eingang nutzbar (s. Datenblatt). In der Grafik ist einmal die Grundbeschaltung eines PICs angedeutet.

PIC_MINDEST

Wie ich bereits oben erwähnt habe könnte man z. B. bei dem PIC18F1220 die Beschaltung des Taktgebers (Quarz) weg lassen, da dieser einen eigenen Takt intern erzeugen kann. Das heißt es könnte XT2, C2 und C3 wegfallen. Außerdem können der Taster RES  und R1 entfallen, da wir entscheiden können ob wir einen Resetschalter brauchen oder eben nicht. Man muss hierbei beachten, dass die MCLRE Beschaltung low aktiv ist. Das heißt, dass der PIC einen Reset durchführt, wenn an dem Pin RA5 Low anliegt (TTL-Logik). Bei high arbeitet er ganz normal seinen Programmcode ab.

PICs mit in größerer Bauform haben oftmals zwei Versorgungsanschlüsse in diesem Fall müssen auch jeweils beide angeschlossen werden!

Wenn Ihr euch dafür entscheidet eine MCLRE Beschaltung nicht benutzen zu wollen müsst Ihr das immer im Programm oder in der Konfiguration angeben. Dazu komme ich aber noch, wenn wir bei der Konfiguration angekommen sind!

Achtet auch darauf, dass es PIC Typen gibt, die lediglich mit 3,3V arbeiten. Diese Typen werden auch nanoWatt oder XLP gennant.

Taktquelle

Die Taktquelle eines PIC kommt immer an seine Pins OSC1 und OSC2, sofern er extern versorgt wird. Man kann als Taktgeber verschiedene Quellen wählen. Die wichtigsten sind entweder einen normalen Quarz oder ein Keramik Resonator. In der Mindestbeschaltung (Schaltplan oben) ist ein Quarz verwendet worden. Dieser hat im Gegensatz zum Keramik Resonator den Nachteil, dass er an seinen beiden Beinen noch jeweils Lastkondensatoren benötigt. Den Wert für die Kondensatoren könnt Ihr übrigens im Datenblatt des PIC nachlesen. Der Keramikresonator hingegen hat die Kondensatoren bereits im Gehäuse und spart somit Platz. Ich empfehle Euch die Verwendung von Keramik Resonatoren. Diese haben dann drei Anschlussbeinchen; Masse (Mitte), OSC1 und OSC2. OSC1 und OSC2 können ruhig vertauscht werden.

Des weiteren kann ein PIC auch mit seinem internen Takt arbeiten. Diese Funktion steht aber nicht allen PIC zur Verfügung! Ihr könnt es heraus finden indem ihr ein Blick in das Datenblatt eures gewählten PIC werft. Wenn der PIC über einen internen Takt verfügt, so kann vollständig auf externe Beschaltung der Pins OSC verzichtet werden.

Wenn Ihr den Internen Takt nutzen wollt müsst Ihr dazu die Konfigurationsbits entsprechend einstellen. Das geht entweder manuel über den Code oder aber über Einstellungen in MPLABX IDE.

MPLABX_Configbits

Wenn man den PIC mit einem Bootloader betreiben möchte, dann muss man eine externe Taktquelle verwenden.

Programm erstellen

Ein Programm kann man auf verschiedene Weise schreiben. Grundsätzlich lassen sich Programmtexte in einem einfachen Texteditor schreiben wir werden die Entwicklungsumgebung >> MPLABX verwenden, da diese ein paar entscheidende Vorteile hat.

Grundlagen

PIC Mikrocontroller gibt es in vielen verschiedenen Sorten. Wir beschäftigen uns hier vornehmlich mit den PIC18F Typen. Nachfolgend möchte ich Euch etwas in die Grundzüge und die wichtigsten Eigenschaften der PIC Mikrocontroller einführen. Wie Ihr die PIC dann wirklich (in C) programmiert könnt Ihr dann in meinem >> PIC-C-Tutorial nachlesen.

Eingänge und Ausgänge

Das wichtigste an Mikrocontrollern sind die IOs (Input/Output), denn mit ihnen wird gesteuert und kommuniziert. Ein Mikrocontroller hat immer eine bestimmte Anzahl von IO-Pins zur Verfügung. Dabei darf man nicht den Trugschluss ziehen, dass die Anzahl der Pins gleich der Anzahl der IO-Pins ist. Dies ist nicht der Fall. PIC Mikrocontroller haben grundsätzlich ein 8 Bit breites IO-Register. Diese haben die Bezeichnung PORT-Register mit einem folgenden Buchstaben für den Port (Also PORTA – PORTE). Für den PIC ist das Register wie alle anderen. Nun kann ein Pin natürlich nicht Aus- und Eingang gleichzeitig sein sondern muss auf eines der beiden definiert werden. Dieses geschieht in den zugehörigen TRIS-Registern. Dabei entspricht eine logische “1″ (also high) einem Eingang und eine “0″ (low) einem Ausgang! Das lässt sich relativ einfach merken: Die 1 sieht ähnlich aus wie ein groß geschriebenes i und steht folglich für Input. Hierzu eine Grafik zum Veranschaulichen:

                Rx0-Rx7   
 _ _ _ _ _    
|          |-----Input-----<<   TRISx0=1
|  PORTx   |-----Input-----<<   TRISx1=1
|          |-----Input-----<<   TRISx2=1
|          |-----Input-----<<   TRISx3=1
|          |-----Output---->>   TRISx4=0
|          |-----Output---->>   TRISx5=0
|          |-----Output---->>   TRISx6=0
|_ _ _ _ _ |-----Output---->>   TRISx7=0

TRISx = 0x0F; // Rx0 .. Rx3 are Inputs

Die Ein- und Ausgänge des PIC sind TTL Pins und haben teilweise noch mehrere Funktionen, sie sind gemultiplext, werden für mehrere Funktionen verwendet. So können zum Beispiel bestimmte Eingänge auch als Analogeingang benutzt werden. Es gibt eine Vielzahl von Funktionen, die sich von PIC zu PIC unterscheiden und beim Programm berücksichtigt werden müssen. Vergisst man z. B. bei einem PIC zu Beginn die Eingänge von Analog auf Digital umzuschalten, dann funktioniert unter Umständen das Programm nicht wie man es eigentlich erwarten würde.

PIC_LASTAußerdem ist es sehr wichtig zu beachten, dass ein Pin eines Mikrocontrollers nur einen begrenzt hohen Strom liefern kann. Zum Beispiel bei einem PIC16F62x liegt dieser Wert bei 25 mA. Weiter gibt es einen Gesamt-Maximalstrom für den ganzen PIC, welcher durch die Summe der Teilströme nicht überschritten werden darf. Die Infos dazu findet Ihr im Datenblatt unter Electrical Specification.Warum dürfen große Lasten nicht direkt an den Mikrocontroller? Dieser Abschnitt sollte nicht falsch verstanden werden! Man kann eine Last schon mit einem Vorwiderstand direkt an einen IO des uC anschließen, man muss dabei aber beachten ob der Strom, den die Last braucht mit dem Strom, den der IO Treiber liefern kann in Ordnung gehen. Wenn Ihr in eurem Projekt zum Beispiel eine normale grüne/gelbe/rote LED ansteuern möchtet kann diese natürlich direkt (mit Vorwiderstand) an einen IO, da der Strombedarf gering genug ist. Aus diesem Grund schalte ich fast immer alle “Lasten” mit einem Transistor.

LEDs können unbedenklicher über einfache Treiberstufen angesteuert werden (siehe Abbildung). Wenn Ihr plant stärkere LEDs zu treiben (z.B. Hochleistungs-LEDs), welche schon mehrere Watt verbrauchen, versteht es sich von selbst, dass der PIC diesen Strom nicht liefern kann und das Augenmerk dann auf den Transistor zu lenken ist ob dieser Typ denn den Strom verkraftet.

In der Abbildung kann man eine klassische Treiberstufe um eine LED von einem Mikrocontroller aus steuern zu können sehen. Sobald der Mikrocontroller seinen Ausgang auf 5 V anhebt, also das zugehörige Port bzw. LAT*-Bit auf 1 setzt (Tris Bit auf 0 voraus gesetzt), wird die Basis positiver als die Emitter Spannung und der Transistor somit leitend. Jetzt fließt durch den Vorwiderstand und die LED Strom hindurch durch die CE Strecke gegen Masse – die LED leuchtet. Sobald der Mikrocontroller sein Potential auf Masse zieht (Low) wird die LED ausgeschaltet. Durch den µC fließt somit nur ein minimaler Strom. Wenn Ihr besonders Stromorientiert arbeiten müsst/wollt, dann könnt Ihr statt des Transistors auch einen MOSFET verwenden. Dieser wird nicht mit Strom gesteuert, wie der Transistor, sondern über Spannung.

* PIC18 verwenden LAT-Register zum Schalten von Ausgängen.

Alle PIC Typen in der Übersicht

Wir werden in diesem kleinen Tutorial, wie ich schon erwähnt habe, nur die PIC16F und die PIC18F besprechen es gibt aber noch weitaus mehr Typen. Hier mal eine Tabelle mit den verschiedenen Typen zur Übersicht:

Daten* Kern Spannung DSP
PIC10F 8 Bit 12 Bit 2,0 – 5,5V Nein
PIC12F 8 Bit 14 Bit 2,0 – 5,5V Nein
PIC16F 8 Bit 14 Bit 2,0 – 5,5V Nein
PIC18F 8 Bit 16 Bit 1,8 – 5,5V Nein
PIC24F 16 Bit 24 Bit 2,2 – 3,6V Nein
dsPIC30F 16 Bit 24 Bit 2,5 – 5,5V Ja
dsPIC33F 16 Bit 24 Bit 3,0 – 3,6V Ja
PIC32M 32 Bit 32 Bit 2,3 – 3,6V Nein

* Datenbreite

Im folgenden wollen wir mal etwas Licht ins dunkle bringen. Was bedeuten folgende Begrifflichkeiten und worauf sollte man bei der Wahl des PIC achten.

Programm- Speicher

Gibt an wie viel Speicherplatz der PIC für Befehle zur Verfügung hat. 
Hat ein PIC die Bezeichnung 4k, dann hat er 4096 Speicherplätze für Befehle mit der Größe seines Kernes.

Pins

Gibt nur an wie viel Pins der PIC insgesamt hat. Also nur eine reine Größenangabe.

I/O-Pins

Hier wird angegeben wie viele der Pins, als IOs genutzt werden können.

ADC

Gibt an wie viele Eingänge des PICs als Analog Digital Wandler eingesetzt werden können.

USART (SCI)

Serielle Schnittstelle, die sich z.B. als RS232 verwenden lässt.

SSP (MSSP)

Synchrone serielle Schnittstelle, die sich als SPI wie auch als I2C verwenden lässt.

I2C

I2C-Bus Anschluss. Dieser Anschluss ist Bestandteil der (M)SSP.

(E)CCP

Anzahl der Capture/Compare/PWM-Module. Mit diesen Modulen lassen sich Impulse Messen und Erzeugen. Außerdem können pulsweitenmodulierte Signale ausgegeben werden.

Timer

Anzahl der Timer. Ist nur 1 Timer vorhanden, handelt es sich um einen 8-Bit-Timer. 
Bei 3 Timern sind 2 davon 16-Bit breit.

nanoWatt

Stromspartechnologie

Hardware

In diesem Kapitel gehe ich auf die grundlegendsten Hardwaremodule des PIC ein und versuche diese zu erklären. Dabei versteht es sich von selbst, dass Ihr das hier gelesene nur durch ausprobieren erlernen und verfestigen könnt. Es gilt: Learning by doing. Schaut mal, auf dieser Grafik seht Ihr was zum Beispiel ein PIC18F45K22 so alles an Hardware zu bieten hat.

PIC18F45K22_BLOCK_DIAGRAMM

Quelle: http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf

Die verschiedenen Timer

Ein PIC (Typenabhängig) beinhaltet verschiedene Sorten von Timern. Was kann man mit Timern machen? Nun die Timer bieten eine große Palette an Möglichkeiten. Man kann mit ihnen zum Beispiel die Länge eines Impulses zählen, der an einem Pin des PIC anliegt. Timer werden aber auch zum Beispiel verwendet um ein Pulsweiten Moduliertes (PWM) Signal zu erzeugen. Damit lassen sich beispielsweise LEDs dimmen. Ausschlaggebend ist, dass die Timer der PIC per Software angestoßen aber dann völlig losgelöst vom PIC weiterlaufen. Und genau das ist der große Vorteil von Hardware-Timern. Der PIC brauch sich nicht weiter um den Timer kümmern, kann stattdessen andere Aufgaben erledigen. Schauen wir uns die einzelnen Timer eines PIC doch mal an:

Timer0

Dieser Timer ist bei allen PIC vorhanden. Es handelt sich hierbei um einen einfachen 8 Bit Timer. Was bedeutet 8 Bit Timer? Das bedeutet, dass dieser Timer von 0 bis 255 zählen kann. Denn ein PIC rechnet im binären Zahlensystem siehe:

Wert 2^[_] 7 6 5 4 3 2 1 0
Bit # 7 6 5 4 3 2 1 0

Der Timer0 kann auch als 16 Bit Timer verwendet werden. Außerdem hat man die Wahl zwischen Timer und Counter. Der Timer0 erhält seinen Takt entweder über den Pin RA4 oder aber er arbeitet mit ¼ des PIC Taktes. Wobei er diesen Takt durch einen Vorteiler mit bis zu 1/256, in 8 Stufen teilen kann. Der Timer0 beginnt bei 0 zu zählen und zählt bis 255 rauf. Bei einem Überlauf also wenn nach dem Zählerstand 255 wieder um eins hoch gezählt wird, wird das Bit T0IF im Register INTCON gesetzt, dies dient dazu, wenn man mit dem Überlauf des Timer0 einen Interupt erzeugen möchte, als Flag. Der aktuelle Zählstand des Timer0 steht im Register TMR0 und kann gelesen und beschrieben werden. Der Timer0 wird im T0CON Register eingestellt, siehe dazu das Datenblatt des jeweiligen PIC.

Timer0_8Bit

Quelle: http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf

Damit der Timer0 Interrupt benutzt werden kann, muss das GIE (Global interrupt enable) Bit gesetzt werden. Dies erlaubt generell Interrupts. Ist das GIE Bit gelöscht kann kein Interrupt ausgeführt werden! Der Timer0 wird mit folgenden Bits im T0CON Register eingestellt:

Bit 3 Bit 2 Bit 1 Bit 0
PSA PS2 PS1 PS0
Bit 7 BIT 6 BIT 5 BIT 4
TMR0ON T08BIT T0CS T0SE

Erklärung der einzelnen Steuerbits:

PS0-2

Mit den Bits PS0 bis PS2 wird der Vorteiler für den Timer0 eingestellt. Er lässt sich in acht Schritten einstellen. Von 1:2 bis 1:256 wobei PS2-PS0 000 einem Vorteiler von 1:2 entspricht.

PSA

Mit dem Bit PSA kann man einstellen für den der Vorteiler gelten soll. Man kann den Vorteiler entweder für den Timer0 verwenden oder für den WDT. In unserem Fall müssen Sie dieses Bit = 0 setzten, damit der Vorteiler dem Timer0 zugesprochen wird.

T0SE

Diese Option ist nur interessant, wenn Ihr den Timer0 mit einem Takt über RA4 versorgt. Mit diesem Steuerbit entscheidet Ihr wann der PIC den Timer0 um eins weiterzählen lässt. Und zwar wird zwischen dem Inkrementieren bei steigender und bei fallender Taktflanke unterschieden.

T0SC

Hier wird zwischen den beiden Taktquellen unterschieden. Interner Takt (0) oder externer Takt über RA4 (1).

T08BIT

Wird dieses Bit gesetzt arbeitet der Timer0 im 8 Bit Modus. Wenn es gelöscht wird mit 16 Bit.

TMR0ON

Der Name verrät es schon. Mit diesem Bit könnt Ihr den Timer0 starten (1) oder anhalten (0).

Der Vollständigkeit halber möchte Ihr an dieser Stelle auch noch das Blockschaltbild für den Timer0 im 16 Bit Modus zeigen.

TMR0_16_Bit

Quelle: http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf

Im 16 Bit Modus steht der Zählerstand in den Registern TMR0L und der höherwertige Teil in TMR0H.

Timer1/3/5

Die Timer1/3 und 5 sind 16 Bit Timer. Das heißt, dass diese von 0 bis 65535 zählen können. Oder in hexadezimaler Schreibweise: 0×000 bis 0xFFFF. Die Timer können ihren Zähltakt entweder über den internen Quarztakt beziehen oder aber wie der Timer0 über IO-Pin(s) (TxCKI oder SOSCI/SOSCO) des PIC. Sobald der Timer überläuft, setzt er das Bit TMRxIF im PIR1/2/5 Register, welches ein Interrupt auslösen kann. Damit die Timer überhaupt einen Interrupt auslösen können müssen die entsprechenden Enabler Bits TMRxIE im PIE1/2/5 Register gesetzt werden. Des Weiteren haben die Bits PEIE/GIEL sowie GIE/GIEH im INTCON Register einen Einfluss auf den Interrupt. Da die Timer 16 Bit Timer sind, der PIC aber nur 8 Bit Register hat, werden für das Zählen des zwei Register benötigt; Das sind die Register TMRxL und TMRxH. Im Register TMRxL steht dementsprechend der niederwertige Teil und in TMRxH der höherwertige Teil. Man kann den Zählstand jederzeit lesen oder ändern.

Die Timer werden mit folgenden Bits im Register TxCON eingestellt. Das Register findet Ihr im Datenblatt unter TxCON, da die Steuerung für die Timer1, 3 und 5 identisch ist.

Bit 3 Bit 2 Bit 1 Bit 0
TxSOSCEN TxSYNC TxRD16 TMRxON
Bit 7 Bit 6 Bit 5 Bit 4
TMRxCS1 TMRxCS0 T1CKPS1 TxCKPS0

Erklärung der einzelnen Steuerbits:

TMRxON

Das Bit schaltet den TimerX ein (1) oder aus (0).

TxRD16

Hier könnt Ihr zwischen Beschreiben der Zählerregister in einer 16 Bit Operation (1) oder in zwei 8 Bit Operationen (0) wählen.

TxSYNC

Mit diesem Bit kann eine Synchronisation des externen Taktes mit dem internen durchgeführt werden. Dieses Bit hat folglich keine Funktion, wenn der Takt nicht von extern kommt.

T1xSOSCEN

Wenn TMRxCS1 gesetzt ist, könnt Ihr zwischen Taktspeisung am TxCKI Pin (0) oder an SOSCI/SOSCO Pins (1) wählen.

TxCKPS0/1

Ähnlich wie beim Timer0 kann man dem Timer1 einen Vorteiler vorschalten, welcher den Zähltakt teilt. Der Vorteiler lässt sich in vier Stufen einstellen wobei T1CKPS0/1 = 00 einen Vorteiler von 1:1 entspricht und 11 einen Vorteiler von 1:8 zur Folge hat.

TMRxCS0/1

Mit diesen beiden Bits wählt Ihr die Quelle des Taktes für den TimerX:
00: ¼ des PIC Taktes
01: Direkt der PIC Takt ohne Teilung
10: Pin oder Oszillator (siehe TxSOSCEN)
11: Diese Einstellung wird nicht verwendet.

Die Timer können verwendet werden um den PIC aus dem Sleep-Zustand zu holen. Damit der Timer1/3/5 den PIC aufwecken kann muss er im asynchronen Modus arbeiten, sprich er bekommt seinen Takt von extern. Sobald der Timer überläuft wird der PIC geweckt.

Sekunden Basis mit Timer1 erstellen

Da man dem Timer1 einen externen Takt anschließen kann, hat man mit einem Uhrenquarz die Möglichkeit eine 1 Sekunden Basis zu schaffen. Ein Uhrenquarz wird wie der normale Taktquarz an die Taktpins T1OSO und T1OSI des PIC angeschlossen. Dann bekommt der Quarz noch pro Beinchen einen Kondensator (10pF bei dem verlinkten Typ) gegen Masse, fertig. Der Timer1 zählt nun mit einem 32,768 kHz Takt, was genau 0×8000 entspricht. Also brauch der Timer1 für einen Überlauf (Intterrupt) von 0×8000 bis zum Überlauf genau 1 Sekunde. Somit hat man den Takt für eine Uhr. Wenn der Quarz zu schnell oder zu langsam ist, kann man an dem Vorladewert, also 0×8000 justieren und somit die Zeit bis zum Interrupt beeinflussen.

Vorgehen:

1. Timer1 konfigurieren (Externen Takt
   auswählen, Syncronisation aus) [T1CON]
2. TMR1 Interrupt konfigurieren [PIE1], [IPR1]
3. Zähleregister TMR1H mit 0x80 vorladen
4. Zähleregister TMR1L löschen (ggf. anpassen
   bei Ungenauigkeiten des Uhrenquarzes)
5. In der ISR nur 1 Variable inkrementieren 
   (+ 1 Sekunde)
6. Und danach (in der ISR) die Register (TMR1H
   und TMR1L) wieder auf 0x80 und 0x00 setzten

Timer2/4/6

Die Timer2/4 und 6 sind drei identische 8 Bit Timer. Diese Timer sind wie der Timer0 wieder 8 Bit Timer allerdings mit einem Vor- und Nachteiler.

Timer2_4_6_BlockDiagramm

Quelle: http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf

Im Gegensatz zu den Timern 0 und 1/3 und 5, könenn die Timer2/4 und 6 nur über den internen PIC Takt laufen. Genauer gesagt mit 1/4 des Quarz-Taktes. Der aktuelle Zählstatus steht im TMRx Register. Genau wie bei den anderen Timern, kann der aktuelle Zählstand ausgelesen oder verändert werden.

Eine Besonderheit bei den Timern2/4 und 6 ist, dass sich der Zählwert dynamisch begrenzen lässt. Das heißt über das Register PRx kann ein (Zähl-)Wert vorgegeben werden. Der aktuelle Zählstand des TMRx Registers wird über einen Komparator mit dem Inhalt des PRx Registers verglichen. Wenn die Registerinhalte übereinstimmen startet der Timer neu zu zählen.

Die Timer2/4/6 lassen sich unter anderem auch zum Erzeugen von PWM Signalen nutzen. Dabei arbeiten sie mit dem (E)CCP-Modul zusammen. Sobald der Timer überläuft wird an das Modul ein Signal gesendet.

Die Timer werden mit folgenden Bits im Register TxCON eingestellt. Hierbei steht das “x” für den gewünschten Timer (2, 4 oder 6).

Bit 3 Bit 2 Bit 1 Bit 0
TxOUTPS0 TMRxON TxCKPS1 TxCKPS0
Bit 7 Bit 6 Bit 5 Bit 4
- TxOUTPS3 TxOUTPS2 TxOUTPS1

TxCKPS0-1

Hier kann der Vorteiler eingestellt werden. Ein Wert von '00' entspricht einem Vorteiler von 1:1. Ein Wert von '10' entspricht 1:16.

TMRxON

Mit dem Setzen dieses Bits wird der Timer gestartet. Ein löschen bedeutet, dass der Timer angehalten wird.

TxOUTPS0-3

Hier stellt Ihr den Nachteiler (Postscaler) ein. Dier reicht von 1:1 mit einer Bitkombination von '0000' bis hin zu 1:16 mit '1111'

Analog Digital Converter (ADC)

Digital ist ja schön und gut, doch manchmal brauchen wir doch das Zusammenspiel mit der Analogtechnik. Und genau dafür hat ein PIC Mikrocontroller analoge Eingänge. Wie das funktioniert möchte ich Euch nun erklären.

adu

Stellt Euch doch mal vor Ihr möchtet mit dem PIC eine Spannung messen. Diese kann zum Beispiel von einem analogen Sensor stammen. Der Wert verrät uns vielleicht die Temperatur. Oder vielleicht plant Ihr auch den Bau eines einfachen Voltmeters. Für solche Zwecke könnt Ihr die zu messende Spannung an einen anlogen Eingang des PIC klemmen. Diese haben die Bezeichnung ANx wobei das “x” durch eine Zahl ersetzt wird, die den Pin erkenntlich macht.

ADU_SPTE

Nun kann es ja auch durchaus mal vorkommen, dass Ihr Spannungen messen möchtet, die über die Betriebsspannung des PIC hinaus reichen. In dem Fall dient ein einfacher Spannungsteiler. Dieser sollte so dimensioniert sein, dass die Spannung, die letztendlich am ANx Pin anliegt nicht größer werden kann als die Betriebsspannung des PIC selber. Ein Beispiel seht Ihr im Bild links. Der Spannungsteiler teilt die Messspannung durch 2. Somit Wäre bei einer VDD Spannung von 5V eine maximale Messspannung von 10 Volt möglich. Damit Ihr als Digitalwert tatsächlich die Messspannung und nicht die herunter geteilte Spannung habt müsst Ihr nach der Messung den Teilungsfaktor des Spannungsteilers wieder zurückrechnen. In diesem Fall würdet Ihr den Wert mit 2 multiplizieren. 

Grundlegendes

Der Analog-Digital-Konverter des PIC hat eine Auflösung von 10 Bit. Ein PIC hat nur einen ADC Modul. Er kann aber von verschiedenen Pins des µC angesprochen werden. Wenn ein Eingangspin Zugriff auf den ADC hat, so wird er auch als ANx bezeichnet. Somit kann der PIC die maximale Spannung in 1024 Werte (10 Bit) einteilen – er quantisiert. Bei einer maximal zulässigen Messspannung von 5V ergibt dies eine Auflösung von circa 5 mV pro Bit.

Nun kann es ja durchaus vorkommen, dass nur ein kleiner Spannungsbereich sehr genau gemessen werden muss. Zum Beispiel werden nur 0-2 Volt als Messspannung benötigt. Man kann dem PIC mitteilen, dass die Referenzspannung für die AD-Umsetzung nicht mehr dem Standard von VDD entspricht, sondern die Referenzspannung an AN2 (VREF -) und AN3 (VREF +) des PIC entnehmen. So kann man die Auflösung (welche vorher auf den Bereich von 5V lag) nun auf einen kleineren Bereich einstellen und kann somit die Voltzahl pro Bit verringern.

Dank an Stefan, für:

Um die maximale Genauigkeit mit einem 5V-PIC zu erreichen, sind, ja nach Typ, zwischen 2,5V und 3,0V Referenzspannung mindestens notwendig (sollte als Parameter AD06 und AD06A in den elektrischen Spezifikationen aufgeführt sein).

Schauen wir uns mal an, wie der Analog Digital Wandler eines PIC konfiguriert wird. Folgende Bits im den Registern ANSEL, ADCON0 und ADCON1 sind dafür nötig:

ANSEL

Im ANSEL Register werden die gewünschten IOs ausgewählt, welche als analoge Eingänge verwendet werden sollen. Wenn ein PIC mehr Eingänge beseitzt, die analog verwendet werden können, so hat er dementsprechend auch mehrere ANSEL-Register. Diese werden dann alphabetisch geführt (ANSELA, ANSELB, . . .). Somit ist die folgende Konfiguration eher exemplarisch zu verstehen und hängt mehr vom verwendeten PIC ab.

Bit 3 Bit 2 Bit 1 Bit 0
ANS3 ANS2 ANS1 ANS0
BIT 7 BIT 6 BIT 5 BIT 4
- ANS6 ANS5 ANS4

Eine “1″ im entsprechenden Bit setzt den IO Pins als analogen Eingang. Wenn ein Pin als analoger Eingang gewählt wird, dann muss das entsprechende TRIS Bit ebenfalls auf “1″ gesetzt werden! Wird das Bit gelöscht ist ein Eingang auf digital geschaltet.

ADCON0

Im ADCON0 (A/D Control Register 0) kann das ADC Modul des PIC genrell ein-/ oder ausgeschaltet werden. Außerdem beinhaltet das Register das Statusflag des ADC. Zusätzlich werden übrige Bits zum selektieren einzelner Chanels (welche ANx soll gemessen werden) verwendet.

Bit 3 Bit 2 Bit 1 Bit 0
CHS1 CHS0 GO/DONE ADON
BIT 7 BIT 6 BIT 5 BIT 4
- CHS4 CHS3 CHS2

ADON

Dieses Bit aktiviert (1) den Umsetzer oder deaktiviert (0) ihn.

GO/DONE

Durch das setzen dieses Bits wird eine AD Umsetzung gestartet. Dieses Bit bleibt solange High, bis der PIC mit der Messung/Umsetzung fertig ist. Man muss dieses Bit also immer auf "0" prüfen,wenn man eine neue Messung starten oder die aktuelle auswerten möchte!

CHS0-4

Mit diesen Bits wird der ANx gewählt an dem die Analog-Ditial-Umsetzung stattfinden soll.

ADCON1

In diesem Register lassen sich weitere Einstellungen für den ADC treffen. So lässt sich zum Beispiel eine alternative Referenz wählen. Standardmäßig sind VDD und GND die Referenz.

Bit 3 Bit 2 Bit 1 Bit 0
PVCFG1 PVCFG0 NVCFG1 NVCFG0
Bit 7 Bit 6 Bit 5 Bit 4
TRIGSEL - - -

Schauen wir uns die einzelnen Bits mal an. . .

NVCFG0/1

Wählen der negativen Referenzspannungsquelle:
00: Intern Vss
01: Extern Vref- Pin
10: -
11: -

PVCFG0/1

Wählen der positiven Referenzspannungsquelle:
00: Intern Vdd
01: Extern Vref+ Pin
10: Intern FVR BUF2
11: -

TRIGSEL

. . .

Acquisition time

Bei der Geschwindigkeit sollte man beachten, dass der PIC genügend Zeit braucht um eine analog Messung durchzuführen, da er hierbei einen internen Kondensator auf die anliegende Spannung auflädt. So liegt es nahe, dass wenn man hier zu schnell zu Werke geht, eine fehlerhafte Messung durchgeführt wird. Im Datenblatt des PIC gibt es eine genaue Formel zur Berechnung dieser Zeit. Laut >> Sprut ist eine Zeit von ca. 40 µS ausreichend.

Das Ergebnis einer AD Konvertierung

Das 10 Bit große Ergebnis einer Analog-Digital Konvertierung steht in den beiden Registern ADRESL und ADRESH. Diese beiden Register wären ja theoretisch 16 Bit lang, da der ADC des PIC aber “nur” eine Auflösung von 10 Bit hat, steht das Ergebnis bündig. Und zwar rechts oder links-bündig! Das hängt ganz davon ab, wie wir das Bit ADFM im Register ADCON2 gesetzt haben.

ADCON2

Bit 3 Bit 2 Bit 1 Bit 0
ACQT0 ADCS2 ADCS1 ADCS0
Bit 7 Bit 6 Bit 5 Bit 4
 ADFM  -  ACQT2  ACQT1

ADCS0-2

Es findet die Wahl des AD-Taktes statt:
000: Fosc/2
001: Fosc/8
010: Fosc/32
011: Frc
100: Fosc/4
101: Fosc/16
110: Fosc/64
111: Frc

ACQT

Hier stellt Ihr die Umsetzzeit ein. Diese sollte gut bedacht gewählt werden, da eine Messung sonst schief gehen kann.
000: -
001:  2 TAD
010:  4 TAD
011:  6 TAD
100:  8 TAD
101: 12 TAD
110: 16 TAD
111: 20 TAD

ADFM

Mit diesen Bit wir ausgewählt, ob das Ergebnis in ADRESL & ADRESH (1) rechts- oder (0) links-bündig ausgegeben wird.

Interrupt mit ADC

Wenn Ihr mit dem Analog Digital Converter einen Interrupt auslösen wollt, müsst Ihr das ADIE Bit im PIE1 Register setzen. Die Priorität kann mit dem Bit ADIP im Register IPR1 gewählt werden. Das Bit ADIF ist das Interruptflag und muss wie alle Flags per Software zurück gesetzt werden. Das Bit wird gesetzt, wenn eine Messung abgeschlossen wurde. Dieser Interrupt ist übrigens auch in der Lage den PIC aus dem Sleep Modus aufzuwecken.

Capture Compare Modul / PWM

Mit dem Captuer/Compare Modul eines PIC lassen sich verschiedene Aufgaben bewältigen. Durch den Capture Eingang lässt sich der genau Zeitpunkt bestimmen, an dem ein Signal am Pin CCPx eintrifft. Der Compare Modus ist quasi das Pferd von hinten aufgezogen; Hier lässt sich am CCPx zu einem exakt bestimmten Zeitpunkt ein Signal (oder Flanke) erzeugen. Der PWM Modus hingegen eignet sich zum erstellen eines pulsweiten modulierten Signals (PWM). Während der Capture und Compare Modus den Timer1, 3 oder 5 verwenden arbeitet der PWM Modus mit dem Timer2, 4 oder 6 zusammen.

Der Unterschied ziwschen CCP und ECCP bestehtd darin, dass der letztere z. B. ein PWM Signal an mehreren Ausgägen bereit stellen kann.

Pulsweitenmodulation (PWM)

Jeder PIC18 und teilweise auch manche PIC16 besitzen das Capture, Compare, PWM (CCP) Modul mit dem man zusammen mit dem Timer2/4 oder 6 ein pulsweitenmoduliertes Signal (kurz PWM) erzeugen kann. Ich möchte Euch hier kurz erklären wie Ihr mit dem Modul umzugehen habt. Der Timer wird mit 1/4 des am PIC angeschlossenen Quarz Taktes gespeist und kann zusätzlich noch über einen Vorteiler in drei Stufen geteilt werden (1, 4, 16). Für den PWM Mode sind folgende Register von Bedeutung: Das Register CCPRxL, das TMRx und das PRx. Während der Timer immer bei 0 beginnt zu zählen wird der aktuelle Zählerstand (TMRx) immer mit dem Wert in PRx und CCPR1x verglichen. Wenn der Zählstand des Timers dem Wert in CCPRxL entspricht, dann wird der CCPx Ausgang (Pin) gelöscht, also auf Low (0V) gesetzt. Wenn der Zählwert (TMRx) dem Wert in PRx entspricht, dann wird der Ausgang auf high gesetzt und der Timer beginnt wieder von 0 an zu zählen.

PIC_PWM

Quelle: http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf

Es handelt sich hier um eine 10 Bit PWM. Der Timer2/4 und 6 und die PRx sowie CCPRxL Register sind aber nur 8 Bit groß. Daher bekommt das CCPRxL Register zwei zusätzliche Bits spendiert. Diese befinden sich im CCPxCON Register (Bit 4 und 5). Die Periode lässt sich nur mit 8 Bit einstellen  aber das Tastverhältnis kann in 10 Bit eingestellt werden.

Der Pin an dem das PWM Signal ausgegeben werden soll muss von Euch als Ausgang (Trisbit gelöscht) konfiguriert werden!

Vorgehensweise zum Nutzen des CCP Moduls zur PWM Erzeugung:

  1. Timer einstellen
  2. Periode einstellen
  3. Tastverhältnis einstellen
  4. PWM aktivieren

Formel zum Errechnen der Periodendauer:

PWM Period = [PRx + 1]*4*Tosc*(TMRx Prescale)

Formel zum Errechnen von PRx:

PRx = [ PWM_Periode / (4 x Tocs x TMxPS) ] -1

Formel zum Errechnen des Tastverhältnisses:

T = CCPRxL + CCPxCON<4:5> / PRx

Durch das verändern vom CCPRxL + CCPxCON<4:5> könnt Ihr die PWM bzw. den Tastgrad verändern. So lässt sich zum Beispiel die Hintergrundbeleuchtung für ein LCD Display in Abhängigkeit der Umgebungshelligkeit regeln.

Hier mal ein Beispiel am PIC18F45K22. Das PWM Signal wird an RC2 ausgegeben. Die Bits 4 und 5 des CCP1CON Registers wurden in diesem Beispiel vernachlässigt >> zum Beispielcode

Capture Funktion

Mit der Capture Funktion des CCP Moduls eines PIC kann man die exakte Zeit messen bis ein Pegelwechsel am CCPx Pin eintritt.

PIC_Capture_Block

Quelle: http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf

Für die Funktion wird der Timer1/3 oder 5 benötigt. Er zählt die Zeit bis das Ereignis am Pin eintritt. Natürlich muss der Timer hierfür auch entsprechend eingestellt werden. Wenn alles richtig eingestellt ist kann man mit einem der Timer messen wann sich etwas am Pin CCPx tut. Wenn es zum Beispiel zu einer steigenden Flanke am Pin kommt, wird der Zählwert des gewählten Timers in den Registern CCPRxH und CCPRxL gesichert. Welchen Timer man verwenden möchte kann man in den Registern CCPTMRS0 und CCPTMRS1 wählen. Wenn ein Capture, also ein Sichern des Zählwertes des Timers, stattgefunden hat, wird das Flag CCPxIF im Register PIR1/2 oder 4 gesetzt. Dies kann einen Interrupt auslösen.

Den CCPx Pin, den Ihr für diese Funktionalität verwenden möchtet muss als Eingang (Trisbit gesetzt) konfiguriert werden!

Für das standard CCP Modul, also nicht ECCP, ist das folgende Register entsprechend zu setzen:

CCPxCON

Bit 3 Bit 2 Bit 1 Bit 0
CCPxM3 CCPxM2 CCPxM1 CCPxM0
Bit 7 Bit 6 Bit 5 Bit 4
- - DCxB1 DCxB0

CCPxM0-3

Mit diesen Bits wird eingestellt in welchem Modus sich das CCP Modul befinden soll und ihr könnt einstellen auf welche Ereignisse das Modul reagieren soll:
[0100] Jede fallende Flanke
[0101]      steigende Flanke
[0110]      4te steigende Flanke
[0111]      16te steigende Flanke

Alle anderen Einstellungen sind nicht für den Capture Modus bestimmt.

DCxB0-1

Diese Bits werden im Capture Modus nicht benutzt

PxM0-1

Diese Bits werden im Capture Modus nicht benutzt

Compare Funktion

Das Compare-Modul ermöglicht es einem ein Signal bzw. einen Flankenwechsel am Pin CCPx zu einem bestimmten Zeitpunkt zu erzeugen. Der Pin, der für diese Aufgabe verwendet werden soll, muss auf Ausgang (Trisbit gelöscht) konfiguriert werden!

PIC_Compare_Block

Quelle: http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf

Das Modul arbeitet mit dem Timer1/3 oder dem Timer5. Es wird in dem 16 Bit Register (2×8) ein Wert vorgegeben, wenn der Zählwert des Timer diesen Wert erreicht hat wird der Flankenwechsel am Pin durchgeführt. So sind die Einstellungen zum Compare Modus, am Beispiel des PIC18F45K22 für ein Stanard-CCP (nicht ECCP) Modul einzustellen:

CCPxCON

Bit 3 Bit 2 Bit 1 Bit 0
CCPxM3 CCPxM2 CCPxM1 CCPxM0
Bit 7 Bit 6 Bit 5 Bit 4
- - DCxB1 DCxB0

CCPxM0-3

Mit diesen Bits wird eingestellt in welchem Modus sich das CCP Modul befinden soll und ihr könnt einstellen auf welche Ereignisse das Modul reagieren soll:
[1000] Pin geht nach eintreten von Low auf
       High (+CCP1IF)
[1001] Pin geht nach eintreten von High auf 
       Low (+CCP1IF)
[1010] Ausgang wird nicht verändert (+CCP1IF)
[1011] Ausgang wird nicht verändert (+CCP1IF + 
       Timer1 auf 0)

DCxB0-1

Diese Bits werden im Compare Modus nicht benutzt

PxM0-1

Diese Bits werden im Compare Modus nicht benutzt

Der Captuer Modus erzeugt natürlich auch einen Interrupt und setzte das CCPxIF Bit im PIR1/2 oder 4 Register.

Auswahl des Timers

Wie Ihr sicherlich bereits gemerkt habt, könnt Ihr jeweils verschiedene Timer für die Module verwenden. Hier muss natürlich eine Entscheidung getroffen werden. Die Wahl über den zu verwendenden Timer wird in den Registern CCPTMRS0 und CCPTMRS1  getroffen. Schauen wir uns die beiden Register mal an.

CCPTMRS0

BIT 3 BIT 2 BIT 1 BIT 0
C2TSEL0 - C1TSEL1 C1TSEL0
BIT 7 BIT 6 BIT 5 BIT 4
C3TSEL1 C3TSEL0 - C2TSEL1

Nun schauen wir uns die einzelnen Bits des Registers an.

CxTSEL0/1

Mit diesen Bits wird dem CCP-Modul ein Timer zugewiesen. Dabei reicht das x von 1-5. Hier einmal am Beispiel für das CCP1:

00: Capture/Compare: Timer1, PWM: Timer 2
01: Capture/Compare: Timer3, PWM: Timer 4
10: Capture/Compare: Timer5, PWM: Timer 6
11: -

CCPTMRS1

BIT 3 BIT 2 BIT 1 BIT 0
C5TSEL0 C5TSEL0 C4TSEL0 C4TSEL0
BIT 7 BIT 6 BIT 5 BIT 4
- - - -

Die Bits haben hier die selbe Bedeutung wie auch schon im CCPTMRS0 Register (s. oben). Nur, dass es hier um die Zuweisung für die CCP-Module 4 und 5 geht.

Stack


Die PIC18 Familie besitzt einen 32 Level großen Hardware Stack (im Vergleich haben die PIC16 lediglich einen 8 Level Stack). Der Stack ist ein sogenannter Stapelspeicher, welche das “hopping” im Programm ermöglicht. Im Stack wird bei einem Sprung zu einer Funktion/Unterprogramm die Adresse gesichert von der aus los gesprungen wurde, damit bei vollständiger Abarbeitung des Uterprogramms oder der Funktion wieder an diese Adresse zurück gesprungen werden kann. Dabei ist auch die Sichtbarkeit von Variablen zu beachten: Angenommen Ihr habt eine globale Variable namens “x” und ihr springt nun in eine Funktion und definiert hier eine neue Variable, welche ebenfalls “x” heißt, dann ist dir globale Variable für die Zeit in der Funktion unsichtbar bleibt aber erhalten und ist bei Rückkehr in die obere Ebene des Stack wieder sichtbar.

Inter-Integrated Circuit (I2C)


Sobald euer PIC ein master synchronous serial port (kurz MSSP) Modul besitzt könnt ihr damit einen I2C Bus aufbauen um damit dann ein gewünschtes Bauteil, welches selbstverständlich seinerseits auch den I2C Bus verwendet, ansprechen könnt. Der I2C Bus ist eine Bus bestehend aus zwei Leitungen: Serial clock (SCL) und Serial data (SDA). Damit der Bus unabhängig von allen Teilnehmern benutzt werden kann werden die beiden Busleitungen mit Pullup Widerständen gegen +5V gezogen. In der folgenden Tabelle sind die empfohlenen Widerstandswerte für die entsprechenden I2C-Modi:

Widerstand Mode
4,7 kOhm < 100 kbps
2,2 kOhm 100 kbps
1,0  kOhn 400 kbps
I2C_Teilnehmer_BSP

Quelle: http://www.nxp.com/documents/other/UM10204_v5.pdf

Die Namen der Leitungen sind Programm; Auf der SCL Leitung wird der Takt des Bus übertragen, welcher ausschließlich vom Master erzeugt wird. Der Slave hat lediglich die Möglichkeit den Slave seinerseits gegen Masse zu ziehen um zum Beispiel zu signalisieren, dass er mehr Zeit benötigt. Auf der SDA Leitung werden entsprechend die Datenpakete zum Slave (schreibend) oder vom Slave (lesend) übertragen.

Die einzelnen Bit eines Byte die auf dem Bus, egal ob lesend oder schreibend, übertragen werden fangen immer mit dem MSB an. Während die SCL Leitung High-Zustand hat, darf auf der SDA Leitung nichts mehr geändert werden (dies würde sonst als Befehl interpretiert). Ein Bit wird mit einem Impuls auf SCL übertragen, dazu später mehr. Ihr müsst dem PIC mitteilen mit welcher Taktgeschwindigkeit Ihr den IC2 Bus betreiben möchten, dazu ist es notwendig das Register SSPADD mit einem passenden Teilerwert zu beschreiben. Dieser errechnet sich wie folgt:

SSPAD = ( FOSC / 4*SCL ) - 1

Beispiel anhand eines SCL Taktes von 50 kHz und einem PIC Quarz von 8 MHz:

SSPAD = ( 8MHz / 4*50kHz ) - 1 = 39

Die Pullup Widerstände an SDA und SCL dürfen nicht vergessen werden. Andernfalls kann keine Kommunikation stattfinden!

Start/Stop

Die nachfolgende Grafik zeigt eine Start- und Stop-Sequenze auf dem I2C Bus. Schauen wir uns mal an was es damit auf sich hat.

I2C_Start_Top

Quelle: http://www.nxp.com/documents/other/UM10204_v5.pdf

Der I2C Bus wird im wesentlichen in drei verschiedenen Geschwindigkeiten betrieben: 3,4 Mbit/s (Highspeed), 400 kHz (Fast) und mit 100 kHz (Standard). Dabei gilt es auch immer im Datenblatt der verwendeten Slaves zu beachten, welche Taktgeschwindigkeiten diese unterstützen. Zum Beispiel ist es bei einem DS1307 nicht empfehlenswert den Takt oberhalb von 100 kHz zu betreiben, da dies die absolute Grenze bei diesem Baustein ist.

Jede Aktion auf dem Bus wird vom Master gestartet über die I2C-Start Sequenz. Dazu muss sich der Master vergewissern, dass der Bus derzeit frei (SCL und SDA sind high) ist (eigentlich nur bei Multi-Master-Systemen notwendig) und beginnt dann mit seiner Arbeit. Für eine Start Sequenz zieht der Master das Potential von SDA auf low während SCL noch auf high ist. In Umgekehrter Reihenfolge ist dies eine Stop Sequenze.

Neben der Start- und Stop-Sequenze gibt es noch die Restart-Sequenze. Ein Restart kann immer dann ausgeführt werden, wenn man auch eine Stop-Sequenze ausführen dürfte. Verwendet wird der Restart um den Bus nach dem Beenden des aktuellen Transfers zu halten. Vom Effekt her hat der Restart die selbe Auswirkung wie ein Start.

Adressierung

Hat ein Master erst einmal eine Start Sequenz auf dem Bus eingeleitet werden alle am Bus angeschlossenen Slaves hellhörig und wollen nun wissen an wen sich der Master richtet. Dafür überträgt der Master nun eine 7 Bit lange Adresse, welche eindeutig einen der am Bus angeschlossenen Slaves entspricht. Alle anderen interessieren sich nun nicht mehr für die Daten. Das 8. Bit des Adressbytes ist das Richtungsbit. Dieses sagt aus ob der Master Daten zum Slave schicken möchte (0) oder ob er Daten vom Slave haben möchte (1). Da die Adresse auf 7 Bit begrenzt ist folgt, dass sich 128 Teilnehmer* am Bus befinden können.

* Es gibt einen 10 Bit Adressmodus

Acknowledge (ACK)

Nachdem 8 Bits übertragen wurden folgt ein ACK oder NACK. Dabei handelt es sich also um das 9. Bit der Übertragung. Das ACK Bit ist low aktiv. Die nachfolgende Grafik zeigt ein ACK auf dem I2C Bus.

I2C_Kommunikation

Quelle: http://www.nxp.com/documents/other/UM10204_v5.pdf

Beispiel: Wenn sich nun ein Slave durch Übereinstimmung der Adresse angesprochen fühlt quittiert er dieses mit einer ACK Sequenz (Acknowledge). Die Datenpakete (Bytes [Bits]), welche dem Adressierungsbyte folgen müssen ebenfalls mit einem ACK vom Slave bestätigt werden. Folgt auf ein gesendetes Byte ein NACK ist die Übertragung fehlgeschlagen und der Master muss die Übertragung des Bytes wiederholen. Ein ACK sieht auf dem Bus so aus: Der Master überträgt mit 8 Impulsen auf SCL die einzelnen Bit des Byte auf SDA (angefangen mit MSB) und erzeugt im Anschluss einen 9. Impuls auf SCL. Wenn der Zustand beim 9. Takt einen Low Zustand auf SDA aufweist (vom Slave auf Low gezogen, nicht vom Master!), dann ist es ein ACK. Ist der Zustand hingegen High, so ist es ein NACK.

Eine Beispielübertragung:

Wenn ein Master Daten von einem Slave erhalten möchte prüft er zunächst ob der Bus frei ist. Wenn er frei ist sendet er ein Start gefolgt von der 7 Bit Adresse des Slaves (schreibend, also Bit 0 ist 0) den er ansprechen möchte. Der Slave antwortet mit ACK. Nun sendet der Master i.d.R. eine Adresse eines Registers, das er beim Slave auslesen möchte, eine 8 Bit Adresse. De Slave quittiert mich ACK. Der Master beendet die Kommunikation mit Stop oder führt ein Restart durch. Nun schickt er erneut die Adresse des Slaves. Aber nun mit der Angabe, das er lesen möchte. Also ist das Bit 0 eine 1. Der Slave antwortet wieder mit ACK. Nun beginnt der Slave die Daten, die sich an der Adresse befinden, die wir ihm zuvor mitgeteilt haben, über den Bus an den Master zu übermitteln. Je nachdem wie viele folgende Register der Master auslesen will quittiert er mit ACK. Wenn der Master genug gelesen hat beendet er mit einem NACK und folgendem Stop.

Noch ein Beispiel als Bild:

I2c_pcf8583_init

Beispiel

Schau mal >> hier in der Codesammlung vorbei. Da gibt es für den PIC18F45K22 ein Beispiel zum I2C.

Eventuell schaut Euch auch mal folgendes PDF von Microchip an (englisch) >> I2C Master Mode

Serial Peripheral Interface (SPI)

Schaut Euch ergänzend auch gerne das >> Einsteiger PDF zum SPI Bus von Microchip an. Es ist ziemlich gut erklärt.Das Serial Peripheral Interface (kurz SPI) ist ein von Motorola entwickeltes Bus-System mit einem sehr lockeren Standard für einen synchronen seriellen Datenbus, mit dem digitale Schaltungen nach dem Master-Slave-Prinzip miteinander verbunden werden können. Ein ähnliches Bus-System existiert von National Semiconductor und nennt sich Microwire.

Für den Bus sind die nachfolgend aufgeführte Leitungen notwendig an denen alle Busteilnehmer angeschlossen sind:

  • SDO (zu Englisch Serial Data Out) bzw. MISO oder SOMI (zu Englisch Master in, Slave out)
  • SDI (zu Englisch Serial Data In) bzw. MOSI oder SIMO (zu Englisch Master out, Slave in)
  • SCK (zu Englisch Serial Clock) bzw. SCLK, wird vom Master ausgegeben

Zusätzlich wird für jeden am Bus angeschlossenen Slave eine weitere Leitung benötigt. Diese Leitung wird ¬Slave select (kurz ¬SS) genannt und ist in den meisten Fällen low aktiv. Das bedeutet, dass wenn der Master eine ¬SS-Leitung auf low zieht, dann ist dieser Slave angesprochen und reagiert auf folgende Daten. Die SS Leitung kann durch jeden beliebigen I/O des PIC realisiert werden. Da der SPI Bus, wie zu Beginn dieses Abschnitts bereits erwähnt, sehr locker definiert ist, sind viele Parameter frei konfigurierbar. Das war auch einer der Gründe weshalb sich dieses Bussystem so weit verbreitet hat.

Der SPI Bus beim PIC

Viele PIC unterstützen die Verwendung des SPI Bus. Dafür werden entsprechende Module zur Verfügung gestellt. Es kann entweder das SSP oder das MSSP Modul verwendet werden. Eine Datenübertragung findet logischerweise nur statt, wenn der Clock aktiv ist. Wobei wir auch bei einem weiteren wichtigem Punkt sind: Der Takt auf der SCK Leitung wird ausschließlich vom Master generiert. Um das SPI bzw. das SSP/MSSP Modul nutzen zu können ist es vorweg nötig das Modul entsprechend zu konfigurieren. Das zuständige Register ist das SSPCON Register:

  • SSPOV: Wird gesetzt wenn es einen Überlauf gab und muss vom Programmierer zurück gesetzt werden.
  • SSPEN: Ein-/ Ausschalten (Strom sparen) des SSP-Moduls.
  • CKP: Einstellen der Takt Polarität.
  • SSPM3:SSPM0 (4 Bits):

SSPOV
Das SSPOV Bit ist der Indikator für ein eventuell aufgetretenes Überlaufen des Puffers. Nachdem ein Byte empfangen wurde muss dieses aus dem Puffer (Register SSPBUF) ausgelesen werden. Wenn das nicht erfolgt, wird SSPOV gesetzt. Außerdem wird der Inhalt des Puffers nicht mehr aktualisiert, solange das Bit gesetzt ist! Das Bit muss eigenhändig wieder gelöscht werden!

SSPEN
Wie es der Name des Bits schon vermuten lässt, wird durch das setzten dieses das SSP Modul aktiviert bzw. wird es deaktiviert wenn das Bit gelöscht ist. Ein löschen des Bits und somit das deaktivieren ist empfehlenswert bei low power Anwendungen um Stro zu sparen. Es versteht sich von selbst, dass das Bit nicht gelöscht werden darf, solange das SSP Modul in Benutzung ist. CKP
Dieses Bit konfiguriert die Polarität des Taktes…

SSPM#
Die vier Bits von SSPM0 bis SSPM3 sind zuständig um den SPI Mode einzustellen. Wenn der Master Mode eingestellt ist, wird mit diesen Bits zusätzlich die Clock Frequenz geregelt. Näheres steht dann im Datenblatt eures PIC.

Ein weiteres Register, welches direkt mit dem SPI Bus bzw. mit dem SPI Bus in Bezug auf den PIC zu tun hat ist das SSPSTAT Register (Synchronous Serial Port STATus), welches den aktuellen Status des Moduls wieder spiegelt:

  • SMP: Bitte Detailbeschreibung lesen.
  • CKE: Bitte Detailbeschreibung lesen.
  • BF: Buffer full sagt, wenn eine Übertragung abgeschlossen ist.

SMP

Spi_wf_ma

Quelle: http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf

Das Bit SaMPle timing (kurz SMP) kontrolliert die Daten Absatzrate. Wenn der PIC als Slave betrieben wird muss dieses Bit durch den Programmierer gelöscht werden. Wenn Ihr dieses Bit setzt, dann werden die Daten auf SDI am Ende der Ausgabe erfasst. Ist das Bit hingegen gelöscht, so werden die Daten in der Mitte erfasst. Seht euch einfach mal die Grafik dazu an.

CKE und CKP
Das CKE Bit muss in Zusammenhang mit dem CKP Bit gesehen werden. Wenn das CKE Bit gesetzt wird, dann werden die Daten beim Wechsel des Potentials auf der SCKx Leitung von Aktiv zu Leerlauf (idle) versendet. Ist das CKE Bit gelöscht, dann beim Wechsel von Leerlauf zu Aktiv. Dies muss dann wie gesagt immer im Zusammenhang mit dem CKP Bit betrachtet werden. Es ergeben sich somit vier verschiedene Clock Modes, welche sehr schön aus der Tabelle ersichtlich sind.

SPI Mode CKP CKE
0,0 0 1
0,1 0 0
1,0 1 1
1,1 1 0

Die grün geschriebenen Parameter bzw. der grün geschriebene SPI Mode ist der am häufigsten verwendete Mode.

Spi_beispiel_pic

BF
Dieses Bit sagt aus ob eine Konversation abgeschlossen ist oder eben noch läuft. Sobald dieses Bit logisch 1 ist, muss der Puffer SSPBUF ausgelesen werden. Das Bit wird automatisch gelöscht, sobald der Puffer gelesen wurde. Nochmal: Der Puffer muss nach empfangenen Daten gelesen werden! Ist das BF Bit 1 und das SSPBUF Register wird nicht ausgelesen, wird automatisch SSPOV gesetzt.
Q: Aber wie sagt man dem PIC denn nun, was gesendet werden soll? Oder wo kann ich die empfangenen Daten her holen?
A: Das zu übertragende Byte wird in das SSPBUF Register gelegt und automatisch versendet.

Beispiel

Schaut >> hier in der Codesammlung mal vorbei. Dort gibt es ein einfaches Beispiel zum Übertragen von Daten über den SPI Bus.

Interrupts

Oftmals kommt es vor, dass der PIC auf ein bestimmtes Ereignis reagieren soll. Nun verwendet man hierfür als Anfänger gerne mal das so genannte “Polling”. Der Mikrocontroller soll, sobald am Eingang der Wahl eine Zustandsänderung eintrifft eine LED schalten. Hierfür zwei Lösungsmöglichkeiten:

Polling

Beim Polling würden wir nun in einer Schleife solange den Zustand von dem Pin abfragen, bis er den erwarteten Zustand erreicht hat und anschließend mit dem Schalten der LED fortfahren. Das ist sicherlich eine Möglichkeit, allerdings ist sie wenig Sinnvoll, da der Mikrocontroller sich ausschließlich damit beschäftigen kann den Zustand vom Port-Pin abzufragen.

Interrupt

Mit einem Interrupt wäre dieses Problem deutlich eleganter gelöst. Wir setzten gewisse Steuerbits, welche bewirken, dass sobald sich der Zustand am Eingang ändert der PIC seinen aktuellen Befehl noch ausführt und im Anschluss sofort zu einer bestimmten Adresse springt und den Code abarbeitet den er dort findet. Es wird also im Prinzip ein Unterprogramm automatisch aufgerufen. Der große Vorteil daran ist, dass wir während wir auf die Zustandsänderung am Eingang warten trotzdem parallel noch weiter arbeiten können!

Interrupt Quellen

Der PIC kann natürlich nicht nur beim Ändern des Zustandes an einem Eingang einen Interrupt auslösen. Es gibt diverse Möglichkeiten, die einen Interrupt auslösen können. Ihr könnt die Interrupt Quellen des PIC im Kapitel Device Overview im Datenblatt nachlesen. Nachfolgend ein paar Quellenbeispiele:

Interrupt on change

Dieser Interrupt wurde oben schon angesprochen. Er löst aus sobald an einem Pin ein Zustandswechsel auftritt, dabei unterscheidet man zwischen fallender und steigender Flanke des Signales.

Timer Interrupt

Dieser Interrupt wird ausgelöst, sobald ein bestimmter Timer überläuft. Spricht sobald der Zähler wieder bei 0 anfängt zu zählen wird dieser Interrupt ausgelöst.

Konfiguration von Interrupts

Natürlich funktionieren die Interrupts nicht einfach so ohne jegliches Zutun. Interrupts sind im Normalzustand deaktiviert bzw. verboten. Damit man einen Interrupt benutzen kann, muss man das entsprechende Bit setzten, welches den Interrupt zulässt. Außerdem muss man (PIC16F) das GIE Bit setzten. Dieses Bit ist das Global Interrupt Enable Bit und verbietet beim Zustand “0″ alle Interrupts. Das bedeutet jedoch nicht im Umkehrschluss, dass wenn dieses Bit gesetzt ist, dass alle Interrupts erlaubt sind. Jeder Interrupt hat ein weiteres Kontrollbit (enable Bit).

Außerdem hat jeder Interrupt ein eigenes Flag, welches das Auftreten eines INT signalisiert. Zum Beispiel wird bei einem Timer0 überlauf das Bit T0IF Bit gesetzt, somit weiß der PIC, dass der Timer0 einen Interrupt auslösen möchte, dieses wird aber nur passieren, wenn das zugehörige Enable Bit T0IE (Timer0 Interrupt Enable) Bit ebenfalls “1″ ist und zusätzlich das GIE Bit die Interrupts überhaupt zulässt.

Besonderheit bei PIC18F

Bei den PIC18F Typen werden verschiedene Interrupt Prioritäten unterschieden (Low & High). Diese haben auch zwei unterschiedliche Interrupt-Vektoren. Daher gibt es bei den PIC18F Typen auch zwei globale Enable Bits. Einmal das GIEL und das GIEH Bit. Ist das GIEL Bit auf disable, so können keine Interrupts, welche als “Low priority” deklariert sind ausgeführt werden – “high priority” Interrupts hingegen schon, sofern das GIEH Bit auf enable steht. Ist hingegen das GIEH Bit aus disable, können weder Low noch High- priorisierte Interrupts ausgeführt werden. Wir stellen also fest, dass das GIEH Bit übergreifend auch die niedrig priorisierten Interrupts sperren kann aber nicht umgekehrt! Für verschiedene Interrupt Prioritäten müsst Ihr das Bit IPEN im Register RCON setzten.

Die Priorität selbst, für die jeweiligen Interrupts kann dann im Register IPT eingestellt werden. Hier steht eine “1″ für einen Interrupt mir hoher und eine “0″ für einen mit niedriger Priorität.

Programmieren eines Interrupts

In Arbeit . . .

Das Konfigurationswort

Das Konfigurationswort eines PIC gibt spezielle Einstellungen an, welche für den PIC zum Arbeiten unabdingbar sind. Das entscheidende hierbei ist, dass der PIC dieses Wort (auch als Fuses bezeichnet) nicht selber verändern kann. Wenn die Fuses einmal beim Brennen gesetzt sind bleiben sie so. Man legt durch die Fuses grundlegende Hardware Einstellungen fest, welche angegeben werden müssen. Man kann das Konfigurationswort entweder manuell in den Programmcode eingeben, oder aber setzt die gewünschten Option in der IDE.

Erklärungen des Codes

Hier sind einmal die für den Einstieg in die PIC µC Welt wichtigsten Einstellungsmöglichkeiten in einer Tabelle aufgelistet:

Funktion Kurzbeschreibung
Taktgenerator Gibt an mit welcher Frequenzkategorie der PIC arbeitet
Power up Timer Kann einen verzögerten Start des PIC hervorrufen (sinnvoll)
Watchdog Timer Kann einen Reset auslösen, wenn der PIC abstürzt
Code protection Wer seinen Code vor Spionage schützen möchte
MCLR Hier kann die Reset Funktion deaktiviert werden (bringt einen I (Input) Pin mehr
LV Programming Kann eine Programmierung mit 5V ermöglichen (kostet einen IO-Pin)
Brown out Reset Kann einen Reset auslösen, wenn die Betriebsspannung einbricht

Taktgenerator

Bei dieser Option müssen Sie den richtigen Taktbereich auswählen, damit der PIC weiß, mit welcher Frequenz gearbeitet wird. Sie finden die Entsprechende Einstellung im Datenblatt. Hier ein Überblick:

LP 32 kHz – 200 kHz Quarz, Keramikresonator, Extern
XT 100 kHz – 4 MHz Quarz, Keramikresonator, Extern
HS 4 MHz – 20 MHz Quarz, Keramikresonator, Extern
RC 30 kHz – 4 MHz Widerstand – Kondensator Kombi

Power up Timer

Durch das aktivieren dieser Funktion startet der µC mit 72 ms Verspätung. Diese Option ist eigentlich immer Sinnvoll!

Watchdog Timer

Der Watchdog Timer ist ein weiterer Hardwaretimer, welcher den PIC resetet sobald der Timer überläuft. Ist diese Funktion aktiviert, muss der Timer in regelmäßigen Abständen gelöscht werden!

Code protection

Diese Funktion schützt Euren Programmcode vor Diebstahl. Wenn Ihr ein Programm geschrieben habt, welches Ihr nicht veröffentlichen möchtet, könnt Ihr mit dieser Funktion den Code schützen.

MCLR (Master clear reset)

Oftmals ist es ja überhaupt nicht notwendig, dass ein PIC per Tastendruck resetet werden kann. Daher kann der MCLR Pin (RA5) auch als Eingang (nur als Eingang) benutzt werden.

LV Programming

Diese Funktion ist für Einsteiger weniger Interessant. Sie ermöglicht das Brennen mit 5 anstatt 12V Programmierspannung. Geht aber auf Kosten von einem IO Pin!

Brown out Reset

Der Brown out Reset schützt den PIC davor fehlerhaft zu arbeiten, wenn ein Spannungseinbruch passiert ist. Der Brown out Reset überprüft ständig die Betriebsspannung des PIC. Sobald diese für mindestens 0,1 ms unter 4V fällt, wird ein Reset ausgelöst sobald die Spannung wieder im sicheren Bereich ist und 72 ms vergangen sind. Bei PIC18F ist die Schwelle einstellbar!

Gut zu wissen

Hier entsteht eine kleine Sammlung mit Dingen die immer wieder falsch gemacht werden bzw. zu Problemen führen. Für Hinweise per Mail oder als Kommentar unter diesem Tutorial bin ich immer dankbar.

Was ist Fosc, Tosc und Tcy

Fosc ist die Taktfrequenz der Signalquelle, die wir an unseren PIC anschließen (zum Beispiel ein Quarz). Tosc ist dementsprechend die Periodendauer der Fosc. Man errechnet Tosc mit 1/Fosc. Da ein PIC zum Bearbeiten eines Befehls 4 Taktzyklen (4*Tosc = Tcy) benötigt errechnet sich Tcy (also die Zeit zum Bearbeiten eines Befehls) durch 1/(Fosc/4) = 4*Tosc. Wieder kann man die Zeit berechnen die ein PIC mit entsprechender Taktquelle benötigt 1/Tosc.

Beispiel

An einem PIC ist ein 4 MHz Quarz angeschlossen.

Fosc = 4 MHz

Durch die Tatsache, dass der PIC vier Taktzyklen zum Abarbeiten eines Befehls benötigt ist der interne Befehlstakt 4 MHz / 4 = 1 MHz.

Tosc = 1 / Fosc = 1 / 4 MHz = 250 ns

Also benötigt der PIC zum abarbeiten eines Befehls:

Tcy = 4 * Tosc = 4 * 250 ns = 1 µs

Offene Pins am Controller

Wenn es vorkommt, dass Ihr nicht alle Pins des Mikrocontrollers braucht, dann habt ihr zwei Möglichkeiten: Ihr schaltet die Pins in der Software auf Ausgang oder Ihr legt die nicht verwendeten Pins (Eingänge) auf VSS oder VDD, damit diese ein festes Potential annehmen. Nicht verwendete Eingänge dürfen nicht offen gelassen werden. Sie können zum Schwingen führen.

Achtung bei RA4

Immer wenn Ihr den PIN RA4 eines PIC als Ausgang benutzen wollt müssen bei Euch die Alarmglocken angehen (dies bezieht sich lediglich auf PIC16F), denn dieser Pin ist bei vielen PIC16F Typen nur ein Open Drain Pin und ist somit nicht in der Lage, ohne einen extra Pull up Widerstand, sein Potential allein auf 5V zu ziehen!

In circuit seriel programming

Wer kennt das nicht: Für die Entwicklung einer Software muss der PIC mehrmals geflasht und anschließend die Software in der Schaltung getestet werden. Es ist nervtötend andauernd den PIC immer wieder aus der Fassung der Schaltung zu entnehmen, dann in die Fassung des Brenners zu stecken und dann wieder anders herum. Es gibt hierfür eine Lösung und die nennt sich In Cuircuit Seriell Programming oder kurz ICSP. Das bedeutet der PIC wird in seiner fertigen Schaltung gebrannt ohne ihn entnehmen zu müssen. Damit die ICSP Funktion benutzt werden kann müssen ein paar Vorkerungen getroffen werden:

Es werden folgende Leitungen benötigt:

  • VPP, Leitung mit der Programmierspannung
  • VDD, Leitung mit der Versorgungsspannung für PIC
  • VSS, Leitung für Masse
  • PGD, die Datenleitung zum Programmieren
  • PGC, die Taktleitung zum Programmieren

Die Leitungen werden wie folgt angeschlossen:

ICSP Leitung Anschluss am PIC
Programmierspannung [Vpp] an den PIN MCLRE
Versorgungsspannung [Vdd] an den/die Pin(s) Vdd
Masseleitung [Vss] an den/die Pin(s) Vss
Taktleitung [PGC] an den Pin RB6
Datenleitung [PGD] an den Pin RB7

Beispiel ICSP beim PICKit3

PICKit3_Con

Vorsicht, der ICSP Stecker von Sprut ist genau Spiegel verkehrt zum Microchip Stecker!

Schlusswort

Ich hoffe, dass ich Euch mit diesem kleinen Tutorial den Einstieg in die PIC-Mikrocontroller-Welt etwas versüßen konnte. Gerne könnt Ihr eure Meinung und Kritik als E-Mail oder als Kommentar im Forum abladen.