Temporizador Regresivo de Hasta 100 Minutos Con PICmicro

download Temporizador Regresivo de Hasta 100 Minutos Con PICmicro

of 22

Transcript of Temporizador Regresivo de Hasta 100 Minutos Con PICmicro

Temporizador regresivo de hasta 100 minutos con PICmicroCon solo un circuito integrado, un PICmicro y el adecuado programa para ste se logra un excelente timer regresivo, con indicacin visual (por medio de 4 cifras) y con memoria no voltil para retener la ltima cuenta.

En el esquema se observa que el manejo de los displays queda en mano de un decodificador de BCD a 7 segmentos y el multiplex de stos queda a cargo de cuatro transistores PNP de uso general. No hay demasiado que explicar en este hardware, salvando la resistencia de Pull-Up conectada al pulsador 3 (las otras dos vas de entrada corresponden al puerto B el cual tiene Pull-Up interno). La alimentacin es de 4.5V y puede ser provista por 3 pilas comunes tipo AA. El pulsador 1 (Start) hace que comience la cuenta regresiva. Tambin se usa para hacer que el zumbador piezoelctrico deje de sonar (suena una vez que la cuenta llega a cero). De ser este el caso el zumbador se silenciar y el temporizador se pondr nuevamente en 99:59 El pulsador 2 (Set) permite alterar el tiempo desde el cual se comenzar a contar. Una vez terminado esto el nuevo valor ser

almacenado en la memoria EEPROM del PICmicro por lo cual el valor no se perder an cuando se interrumpa la alimentacin. El pulsador 3 (End) permite terminar la cuenta prematuramente. Detalle de los terminales del CD4511:

;------------------------------------------------------------------------; ; Darkroom Timer ; ; April '99 Stan Ockers ([email protected]) ; ; circuit diagram in CNTDN.PCX ; ; further description in CNTDN.TXT ; ; ; ; Counts down from 0-99 min and 0-59 sec giving an alarm at 0 ; ; initial counts are held in data EEPROM setable with one button ; ; ; ; RBO-RB3 to bases of transistors connect to common cathode of displays. ; ; RA0-RA3 to 1,2,4,8 BCD inputs of CD4511 7 segment latch and driver. ; ; RB7 to start pushbutton used to start countdown and silence alarm. ; ; RB6 goes to time set pushbutton use to sucessively set the digits. ; ; RA4 with pull-up resistor goes to PB to select from 15 starting counts ; ; RB4 and RB5 go to speaker which gives an alarm. ; ;------------------------------------------------------------------------; LIST P=16F84 #INCLUDE "p16f84.inc" ;------------------------------------------------------------------------; ; Here we define our own personal registers and give them names ; ;------------------------------------------------------------------------; SEC EQU H'0C' seconds SEC10 EQU H'0D' MIN EQU H'0E' MIN10 EQU H'0F' DIGCTR EQU H'10' actually used DIGIT EQU H'11' INTCNT EQU H'12' sec up FUDGE EQU H'13' interrupts RUNFLG EQU H'14' progress W_TEMP EQU H'15' STATUS_TEMP EQU H'16' ; this register holds the value of ; ; ; ; holds holds holds 8 bit value of value of value of counter, 10's of seconds minutes 10's of minutes only 2 lowest bits

; hold digit number to access table ; counts # interrupts to determine when 1 ; allows slight adjustment every 7 ; bit 0 only, tells if countdown in ; temporarily holds value of W ; temporarily holds value of STATUS

SECNT 1 sec CNTMSEC ALARM alarm OFFSET

EQU H'17' EQU H'18' EQU H'19' EQU H'1A'

; used in counting 50, 20 msec delays for ; used in timing of milliseconds ; bit 0 only, used as flag for when to ; hold offset of address in EEPROM

;------------------------------------------------------------------------; ; Here we give names to some numbers to make their use more clear ; ;------------------------------------------------------------------------; #DEFINE #DEFINE #DEFINE #DEFINE #DEFINE START_PB SET_PB SELECT_PB RB4 RB5 D'7' D'6' D'4' D'4' D'5'

;------------------------------------------------------------------------; ; We set the start of code to orginate a location zero ; ;------------------------------------------------------------------------; ORG 0 GOTO MAIN NOP NOP NOP GOTO INTERRUPT ; jump to the main routine

; interrupt routine

;------------------------------------------------------------------------; ; This table is used to get a bit pattern that will turn on a digit ; ;------------------------------------------------------------------------; BITPAT ADDWF transistors RETLW transistor on RETLW RETLW RETLW PCL,f H'0E' H'0D' H'0B' H'07' ; get bit pattern for ; a low, (0), turns the

;------------------------------------------------------------------------; ; Initialization routine sets up ports and timer ; ;------------------------------------------------------------------------; INIT outputs MOVLW H'C0' TRIS PORTB ; PB6 & PB7 inputs all others

MOVLW H'10' outputs TRIS PORTA MOVLW H'03' OPTION MOVLW H'A0' MOVWF INTCON MOVLW H'F4' MOVWF INTCNT MOVLW H'06' MOVWF FUDGE CLRF OFFSET RETURN

