Sie sind auf Seite 1von 24

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

PICkitTM 2 Beispielprogramme
Inhaltsverzeichnis PICkitTM 2 Starter Kit...............................................................................................2 Programmieren des Targets mit Software PICkitTM 2 Programmer..................2 Programmieren des Targets in der IDE MPLAB................................................ 4 Microcontroller Ein- und Ausgabe .............................................................................5 Setzen eines Digital Ausganges.............................................................................. 5 Lesen eines Digitalen Einganges.............................................................................6 Erfassen von Analogwerten.................................................................................... 7 Ereignisgesteuertes Programmieren............................................................................9 Digitale Eingnge - Interrupt on Port Change..................................................... 9 Zugriffe auf das EEPROM....................................................................................11 Zeitgeber................................................................................................................13 Zhler.................................................................................................................... 14 Komparator............................................................................................................15 Anhang......................................................................................................................16 Configuration Bits.................................................................................................16 Taktsignal..........................................................................................................16 Reset..................................................................................................................16 Die Datei P16F690.INC........................................................................................ 17 Das HEX-Format fr Images................................................................................ 24

Lothar Kerbl

26.11.2010

Seite 1 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

PICkitTM 2 Starter Kit


Das PICkitTM 2 System besteht aus zwei Hardware Komponenten: PIC-Kit 2 Programmer (dieser ist ber USB mit dem PC verbunden) Evaluation Board (das Target-System dieses ist mit dem Programmer ber eine sechspolige Stiftleiste JP1 verbunden) Mit der Software PICkit 2 Programmer kannst du Programme in das Zielsystem laden bzw. den Inhalt des Programmspeichers des Zielsystems ansehen (und in eingeschrnktem Mae auch verndern) Wenn du ernsthaft Software fr das Targetsystem entwickeln mchtest, bentigst du die Integrierte Entwicklungsumgebunge (Integrated Developer's Environmet- IDE) MPLAB (kostenloser Download von der Homepage der Firma Microchip www.microchip.com ) Wenn du Software fr das Targetsystem entwickelst, solltest du folgende Dokumentation verfgbar haben: PIC16F690 Data Sheet (Microchip-Bezeichnung: 41262e.pdf) Zusammenstellung der symbolischen Namen fr den Microcontroller 16F690 (siehe Anhang Die Datei P16F690.INC Den Stromlaufplan des PICkit 2 Low Pin Count Demo Boards In diesem Skriptum sind alle Programmierbungen in Assembler geschrieben; eine bertragung der Programme nach C ist natrlich mglich.

Programmieren des Targets mit Software PICkitTM 2 Programmer


Mit dem Programm PICkitTM 2 Programmer und dem Programmiergert PICkitTM 2 (ber USB angeschlossen) kannst du einen Microcontrollerbaustein (z.B. den PIC16F690) einfach programmieren, wenn du das Image des Programmspeichers fr den Microcontroller in einer HEX-Datei gespeichert hast (Aufbau einer solchen Datei siehe im Anhang) und das Programmiergert mit den zur Programmierung notwendigen Pins des Microcontrollers verbindest (6 poliger Stecker am Programmiergert serielle Programmierschnittstelle), es sind dies die Microcontroller Pins VPP, VDD, GND, ICSPDAT, ICSPCLK und T1G.

Lothar Kerbl

26.11.2010

Seite 2 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

Bild 1 Das stand alone Programm zur Kommunikation zwischen PC und PICkit2 und zur Programmierung eines Microcontrollers, der ber die serielle Programmierschnittelle angeschlossen ist.

Mit Import HEX kannst du eine Datei, die ein Image fr das Target System (Zielsystem) enthlt, in ein Editorfenster laden. Das im Editorfenster gezeigte Speicherabbild kannst du mit Write Device in das Target System bertragen. Umgekehrt kannst du mit Read Device den Inhalt des Programmspeichers des Target Systems in das Editorfenster laden. Den Inhalt des Editorfensters kannst du in einer HEX-Datei abspeichern. (Export HEX) Mit dem Befehl Programmer /Verify kannst du die Gleichheit der Programme im Target System und im Editorfensters berprfen.

Die Daten, die du in den Programmspeicher des Zielsystems bertrgst, werden dort in ein FLASH-EEPROM geschrieben. Das heit das Programm bleibt auch nach dem Abschalten der Versorgungsspannung am Zielsystem erhalten.

Lothar Kerbl

26.11.2010

Seite 3 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

Programmieren des Targets in der IDE MPLAB


Wenn du ein Programm entwickelst und es gleich am Target testen mchtest, dann musst du: Das Programmiergert PICkitTM 2 an der USB-Schnittstelle anschlieenden Die integrierte Entwicklungsumgebung (IDE) MPLAB aufrufen in der IDE mit Programmer/Select Programmer / PICkit 2 das PICkit 2 auswhlen; eine Assemblerdatei mit folgenden Rahmen erstellen
#include <p16f690.inc> ;friendly names fr die CPU 16F690 __CONFIG (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF) ; ; ; ORG 0x00 ; Festlegen der Adresse fr den folgenden Programmcode

.. hier steht dein Programmcode END

Durch Einfgen der Datei P16F690.INC (Direktive #include) kannst du in deinem Source Code friendly names (wie STATUS, RP0,TRISIO,... verwenden !) Beachte die Gro- bzw. Kleinschreibung; vergleiche die in dieser Datei definierten friendly names mit den Angaben im Datenblatt der CPU 16F690 (z.B. Adressen der Special Function Registers....) Mit der __CONFIG Direktive definierst du den Inhalt der Configuration Bits. Diese Bits werden im Programmspeicher unter der Adresse 0x2007 gespeichert. Die Werte knnen whrend des Programmablaufes weder gelesen noch verndert werden. Was die einzelnen Einstellungen bedeuten, musst du in der Originaldokumentation nachlesen. Die einstellbaren Werte sind in der Datei P16F690.INC beschrieben. Die einzelnen Optionen bewirken durch & eine Und-Verknpfung der in der INC-Datei definierten Hexadezimal bzw. Binrwerte. (siehe dazu auch Anhang Configuration Bits) Beim Quickbuild werden in deinem Arbeitsverzeichnis ein Assemblerlisting und eine HEX-Datei erstellt. In der IDE stehen dir Funktionen zur Kommunikation mit dem angeschlossenen Target zur Verfgung.

Wenn die Verbindung zwischen Target und PC ber USB hergestellt ist, kannst du das Programm direkt aus der MPLAB IDE in das Target laden (Program Device). Durch Program Device wird das aktuelle Programm im Target System berschrieben. Mglicherweise wirst du zuvor Programmspeicherinhalt des Target Systems in eine HEX-Datei retten wollen. Das geschieht durch Programmer / Read Device und anschlieendes File / Export .

Lothar Kerbl

26.11.2010

Seite 4 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

Die Daten, die du in den Programmspeicher des Zielsystems bertrgst, werden dort in ein FLASH-EEPROM geschrieben. Das heit das Programm bleibt auch nach dem Abschalten der Versorgungsspannung am Zielsystem erhalten.

Microcontroller Ein- und Ausgabe


Setzen eines Digital Ausganges
Die einfachste Mglichkeit, das im Microcontroller ablaufende Programm nach auen wirken zu lassen, ist die programmierte Vorgabe eines logischen Pegels (0 oder 1) an einem der Pins des Microcontrollers. Aus dem Stromlaufplan entnehmen wir: Die Pins RC0 .. RC3 sind ber je eine Leuchtdiode und ber Vorwiderstnde (470) gegen Masse geschalten; ein aktiver Pegel 1 an einem dieser Pins bewirkt also einen Stromfluss von etwa 8mA aus dem Pin ber die Leuchtdiode und ber den Vorwiderstand gegen Masse. Dieser Strom reicht aus, um die Leuchtdiode zum Leuchten zu bringen. Wenn an einem dieser Pins ein Pegel 0 liegt, wird die entsprechende Leuchtdiode nicht leuchten.

Das Programm, um einen Ausgang auf Pegel 1 (bzw. 0) zu setzen.


#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF) org 0x000 ; Auswahl Bank 1 : bcf STATUS,RP1 ; Bit 6 im Status Register auf 0 setzen und .. bsf STATUS,RP0 ; Bit 5 im Status Register auf 1 setzen ; Definition der Richtung (Ausgang) movlw B'00000000' movwf TRISC Auswahl der Bank 0: bcf STATUS,RP1 ; Bit 6 im Status Register auf 0 setzen bcf STATUS,RP0 ; Bit 5 im Status Register auf 0 setzen ; Definition des Pegels (1-> HIGH , LED leuchtet) ; die vier LEDs sind ber die Ausgnge RC0,.., RC3 angesteuert movlw B'11111111' movwf PORTC ; Ausgang auf "1" setzen Loop: goto Loop ; Endlosschleife end

Aufgaben: Untersuche das entstehende HEX-File mit einem Editor und vergleiche es mit der Anzeige im Programm PICkit Programmer, mit dem Inhalt des Fensters Program Memory in der IDE und mit dem Ergebnis im Fenster Disassembly Listing in der MPLAB IDE. Im Disassembly Listing findest du einen Eintrag fr die Adresse 0x2007 wodurch ensteht dieser ? Lothar Kerbl 26.11.2010 Seite 5 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

Welche Unterschiede sind im HEX File, wenn die __CONFIG-Direktive nicht eingefgt wird ? Wie sieht das Flussdiagramm deines Programmes aus. Was bewirkt der letzte Befehl (GOTO Schleife), warum ist dieser Befehl notwendig ? Was geschieht, wenn anstelle der Direktive
ORG 0x00 ORG 0x10

die Direktive
verwendet wird ? Wird dadurch das Programm nach einem Reset an der Adresse 0x10 gestartet ?

Lesen eines Digitalen Einganges


Um die aktuellen logischen Pegel der Eingnge RA0 ... RA3 anzuzeigen, schreiben wir ein Programm, das diese Eingangswerte (0 oder 1) auf den Dioden DS1 ... DS4 anzeigt. Wir entnehmen aus dem Stromlaufplan: Am Pin RA0 liegt ber einen einstellbaren Spannungsteiler eine Spannung zwischen VDD und VSS. Am Pin RA1 liegt das Signal ICSPCLK (Stecker P1); dieses Signal ist whrend des Normalbetriebs aber hochohmig und beeinflusst so das Potential an diesem Pin nicht. Der Pin RA2 ist unbelegt. Der Eingang RA3 kann ber den Taster SW1 ber einen Vorwiderstand von 1k an Masse gelegt werden. Dieser Eingang kann - durch geeignete Wahl der Configuration-Bits - auch als Reset-Eingang (/MCLR) verwendet werden. Auerdem liegt an diesem Eingang whrend des Programmierens die Programmierspannung (VPP). Whrend des Normalbetriebes bei angeschlossenem Programmer sollte der Programmiergerteausgang hochohmig (weggeschalten) sein, sodass das Potential am Pin RA3 nicht durch den Programmer beeinflusst wird1. Die Pins RA0 .. RA3 sind auerdem am Stecker J1 aufgelegt
; PICkit2_2: Lesen von digitalen Eingngen, Ergebnis als LED-Muster ausgeben #include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF) org 0x000 ; PORT A - Bit 0 und Bit 3 werden als "Digital I/O" festgelegt... bsf STATUS,RP1
1

Der Eingang RA3, (an dem ber einen Widerstand auch der Taster SW1 des Demo-Boards angeschlossen ist), kann vom Programmiergert (gesteuert durch die MPLAB-IDE oder durch die Software PICkit 2 Programmer) auf 0 oder 1 gesetzt werden. Wenn du die IDE MPLAB verwendest, dann musst du um den Ausgang hochohmimg zu machen im Menupunkt Programmer / Settings die Option 3-state on Release from Reset aktivieren. Du musst natrlich auch sicherstellen, dass tatschlich ein Release from Reset durchgefhrt wird . (Menpunkt Programmer / Release from Reset).

Lothar Kerbl

26.11.2010

Seite 6 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

bcf STATUS,RP0 ; Wahl der BANK "2" (Register ANSEL) movlw B'11110110' movwf ANSEL ; Port A wird als Eingang definiert, die unteren vier Bit von Port C werden als Ausgang definiert bcf STATUS,RP1 bsf STATUS,RP0 ; Wahl der Bank "1" (Register TRISA,TRISC) movlw B'11111111' movwf TRISA movlw B'11110000' movwf TRISC ; auf "OUTPUT" setzen ; ; Umspeichern der Eingangswerte (Potentiometer und Taster von PORT A) auf die LEDs (PORT C) bcf STATUS,RP1 bcf STATUS,RP0 ; Wahl der Bank "0" (Register PORTA, PORTC) Loop: movf movwf goto end PORTA,w PORTC Loop

Fragen Wie sieht das zugehrige Flussdiagramm aus ? Warum werden Abfrage und Ausgabe in einer Schleife ausgefhrt? Wie oft wird die Schleife in einer Sekunde ausgefhrt ? Wie sieht das ESB (die Charakteristik) eines Digitalausganges fr Ausgabewert 1 (Ausgangskennlinie) eines Digitalausganges fr Ausgabewert 0 (Ausgangskennlinie) eines Digitaleinganges (Stromaufnahme, Schaltschwelle bzw. Hysterese)
aus (Datenblatt bzw. Versuch)

Erfassen von Analogwerten


Im folgenden Programm werden die beiden hchstwertigen Bits einer ADCUmsetzung an den LEDs DS0 und DS1 angezeigt. Aus dem Stromlaufplan entnehmen wir: Am Pin RA0 kann die Spannung durch das Potentiometer RP1 eingestellt werden.
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF) org 0x000 banksel TRISC movlw B'00000000' movwf TRISC ; Definiere Digital-Leitungen (LEDs) als Ausgang banksel ADCON1 movlw B'01110000'; movwf ADCON1 ; definiere Quelle fr ADC-Takt banksel TRISA bsf TRISA,0 ; Definiere RA0 als Eingang ("1") banksel ANSEL bsf ANSEL,0 ; definiere Analog Eingang auf RA0

Lothar Kerbl

26.11.2010

Seite 7 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

; ; ; Loop:

banksel ADCON0 movlw B'10000001' movwf ADCON0 ; definiere "right justified" ; Referenzspannung = VDD ; Kanal AN0 ; ADC enable

banksel ADCON0 bsf ADCON0,1 ; Starten des ADC durch Setzen des "GO"-Bits ADC_Warten: btfsc ADCON0,1 ; busy waiting, bis d. AD-Umsetzung beendet ist .. goto ADC_Warten ; ...solange das Bit "1" ist,luft die Umsetzung... ADC_Fertig: ; jetzt liegt das ADC-Ergebnis vor... movf ADRESH,w ; hchstwertige Bits der AD-Umsetzung (AD-Result) banksel PORTC movwf PORTC ; die hchstwertigen zwei Bits -> LEDs goto Loop ; .. erneut ADC-Umwandlung starten (Endlosschleife) end

Bei dem Befehl banksel (Bank selection) handelt es sich um ein sogenanntes Assemblermakro: Zur Auswahl einer Speicherbank mssen die beiden Bits RP0 und RP1 im STATUS-Register richtig gesetzt/gelscht werden (siehe die Programme zum Setzen und Lesen von Digitalen Ausgngen/Eingngen). Als Erleichterung fr den Programmierer knnen die dafr notwendigen beiden Befehle mit abgekrzter Schreibweise in den Assembler Source Code eingefgt werden. Auerdem muss der Programmierer nicht die geeignete Nummer der Registerbank nachschlagen. Im Assemblerlisting oder im Program Memory siehst du den tatschlich produzierten (Assembler) Code. Wie sieht das zu diesem Programm gehrige Flussdiagramm aus? Zwischen welchen Spannungswerten kann eine Eingangsspannung verarbeitet werden ? Welcher Strom wird von einem Digital(Analog)eingang aufgenommen ? Aus wievielen Stellen besteht das Ergebnis der AD-Umsetzung ? Wo wird dieses Ergebnis gespeichert ?

Lothar Kerbl

26.11.2010

Seite 8 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

Ereignisgesteuertes Programmieren
Digitale Eingnge - Interrupt on Port Change
Bei den ersten Microcontrollerprogrammen haben wir auf Interrupts verzichtet. Um Eingnge zu erfassen wurde die Umgebung in einer Endlosschleife dauernd abgefragt und im Kontext der Schleife wurden entsprechende Aktionen durchgefhrt. Anstelle einer dauernden Abfrage kann der Zustand der Umgebung auch durch Auslsen eines Unterbrechungsereignisses (Interrupt) und einer zugehrigen Interrupt Service Routine (ISR) vom Microcontroller bearbeitet werden. Aufgabe: Beim Drcken und Loslassen des Tasters soll ereignisgesteuert zwischen LED0 und LED1 umgeschalten werden.2
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF) ORG RESET: goto 0x0000 ;an dieser Adresse MUSS die RESET-Routine stehen STARTUP 0x0004 ;an dieser Adresse MUSS die ISR stehen ISR

