PIC-Lernbeispiel: Blinklicht mit PIC10F202


zurück zu Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage

Das ist ein primitives Beispielprogramm für einen PIC10F202.
Das Programm läuft auch auf dem PIC10F200.
Wenn man das Semikolon vor einer im Quelltext auskommentierten (und mit einem entsprechenden Kommentar versehenen) Zeile entfernt, dann lässt sich das Programm auch auf  PIC10F204/206 benutzen.


Schaltung
Der PIC10F202 ist mit Betriebsspannung (5 V) versorgt:
  • +5V anVdd
  • Masse an Vss
Am Pin GP0 ist die Anode einer LED angeschlossen. Die Kathode dieser LED ist mit einem 1kOhm-Widerstand an Masse (Vss) angeschlossen.

Im nebenstehenden Bild verwende ich eine 8-polige DIL-Ausführung des PIC. Natürlich geht auch ein 6-Pin-SMD-Variante im SOT-Gehäuse.

Stromlaufplan


Besonderheiten
Dieses Beispiel dient der Vorstellung der 12-Bit-PICs.

OSCCAL
Im Unterschied zu den 14- und 16- Bit PICs, starten die 12-Bit-PICs nach dem Reset (z.B. Power-on) mit der Programmabarbeitung nicht an der Adresse 0x00, sondern auf der allerletzten FLASH-Adresse. Dort steht (wenn die Brennersoftware fehlerfrei funktionierte) ein MOVLW-Befehl, der den für diesen PIC ausgemessenen individuellen OSCCAL-Wert nach w lädt.
Danach springt der PIC zur Adresse 0x00, und beginnt mit der Abarbeitung des eigentlichen Programms. Als erstes sollte man nun den Kalibrierwert aus w in das Register OSCCAL schreiben, um den Oszillator damit auf 4 MHz zu kalibrieren.
 
; Beginn des Programmcodes

        org     0x0000
        movwf   OSCCAL     ; Oszillator kalibrieren
 

Da normalerweise die Brennsoftware sich um den MOVLW-Befehl an der letzten FLASH-Adresse kümmert, kann man so tun, als ob der PIC einfach bei 0x00 zu arbeiten beginnt, und den Kalibrierwert in w trägt.
Falls ein PIC aber absolut nicht funktionieren will, kann es sein, dass durch einenn Brennerfehler auf der letzten FLASH-Adresse etwas falsches steht, und der PIC dadurch nicht richtig arbeiten kann.
 

Variablen/Symbole
Zum Festlegen von Symbolen benutze ich in diesem Beispiel die Anweisungen 'cblock - endc'.

Das Definieren vieler Speicherzellen (als Variablen) mit EQU-Befelen ist umständlich. In diesem Programm benötige ich die Zählvariablen loops und loops2, die jeweils ein Byte im RAM benötigen. Mit EQU-Befehlen könnte man sie wie folgt definieren:
 
; Variablen festlegen

loops   equ 0x10      ; timer für wait
loops2  equ 0x11      ; timer für wait
 

Es geht aber auch einfacher mit den Befehlen cblock und endc:
 
; Variablen festlegen ab 10h

        cblock 0x10
        loops
        loops2
        endc
 

Mit cblock beginnt die Definition von Symbolen (Variablen), die hinter cblock angegebene Adresse ist die Adresse für die erste Variable. Danach werden die Bezeichner aller benötigter Variable zeilenweise aufgelistet. Der Assembler reserviert für alle diese Variablen jeweils ein Byte Speicherplatz.
Man kann auch mehrere Variablen auf einer Zeile definieren, dann sind die einzelnen Namen durch ein Komma zu trennen.
Benötigt eine Variable mehr als ein Byte, dann hat dem Variablennamen unmittelbar ein Doppelpunkt und die Bytezahl zu folgen (z.B. loops:2).
Der Befehl endc beendet die Variablendefinition.

Bei nur 2 Variablen lohnt sich cblock eigentlich noch nicht, aber wenn man 20 Variablen festlegen muss, wird der Vorteil deutlich.


Programmablauf

Die Warteschleife besteht aus drei ineinander verschachtelten Schleifen.
Die innere Schleife (top2 ... goto top2) ist 4 PIC-Zyklen lang. Bei einen Oszillatortakt von 4 MHz, sind das genau 4 Mikrosekunden.
Eine mittlere Schleife (top ... goto top) sorgt dafür, dass die innere Schleife genau 250 mal durchlaufen wird. Das ergibt 1 Millisekunde (+ einige Mikrosekunden overhead für die mittlere Schleife).
Eine äußere Schleife (Wait ... retlw) sorgt dafür, dass die mittlere Schleife genau 250 mal durchlaufen wird. Das ergibt 250 Millisekunden (+ einige Mikrosekunden overhead für die mittlere und äußere Schleife).


Programmlisting


        list p=10f202
;***********************************************************************
;*      Pinbelegung
;*      ---------------------------------- 
;*      GP:     0 > LED mit 1 kOhm Vorwiderstand
;*              1 -
;*              2 -
;*              3 -
;* 
;***********************************************************************
;
;sprut (zero) Bredendiek 05/2005
;
; Blinklicht mit PIC10F202 am Pin GP0
;
; Prozessor 10F202 (oder 10F200) 
;
; Prozessor-Takt  4 MHz intern
;
;
;***********************************************************************
; Includedatei für den 10F202 einbinden

        #include <p10f202.inc>

; Configuration festlegen:
;       kein codeprotection
;       kein WDT-Timer
;       kein Reset-Pin

        __CONFIG _CP_OFF & _WDT_OFF & _MCLRE_OFF

;***********************************************************************
; Variablen festlegen ab 10h

        cblock  0x10
        loops
        loops2
        endc

        #define LED     GPIO,0

;*******************************************************
; Beginn des Programmcodes

        org     0x0000

        movwf   OSCCAL          ; Oszillator kalibrieren

        movlw   b'00001110'     ; GP0 output
        tris    GPIO

;       bcf     CMCON0,CMPON    ; Comparator off nur bei 10F204/206

;*******************************************************
Mainloop
        bsf     LED             ; LED an
        call    WAIT            ; 250 ms warten
        bcf     LED             ; LED aus
        call    WAIT            ; 250 ms warten
        goto    Mainloop

;*******************************************************
; Warteschleife für 250 ms
WAIT
        movlw   .250
        movwf   loops

; die top-Schleife verzögert 1 ms = 250 x 4µs
top     movlw   .250
        movwf   loops2
; die top2-Schleife verzögert 4 Takte = 4 µs
top2    nop
        decfsz  loops2, F 
        goto    top2
        decfsz  loops, F
        goto    top
        retlw   .0

        end
 


zurück zu Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt: 27.05.2005
letzte Änderung: 01.02.2006