; Port RA4 input, others ; prescaler on TMR0 and 1:16 ; GIE & T0IE set T0IF cleared ; initialize INTCNT ; initialize FUDGE ; initialize OFFSET

;------------------------------------------------------------------------; ; This is the interrupt routine that is jumped to when TMR0 overflows ; ;------------------------------------------------------------------------; INTERRUPT MOVWF W_TEMP SWAPF STATUS,W MOVWF STATUS_TEMP INCF DIGCTR,f MOVF DIGCTR,W ANDLW H'03' MOVWF DIGIT ADDLW H'0C' MOVWF FSR MOVF INDF,W MOVWF PORTA MOVF DIGIT,W CALL BITPAT MOVWF PORTB DECFSZ INTCNT,f GOTO RESTORE CALL EVERYSEC MOVLW H'F4' MOVWF INTCNT DECFSZ FUDGE,f GOTO RESTORE MOVLW H'06' MOVWF FUDGE INCF INTCNT,f SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF STATUS_TEMP,f SWAPF STATUS_TEMP,W BCF INTCON,T0IF RETFIE ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; save W save status without changing flags next digit # get it into W mask off 2 lowest bits save it for later point at register to display use as pointer get value of reg pointed to output to CD4511 recall digit # get bit pattern select transistor finished 1 sec ? not yet, return and enable

into W

inter.

; go to every second routine ; reset INTCNT to normal value ; time for fudge? ; not yet, continue on ; reset FUDGE to 6 ; ; ; ; ; ; ; INTCNT to 245 get original status back into status register old no flags trick again to restore W clear the TMR0 interrupt flag finished

RESTORE

;------------------------------------------------------------------------; ; This routine is called by the interrupt routine every second ; ;------------------------------------------------------------------------;

EVERYSEC

CKZERO

BTFSS RUNFLG,0 RETURN DECF SEC,f INCFSZ SEC,W GOTO CKZERO MOVLW H'09' MOVWF SEC DECF SEC10,f INCFSZ SEC10,W GOTO CKZERO MOVLW H'05' MOVWF SEC10 DECF MIN,f INCFSZ MIN,W GOTO CKZERO MOVLW H'09' MOVWF MIN DECF MIN10,f MOVF SEC,f BTFSS STATUS,Z RETURN MOVF SEC10,f BTFSS STATUS,Z RETURN MOVF MIN,f BTFSS STATUS,Z RETURN MOVF MIN10,f BTFSS STATUS,Z RETURN CLRF RUNFLG BSF ALARM, 0 RETURN

; return if runflg not set ; decrement seconds digit ; test for underflow ; reset sec to 9 ; decrement SEC10 ; check underflow

; test SEC for zero ; check SEC10 for zero ; check MIN for zero ; check MIN10 for zero ; stop the countdown ; set the alarm flag

;------------------------------------------------------------------------; ; This is a routine to read a byte from the data EEPROM ; ;------------------------------------------------------------------------; READEE MOVWF EEADR BSF STATUS,RP0 BSF EECON1,RD BCF STATUS,RP0 MOVF EEDATA,W RETURN ; ; ; ; ; set up eeprom address from W change to page 1 set the read bit back to page 0 return value in W

;------------------------------------------------------------------------; ; This routine fills the display registers from data EEPROM ; ;------------------------------------------------------------------------; GETEE MOVLW H'01' ADDWF OFFSET,W CALL READEE MOVWF SEC MOVLW H'02' ADDWF OFFSET,W ; ; ; ; ; ; EEprom location 1 + offset from start into W into SEC register location 2 + offset from start

CALL READEE MOVWF SEC10 MOVLW H'03' ADDWF OFFSET,W CALL READEE MOVWF MIN MOVLW H'04' ADDWF OFFSET,W CALL READEE MOVWF MIN10 RETURN

; ; ; ; ; ; ; ; ; ;

into W into SEC10 register location 3 + offset from start into W into MIN register location 4 + offset from start into W into MIN10 register

;------------------------------------------------------------------------; ; This routine writes a byte to data EEPROM ; ;------------------------------------------------------------------------; WRITEEE BSF STATUS,RP0 CLRF EECON1 BSF EECON1,WREN MOVLW H'55' MOVWF EECON2 MOVLW H'AA' MOVWF EECON2 BSF EECON1,WR BTFSC EECON1,WR GOTO EELOOP BSF EECON1,WREN BCF EECON1,EEIF BCF STATUS,RP0 RETURN ; set up EEADR and EEDATA first ; enable write ; magic sequence

EELOOP

; wait for WR to go low ; not yet ; clear the interrupt flag ; return to page 0

;------------------------------------------------------------------------; ; This routine puts display registers into data EEPROM ; ;------------------------------------------------------------------------; PUTEE EEprom MOVF SEC,W MOVWF EEDATA MOVLW H'01' ADDWF OFFSET,W MOVWF EEADR CALL WRITEEE MOVF SEC10,W MOVWF EEDATA MOVLW H'02' ADDWF OFFSET,W MOVWF EEADR CALL WRITEEE MOVF MIN,W MOVWF EEDATA MOVLW H'03' ADDWF OFFSET,W MOVWF EEADR CALL WRITEEE MOVF MIN10,W ; put digit registers into ; EEPROM location 1 + ; offset from start