ORG INTERRUPT: goto

ORG 0x0005 STARTUP: ; die folgenden Befehle werden nach dem RESET ausgefhrt. ; PORT A - Bit 0..3:"Digital I/O" Analog Funktion deaktivieren)... banksel ANSEL movlw B'11110000' movwf ANSEL ; Port A:Eingang; Port C: die unteren vier Bits: Ausgang ... banksel TRISA movlw B'11111111' movwf TRISA ; Port A ... "INPUT" movlw B'11110000' movwf TRISC ; Port C ... "OUTPUT" ; Interruptfunktionen definieren ... (INTCON ist in allen Bnken sichtbar) movlw B'00001000' ; GIE = 0, PEIE=0 ; T01E=0,INTE=0,RABIE=1; Flags lschen movwf INTCON ; "Interrupt on Change" fr RA3 und RA0 aktivieren... banksel IOCA movlw B'00001000' movwf IOCA ; Merker initialisieren ; 0x70..0x7F sind in allen Bnken gleich bcf 0x70,0 ; Merker wird spter bei jedem Interrupt "getoggelt"; ; LEDs initialisieren (LED leuchtet nach RESET) ... banksel PORTC movlw B'11110001' movwf PORTC ; ..auf Port C (LEDs) schreiben ;INTERRUPT FREIGEBEN bsf INTCON,GIE ; GIE = 1 ; Interrupts AKTIVIEREN
2

