Solenoid.asm Page: 1 00001 0000 ;========================================================================== 00002 0000 ; 00003 0000 ; Filename: Solenoid.asm 00004 0000 ; Date: 7/14/2003 00005 0000 ; File Version: 1.0b1 00006 0000 ; 00007 0000 ; Author: David M. Flynn 00008 0000 ; Company: DMF Rockets 00009 0000 ; E-Mail: dflynn@oxfordvue.com 00010 0000 ; Web Site: http://www.oxfordvue.com/ 00011 0000 ; 00012 0000 ;========================================================================== 00013 0000 ; Solenoid is a PIC based PWM Solenoid saver. 00014 0000 ; 00015 0000 ; History: 00016 0000 ; 1.0b1 7/14/2003 Changed to 80uS period. Added PWM duty cycle control. 00017 0000 ; 1.0d2 7/14/2003 Added PWM stuff 00018 0000 ; 1.0d1 5/13/2003 Copied from FlowPCB.asm 00019 0000 ; 00020 0000 ; FlowBoard 00021 0000 ; 1.0b3 8/23/2002 Changed to 16F628 processor 00022 0000 ; 1.0b2 2/26/2002 Flixed bug in flow/no flow LED BCF/BSF... 00023 0000 ; 1.0b1 2/23/2002 Working flow detection. Replicates signet intf rev. B1. 00024 0000 ; 1.0d1 2/23/2002 First code 00025 0000 ; 00026 0000 ;========================================================================== 00027 0000 ;========================================================================== 00028 0000 ; 00029 0000 list p=16f628,r=hex,W=1 ; list directive to define processor 00030 0000 ; processor specific variable definitions 00031 0000 ; P16F84.INC Standard Header File, Version 2.00 Microchip Technology, Inc. 00032 0000 ; 00033 0000 ; This header file defines configurations, registers, and other useful bits of 00034 0000 ; information for the PIC16F84 microcontroller. These names are taken to match 00035 0000 ; the data sheets as closely as possible. 00036 0000 ; 00037 0000 ;========================================================================== 00038 0000 ; 00039 0000 ;========================================================================== 00040 0000 ;========================================================================== 00041 0000 ; 00042 0000 ;Constants for conditional assembly 00043 0000 ; 00044 0000 constant oldcode=0 00045 0000 constant Use40usTiming=0 00046 0000 constant Use80usTiming=1 00047 0000 ; 00048 0000 if Use40usTiming 00060 0000 endif 00061 0000 ; 00062 0000 if Use80usTiming 00063 0000 0064 PR2_Value EQU d'100' 00064 0000 0000 PWM_Off EQU 0x00 ;0% 00065 0000 0001 PWM_1 EQU d'1' ;1% 00066 0000 0002 PWM_2 EQU d'2' ;2% Duty Cycle 00067 0000 0003 PWM_3 EQU d'3' ;3% 00068 0000 0004 PWM_4 EQU d'4' ;4% 00069 0000 0005 PWM_5 EQU d'5' ;5% 00070 0000 0006 PWM_6 EQU d'6' ;6% 00071 0000 0007 PWM_7 EQU d'7' ;7% 00072 0000 0008 PWM_8 EQU d'8' ;8% 00073 0000 000A PWM_10 EQU d'10' ;10% 00074 0000 000C PWM_12 EQU d'12' ;12% 00075 0000 000F PWM_15 EQU d'15' ;15% 00076 0000 0014 PWM_20 EQU d'20' ;20% 00077 0000 0032 PWM_50 EQU d'50' ;50% 00078 0000 003C PWM_60 EQU d'60' ;60% 00079 0000 0046 PWM_70 EQU d'70' ;70% 00080 0000 0065 PWM_FullOn EQU d'101' ;100% 00081 0000 endif 00082 0000 ; 00083 0000 000C CCP1CON_Value EQU 0x0C ;PWM_Mode 00084 0000 0004 T2CON_Value EQU 0x04 ;Tmr 2 On, Presale 1:1, Postscale 1:1 00085 0000 0032 ValveFullTime EQU d'50' ;100ths of a second 00086 0000 ; 00087 0000 ;========================================================================== 00088 0000 ; 00089 0000 ; Register Definitions 00090 0000 ; 00091 0000 ;********************************************************************** 00092 0000 ; 00093 0000 ; 00094 0000 LIST 00095 0000 ; P16F628.INC Standard Header File, Version 1.01 Microchip Technology, Inc. 00096 0000 ; Comments added by Dave Flynn 00097 0000 NOLIST 00345 0000 ; 00346 0000 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _INTRC_OSC_NOCLKOUT 00347 0000 ; 00348 0000 ;============================================================================================== 00349 0000 ; 00350 0000 ; Port A bits 00351 0000 ; 00352 0000 0001 SystemLEDMask EQU 0x01 00353 0000 0005 SystemLEDPort EQU PORTA 00354 0000 0005 #Define SysLed SystemLEDPort,0 00355 0000 ; 00356 0000 001E PortADDRBits EQU b'00011110' ;All In, except 0 00357 0000 ; Solenoid.asm Page: 2 00358 0000 ; Port B bits 00359 0000 ; 00360 0000 0006 #Define ActivateValve PORTB,0 ;Active low input 00361 0000 0003 PWM_OutBit EQU 3 ;Output Active High 00362 0000 0004 DutyCycle1 EQU 4 ;Input 00363 0000 0005 DutyCycle2 EQU 5 ;Input 00364 0000 0006 DutyCycle3 EQU 6 ;Input 00365 0000 0007 DutyCycle4 EQU 7 ;Input 00366 0000 00F7 PortBDDRBits EQU 0xF7 ;All IN except 3 00367 0000 0000 PortBValue EQU b'00000000' 00368 0000 ; 00369 0000 ; 00370 0000 ;Constants 00371 0000 00D8 TMR0Val EQU 0xD8 00372 0000 0030 LEDTIME EQU 0x30 00373 0000 ; 00374 0000 ;***** VARIABLE DEFINITIONS 00375 0000 ; there are 68 bytes of ram starting at 0x0C 00376 0000 ; there are 64 bytes of EEPROM starting at 0x00 the EEPROM is not mapped into memory but 00377 0000 ; accessed through the EEADR and EEDATA registers 00378 0000 ; 00379 0000 ORG 0x20 00380 0020 status_temp RES 1 ; variable used for context saving 00381 0021 fsr_temp RES 1 ; variable used for context saving 00382 0022 fsr_swap RES 1 ; 2nd FSR reg 00383 0023 temp RES 1 ; temporary variable 00384 0024 temp2 RES 1 ; used by SwapFSRs 00385 0025 EEAddrTemp RES 1 ;EEProm address to read or write 00386 0026 EEDataTemp RES 1 ;Data to be writen to EEProm 00387 0027 tickcount RES 1 ;Timer tick count 00388 0028 Timer1Lo RES 1 ;1st 16 bit timer 00389 0029 Timer1Hi RES 1 00390 002A Timer2Lo RES 1 ;2nd 16 bit timer 00391 002B Timer2Hi RES 1 00392 002C Timer3Lo RES 1 00393 002D Timer3Hi RES 1 00394 002E ; 00395 002E 0070 Param70 EQU 0x70 00396 002E 007E w_temp EQU 0x7E 00397 002E ; 00398 002E ; EEPROM locations (NV-RAM) 0x00..0x3F 00399 002E ; 00400 002E ; none used 00401 002E ; 00402 002E ;================================================================================== 00403 002E ; 00404 002E RESET_VECTOR ORG 0x0000 ; processor reset vector 00405 0000 2835 goto start ; go to beginning of program 00406 0001 ; 00407 0001 INT_VECTOR ORG 0x0004 ; interrupt vector location 00408 0004 00FE movwf w_temp ; save current W register contents 00409 0005 0803 movf STATUS,W ; move status register into W register 00410 0006 0183 clrf STATUS 00411 0007 00A0 movwf status_temp ; save contents of STATUS register 00412 0008 0804 movf FSR,W ; save contents of FSR register 00413 0009 00A1 movwf fsr_temp 00414 000A ; 00415 000A 30D8 movlw TMR0Val ;256x39+16 cycles (10,000uS) 00416 000B 0081 movwf TMR0 ; reload TMR0 with -40 00417 000C 110B bcf INTCON,T0IF ; reset interupt flag bit 00418 000D ; 00419 000D ;Decrement timers 1,2 and 3 until they are zero 00420 000D 208E call TestT10 ;test if timer 1 is zero 00421 000E 1D03 btfss STATUS,Z ;skip if zero 00422 000F 207A call DecTimer1 ;was not zero 00423 0010 208C call TestT20 00424 0011 1D03 btfss STATUS,Z 00425 0012 2078 call DecTimer2 00426 0013 208A call TestT30 00427 0014 1D03 btfss STATUS,Z 00428 0015 2076 call DecTimer3 00429 0016 ; 00430 0016 1405 BSF SysLed ;LED Off 00431 0017 ; 00432 0017 03A7 DECF tickcount,F 00433 0018 1D03 BTFSS STATUS,Z 00434 0019 281D GOTO NoToggleSysLED 00435 001A ; 00436 001A 3030 ToggleSysLED MOVLW LEDTIME 00437 001B 00A7 MOVWF tickcount 00438 001C 1005 BCF SysLed ;LED On 00439 001D ; 00440 001D ; 00441 001D 0821 NoToggleSysLED movf fsr_temp,W 00442 001E 0084 movwf FSR 00443 001F 0820 movf status_temp,W ; retrieve copy of STATUS register 00444 0020 0083 movwf STATUS ; restore pre-isr STATUS register contents 00445 0021 0EFE swapf w_temp,F 00446 0022 0E7E swapf w_temp,W ; restore pre-isr W register contents 00447 0023 0009 retfie ; return from interrupt 00448 0024 ; 00449 0024 ;========================================================================================= 00450 0024 ; 00451 0024 0782 DCTable ADDWF PCL,F ;0..15 00452 0025 3401 RETLW PWM_1 ;All jumpers on 00453 0026 3402 RETLW PWM_2 00454 0027 3403 RETLW PWM_3 00455 0028 3404 RETLW PWM_4 00456 0029 3405 RETLW PWM_5 Solenoid.asm Page: 3 00457 002A 3406 RETLW PWM_6 00458 002B 3407 RETLW PWM_7 00459 002C 3408 RETLW PWM_8 00460 002D 340A RETLW PWM_10 00461 002E 340C RETLW PWM_12 00462 002F 340F RETLW PWM_15 00463 0030 3414 RETLW PWM_20 00464 0031 3432 RETLW PWM_50 00465 0032 343C RETLW PWM_60 00466 0033 3446 RETLW PWM_70 00467 0034 3465 RETLW PWM_FullOn ;No jumpers on 00468 0035 ; 00469 0035 ;========================================================================================= 00470 0035 ;========================================================================================= 00471 0035 ; 00472 0035 0183 start CLRF STATUS 00473 0036 018A CLRF PCLATH 00474 0037 1683 bsf STATUS,RP0 ; select bank 1 00475 0038 1381 bcf OPTION_REG,NOT_RBPU ; ensable pullups on port B 00476 0039 1281 bcf OPTION_REG,T0CS ; TMR0 clock CLKOUT 00477 003A 1181 bcf OPTION_REG,PSA ; prescaler assigned to TMR0 00478 003B 1401 bsf OPTION_REG,PS0 00479 003C 1481 bsf OPTION_REG,PS1 00480 003D 1501 bsf OPTION_REG,PS2 00481 003E 178B bsf INTCON,GIE ; enable interupts 00482 003F 168B bsf INTCON,T0IE ; enable TMR0 interupt 00483 0040 1283 bcf STATUS,RP0 ; select bank 0 00484 0041 ; 00485 0041 ; 00486 0041 3000 movlw PortBValue 00487 0042 0086 movwf PORTB ;init port B 00488 0043 0185 clrf PORTA 00489 0044 3007 movlw 0x07 00490 0045 009F movwf CMCON 00491 0046 1683 bsf STATUS,RP0 ; select bank 1 00492 0047 301E movlw PortADDRBits 00493 0048 0085 movwf TRISA 00494 0049 30F7 movlw PortBDDRBits ;setup for programer 00495 004A 0086 movwf TRISB 00496 004B 1283 bcf STATUS,RP0 ; select bank 0 00497 004C ; 00498 004C ; clear memory to zero (Timer1Lo..0x3F) 00499 004C 3028 movlw Timer1Lo 00500 004D 0084 movwf FSR 00501 004E 0180 RLoop clrf INDF 00502 004F 0A84 incf FSR,F 00503 0050 1F04 btfss FSR,6 00504 0051 284E goto RLoop 00505 0052 ; 00506 0052 ;setup PWM 00507 0052 ; 00508 0052 3004 MOVLW T2CON_Value 00509 0053 0092 MOVWF T2CON 00510 0054 0196 CLRF CCPR1H 00511 0055 0195 CLRF CCPR1L 00512 0056 300C MOVLW CCP1CON_Value 00513 0057 0097 MOVWF CCP1CON 00514 0058 3064 movlw PR2_Value 00515 0059 1683 bsf STATUS,RP0 ;Bank1 00516 005A 0092 movwf PR2 00517 005B 1283 bcf STATUS,RP0 ;Bank0 00518 005C 00519 005C ; 00520 005C ;========================================================================== 00521 005C ;========================================================================== 00522 005C ; Main Loop 00523 005C ; 00524 005C ;========================================================================== 00525 005C ; 00526 005C 1806 MainLoop btfsc ActivateValve 00527 005D 285C goto MainLoop 00528 005E ; activate 00529 005E 3065 MOVLW PWM_FullOn 00530 005F 0095 MOVWF CCPR1L 00531 0060 3032 MOVLW ValveFullTime 00532 0061 2070 CALL Wait 00533 0062 ; 00534 0062 ; get duty cycle 00535 0062 0E06 SWAPF PORTB,W 00536 0063 390F ANDLW 0x0F 00537 0064 2024 CALL DCTable 00538 0065 0095 MOVWF CCPR1L 00539 0066 1C06 KeepOn BTFSS ActivateValve 00540 0067 2866 GOTO KeepOn 00541 0068 ; 00542 0068 3000 MOVLW PWM_Off 00543 0069 0095 MOVWF CCPR1L 00544 006A ; 00545 006A 3032 MOVLW ValveFullTime ;debounce 00546 006B 2070 CALL Wait 00547 006C ; 00548 006C 285C MainEnd goto MainLoop 00549 006D ; 00550 006D ;========================================================================== 00551 006D ; 00552 006D ;halt here for 10 ms 00553 006D 3002 Wait10ms movlw 2 00554 006E 2870 goto Wait 00555 006F ;halt here for 1 second Solenoid.asm Page: 4 00556 006F 3064 Wait1Second movlw d'100' 00557 0070 00AC Wait movwf Timer3Lo 00558 0071 01AD clrf Timer3Hi 00559 0072 208A W1S_Loop call TestT30 00560 0073 1D03 btfss STATUS,Z 00561 0074 2872 goto W1S_Loop 00562 0075 0008 return 00563 0076 ; 00564 0076 ;========================================================================== 00565 0076 ; Decrement routine for 16 bit timers 00566 0076 ; 00567 0076 302D DecTimer3 movlw Timer3Hi 00568 0077 287B goto DecTimer 00569 0078 302B DecTimer2 movlw Timer2Hi 00570 0079 287B goto DecTimer 00571 007A 3029 DecTimer1 movlw Timer1Hi 00572 007B ;DecTimer 00573 007B ; entry: FSR=Timer(n)Hi 00574 007B 0084 DecTimer movwf FSR 00575 007C 0880 movf INDF,F 00576 007D 1D03 btfss STATUS,Z 00577 007E 2884 goto THnot0 ;TimerHi was not zero 00578 007F 0384 decf FSR,F 00579 0080 0880 movf INDF,F 00580 0081 1D03 btfss STATUS,Z 00581 0082 0380 decf INDF,F ;TimerLo was not zero 00582 0083 0008 return 00583 0084 return 00584 0084 0384 THnot0 decf FSR,F 00585 0085 0B80 decfsz INDF,F 00586 0086 2889 goto DTDone ;TimerLo is not zero 00587 0087 0A84 incf FSR,F 00588 0088 0380 decf INDF,F 00589 0089 0008 DTDone return 00590 008A ; 00591 008A ;========================================================================== 00592 008A ; Test for 16 bit timers = zero 00593 008A ;If Timer is zero return Z flag,1 else Z=0 00594 008A ; 00595 008A 302C TestT30 movlw Timer3Lo 00596 008B 288F goto DoTestT 00597 008C 302A TestT20 movlw Timer2Lo 00598 008D 288F goto DoTestT 00599 008E 3028 TestT10 movlw Timer1Lo 00600 008F 0084 DoTestT movwf FSR 00601 0090 0880 movf INDF,F 00602 0091 1D03 btfss STATUS,Z 00603 0092 2895 goto DTTDone ;TimerHi was not zero 00604 0093 0A84 incf FSR,F 00605 0094 0880 movf INDF,F 00606 0095 0008 DTTDone return 00607 0096 ; 00608 0096 ; 00609 0096 ;SwapFSRs is used to maintain two indirect pointers 00610 0096 ; 00611 0096 0804 SwapFSRs movf FSR,W ;swap FSR<>fsr_swap 00612 0097 00A4 movwf temp2 00613 0098 0822 movf fsr_swap,W 00614 0099 0084 movwf FSR 00615 009A 0824 movf temp2,W 00616 009B 00A2 movwf fsr_swap 00617 009C 0008 return 00618 009D ; 00619 009D ; Read EEPROM 00620 009D ; entry: EEPROM address to read in EEAddrTemp 00621 009D ; Bank 0 selected 00622 009D ; exit: W=EEDATA, Bank 0 selected 00623 009D ; 00624 009D 0825 EERead movf EEAddrTemp,W 00625 009E 009B movwf EEADR ;Address to read 00626 009F 1683 bsf STATUS,RP0 ;Bank 1 00627 00A0 141C bsf EECON1,RD 00628 00A1 1283 bcf STATUS,RP0 ;Bank 0 00629 00A2 081A movf EEDATA,W ;W=EEDATA 00630 00A3 0008 return 00631 00A4 ; 00632 00A4 ; Write EEPROM 00633 00A4 ; entry: EEPROM address to write in EEAdrTemp 00634 00A4 ; EEPROM data to write in EEDataTemp 00635 00A4 ; Bank 0 selected 00636 00A4 ; exit: Bank 0 selected 00637 00A4 ; 00638 00A4 0825 EEWrite movf EEAddrTemp,W 00639 00A5 009B movwf EEADR ;Address to write 00640 00A6 0826 movf EEDataTemp,W 00641 00A7 009A movwf EEDATA 00642 00A8 1683 bsf STATUS,RP0 ;Bank 1 00643 00A9 138B bcf INTCON,GIE ;Disale Ints 00644 00AA 151C bsf EECON1,WREN 00645 00AB 3055 movlw 0x55 00646 00AC 009D movwf EECON2 ;write 55 00647 00AD 30AA movlw 0xAA 00648 00AE 009D movwf EECON2 ;write AA 00649 00AF 149C bsf EECON1,WR 00650 00B0 151C bsf EECON1,WREN 00651 00B1 189C EEWriteLoop btfsc EECON1,WR 00652 00B2 28B1 goto EEWriteLoop 00653 00B3 178B bsf INTCON,GIE 00654 00B4 1283 bcf STATUS,RP0 ;Bank 0 Solenoid.asm Page: 5 00655 00B5 0008 return 00656 00B6 ; 00657 00B6 ; 00658 00B6 ; 00659 00B6 ; 00660 00B6 END ; directive 'end of program' Solenoid.asm Memory Usage Map Page: 6 Memory Usage Map ('X' = Used, '-' = Unused) 0000 : X---XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXX---------- 2000 : -------X-------- ---------------- ---------------- ---------------- Program Memory Words Used:179 Config:3F10