; EEPROM location 2 + ; offset from start

; EEPROM location 3 + ; offset from start

MOVWF EEDATA MOVLW H'04' ADDWF OFFSET,W MOVWF EEADR CALL WRITEEE RETURN

; EEPROM location 4 + ; offset from start

;------------------------------------------------------------------------; ; This is the main routine, the program starts here ; ;------------------------------------------------------------------------; MAIN CALL INIT ; set up ports etc.

;------------------------------------------------------------------------; ; We will return to this point when alarm is shut off. ; ;------------------------------------------------------------------------; EE2D countdown CALL GETEE BCF RUNFLG, 0 BCF ALARM, 0 CALL WAITSTARTUP CALL WAITSETUP CALL WAITSELECT ; put eeprom in display regs. ; clear run flag so no ; clear alarm flag ; wait till no switches pressed

;------------------------------------------------------------------------; ; This loop checks for either pushbutton and acts accordingly ; ;------------------------------------------------------------------------; KEYCHKLOOP BTFSS PORTB,START_PB GOTO STARTCNT BTFSS PORTB,SET_PB GOTO SETDISP BTFSS PORTA,SELECT_PB GOTO SETSELECT GOTO KEYCHKLOOP ; ; ; ; ; check for start pressed yes, start count check for set pressed yes, set display check select pushbutton

pressed

; yes, select starting count ; loop to catch key press

;------------------------------------------------------------------------; ; If start key has been pressed then start countdown process, ; ; I initially released this code with only the setting of the ; ; run flag included. If you think about it you must also reset ; ; TMR0 to zero. TMR0 is free running and could have any value ; ; 0-255 when the button in pressed. Also INTCNT has to be ; ; initialized because the previous count could have been cancelled. ;

;------------------------------------------------------------------------; STARTCNT CALL WAITSTARTUP MOVLW D'244' MOVWF INTCNT CLRF TMR0 BSF RUNFLG, 0 ; wait for release of start key ; reset INTCNT ; and clear timer 0 ; start the countdown

;------------------------------------------------------------------------; ; Once started just loop looking for cancel or reaching 0000 ; ;------------------------------------------------------------------------; MAINLOOP start BTFSS PORTB,START_PB GOTO EE2D BTFSC ALARM, 0 GOTO SOUNDALARM GOTO MAINLOOP ; countdown in progress, check ; ; ; ; start over again if pressed reached 0000 yet? yes, turn alarm on no start switch, continue

looping

;------------------------------------------------------------------------; ; This code sounds the alarm and waits on start to be pressed ; ;------------------------------------------------------------------------; SOUNDALARM FINALWAIT BCF PORTB,RB4 BSF PORTB,RB5 MOVLW 2 CALL NMSEC BSF PORTB,RB4 BCF PORTB,RB5 MOVLW 2 CALL NMSEC BTFSC PORTB,START_PB GOTO FINALWAIT CALL DLY20 BTFSC PORTB,START_PB GOTO FINALWAIT BCF PORTB,RB4 BCF PORTB,RB5 CALL WAITSTARTUP GOTO EE2D ; speaker leads set up ; opposite polarity ; delay 2 milliseconds ; flip the speaker leads ; another 2 msec delay ; ; ; ; ; ; start button pressed not yet debounce just to make sure second look nah, keep waiting speaker leads set to same

polarity

; now wait for the switch up ; start all over again

;------------------------------------------------------------------------; ; Wait for release of start button ; ;------------------------------------------------------------------------; WAITSTARTUP BTFSS PORTB,START_PB GOTO WAITSTARTUP CALL DLY20 ; wait for release ; not released yet ; debounce release

BTFSS PORTB,START_PB GOTO WAITSTARTUP RETURN

; 2nd check, make sure released ; keep checking

;------------------------------------------------------------------------; ; Wait for release of set button ; ;------------------------------------------------------------------------; WAITSETUP BTFSS PORTB,SET_PB GOTO WAITSETUP CALL DLY20 BTFSS PORTB,SET_PB GOTO WAITSETUP RETURN ; ; ; ; ; wait for release not yet debounce release 2nd check, make sure released keep checking

;------------------------------------------------------------------------; ; Wait for release of select button ; ;------------------------------------------------------------------------; WAITSELECT BTFSS PORTA,SELECT_PB GOTO WAITSELECT CALL DLY20 BTFSS PORTA,SELECT_PB GOTO WAITSELECT RETURN ; ; ; ; ; wait for release not yet debounce release 2nd check, make sure released keep checking

