list p=12f629 ;************************************************************** ;* ;* Pinbelegung ;* ---------------------------------- ;* GPIO: 0 LED Rund ;* 1 LED Rund ;* 2 LED Rund ;* 3 Input für Impulsmessung ;* 4 LED Rund ;* 5 LED Blitz ;* 6 frei ;* ;************************************************************** ; ; Autor: Peter Narozny, ; Datum: 7.10.2005 ; Blitzlicht, Rundlichtsteuerung, Impulsweitenmessung für H34-G ; Steuerung über Empfängersignal an Port GPIO 3 ; Lauflicht GPIO 0 - 2 und GPIO 4 und Blitzlicht am Port GPIO 5 ; ; Taktquelle: interner Oszillator 4MHz ; ;************************************************************** ; Includedatei für den 12F629 einbinden ; #include ERRORLEVEL -302 ; SUPPRESS BANK SELECTION MESSAGE ; ; Configuration festlegen ; ; bis 4 MHz: kein Power on Timer, kein Watchdog, int-Oscillator, kein Broun out __CONFIG _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF ; ;************************************************************** ; Variablennamen vergeben ; loops Equ 0x22 ; Zähler für Warteschleife loops2 Equ 0x23 ; Zähler für Warteschleife loops3 Equ 0x24 ; Zähler für kurze Warteschleife impuls Equ 0x25 ; Impulsdauer des Kanals zaehler Equ 0x26 ; Zaehler für Rundumlicht ;************************************************************** ; Start des Programms ; Port B auf Ausgabe stellen Init ; IO-Pins definieren bcf STATUS, RP0 ; auf Bank 0 umschalten clrf GPIO movlw 0x07 movwf CMCON ; alle PINS digital (nicht Comp) bsf STATUS, RP0 ; auf Bank 1 umschalten movlw 0x8 ; GPIO 3 auf Input und movwf TRISIO ; GPIO 0-2 - GPIO 4-5 auf Output schalten bcf STATUS, RP0 ; auf Bank 0 zurückschalten clrf impuls ; interner Tankgenerator aktivieren bsf STATUS, RP0 ; Bank 1 Call 0x3FF ; Kalibrierwert movwf OSCCAL ; 4-MHZ Kalibrierung bcf STATUS, RP0 ; Bank 0 PWM Call Impulsmessung movf impuls,0 ; Ergebnis nach w schreiben ; Impuls = 11-13 --> nur Blitz ; Impuls = 14-16 --> nur Blitz ; Impuls = 17-19 --> Blitz und Rundumlicht addlw D'242' btfss STATUS, C ; Prüfen des Carry Bits goto Markemin ; Sprung nach Markemin wenn C=0 movf impuls,0 ; Impulswert nach w schreiben addlw D'239' btfss STATUS, C ; Prüfen des Carry Bits goto Markenull ; Sprung nach Markenull wenn C=0 goto Markemax ; Sprung nach Markemax wenn C=1 Markemin goto Blitz ; nur Blitz wenn Schalter -100% Markenull goto BlitzRund ; Blitz und Rundumlicht wenn Schalter auf 0% Markemax goto BlitzRund ; Blitz und Rundumlicht wenn Schalter auf +100% ; Lichtsteuerung Blitz clrf GPIO ; alle LED's ausschalten bsf GPIO,5 ; LED an GPIO 5 einschalten call Wait50 ; 50ms Warten bcf GPIO,5 ; LED an GPIO 5 ausschalten Call Wait400 ; 400ms Warten bsf GPIO,5 ; LED an GPIO 5 einschalten call Wait50 ; 50ms Warten bcf GPIO,5 ; LED an GPIO 5 ausschalten Call Wait450 ; 450ms Warten Call Wait450 ; 450ms Warten Call Wait450 ; 450ms Warten goto PWM ; Rücksprung zur weiteren Impulsmessung BlitzRund clrf GPIO ; alle LEDs ausschalten bsf GPIO,5 ; LED an GPIO 5 einschalten Call Wait50 ; 50ms Warten bcf GPIO,5 ; LED an GPIO 5 ausschalten ; Lauflicht bsf GPIO,0 ; LED an GPIO 0 einschalten call Wait400 bsf GPIO,5 ; LED an GPIO 5 einschalten Call Wait50 ; 50ms Warten bcf GPIO,5 ; LED an GPIO 5 ausschalten bcf GPIO,0 ; LED an GPIO 0 ausschalten bsf GPIO,1 ; LED an GPIO 1 einschalten call Wait450 bcf GPIO,1 ; LED an GPIO 1 ausschalten bsf GPIO,2 ; LED an GPIO 2 einschalten call Wait450 bcf GPIO,2 ; LED an GPIO 2 ausschalten bsf GPIO,4 ; LED an GPIO 4 einschalten call Wait450 bcf GPIO,4 ; LED an GPIO 4 ausschalten goto PWM ;********************************************************** ; Warteschleife 50 ms Wait50 movlw D'25' ; 250 ms Pause movwf loops Wai4 movlw .110 ; Zeitkonstante für 1ms movwf loops2 Wai5 nop ; nop nop nop nop nop decfsz loops2, F ; 1 ms vorbei? goto Wai5 ; nein, noch nicht ; decfsz loops, F ; 250 ms vorbei? goto Wai4 ; nein, noch nicht retlw 0 ; Ende erreicht ;********************************************************** ; Warteschleife 0,1ms WaitKurz movlw .11 ; Zeitkonstante für 0,1ms movwf loops3 Wai3 nop nop nop nop nop nop decfsz loops3, F goto Wai3 retlw 0 ;********************************************************** ; Warteschleife 250 ms Wait250 movlw D'125' ; 250 ms Pause movwf loops Wai movlw .110 ; Zeitkonstante für 1ms movwf loops2 Wai2 nop ; nop nop nop nop nop decfsz loops2, F ; 1 ms vorbei? goto Wai2 ; nein, noch nicht ; decfsz loops, F ; 250 ms vorbei? goto Wai ; nein, noch nicht retlw 0 ; Ende erreicht ;********************************************************** ; Warteschleife 450 ms Wait450 Call Wait250 Call Wait50 Call Wait50 Call Wait50 Call Wait50 retlw 0 ;********************************************************** ;********************************************************** ; Warteschleife 400 ms Wait400 Call Wait250 Call Wait50 Call Wait50 Call Wait50 retlw 0 ;********************************************************** ; Impulszeitmessung ; Die Länge des Impulses an RA1 wird gemessen. Das Ergebnis steht ; in der Speicherzelle "Impuls" (zb. 18 binär für 1.8ms). ; Beginn der Subroutine ; Warten auf steigende Flanke am Port A1 Impulsmessung HILEVEL BTFSC GPIO,3 ; PortA Pin 1 lesen goto HILEVEL ; A1 is hi,warten auf fallende Flanke LOWLEVEL BTFSC GPIO,3 ; A1 is low, warten auf steigende Flanke goto LOS1 ; Sprung zur Impulsmessung goto LOWLEVEL ; warten auf steigende Flanke LOS1 clrw movwf impuls ; Impuls Register auf 0 setzen LOS call WaitKurz incf impuls,1 ; Impuls Register um 1 hochzählen btfsc GPIO,3 ; Pin 1 lesen ob 0 goto LOS ; weiterzählen wenn A1 is hi retlw 0 ; Rücksprung ;********************************************************** end ;***********************************************************