Du musst vor Ausfhrung dieses Programmes sicherstellen, dass die PICkit 2 - Hardware das Target den Reset am Eingang RA3 (/MCLR) freigibt (Programmer / Release from Reset) und in hochohmigen Zustand schaltet. (Programmer / Settings / 3state on Release from Reset )

Lothar Kerbl

26.11.2010

Seite 9 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

Schleife: ;ENDLOSSCHLEIFE sleep ; warten auf den Interrupt.... goto Schleife ; ... der Befehl NACH der ISR ;-----------------------ISR: ; das ist die Fortsetzung der INTERRUPTSERVICEROUTINE (ISR) ; der folgende Programmteil wird nur ausgefhrt, wenn durch GP3 ein ; Interrupt ausgelst wurde ; der Programmteil wird im Kontext der Interruptbearbeitung ausgefhrt btfss 0x70,0 ; Teste den "Toggle-Merker" goto IsZero ; IsOne: ; Merker ist gesetzt.... bcf 0x70,0 ; ... deshalb Merker lschen .... movlw B'11110100' ; LED-Muster einstellen ... goto Ausgabe IsZero: ; Merker ist gelscht... bsf 0x70,0 ; ... deshalb Merker setzen .... movlw B'11111000' ; LED-Muster einstellen ... Ausgabe: banksel PORTC movwf PORTC ; .. LED-Muster auf Port C schreiben ; Anstehende Interruptbedingung lschen (durch Zugriff auf Port A und RABIF:=0) movf PORTA bcf INTCON,RABIF ; erneutes Aktivieren des Interrupts RABIE:=1, GIE:=1 bsf INTCON,RABIE retfie ;damit wird automatisch GIE:=1 END