;------------------------------------------------------------------------; ; Routine to follow sets the countdown time digit by digit ; ;------------------------------------------------------------------------; SETDISP released display) CALL WAITSETUP MOVLW H'0A' MOVWF MIN10 MOVWF MIN MOVWF SEC10 MOVWF SEC CLRF MIN10 MOVLW H'32' MOVWF SECNT CALL DLY20 BTFSS PORTB,SET_PB GOTO MINSET DECFSZ SECNT,f GOTO WAIT1 INCF MIN10,f MOVLW H'0A' SUBWF MIN10,W BTFSC STATUS,Z GOTO STARTMIN10 ; wait for set key to be ; put A's in digits, (no ; ; ; ; ; ; ; ; ; ; ; ; 10's of minutes minutes 10's of seconds seconds 0 now in MIN10 50 delays of 20 msec into counting register set key pressed? yes MIN10 now set finished 1 sec delay? continue wait every second increment 10's

STARTMIN10 MOREMIN10 WAIT1

MIN

; reached 10? ; Z set if reached 10 ; start again with 0

MINSET STARTMIN MOREMIN WAIT2

SETSEC10 STARTSEC10 MORESEC10 WAIT3

SEC

GOTO MOREMIN10 CALL WAITSETUP CLRF MIN MOVLW H'32' MOVWF SECNT CALL DLY20 BTFSS PORTB,SET_PB GOTO SETSEC10 DECFSZ SECNT,f GOTO WAIT2 INCF MIN,f MOVLW H'0A' SUBWF MIN,W BTFSC STATUS,Z GOTO STARTMIN GOTO MOREMIN CALL WAITSETUP CLRF SEC10 MOVLW H'32' MOVWF SECNT CALL DLY20 BTFSS PORTB,SET_PB GOTO SETSEC DECFSZ SECNT,f GOTO WAIT3 INCF SEC10,f MOVLW H'06' SUBWF SEC10,W BTFSC STATUS,Z GOTO STARTSEC10 GOTO MORESEC10 CALL WAITSETUP CLRF SEC MOVLW H'32' MOVWF SECNT CALL DLY20 BTFSS PORTB,SET_PB GOTO FINSET DECFSZ SECNT,f GOTO WAIT4 INCF SEC,f MOVLW H'0A' SUBWF SEC,W BTFSC STATUS,Z GOTO STARTSEC GOTO MORESEC BCF INTCON, GIE CALL PUTEE BSF INTCON, GIE CALL WAITSETUP GOTO KEYCHKLOOP

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

set up another 1 sec delay wait for release of set key 0 into MIN 50 delays of 20 msec into counting register set pressed? yes, finished with MIN finished 1 sec delay? continue wait every second increment MIN reached 10? Z set if reached 10 put zero in if Z set set up another 1 sec delay wait release 0 into SEC10 50 delays of 20 msec into counting register set pressed? yes quit incrementing finished 1 sec delay? continue wait every second increment 10's

; reached 6? ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; Z set if reached 6 put zero in if Z set set up another 1 sec delay wait for release 0 into SEC 50 delays of 20 msec into counting register set button pressed? yes finished setting digits finished 1 sec delay? continue wait every second increment SEC reached 10? Z set if reached 10 put zero in if Z set set up another 1 sec delay disable interrupts put new digits into EEPROM re-enable interrupts make sure set switch up start checking buttons again

SETSEC STARTSEC MORESEC WAIT4

FINSET

;------------------------------------------------------------------------; ; Selects starting count by changing EEPROM location 0 ; ;------------------------------------------------------------------------; SETSELECT MOVLW D'4' ; offset up 4

interrupts

ADDWF OFFSET,F MOVLW D'60' SUBWF OFFSET,W BTFSC STATUS,Z CLRF OFFSET MOVLW 0 MOVWF EEADR MOVF OFFSET,W MOVWF EEDATA BCF INTCON,GIE CALL WRITEEE BSF INTCON,GIE CALL GETEE CALL WAITSELECT GOTO KEYCHKLOOP

; ; ; ; ; ; ; ; ; ;

next offset position reached 16th yet? will give zero if yes skip if not 64 reset position to zero EEPROM location set up address offset # into W set up data clear GIE, disable

display

; save # in location 0 ; re-enable interrupts ; get new start count into ; make sure select switch is up ; start checking buttons again

;------------------------------------------------------------------------; ; The following are various delay routines based on instruction length. ; ; The instruction length is assumed to be 1 microsecond (4Mhz crystal). ; ;------------------------------------------------------------------------; DLY20 MOVLW 20 ; delay for 20 milliseconds ;*** N millisecond delay routine *** MOVWF CNTMSEC ; delay for N (in W) ; ; ; ; ; ; load takes 1 microsec by itself CALL takes ... 2 + 247 X 4 + 3 + 2 = 995 1 more microsec 1 when skip not taken, else 2 2 here: total 1000 per

NMSEC milliseconds MSECLOOP MOVLW D'248' CALL MICRO4

NOP DECFSZ CNTMSEC,f GOTO MSECLOOP msecloop to here RETURN

; final time through takes 999 ; overhead in and out ignored

ONEMSEC = 995 MICRO4 last return = microsec

;*** 1 millisecond delay routine *** MOVLW D'249' ; 1 microsec for load W ; loops below take 248 X 4 + 3 ADDLW H'FF' BTFSS STATUS,Z GOTO MICRO4 RETURN ; subtract 1 from 'W' ; skip when you reach zero ; loops takes 4 microsec, 3 for ; takes 2 microsec ; call + load W + loops + ; 2 + 1 + 995 + 2 = 1000

