This project is a discussion on how to program PIC10F200 chips. We are not selling the program or the project. Go to Mike McLaren - Micro Application Consultants for details on these things. We are just teaching how to write a program PIC10F200 chips. We have specialised in presenting programs for the simplest PIC chip: the PIC12F629 and the PIC10F200 is even smaller in size and pin-count. It has 3 in-out lines and one input-only line. It has 256 locations for your program and the 16 General Purpose Registers are located between 10h and 1Fh. It has only a 2-level stack and one 8-bit timer. All the other features are the same as the PIC12F629 and if you want to produce something extremely small, this chip is the challenge for you. The first IGNITION SWITCH program has been written by a very qualified programmer and shows what can be done with this 6 pin chip, but the program also contains a number of difficult-to-understand instructions, with some of them coming from a list that only expert programmers understand. The second IGNITION SWITCH program has been written by Colin Mitchell and is much easier to understand. if you study them both, you will gain a lot of understanding on how to create a program. Here's what the circuit does: Put your Ignition Switch and Starter into one unit. The push-switch has a blue LED to indicate when the ignition is "On." Push and hold the button while the starter turns over and release when the engine starts. The ignition stays "On." Push again to stop the engine. You've seen it on new, top-end luxury cars. . .now it can be in your car, too.
|
IGNITION SWITCH for PIC10F200 ;****************************************************************** ;* * ;* Filename: Ignition 10F200 v2.asm * ;* Author: Mike McLaren, K8LH (k8lh@arrl.net) * ;* Date: 30-Sep-09 * ;* * ;* * ;* 10F200 Ignition Switch Experiment * ;* * ;* * ;* MPLab: 8.14 (tabs=8) * ;* MPAsm: 5.21 * ;* * ;****************************************************************** include "p10f200.inc" list st=off __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF radix dec ;--< hardware >---------------------------------------------------- #define ignition GPIO,0 ; GP0 = active hi ignition relay #define starter GPIO,1 ; GP1 = active hi starter relay ;--< variables >--------------------------------------------------- cblock 0x10 temp ; delay subsystem swnew ; fresh switch sample (b3 bit) swold ; switch state latch (b3 bit) mstmr ; msec timer swtmr ; 1 sec switch timer endc #define running swold,0 ; running flag ;--< macros >------------------------------------------------------ clock equ 4 ; 4-MHz clock usecs equ clock/4 ; cycles/usec multiplier inDlyCy macro pCycles ; 0..1027 cycle range local loop ; if pCycles > 3 movlw pCycles/4 ; loop movwf temp ; 4-cycle loop decfsz temp,W ; goto loop ; endif if pCycles%4 >= 2 goto $+1 ; 2 cycles endif if pCycles&1 == 1 nop ; 1 cycle endif endm ;****************************************************************** ; main program * ;****************************************************************** org 0x000 start movwf OSCCAL ; movlw b'10011110' ; 10011110 ; 1-------, IOC off ; -0------, weak pullups ON ; --0-----, T0CS source Fosc/4 ; ---1----, T0SE edge hi>lo ; ----1---, PSA prescale WDT ; -----110, PS prescaler 64 option ; movlw b'00001000' ; tris GPIO ; GP3 input, all others outputs clrf GPIO ; set output latches to '0' clrf swold ; clear switch state latch clrf swtmr ; clear 1 second timer clrc ; clear Carry newsample call dbdelay ; 32-msec debounce delay comf GPIO,W ; sample active lo GP3 switch movwf swnew ; save fresh sample newpress btfsc swnew,3 ; swnew.3 == 1 and btfsc swold,3 ; swold.3 == 0 (new press)? goto newrelease ; no, branch, else bsf swold,3 ; update swold.3 state latch call beep1 ; do a single 32-msec beep and movlw 1000/32 ; start 1 second timer movwf swtmr ; newrelease btfss swnew,3 ; swnew.3 == 0 and btfss swold,3 ; swold.3 == 1 (new release)? goto timeout ; no, branch, else bcf swold,3 ; update swold.3 state latch bcf starter ; turn GP1 'starter' off movf swtmr,W ; timed out "long" press? bz newsample ; yes, branch (done), else clrf swtmr ; turn off 1 second timer movlw b'00000001' ; use GP0 pin mask to xorwf GPIO,F ; toggle GP0 'ignition' output bcf running ; clear "running" flag timeout movf swtmr,F ; switch timer running? bz newsample ; no, branch, else decfsz swtmr,F ; is it timed out? goto newsample ; no, branch, else call beep2 ; do a double beep btfsc ignition ; ignition == 1 and btfsc running ; running == 0 (allow start)? goto newsample ; no, branch, else bsf running ; set "running" flag bsf starter ; turn GP1 'starter' on goto newsample ; ;****************************************************************** ; subroutines This subroutine creates a beep as well as a delay * ; The setc instruction determines if the speaker bit is toggled * ;****************************************************************** beep2 call beep1 ; 32-msec delay with beep call dbdelay ; 32-msec delay beep1 setc ; 32-msec delay with beep dbdelay movlw 32 ; C = 0, delay, C = 1, beep movwf mstmr ; mstmr = 32 msecs dbloop movlw b'00000100' ; mask for GP2 'spkr' pin skpnc ; beep task? no, skip, else xorwf GPIO,F ; toggle the speaker pin inDlyCy(1000*usecs-6) ; 1-msec minus 6 cycles decfsz mstmr,F ; done? yes, skip, else goto dbloop ; loop clrc ; retlw 0 ; ;****************************************************************** end |
IGNITION SWITCH for PIC10F200 ;****************************************************************** ;* * ;* Filename: Ignition 10F200 v2.asm * ;* Author: Colin Mitchell * ;* Date: 11-Feb-2010 * ;* * ;* * ;* 10F200 Ignition Switch Project * ;* * ;* * ;****************************************************************** include "p10f200.inc" list st=off __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF radix dec ;--< hardware >---------------------------------------------------- #define ignition GPIO,0 ; GP0 = active hi ignition relay #define starter GPIO,1 ; GP1 = active hi starter relay #define spkr GPIO,2 ; GP2 = piezo speaker #define Sw GPIO,3 ; GP3 = input - switch ;--< variables >--------------------------------------------------- ;general purpose registers 10h to 1Fh temp equ 10h ; used in delay DelA equ 11h ; used in delay DelB equ 12h ; used in delay ;****************************************************************** ; main program * ;****************************************************************** org 0x000 SetUp movlw b'10011110' ;10011110 ;-0------, weak pullups ON option ; movlw b'00001000' ; tris GPIO ;GP3 input, all others outputs clrf GPIO ;make outputs LOW Start call Delay1 ;20mS debounce delay btfsc GPIO,3 ;Is Sw LOW? - pushed goto Start ;loop call beep1 ;40mS beep bsf GPIO,0 ;activate ignition relay call Delay1 bsf GPIO,1 ;activate starter relay ;Turn off starter relay call Delay2 ;delay 1 second btfss GPIO,3 ;Is Sw released? - HIGH goto $-2 bcf GPIO,1 ;de-activate starter relay call beep2 ; 40mS beeps ;Turn off Ignition call Delay2 ;delay 1 second btfsc GPIO,3 ;Is Sw LOW? - pushed goto $-2 call Delay2 ;delay 1 second btfsc GPIO,3 ;Is Sw LOW? - pushed goto $-5 bcf GPIO,0 ;de-activate ignition relay call beep2 ;40mS beeps call Delay2 ;delay 1 second call Delay2 ;delay 1 second call Delay2 ;delay 1 second call Delay2 ;delay 1 second call Delay2 ;delay 1 second goto SetUp ;****************************************************************** ; subroutines * ;****************************************************************** beep2 call beep1 ; 40mS beep call Delay1 ; 20mS delay ;(micro will go here after delay1 and execute beep1) beep1 movlw .40 movwf temp goto $+1 decfsz DelA,1 goto $-2 movlw b'00000100' ;spkr pin xorwf GPIO,F ;spkr bit will toggle decfsz temp,1 goto $-6 retlw 00 Delay1 movlw .20 ; 20mS delay movwf temp goto $+1 decfsz DelA,1 goto $-2 decfsz temp,1 goto $-4 retlw 00 ;1 Second delay Delay2 movlw .50 movwf DelB call Delay1 decfsz DelB,1 goto $-2 retlw 00 ;****************************************************************** end |
If you are going to burn the program yourself, you will need
a PICkit-2 programmer.
|