PIC-Lernbeispiel: Ausgabe einer Spannung

mit der Referenzspannungsquelle

des PIC16F628


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


einige PICs besitzen Komparatoren und eine Referenzspannungsquelle.

Die Grundlagen der Referenzspannungsquelle sind bereits an anderer Stelle erläuter worden. In diesem Beispiel wird mit der Referenzspannungsquelle des 16F628 eine langsame (0,25 Hz) Sägezahnspannung (0 V ... 3,125 V) erzeugt.


Schaltung
Die Schaltung besteht lediglich aus einem PIC16F628 und einer 10-MHz Taktquelle für den PIC. Am Port B sind 4 Leuchtdioden angeschlossen. Am Pin RA2 ist ein hochohmiges Voltmeter angeschlossen. 
(Die LEDs sind für die Sägezahnfunktion nicht unbedingt erforderlich.)

Zum Aufbau eignet sich z.B. die 16F84-Testplatine. oder die 16F84-Minitestplatine mit einer LED-Platine

Beim Brennen des PIC ist der HS-Oszillator auszuwählen. Bitte darauf achten, dass beim Brennen LV-Programming-Enable nicht aktiv ist.


Programmablauf

Das Beispiel gibt am Pin RA2 eines 16F628 eine Sägezahnspannung von 0 V bis  3,125V aus. Das dauert jeweils 4 Sekunden (16 Schleifendurchläufe), und
beginnt dann von vorn. Am PortB werden zur Kontrolle die aktuellen Werte von VR ausgegeben, und können auf Wunsch mit LEDs angezeigt
werden.
Am Besten benutzt man ein Digital-Voltmeter mit Bargraph-Anzeige oder einen Oszi zur Darstellung des Ausgangswerts an RA2.
Einfache Digitalvoltmeter sind bei so schnellen Änderungen schwer ablesbar. Voltmeter mit Zeigerinstrument stellen die Änderung wunderbar
dar, allerdings belasten sie die Referenzspannungsquelle zu hoch (sie haben einen zu kleinen Innenwiderstand). Folglich zeigen sie eine zu geringe Spannung an.


Ich habe aber einen anderen Prozessor


Programmlisting

        list p=16f628 
 ;************************************************************** 
 ;*      Pinbelegung 
 ;*      ---------------------------------- 
 ;*      PORTA:  0 - 
 ;*              1 - 
 ;*              2 > Spannungsausgang 
 ;*              3 - 
 ;*              4 - 
 ;*              5 < MCLR
 ;*              6 > OSC2
 ;*              7 < OSC1
 ;* 
 ;*      PORTB:  0 > LED 
 ;*              1 > LED 
 ;*              2 > LED 
 ;*              3 > LED 
 ;*              4 - 
 ;*              5 - 
 ;*              6 - 
 ;*              7 - 
 ;* 
 ;************************************************************** 
 ; 
 ;sprut (zero) Bredendiek 01/2003 
 ; 
 ; Sägezahn mit der Referenzsspannungsquelle am Port RA2 
 ; Spannung steigt in 4 Sekunden von 0V auf 3,125 V 
 ; 
 ; Prozessor 16F628 
 ; 
 ; Prozessor-Takt 10 MHz 
 ; 
 ; LED-Zeile am PortB 
 ; 
 ;************************************************************** 
 ; Includedatei für den 16F628 einbinden 

         #include <P16f628.INC> 

         ERRORLEVEL      -302            ; SUPPRESS BANK SELECTION MESSAGES 
 

 ; Configuration festlegen: 
 ; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming 
         __CONFIG       _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF 

 ; Constanten festlegen 
 #define LED     PORTB 

 ; Variable festlegen 
 counter         equ     0x20            ; Zählstand für Sägezahn 
 loops           equ     0x21            ; ms-Zähler 
 loops2          equ     0x22            ; Wait-Zähler 
 

 ;************************************************************** 
 ; Programmanfang 

         org     0 

 ;************************************************************** 
 ; Initialisierung ********************************************* 

 init 
         BSF     STATUS,RP0              ; Bank 1 
         BSF     TRISA,2                 ; RA2 ist digital-input 
         MOVLW   B'11100000'             ; enable VREF, RA2-output, VR=0000 
         MOVWF   VRCON                   ; low range mode 
         clrf    OPTION_REG
         clrf    TRISB                   ; PortB alle outputs 
         bcf     STATUS, RP0             ; Bank 0 
         clrf    PORTB                   ; LEDs aus 
         clrf    INTCON                  ; Interrupt disable 

         clrf    counter 

 ;Hauptprogrammschleife 
 mainloop 
         movfw   counter 
         movwf   LED                     ; VR anzeigen 

         movlw   B'11100000' 
         iorwf   counter, w 
         bsf     STATUS, RP0             ; Bank 1 
         movwf   VRCON 
         bcf     STATUS, RP0             ; Bank 0 

         movlw   D'255'                  ; 250 ms Pause 
         movwf   loops 
         call    WAIT 

         incf    counter, f 
         movlw   B'00001111' 
         andwf   counter, f              ; VR auf 15 begrenzen 

         goto    mainloop 
 

 ;***************************************************** 
 ;Zeitverzögerung um loops * 1 ms 
 ; 10 MHz externer Takt bedeutet 2,5 MHz interner Takt 
 ; also dauert 1 ms genau 2500 Befehle 
 ; 250 Schleifen a 10 Befehle sind 2500 Befehle = 1 ms 

 WAIT 
 top     movlw   .250           ; timing adjustment variable (1ms) 
         movwf   loops2 
 top2    nop                    ; sit and wait 
         nop 
         nop 
         nop 
         nop 
         nop 
         nop 
         decfsz  loops2, F      ; inner loops complete? 
         goto    top2           ; no, go again 
                                ; 
         decfsz  loops, F       ; outer loops complete? 
         goto    top            ; no, go again 
         retlw   0              ; yes, return from subWAIT 
 

         end


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