;------------------------------------------------------------------------; ; Here we set up the initial values of the digits in data EEPROM ;

;------------------------------------------------------------------------; ORG H'2100' DE 0, 1, 0, 0, 0 DE 2, 0, 0, 0 DE 3, 0, 0, 0 DE 4, 0, 0, 0 DE 5, 0, 0, 0 DE 6, 0, 0, 0 DE 7, 0, 0, 0 DE 8, 0, 0, 0 DE 9, 0, 0, 0 DE 0, 1, 0, 0 DE 1, 1, 0, 0 DE 2, 1, 0, 0 DE 3, 1, 0, 0 DE 4, 1, 0, 0 DE 5, 1, 0, 0 END ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 1st starting # 2nd starting # 3rd starting # 4th starting # 5th starting # 6th starting # 7th starting # 8th starting # 9th starting # 10th starting # 11th starting # 12th starting # 13th starting # 14th starting # 15th starting #

Firmware a cargar en el PICmicro (en Hexa):100000009528000000000000182882070E340D34E7 :100010000B340734C03066001030650003306200D6 :10002000A0308B00F4309200063093009A01080053 :100030009500030E9600900A1008033991000C3EBB :10004000840000088500110805208600920B3028E6 :100050003620F4309200930B302806309300920A39 :10006000160E8300960E160E0B110900141C0800C4 :100070008C030C0F482809308C008D030D0F482885 :1000800005308D008E030E0F482809308E008F0337 :100090008C08031D08008D08031D08008E08031D31 :1000A00008008F08031D0800940119140800890036 :1000B0008316081483120808080001301A07572015 :1000C0008C0002301A0757208D0003301A07572082 :1000D0008E0004301A0757208F000800831688010D :1000E000081555308900AA308900881488187628A8 :1000F00008150812831208000C08880001301A073E :1001000089006E200D08880002301A0789006E20D1 :100110000E08880003301A0789006E200F08880037 :1001200004301A0789006E2008000A205D20141090 :100130001910BE20C420CA20861FA328061FD0285D :10014000051E16299C28BE20F4309200810114144B :10015000861F96281918AD28A82806128616023080 :1001600027210616861202302721861BAD2826215C :10017000861BAD2806128612BE209628861FBE2832 :100180002621861FBE280800061FC4282621061F18 :10019000C4280800051ECA282621051ECA280800F2 :1001A000C4200A308F008E008D008C008F01323009 :1001B00097002621061FE428970BD9288F0A0A30BA :1001C0000F020319D628D728C4208E013230970099 :1001D0002621061FF328970BE8288E0A0A300E0204 :1001E0000319E528E628C4208D0132309700262126 :1001F000061F0229970BF7288D0A06300D020319F6 :10020000F428F528C4208C01323097002621061FDF :100210001129970B06298C0A0A300C0203190329AD :1002200004298B137C208B17C4209C2804309A0748 :100230003C301A0203199A01003089001A0888001C :100240008B136E208B175D20CA209C2820309800CD :10025000F8302F210000980B28290800F930FF3EC4 :06026000031D2F29080018 :1042000000000100000000000000020000000000AB :104210000000030000000000000004000000000097 :104220000000050000000000000006000000000083 :10423000000007000000000000000800000000006F :104240000000090000000000000000000100000064 :104250000000010001000000000002000100000059 :104260000000030001000000000004000100000045 :0A427000000005000100000000003E :00000001FF

EXPLICACION

CUARTO TEMPORIZADOR El objetivo de este proyecto es presentar un dispositivo que es til y en el mismo tiempo, demostrar a las caractersticas de muchos principiantes que participan en la programacin el PIC. Algunos de los temas incluidos son: * El uso simple de ensamblador MPASM * Demostracin de uso de temporizador 0 y el prescaler * El uso de la longitud de las instrucciones para configurar los retrasos de tiempo * El uso de rutinas de interrupcin * Deteccin de cierre del interruptor incluyendo eliminacin de rebotes * Almacenamiento y recuperacin de datos a bordo de la EEPROM DESCRIPCIN Cuando la unidad est en el ltimo recuento de utilizarse a partir, a pocos minutos 099, 0-59 segundos, se muestra en la pantalla. El recuento de inicio se mantiene en los datos EEPROM del PIC16F84. Cuenta regresiva comienza cuando el botn de inicio se presiona. Una alarma suena cuando la cuenta llegue a cero. La alarma contina hasta inicio se presiona de nuevo. Esta prensa tambin devuelve el nmero de partida a la pantalla. Al pulsar inicio antes de llegar a cero tambin vuelve a comenzar condiciones. El recuento de inicio se puede cambiar si el botn de ajuste es presionado antes de la cuenta regresiva. Cada dgito se enciende a su vez, el incremento de cero hasta que el botn de ajuste es pulsa de nuevo. El recuento de empezar de nuevo se guarda en la EEPROM de prensa despus de la final del botn de ajuste. Hay 15 cargos inicio configurable. Usted ciclo a travs de ellas usando la seleccin pulsador. El conjunto botn cambia slo el nmero de partida en la actualidad que aparecen.