Wenn du anstelle mit dem Taster SW1 durch Aufprgen der Massepotentials auf Durch Prellen werden mehrere Interrupts den Pin RA3 den Interrupt auslst, kommt es oft vor, dass zweimal (oder sogar ausgelst. fter) umgeschalten wird. Der Grund ist Schalterprellen. Das bewirkt, dass beim Aufbringen bzw. Wegschalten des GND-Potentials mehrere aufeinanderfolgende Interrupts ausgelst werden. Jeder dieser Interrupts lst die Interrupt Service Routine (ISR) erneut aus und bewirkt damit einen Wechsel der aktivierten LED. Durch das Ausfhren einer ISR ist die Interruptbedingung noch nicht automatisch beseitigt. Wenn in einer ISR z.B. nur der Befehl RETFIE ausgefhrt wird, bleibt die Interruptbedingung bestehen, und die ISR wrde nach Ausfhren des Befehls RETFIE sofort wieder ausgefhrt werden. Der Befehl RETFIE setzt nmlich automatisch das GIE-Bit wieder auf 1 und damit sind aktivierte Interrupts wieder freigegeben. Die Interruptbedingung fr einen Interrupt on Port Change kann nur durch Zugriff auf das PORTA-Register und durch Rcksetzen des Interrupt Flags quittiert und damit zum Verschwinden gebracht werden. Das ist zum Beispiel durch folgende Befehle (die im Kontext der ISR ausgefhrt werden mssen) mglich:
movf bcf PORTA INTCON,RABIF ;Lesen oder Schreiben auf das Register GPIO ;Lschen des Interruptflags GPIF

Aufgabenstellungen: Wie lange dauert die Ausfhrung der ISR ? Zu wie viel Prozent ist die CPU zeitmig ausgelastet, wenn du annimmst, dass du zwei mal pro Sekunde den Taster bettigst. (Ausgelastet bedeutet, dass die ISR Routine ausgefhrt wird) Wie muss das Programm gendert werden, sodass nur ein Druck auf den Taster das Umschalten zwischen den beiden LEDs bewirkt. (Das Loslassen des Tasters soll ohne Wirkung bleiben)

Lothar Kerbl

26.11.2010

Seite 10 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

Wie muss das Programm gendert werden, sodass nur jeder zweite Druck auf den Taster das Umschalten zwischen den LEDs bewirkt. (Das Loslassen des Tasters soll ohne Wirkung bleiben)

Zugriffe auf das EEPROM


Das folgende Programm schaltet auf Tastendruck zwischen zwei LEDs um. Wird die Versorgungsspannung abgeschalten, so bleibt der letzte Zustand erhalten, d.h. nach erneutem Einschalten der Versorgungsspannung erscheint das LED Muster, das beim Abschalten gerade aktuell war.
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF) RESET: ORG GOTO ORG INTERRUPT: GOTO 0x0000 ;an dieser Adresse MUSS die RESET-Routine stehen STARTUP 0x0004 ;an dieser Adresse MUSS der Beginn der ISR stehen ISR

ORG 0x0005 STARTUP: ; die folgenden Befehle werden nach dem RESET ausgefhrt. ; PORT A - Bit 0..3:"Digital I/O" Analog Funktion deaktivieren)... banksel ANSEL movlw B'11110000' movwf ANSEL movlw B'00000111' ; Port A:Eingang; Port C: die unteren vier Bits: Ausgang ... banksel TRISA movlw B'11111111' movwf TRISA ; Port A ... "INPUT" movlw B'11110000' movwf TRISC ; Port C ... "OUTPUT" ; LEDs ENTSPRECHEND PERMANENTEN "MERKER" im EEPROM initialisieren ... call SchreibeLED ; Interruptfunktionen definieren ; Interruptfunktionen definieren movlw B'00001000' ; GIE = movwf INTCON ; "Interrupt on Change" fr RA3 banksel IOCA movlw B'00001000' movwf IOCA bsf Schleife: sleep goto INTCON,GIE Schleife ... (INTCON ist in allen Bnken sichtbar) 0, PEIE=0 ; T01E=0,INTE=0,RABIE=1; Flags lschen aktivieren...

; GIE: = 1 ; Interrupts aktivieren ;ENDLOSSCHLEIFE ; warten auf den Interrupt.... ; ... der Befehl NACH der ISR

;-----------------------; INTERRUPTSERVICEROUTINE ; ISR: ; das ist die Fortsetzung der INTERRUPTSERVICEROUTINE (ISR) ; der folgende Programmteil wird nur ausgefhrt, wenn durch GP3 ein ; Interrupt ausgelst wurde call AendereMerker call SchreibeLED ; ; Interruptflags lschen (durch Lesen von PORT A RABIF:=0)... banksel PORTA movf PORTA bcf INTCON,RABIF ; retfie ; GIE wird durch RETFIE auf 1 gesetzt

Lothar Kerbl

26.11.2010

Seite 11 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

;----------------------------------------; UNTERPROGRAMME ; AendereMerker: ; der Inhalt der Speicherstelle 0x00 im EEPROM wird hochgezhlt ; ; Hinweis: Da diese Routine NUR im Kontext der ISR ausgefhrt wird, ; sind die Interrupts ohnenhin sicher gesperrt; "im Normalfall" mssten ; whrend des Schreibvorganges auf das EEPROM die Interrupts gesperrt werden. ; (siehe die kursiv gedruckten auskommentierten Zeilen ; ; Lesen des Inhalts.... banksel EEADR movlw 0x00 ; Adresse im EEPROM... movwf EEADR ; ..vorgeben banksel EECON1 ; lesender Zugriff auf den EEPROM Datenspeicher bcf EECON1,EEPGD bsf EECON1,RD ; ..Zugriffsart "Lesen" von EEPROM banksel EEDAT incf EEDAT ; Erhhen des EEPROM gespeicherten Wertes ; Zurckschreiben des invertierten Wertes in den EEPROM-Datenspeicher... banksel EECON1 bcf EECON1,EEPGD bsf EECON1,WREN ; bcf INTCON,GIE ; Interrupts "im Normalfall" ab nun sperren !!! movlw 0x55 ; "required uninterruptable sequence" movwf EECON2 ; "required uninterruptable sequence" movlw 0xAA ; "required uninterruptable sequence" movwf EECON2 ; "required uninterruptable sequence" bsf EECON1,WR ; "required uninterruptable sequence" START SCHREIBEN ; bsf INTCON,GIE ; Interrupts "im Normalfall" ab nun wieder zulassen !!! bcf EECON1,WREN ; ..erneutes Starten von Schreiben verhindern ; banksel PIR2 ; .. Peripheral Interrupt-Register Warten: ; "busy waiting" bis Schreibvorgang beendet ist btfss PIR2,EEIF ; Flag testen, ob Schreibvorgang fertig ist goto Warten ; ->das Flag ist noch nicht gesetzt .. FertigGeschrieben: bcf PIR1,EEIF ; das Flag muss gelscht werden RETURN ;-----SchreibeLED: ; je nach Inhalt des Merkers banksel EEADR movlw 0x00 movwf EEADR banksel EECON1 bsf EECON1,RD banksel EEDATA movf EEDATA,w banksel PORTC movwf PORTC return end

im EEPROM wird entspr. LED-Muster eingeschalten ;Lesen aus EEPROM (EEADR, EECON1,EEDATA) ; Adresse im EEPROM... ; ; ..Zugriff "Lesen" ; Inhalt der Speicherstelle des EEPROM ... ; .. auf PORTC schreiben

In diesem Programm wird im Kontext der Interrupt Service Routine (ISR) auf das Die Warteschleife wird etwa 5ms lang ausgefhrt EEPROM geschrieben. Dieser Schreibvorgang und damit die Warteschleife (busy waiting) - dauert sehr lang (laut Originaldokumentation typisch 5ms). Dementsprechend lang dauert auch die Ausfhrung der gesamten Interrupt Service Routine (ISR). Kontrollfrage: Busy Waiting: Welcher Anteil (in %) der Ausfhrungszeit der Interrupt Service Routine wird durch Warteschleife, bis ein busy waiting auf den Abschluss des EEPROM-Schreibvorganges Ereignis eintrifft verbraucht ? Lothar Kerbl 26.11.2010 Seite 12 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

Zeitgeber
Oft bentigst du einen einfachen Frequenzgenerator. Im folgenden Programm wird durch den Zeitgeber Timer0 in regelmigen Abstnden ein Interrupt ausgelst. Die Frequenz kannst du durch Verndern des Startwertes, den du in das Register TMR0 bzw. in den Prescaler schreibst, einstellen
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF) RESET: GOTO ORG INTERRUPT: GOTO STARTUP 0x0004 ;an dieser Adresse MUSS die ISR stehen ISR

