; ARCHIVO BOLT-INTERRUPCIONES-TIMER0-VERSION-2.ASM ; CODIGO FUENTE PARA EL MICROCONTROLADOR PIC18F2550 ; PROGRAMA PARA GENERAR UNA BASE DE TIEMPO DE UN SEGUNDO ; POR INTERRUPCIONES. ENCIENDE Y APAGA EL BIT RB7 ; SE USA EL TEMPORIZADOR TMR0 A 8 BITS Y SU PREESCALADOR (256) ; PARA GENERAR 5.46 MILISEGUNDOS POR CADA CICLO DE INTERRUPCION. ; 183 CICLOS ES APROXIMADAMENTE 1 SEGUNDO. ; EN EL PROGRAMA PRINCIPAL, REALIZA UNA CUENTA BINARIA ; EN LOS 4 BITS MENOS SIGNIFICATIVOS DEL PUERTO B. processor 18F2550 include include "KEYBOLT.inc" ;ARCHIVO AUXILIAR CONTIENE MACRO Y DIRECTIVAS DEFINE CONT1 EQU H'60' ;CONTADOR DE CICLOS DE 65.5 MILISEGUNDOS. J EQU H'61' K EQU H'62' L EQU H'63' SALVAW EQU H'64' ;guarda registro w SALVAST EQU H'65' ;guarda bandera Z ;aquí inicia el programa org 0X800 goto begin ;SALTA AL PROGRAMA PRINCIPAL org 0x808 ;subrutina de interrupción en la dirección 0x808 clrf TMR0L ;inicializa TMR0 movwf SALVAW swapf STATUS,w movwf SALVAST bcf INTCON,TMR0IF ;apaga bandera de overflow del TMR0 incf CONT1,f ;incrementa contador de 65.5 ms. movlw D'183' subwf CONT1,w ;prueba si la cuenta es igual a 183 btfss STATUS,Z ;bandera Z encendida? goto salida ;cuenta diferente a 183, regresa BTFSS LED7 ;¿LED ENCENDIDO? GOTO ENC BCF LED7 ;APAGA LED CLRF CONT1 goto salida ENC BSF LED7 ;ENCIENDE LED CLRF CONT1 salida swapf SALVAST,w movwf STATUS swapf SALVAW,f swapf SALVAW,w retfie ;PROGRAMA PRINCIPAL begin PUERTOS ;inicializa puertos. clrf CONT1 ;programa principal movlw B'11000111' ;HABILITA TEMPORIZADOR A 8 BITS Y CLOCK INTERNO movwf T0CON ;PREESCALADOR DIVIDE ENTRE 256 movlw D'00' movwf TMR0L ;INICIALIZA TEMPORIZADOR=0 bsf INTCON,GIE ;habilita interrupciones global bsf INTCON,TMR0IE ;habilita interrupción del temporizador. ;TAREA 2 CUENTA EN BINARIO EN RB0...RB3 increment: incf PORTB,F call retrobolt MOVF PORTB,W ANDLW H'7F' SUBLW H'0F' BTFSS STATUS,Z GOTO NOCERO SICERO: MOVF PORTB,W ANDLW H'80' ;NO CAMBIES EL VALOR DEL BIT 7 MOVWF PORTB NOCERO goto increment ;SUBRUTINA DE RETRASO APROX DE 1 SEGUNDO.SE PUEDE MODIFICAR A (16.4 x L) MILISEGUNDOS retrobolt: movlw D'10' ;valor de L. Modifique para cambiar el valor del retraso. movwf L lloop movlw D'255' ; w := 200 decimal movwf J ; J := w jloop: movwf K ; K := w kloop: decfsz K,f ; K = K-1, skip next if zero goto kloop decfsz J,f ; J = J-1, skip next if zero goto jloop decfsz L,f goto lloop return end