MPASM El cdigo fuente para MPASM est en 'CNTDN.ASM' el archivo.Es tan simple como se puede llegar tan lejos como las directivas del ensamblador ir."LISTA" define el

procesador, mientras que el cdigo adicionales introducidas por '# include' definir todas las funciones especiales registros, etc bits # DEFINE se utilizan para hacer el cdigo ms claro. "ORG 0 ', dice para iniciar el cdigo en la posicin 0 y 'END' marca el final del programa. Etiquetas de inicio en la primera columna. Tanto la iguala y tienen lneas de destino etiquetas adheridas a ellos. Todo lo dems se inicia en la columna 2 o ms all. # Define y # include opcionalmente podra comenzar en la columna 1 tambin. Revise "p16F84.inc" para ver todas las definiciones incluidas. Los bits individuales de los registros tienen nombres que debe ser usado en lugar de nmeros, es decir, ESTADO, Z en lugar de ESTADO, 2. Define sustituir los nmeros correspondientes involucrarse y hacer las cosas ms claras, (PORTA, START_PB en lugar de PORTA, 7). Cuando se monten "CNTDN.ASM ', obtendr una serie de advertencias y mensajes. Las advertencias se deben a "TRIS" las instrucciones y "OPCIN". No haga caso de ellos, es la forma ms fcil de crear estos registros. Los mensajes se deben a que MPASM no se puede hacer un seguimiento de la pgina que se in Slo asegrese de que RB0 del ESTADO se ha puesto delante de las instrucciones mencionadas se alcanzan y se despeja despus. EL CDIGO Hay dos rutina pasando al mismo tiempo. Los conjuntos de rutina principal condiciones iniciales y despus coloca, interruptores de control y de una bandera de alarma en terminacin de la cuenta. Una rutina de interrupcin se la multiplexacin de la pantalla y disminuye el recuento de cada segundo, si una cuenta atrs est en marcha. Tambin establece una bandera de alarma cuando la cuenta llegue a cero. La interrupcin se basado en el desbordamiento del temporizador 0 (TMR0). CALENDARIO Dos mtodos de sincronizacin se utilizan en el programa, TMR0 para la rutina de interrupcin y la instruccin de tiempo de longitud de los retrasos en el interruptor de supresin de rebotes y alarma generacin.

PUESTA A CERO DEL TEMPORIZADOR instalacin TMR0 es complicado. Contador de tiempo cero continuamente incrementos. Cuando se rueda ms, una bandera, T0IF en el registro INTCON, se establece.Somos responsables de facilitacin de la bandera en el software. Si quisiramos, podramos encuesta de este indicador. Para ello es necesario un bucle, comprobando constantemente la bandera. Una mejor manera es permitir a cero el temporizador de interrupcin, (T0IE en INTCON = 1), y habilitar las interrupciones en general (GIE en INTCON = 1). Con los dos bits puestos, un desbordamiento de TMR0 se aumentar T0IF y causar un CALL a la ubicacin de 4, que es un salto a la interrupcin de rutina. GIE es cleard cuando la rutina se introduce para otras interrupciones no interferir. GIE se restablecer al final de la rutina por RETFIE, (ida y vuelta y permitir GIE). No se olvide de clara T0IF o estamos de vuelta en el situacin de interrupcin de nuevo. Cdigo tambin es necesario en el comienzo y el final de la rutina para guardar y restaurar los valores de W y registrar el estado. Recuerde, no hay otra rutina pasando, (MAIN), que pueden requerir estos valores. Guardar estos es un poco difcil porque no podemos utilizar cualquier instrucciones que cambiar el valor de STATUS para hacerlo.SWAP parece que funciona. Cuando la puesta en marcha del PIC, TMR0 se establece en el incremento de los pulsos del puerto A poco 4 pines, (T0CS en option = 1). Borrar T0CS, (Timer 0 Reloj Seleccione), a 0 para hacer TMR0 incremento con el ciclo de instruccin. Esto es cada microsegundo para un cristal de 4 Mhz. TMR0 se desbordar despus de 256 microsegundos. Esto es demasiado rpido. Usamos el prescaler para disminuir la tasa de abajo. El prescaler aparece asignado para el temporizador de vigilancia, (PSA option = 1). PSA = 0 se asigna a TMR0. Si bien estamos hablando de OPCIN, los bits 0-3 controlar el factor de divisin para el prescaler. Hemos establecido los bits 0 y 1 para obtener una tasa de 1:16. Esto le da un exceso de capacidad cada 16 x 256 = 4096 microsegundos. Todo esto contribuye a poner un 3 en la opcin de registro. Te dije que era complicado. La parte buena es que una vez que se establece que slo se activa automticamente en segundo plano. Cada 4 milisegundos que el rutina de interrupcin se entra. El dgito de la pantalla se cambia y el valor desde el registro correspondiente, (SEC, SEC10, MIN o MIN10), se enva al CD4511 , (A travs del puerto A), donde los segmentos a iluminar se deciden. Un patrn es