Timer: Der Interrupt wird nach einer vorgegebenen Anzahl von internen Zeitschritten ausgelst.

ORG 0x0005 STARTUP: ; die folgenden Befehle werden nach dem RESET ausgefhrt. ;ADC-Funktion fr Pins AUSschalten (siehe Dokumentation) banksel ANSEL MOVLW B'00000000' ; kein Analog Eingang MOVWF ANSEL ; ; Richtung des bentigten Digital I/O definieren banksel TRISC MOVLW B'11110000' ; MOVWF TRISC ; .. und auf das Richtungsregister schreiben ; Interruptfunktionen definieren ... banksel OPTION_REG MOVLW B'11010110' ; -;-;interner Takt;-;Prescaler f.TMR0;Prescaler Rate MOVWF OPTION_REG ; .. in das Option Register schreiben ; Merker initialisieren ... clrf 0x70 ; Merker wird spter bei jedem Interrupt weitergezhlt bcf INTCON,T0IF ; Interrupt Flag lschen bsf INTCON,T0IE ; Interrupt aktivieren bsf INTCON,GIE ; Schleife: ;ENDLOSSCHLEIFE GOTO Schleife ; SLEEP wrde Timer0 deaktivieren... ;-----------------------ISR: ; das ist die Fortsetzung der INTERRUPTSERVICEROUTINE (ISR) ; der folgende Programmteil wird ausgefhrt, wenn durch den berlauf des Timer0 ; ein Interrupt ausgelst wurde incf 0x70 movf 0x70,w ; Inhalt des Merkers . banksel PORTC movwf PORTC ; auf die LED-Anzeige schreiben ; Interruptflags lschen und Interrupts wieder "aktivieren".... banksel TMR0 clrf TMR0 ; in das Timerregister schreiben bsf INTCON,T0IE ; bcf INTCON,T0IF RETFIE ; GIE=1 end

Du kannst in der ISR den Startwert fr den Zhler natrlich jedes Mal mit einem neuen Wert initialisieren. Insbesondere kannst du fr die beiden Flle Merker ist eine gerade Zahl und Merker ist eine ungerade Zahl verschiedene Werte vorsehen, die von anderen Programmteilen beeinflusst werden knnen. So kannst du durch Programmierung deinem ausgegebenen Digitalsignal verschiedene Eigenschaften verleihen: Lothar Kerbl 26.11.2010 Seite 13 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

PFM-Signal - Frequenzmoduliertes Signal PWM-Signal - Pulsweitenmoduliertes Signal PPM-Signal - Pulsphasenmoduliertes Signal (Signalfrequenz ist konstant !)

Aufgabe: Wie muss die ISR fr ein PFM, PWM und ein PPM-Signal programmiert werden? Welche Variable mssen dabei verwendet werden? Welche Grenzfrequenzen (Maximal, Minimal) und welche Auflsungen des Tastverhlnisses bzw. der Phasenlage eines PPM-Signales sind dabei jeweils erreichbar?

Zhler
Flanken am Eingang RA2/T0CKI knnen im Register TMR0 gezhlt werden; bei berlauf des Zhlers (bergang von 0xFF auf 0x00) wird ein Interrupt ausgelst. Der Anfangswert des Zhlers (TMR0) und ein Prescaler knnen gesetzt werden gesetzt werden.
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF) RESET: GOTO ORG INTERRUPT: GOTO STARTUP 0x0004 ISR ;an dieser Adresse MUSS die ISR stehen

Counter: Der Interrupt wird nach einer vorgegebenen Anzahl von externen Zhlereignissen ausgelst.

ORG 0x0005 STARTUP: ; die folgenden Befehle werden nach dem RESET ausgefhrt. ;ADC-Funktion fr Pins AUSschalten (siehe Dokumentation) banksel ANSEL MOVLW B'00000000' ; kein Analog Eingang MOVWF ANSEL ; ; Definition der Ausgnge (LEDs) banksel TRISC MOVLW B'11110000' ; MOVWF TRISC ; .. in das Richtungsregister schreiben ; Interruptfunktionen definieren ... banksel OPTION_REG MOVLW B'01110000' ;Pull-Up aktiv;-;EXTERNE ZHLPULSE; steigende Flanke;Prescaler f.TMR0;Prescaler Rate -> 1:1 MOVWF OPTION_REG ; .. in das Option Register schreiben ; Merker initialisieren ... clrf 0x70 ; Merker wird spter bei jedem Interrupt weitergezhlt banksel TMR0 ; Initialisieren des Zhlerregisters.. movlw 0xF8 ; ... noch 8 Zhlpulse bis berlauf FF->00 und ... movwf TMR0 ; ... damit zum Auslsen des Interrupts bcf INTCON,T0IF ; Interrupt Flag lschen bsf INTCON,T0IE ; Interrupt aktivieren bsf INTCON,GIE ; Schleife: ;ENDLOSSCHLEIFE GOTO Schleife ; SLEEP wrde Timer0 deaktivieren... ;-----------------------ISR: ; das ist die Fortsetzung der INTERRUPTSERVICEROUTINE (ISR) ; der folgende Programmteil wird ausgefhrt, wenn durch den berlauf des Registers TMR0 ; (0xFF-> 0x00) ein Interrupt ausgelst wurde incf 0x70 ; Merker weiterzhlen movf 0x70,w ; banksel PORTC movwf PORTC ; auf die LED-Anzeige schreiben ; Zhlerregister (wieder) auf den Startwert setzen... banksel TMR0 movlw 0xF8 ; ... noch 8 Zhlpulse bis zum berlauf FF->00... movwf TMR0 ; Interruptflags lschen und Interrupts wieder "aktivieren".... bsf INTCON,T0IE ; bcf INTCON,T0IF RETFIE ; GIE=1 end

Lothar Kerbl

26.11.2010

Seite 14 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

