; ARCHIVO EJEMPLO2INTERRUPCIONESTINY.ASM ; CODIGO FUENTE PARA EL MICROCONTROLADOR PIC16F88 ; EL PROGRAMA REALIZA 2 TAREAS ; PROGRAMA PARA GENERAR UNA BASE DE TIEMPO DE UN SEGUNDO ; POR INTERRUPCIONES. ENCIENDE Y APAGA EL BIT RB7 ; SE USA EL TEMPORIZADOR TMR0 Y SU PREESCALADOR PARA GENERAR ; 65.536 MILISEGUNDOS POR CADA CICLO DE INTERRUPCION. ; 15 CICLOS ES APROXIMADAMENTE 1 SEGUNDO. ; ADICIONALMENTE, DESDE EL PROGRAMA PRINCIPAL, SE REALIZA ; UNA CUENTA BINARIA EN LOS LEDS RB0...RB3, CON UN PERIODO ; APROXIMADO DE 100 MS. ; VERSION PARA OSCILADOR CRISTAL 4 MHZ ; CPU configuration ; (It's a 16F88, XT OSCILADOR ; watchdog timer off, power-up timer on) processor 16f88 include #DEFINE BANCO0 BCF STATUS,RP0 #DEFINE BANCO1 BSF STATUS,RP0 CONT1 EQU H'20' ;CONTADOR DE CICLOS DE 65.5 MILISEGUNDOS. ;15 CICLOS ES APROX. UN SEGUNDO SALVAW EQU H'21' ;REGISTRO PARA GUARDAR W SALVAST EQU H'22' ;REGISTRO PARA GUARDAR STATUS J EQU H'23' K EQU H'24' ;aquí inicia el programa ORG 0 CLRF PCLATH GOTO begin ;AQUI EMPIEZA EL PROGRAMA PRINCIPAL org H'4' ;subrutina de interrupción en la dirección 4 bcf INTCON,TMR0IF ;apaga bandera de overflow del TMR0 int BANCO0 clrf TMR0 ;inicializa TMR0 incf CONT1,f ;incrementa contador de 65.5 ms. movlw D'15' subwf CONT1,w ;prueba si la cuenta es igual a 15 btfss STATUS,Z ;bandera Z encendida? retfie ;cuenta diferente a 15, regresa sin modificar CONT1 BTFSS PORTB,7 ;¿LED 7 ENCENDIDO? GOTO ENC BCF PORTB,7 ;APAGA LED CLRF CONT1 retfie ENC BSF PORTB,7 ;ENCIENDE LED CLRF CONT1 retfie ;FIN DE LA RUTINA DE INTERRUPCION begin clrf CONT1 ;programa principal BANCO0 bcf RCSTA,SPEN ;DESHABILITA UART BANCO1 movlw 7 movwf CMCON clrf CVRCON clrf ANSEL movlw B'00011110' movwf TRISA ;INICIALIZA ENTRADAS Y SALIDAS PUERTO A clrf TRISB ;PUERTO B SON SALIDAS movlw B'00000111' ;HABILITA TEMPORIZADOR Y CLOCK INTERNO movwf OPTION_REG ;PREESCALADOR DIVIDE ENTRE 256 BANCO0 clrf PORTB BCF PORTA,0 movlw D'00' movwf TMR0 ;INICIALIZA TEMPORIZADOR=00 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 retro 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 ; RETRASO DE 0.1 SEGUNDOS retro: movlw D'255' ; w := 100 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 return end