seleccionado para encender el transistor apropiado y enviado a Puerto B. Cada segundo una llamada se hace a EVERYSEC que disminuye el nmero de controles y de 0000. Si es cero llegado el pedacito de bandera de alarma est activada. Una complicacin adicional es ms el tiempo exacto durante 1 segundo. Un contador INTCNT se decrementa cada vez que se entr en la rutina de interrupcin. Es normalmente se establece inicialmente en 244 (H'F4 '). 244 X 4096 = 999.424 microsegundos, un poco menos de 1 segundo. Cada vez sptimo se establece en 245 lugar, a travs de el uso de la chapuza del contador. Este es 1003520 microsegundos. El promedio obras a 1000009 microsegundos. No es perfecto, pero muy cerca. Para revisar el procedimiento de interrupcin: * Hay cuatro condiciones en el PIC que interrumpe causa. Cada condicin levanta una bandera en INTCON. Esto ocurre independientemente del estado de la bits de habilitacin. * Cada estado tiene un bit de habilitacin que cuando el sistema indica que una interrupcin debe ser considerado. Si GIE tambin se establece una interrupcin se producir y llamamiento a la ubicacin 4. * Estamos interesados slo en la interrupcin que puede ocurrir cuando TMR0 rollos ms de 255 a 0. Al utilizar el prescaler, que hacer que esto ocurra sobre cada 4 milisegundos. GIE * se utiliza para desactivar todas las interrupciones yendo a cero cuando cualquiera de los condiciones de interrupcin se producen. Esto evita que cualquier otra interrupcin, mientras que la interrupcin de corriente est siendo reparado. GIE se restablece por RETFIE. * Usted tiene que acordarse de borrar el indicador establecido por la condicin de interrupcin en la rutina de interrupcin en s. De lo contrario la condicin se aplica tan pronto como sea salir. TIEMPO DE USO DE LA LONGITUD DE INSTRUCCIONES TMR0 es muy til cuando algo tiene que ocurrir a intervalos regulares. A veces nos Slo quiero retrasar por un perodo determinado de tiempo. Esto se puede hacer con la sincronizacin basado en la longitud de instruccin, un ciclo de instruccin para la mayora de las instrucciones, dos, si el contador de programa tiene que ser cambiado. rutinas de sincronizacin aparecen en la final del programa. Sobre la base de un cristal de 4Mhz la rutina en ONEMSEC tiene un

milisegundos, si se incluyen los dos microsegundos necesarios para la llamada. En similares de moda NMSEC tomar el nmero de milisegundos en W cuando la rutina es entr. El lazo ms elementales en las rutinas de tiempo es en MICRO4.Cada vez que a travs de este ciclo requiere 4 microsegundos, (dos instrucciones solo ciclo y un ciclo de dos instrucciones). Observe que cuando W va de 1 a 0, el ltima vez a travs de toma de 3 microsegundos. Llame con 249 W y en el tiempo total bucle se suma a 995 microsegundos. Aadir 2 de la convocatoria, dos para el regreso y 1 para la carga de W y termina con exactamente 1000 microsegundos. Por mltiplos de 1 milisegundo, (NMSEC), tenemos que cargar un contador externo y realizar un seguimiento de este contador a medida que avanzamos a travs de una serie de bucles. Como nos tiene que permitir cualquier nmero de bucles de 1 a 255, lo mejor que podemos hacer es hacer que cada lazo de salir 1 mseg e ignorar la ligera sobre la cabeza de entrar en el bucle situacin. Esto sera de 4 microsegundos para cargar W, hacer la llamada y la carga CNTMSEC. INTERRUPTOR eliminacin de rebotes Un par de rutinas se utilizan en el interruptor de supresin de rebotes. El problema aqu es que cuando se presiona un pulsador o la liberacin no es una simple cuestin de ir de un estado a otro. Normalmente pulsador abierto se unen a Puerto pines RB7 B, (de inicio), y RB6, (Juego). Los pines de los puertos son de insercin alta mediante la activacin interna de pull-ups. Pull-ups no se activan en el encendido. Para activarlos hacer poco seguro 7 de OPCIN es baja. Cuando se pulsa uno de estos botones, la conexin se hace con un contacto que est conectado a tierra. Esto har que el pasador de baja. El problema es que el contacto rebota y la conexin est hecha y rota en varias ocasiones antes de los contactos se establecen en la posicin cerrada.Cada vez que el contacto rebota, la atraccin de empresas a tratar de sacar el perno de alta de nuevo. La contacto no puede ir todo el camino de regreso a la posicin original, pero si el nivel de es lo suficientemente alto, incluso para un microsegundo el PIC puede interpretar como un "ABIERTA". Un problema similar se produce cuando el botn se libera. El problema no es tan malo en este caso, sin embargo debido a que el contacto tiene que rebotar hasta el fondo a la posicin cerrada del orignal para ser interpretado como una "LOW". Algunos