Welche Spannung an einem Digitaleingang wird als 0 erkannt, welche als 1? Welche Wirkung hat der Pull up Widerstand, der im OPTION_REG (RABPU) und in den Registern WPUA bzw. WPUB aktiviert werden kann? Wie (warum) vereinfacht sich die Ansteuerung eines Digitaleinganges, wenn ein interner Pull up Widerstand verwendet wird?

Komparator
Regler arbeiten meist als Zwei- oder Mehrpunktregler (mit oder ohne Hysterese). Eine solche Reglerfunktionen lsst sich durch die Komparatorfunktion des PIC Microcontrollers realisieren. Bei solchen diesen Reglern wird ein Digitaler Ausgang geschaltet, und zwar dann, wenn ein (analoger) Eingangswert eine Schaltschwelle berschreitet. Die Schaltschwelle kann durch einen weiteren (analogen) Eingangswert oder durch einen fest vorgegeben Wert definiert sein. Der PIC-Microcontroller kann diese Komparatorfunktion ausfhren, mit dem Auftreten des Schaltereignisses kann eine Interrupt Service Routine verbunden werden, der Schaltzustand kann direkt an einem Ausgang C1OUT bzw. C2OUT abgebildet werden kann. Beispiel Zweipunktregler mit Hysterese: Der Istwert wird durch die analoge Spannung (Analog Eingang 1 0..5V ) vorgegeben, die Schaltschwelle ist durch einen fixen Wert (entsprechend 3,0V) vorgegeben . Die Gesamtbreite der Hysterese soll 500 mV betragen. Die Hysterese ist symmetrisch zur Schaltschwelle und nicht vernderbar. Nach Reset ist der Ausgang bevorzugt ausgeschaltet3. Hinweis: Bei jedem Aufruf der ISR muss die Schaltschwelle entsprechend der Hysterese neu parametriert werden, bei einem Zweipunktregler ohne Hysterese (Hysteresebreite = 0) kann auf die Verwendung einer ISR verzichtet werden. Erweiterte Aufgabenstellung: Wie knnte man die Vorgabe der Schaltschwelle durch einen weiteren analogen Eingangswert verndern? Wie knnte man durch Druck auf einen Taster vorbergehend die Hysterese ausschalten (Zweipunktregler ohne Hysterese) Wie ist ein Dreipunktregler mit Hysterese zu programmieren? Welche Parameter mssen bei dieser Reglerart als Parameter bercksichtigt werden? Wie ist die ISR zu programmieren?

Dies gilt fr den Fall, dass der Istwert im Bereich der Hysterese um die Schaltschwelle liegt.

Lothar Kerbl

26.11.2010

Seite 15 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

Anhang
Configuration Bits
Ein Teil des Programmspeicherbereiches kann nicht mit ausfhrbarem Code belegt werden. (Adresse 0x2007) In diesem Bereich werden Grundeinstellungen fr die Arbeitsweise des Microcontrollers festgelegt. Zwei dieser Einstellungen betreffen die Verwendung des Taktsignales und die Behandlung der RESET-Funktion

Taktsignal Die umfangreiche Logik eines Microcontrollers kann nur als synchrones Schaltwerk entworfen und realisiert werden. Zu dessen Ansteuerung ist ein zentraler Takt notwendig, der auf verschiedene Arten zur Verfgung gestellt werden kann: 1. Der Microcontroller ist Teil einer umfangreicheren Schaltung und kann mit einem vorhandenen Takt versorgt werden. (external clock in-EC) 2. Um eine genau definierte Frequenz erzeugen zu knnen, kann die Frequenz durch ein frequenzbestimmendes Element und zwei Kondensatoren eingestellt werden. (crystal oscillator, ceramic resonator - LP, XT, HS) 3. Wenn die Frequenz fr die Arbeitsweise von untergeordneter Bedeutung ist, kann sie durch einen Kondensator und einen Widerstand vorgegeben werden (external Resistor/Capacitor RC) 4. Wenn man mit einer vorgegebenen Frequenz von 4MHz das Auslangen findet, kann man den internen 4 MHz Oszillator nutzen (internal oscillator INTOSC) Die Auswahl der Betriebsart, die natrlich mit der Beschaltung zusammenpassen muss, geschieht durch Vorgabe der Configuration Bits FOSC0, FOSC1, FOSC2

Reset Das Programm wird an der Adresse 0 gestartet, wenn eine der folgenden Bedingungen eintritt: 1. Power up Reset Wenn die Versorgungsspannung einen gewissen Wert berschreitet, wird das Programm an der Adresse 0 gestartet 2. Brown Out Wenn die Versorgungsspannung einen bestimmten Wert unterschreitet tritt der sog. Brown out Zustand ein. Wenn nach diesem Brown out Zustand die Versorgungsspannung wieder stabil ist, wird das Programm an der Adresse 0 begonnen. 3. Master Clear Durch das Eingangssignal MCLR kann ein Reset ausgelst werden

Lothar Kerbl

26.11.2010

Seite 16 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

4. Watch Dog Timer unabhngig von laufenden Programmen kann durch einen Watch Dog ein Programmabsturz erkannt und durch ein Reset beantwortet warden. Der Watch Dog wird durch die Befehle SLEEP und CLRWDT wieder nachgestellt. Um zu erkennen, welcher dieser Grnde den Programmstart ausgelst hat, muss der Inhalt des Power Control Registers (PCON) im Programmcode, der nach nach einem Reset erfolgt, berprft werden.

Die Datei P16F690.INC


LIST ; P16F690.INC Standard Header File, Version 1.00 NOLIST Microchip Technology, Inc.

; This header file defines configurations, registers, and other useful bits of ; information for the PIC16F690 microcontroller. These names are taken to match ; the data sheets as closely as possible. ; Note that the processor must be selected before this file is ; included. The processor may be selected the following ways: ; ; ; ; ; 1. Command line switch: C:\ MPASM MYFILE.ASM /PIC16F690 2. LIST directive in the source file LIST P=PIC16F690 3. Processor Type entry in the MPASM full-screen interface

;========================================================================== ; ; Revision History ; ;========================================================================== ;1.00 10/12/04 Original ;========================================================================== ; ; Verify Processor ; ;========================================================================== IFNDEF __16F690 MESSG "Processor-header file mismatch. Verify selected processor." ENDIF ;========================================================================== ; ; Register Definitions ; ;========================================================================== W EQU H'0000' F EQU H'0001' ;----- Register Files-----------------------------------------------------INDF EQU H'0000' TMR0 EQU H'0001' PCL EQU H'0002' STATUS EQU H'0003' FSR EQU H'0004' PORTA EQU H'0005' PORTB EQU H'0006' PORTC EQU H'0007' PCLATH INTCON PIR1 PIR2 TMR1L TMR1H T1CON TMR2 T2CON SSPBUF SSPCON CCPR1L CCPR1H CCP1CON RCSTA TXREG RCREG PWM1CON ECCPAS EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU H'000A' H'000B' H'000C' H'000D' H'000E' H'000F' H'0010' H'0011' H'0012' H'0013' H'0014' H'0015' H'0016' H'0017' H'0018' H'0019' H'001A' H'001C' H'001D'

Lothar Kerbl

26.11.2010

Seite 17 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

ADRESH ADCON0 OPTION_REG TRISA TRISB TRISC PIE1 PIE2 PCON OSCCON OSCTUNE PR2 SSPADD MSK SSPMSK SSPSTAT WPU WPUA IOC IOCA WDTCON TXSTA SPBRG SPBRGH BAUDCTL ADRESL ADCON1 EEDAT EEDATA EEADR EEDATH EEADRH WPUB IOCB VRCON CM1CON0 CM2CON0 CM2CON1 ANSEL ANSELH EECON1 EECON2 PSTRCON SRCON

EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU

H'001E' H'001F' H'0081' H'0085' H'0086' H'0087' H'008C' H'008D' H'008E' H'008F' H'0090' H'0092' H'0093' H'0093' H'0093' H'0094' H'0095' H'0095' H'0096' H'0096' H'0097' H'0098' H'0099' H'009A' H'009B' H'009E' H'009F' H'010C' H'010C' H'010D' H'010E' H'010F' H'0115' H'0116' H'0118' H'0119' H'011A' H'011B' H'011E' H'011F' H'018C' H'018D' H'019D' H'019E'

;----- BANK 0 REGISTER DEFINITIONS ---------------------------------------;----- STATUS Bits -------------------------------------------------------IRP RP1 RP0 NOT_TO NOT_PD Z DC C EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- INTCON Bits -------------------------------------------------------GIE PEIE T0IE INTE RABIE T0IF INTF RABIF EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- PIR1 Bits ---------------------------------------------------------ADIF RCIF TXIF SSPIF CCP1IF T2IF TMR2IF EQU EQU EQU EQU EQU EQU EQU H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0001'

Lothar Kerbl

26.11.2010

Seite 18 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

T1IF TMR1IF

EQU EQU

H'0000' H'0000'

;----- PIR2 Bits ---------------------------------------------------------OSFIF C2IF C1IF EEIF EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004'

;----- T1CON Bits --------------------------------------------------------T1GINV TMR1GE T1CKPS1 T1CKPS0 T1OSCEN NOT_T1SYNC TMR1CS TMR1ON EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- T2CON Bits --------------------------------------------------------TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 EQU EQU EQU EQU EQU EQU EQU H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- SSPCON Bits ------------------------------------------------------WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- CCP1CON Bits ------------------------------------------------------P1M1 P1M0 DC1B1 DC1B0 CCP1M3 CCP1M2 CCP1M1 CCP1M0 EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- RCSTA Bits --------------------------------------------------------SPEN RX9 SREN CREN ADDEN FERR OERR RX9D EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- PWM1CON Bits ------------------------------------------------------PRSEN PDC6 PDC5 PDC4 PDC3 PDC2 PDC1 PDC0 EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- ECCPAS Bits -------------------------------------------------------ECCPASE ECCPAS2 ECCPAS1 ECCPAS0 PSSAC1 PSSAC0 PSSBD1 PSSBD0 EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- ADCON0 Bits -------------------------------------------------------ADFM EQU H'0007'

Lothar Kerbl

26.11.2010

Seite 19 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

VCFG CHS3 CHS2 CHS1 CHS0 GO NOT_DONE GO_DONE ADON

EQU EQU EQU EQU EQU EQU EQU EQU EQU

H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0001' H'0001' H'0000'

;----- BANK 1 REGISTER DEFINITIONS ---------------------------------------;----- OPTION Bits -------------------------------------------------------NOT_RABPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- TRISA Bits -------------------------------------------------------TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0 EQU EQU EQU EQU EQU EQU H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- TRISB Bits -------------------------------------------------------TRISB7 TRISB6 TRISB5 TRISB4 EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004'

;----- TRISC Bits -------------------------------------------------------TRISC7 TRISC6 TRISC5 TRISC4 TRISC3 TRISC2 TRISC1 TRISC0 EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- PIE1 Bits ---------------------------------------------------------ADIE RCIE TXIE SSPIE CCP1IE T2IE TMR2IE T1IE TMR1IE EQU EQU EQU EQU EQU EQU EQU EQU EQU H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0001' H'0000' H'0000'

;----- PIE2 Bits ---------------------------------------------------------OSFIE C2IE C1IE EEIE EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004'

;----- PCON Bits ---------------------------------------------------------ULPWUE SBOREN NOT_POR NOT_BOR EQU EQU EQU EQU H'0005' H'0004' H'0001' H'0000'

;----- OSCCON Bits -------------------------------------------------------IRCF2 IRCF1 IRCF0 OSTS HTS LTS SCS EQU EQU EQU EQU EQU EQU EQU H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- OSCTUNE Bits ------------------------------------------------------TUN4 TUN3 EQU EQU H'0004' H'0003'

Lothar Kerbl

26.11.2010

Seite 20 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

TUN2 TUN1 TUN0

EQU EQU EQU

H'0002' H'0001' H'0000'

;----- SSPSTAT Bits -------------------------------------------------------SMP CKE D I2C_DATA NOT_A NOT_ADDRESS D_A DATA_ADDRESS P I2C_STOP S I2C_START R I2C_READ NOT_W NOT_WRITE R_W READ_WRITE UA BF EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0005' H'0005' H'0005' H'0005' H'0005' H'0004' H'0004' H'0003' H'0003' H'0002' H'0002' H'0002' H'0002' H'0002' H'0002' H'0001' H'0000'

;----- WPUA Bits --------------------------------------------------------WPUA5 WPUA4 WPUA2 WPUA1 WPUA0 EQU EQU EQU EQU EQU H'0005' H'0004' H'0002' H'0001' H'0000'

;----- IOC Bits --------------------------------------------------------IOC5 IOC4 IOC3 IOC2 IOC1 IOC0 EQU EQU EQU EQU EQU EQU H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- IOCA Bits --------------------------------------------------------IOCA5 IOCA4 IOCA3 IOCA2 IOCA1 IOCA0 EQU EQU EQU EQU EQU EQU H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- WDTCON Bits -------------------------------------------------------WDTPS3 WDTPS2 WDTPS1 WDTPS0 SWDTEN EQU EQU EQU EQU EQU H'0004' H'0003' H'0002' H'0001' H'0000'

;----- TXSTA Bits ------------------------------------------------------CSRC TX9 TXEN SYNC SENB BRGH TRMT TX9D EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- SPBRG Bits ------------------------------------------------------BRG7 BRG6 BRG5 BRG4 BRG3 BRG2 BRG1 BRG0 EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- SPBRGH Bits ------------------------------------------------------BRG15 BRG14 BRG13 EQU EQU EQU H'0007' H'0006' H'0005'

Lothar Kerbl

26.11.2010

Seite 21 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

BRG12 BRG11 BRG10 BRG9 BRG8

EQU EQU EQU EQU EQU

H'0004' H'0003' H'0002' H'0001' H'0000'

;----- BAUDCTL Bits ------------------------------------------------------ABDOVF RCIDL SCKP BRG16 WUE ABDEN EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0004' H'0003' H'0001' H'0000'