interruptores son mucho menos "saltos" que otros. Qu podemos hacer acerca del problema? Una solucin es colocar un condensador a travs de el interruptor. Si es sobre el tamao adecuado, el tiempo que tarda para cargar impide que los rpidos cambios del estado de la clavija y tipo de medio de la rebotes que normalmente duran slo una o dos milsimas de segundo. Usted tendra que jugar con el tamao de encontrar lo que funciona, por lo general algo entre 0,01 y 0,1 MFD. Otra solucin electrnica es un flip-flop para cada interruptor. La solucin se puede hacer en el software. La idea es observar la situacin cada pocos milisegundos y encontrar tres o cuatro veces seguidas, cuando el la lectura es la misma. Otra solucin, si usted tiene el tiempo, es simplemente visita comenzar en la primera indicacin de, por ejemplo un cierre y luego esperar el tiempo suficiente para cualquier rebote que ha dejado sin antes consultar de nuevo.Si usted recibe un contrario lectura que ignorar esto como un cierre. Si usted puede asumir que los interruptores de comenzar la secundaria y viene cualquier baja inicial de pulsar un interruptor se puede ignorar rebota en la prensa. Ir a la rutina requerido por la prensa y esperar a que un comunicado al final de la rutina. Tenga en cuenta que la espera para las rutinas de la liberacin son slo eso, te bloqueo en un bucle hasta que la tecla se libera definitivamente. Incluso si el interruptor se sigue rebotando de la prensa, que se ignoran. Este es el mtodo utilizados en el programa. Usted ve que utiliza en todo el conjunto dgitos rutina as como en el bucle principal. Incluso antes de que el bucle principal se entra, tres en espera una fila de asegurarse de que no se pulsan los botones. CUENTA DE AHORRO DE ARRANQUE EN EEPROM Las rutinas para guardar y recuperar datos de EEPROM de datos son rectas de la literatura de Microchip. Hay secuencias de magia involucrados que no lo entiendo. Acabo de utilizar el cdigo proporcionado. Una cosa que me caus algunos problemas era olvidarse de deshabilitar las interrupciones antes de escribir en la EEPROM. Esto se podra haber hecho en el WRITEE de rutina, pero opt por hacerlo en el rutina SETDISP al final, a ambos lados de la llamada a PUTEE y en la rutina SETSELECT justo antes y despus de WRITEE. Los datos iniciales se coloca en la EEPROM cuando el PIC se programa mediante el DE Directiva a finales de CNTDN.ASM. Posicin 0 de la EEPROM tiene un desplazamiento que

decide las cuatro posiciones de la celebracin dgitos que se colocar en la pantalla durante la a partir cuenta. La ubicacin es inicialmente a cero, ir aumentando de cuatro cada vez que seleccione el botn que se presiona. Los cuatro lugares seleccionados se modifican y sustituyen utilizando el botn de configurar. MODIFICACIONES PROPUESTAS He utilizado tres pilas alcalinas AA para una fuente de energa. El servicio se basa en cerca de 50 ma. por lo que estos deben durar unos pocos cientos de horas.Usted podra utilizar una lnea de energa operados 5 voltios. Si utiliza LEDs de alta eficiencia para el monitor que puede aumentar el tamao de las resistencias de 150 ohmios y reducir la corriente / segmento a unos pocos miliamperios. Si es as, podra acabar con los transistores. La unidad se puede construir sin el decodificador CD4511. Este chip proporciona a por lo menos dos ventajas: 1. Se libera tres lneas I / O y evita tener que mltiplex de los interruptores. 2. Simplifica el cdigo mediante la seleccin de los segmentos a iluminar. Tambin espacios en blanco la pantalla cuando un ilegal #, como hex A, se introduce. Usted podra acabar con el chip, seleccionar los segmentos de software y mltiple en los interruptores, (que tendr un poco ms de resistencias para aislarlos de la muestra). En realidad no le gustaba el sonido del altavoz piezo en el esquema. I aadido un par de transistores y un orador que encontr de un reloj digital de edad, (Que fue de 50 ohmios a cada lado de la toma central). interruptores de pulsador varan considerablemente en la calidad.Los que se utiliza bastante barato y parece que tiene problemas en hacer contacto a veces. VISTAS ALGO IMPORTANTE Que originalmente se precipit conseguir este proyecto a cabo.Yo constru la unidad, escribi el cdigo y funcion, (no la primera vez, por supuesto). Luego le en Piclist de otro mtodo de usar TMR0 para la sincronizacin. Se trataba de escribir una cifra para TMR0 para los cargos restantes a la renovacin 255-0 dara a la deseada tiempo. Ni siquiera pens en hacerlo de esta manera, siempre me acaba de utilizar la totalidad 256 cargos. Entonces se me ocurri. El momento en que el primer segundo puede ser

la forma fuera. TMR0 se ejecuta continuamente y podra tener algn valor cuando el 0-255 se pulsa el botn. Usted, por supuesto, tiene que ponerlo a cero para obtener los 256 que cuenta. Esto me hizo darme cuenta de que algo podra estar mal. Usted tiene la opcin de cancelar una cuenta atrs. Esto significa que no INTCNT necesariamente llegar a cero y se restablecen. Mejor cargar INTCNT demasiado justo para asegurarse. La moraleja ... slo porque algo parece que est trabajando no significa que realmente es.