;----- ADCON1 Bits -------------------------------------------------------ADCS2 ADCS1 ADCS0 EQU EQU EQU H'0006' H'0005' H'0004'

;----- BANK 2 REGISTER DEFINITIONS ---------------------------------------;----- WPUB Bits ---------------------------------------------------------WPUB7 WPUB6 WPUB5 WPUB4 EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004'

;----- IOCB Bits --------------------------------------------------------IOCB7 IOCB6 IOCB5 IOCB4 EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004'

;----- VRCON Bits --------------------------------------------------------C1VREN C2VREN VRR VP6EN VR3 VR2 VR1 VR0 EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- CM1CON0 Bits ------------------------------------------------------C1ON C1OUT C1OE C1POL C1R C1CH1 C1CH0 EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0002' H'0001' H'0000'

;----- CM2CON0 Bits ------------------------------------------------------C2ON C2OUT C2OE C2POL C2R C2CH1 C2CH0 EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0002' H'0001' H'0000'

;----- CM2CON1 Bits ------------------------------------------------------MC1OUT MC2OUT T1GSS C2SYNC EQU EQU EQU EQU H'0007' H'0006' H'0001' H'0000'

;----- ANSELH Bits -------------------------------------------------------ANS11 ANS10 ANS9 ANS8 EQU EQU EQU EQU H'0003' H'0002' H'0001' H'0000'

;----- ANSEL Bits --------------------------------------------------------ANS7 ANS6 EQU EQU H'0007' H'0006'

Lothar Kerbl

26.11.2010

Seite 22 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

ANS5 ANS4 ANS3 ANS2 ANS1 ANS0

EQU EQU EQU EQU EQU EQU

H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- BANK 3 REGISTER DEFINITIONS ---------------------------------------;----- EECON1 Bits -------------------------------------------------------EEPGD WRERR WREN WR RD EQU EQU EQU EQU EQU H'0007' H'0003' H'0002' H'0001' H'0000'

;----- PSTRCON Bits -------------------------------------------------------STRSYNC STRD STRC STRB STRA EQU EQU EQU EQU EQU H'0004' H'0003' H'0002' H'0001' H'0000'

;----- SRCON Bits ---------------------------------------------------------SR1 SR0 C1SEN C2REN PULSS PULSR EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002'

;========================================================================== ; ; RAM Definition ; ;========================================================================== __MAXRAM H'1FF' __BADRAM H'08'-H'09', H'1B' __BADRAM H'88'-H'89', H'91', H'9C'-H'9D' __BADRAM H'108'-H'109', H'110'-H'114', H'117', H'11C'-H'11D' __BADRAM H'188'-H'189', H'18E'-H'19C', H'19F'-H'1EF' ;========================================================================== ; ; Configuration Bits ; ;========================================================================== _FCMEN_ON _FCMEN_OFF _IESO_ON _IESO_OFF _BOR_ON _BOR_NSLEEP _BOR_SBODEN _BOR_OFF _CPD_ON _CPD_OFF _CP_ON _CP_OFF _MCLRE_ON _MCLRE_OFF _PWRTE_OFF _PWRTE_ON _WDT_ON _WDT_OFF _LP_OSC _XT_OSC _HS_OSC _EC_OSC _INTRC_OSC_NOCLKOUT _INTRC_OSC_CLKOUT _EXTRC_OSC_NOCLKOUT _EXTRC_OSC_CLKOUT _INTOSCIO _INTOSC _EXTRCIO _EXTRC LIST EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU H'3FFF' H'37FF' H'3FFF' H'3BFF' H'3FFF' H'3EFF' H'3DFF' H'3CFF' H'3F7F' H'3FFF' H'3FBF' H'3FFF' H'3FFF' H'3FDF' H'3FFF' H'3FEF' H'3FFF' H'3FF7' H'3FF8' H'3FF9' H'3FFA' H'3FFB' H'3FFC' H'3FFD' H'3FFE' H'3FFF' H'3FFC' H'3FFD' H'3FFE' H'3FFF'

Lothar Kerbl

26.11.2010

Seite 23 (24)

htl donaustadt - Abteilung fr Elektrotechnik

PICkitTM 2 Beispielprogramme

Das HEX-Format fr Images


Wenn du die HEX-Datei, die als Ergebnis der bersetzungsvorgnge (C-Compiler, Assembler) und des Linkvorganges entstanden ist, mit einem Editor ffnest, knnte die etwa folgendermaen aussehen:
:10000000830100308A006328A00003088301AC004C :100010000408AD000A08AE008A012B08AF000B19D6 :100020008B1E16288312CD239F140B110B188B1DCA :10003000212883123623013A031D20280130A1060E :02400E00D430AC ....usw

In dieser Datei wird der Inhalt des Programmspeichers fr das Target System beschrieben. Das Format, in dem der Speicherinhalt in dieser Datei angegeben ist, heit INTELHEX-Format. Das ist ein gebruchliches Format zur Darstellung und zum Transport von Images fr Mikroprozessorsysteme (und auch zur Darstellung von PROMInhalten). Jede Zeile ist folgendermaen aufgebaut. Doppelpunkt : am Beginn der Zeile Die Anzahl der zu ladenden Bytes als zweistellige HEX-Zahl Die Adresse4, an der die Daten im Target System zu laden sind Angabe ber die Art der Daten in der Zeile (normalerweise 00) Die Daten; d.h. der zu programmierende Inhalt des Programmspeichers wenn du in der IDE MPLAB dasselbe Programm geladen hast, sollten diese Daten mit der Anzeige Program Memory bereinstimmen. Den Inhalt des Programmspeichers kannst du auch mit dem Programm PICkit 2 Programmer berprfen. Beachte aber, dass die Adressierung in der HEXDatei byteweise erfolgt, whrend im Programmspeicher immer 14 Bit unter einer Adresse gespeichert sind. Prfsumme Beachte, dass auch fr die Programmierung der Configuration Bits eine eigene Zeile vorgesehen ist
: : : : : : : 10 10 10 10 10 10 02 0000 0010 0020 0030 0040 0050 400E 00 00 00 00 00 00 00 830100308A006328A00003088301AC00 0408AD000A08AE008A012B08AF000B19 8B1E16288312CD239F140B110B188B1D 212883123623013A031D20280130A106 0B1083120C1F582883160C1F57287F30 83121E020318402840301E02031C3828 D430 AC 4C D6 CA 0E 63 59

Wahrscheinlich fllt dir bei genauerem Vergleich auf, dass die Adressen in der HEX-Datei nicht mit der Adressierung im Programmspeicher bereinstimmen. Der Programmspeicher wird beim Programmieren - anders als bei der Programmausfhrung - mit einer Breite von 8 Bit gesehen. In der Datei sollte auch ein Eintrag fr das Configuration Word auf der Programmspeicheradresse 0x2007 (Programmieradresse 0x400E) vorgesehen sein.

Lothar Kerbl

26.11.2010

Seite 24 (24)