Practicas ASM 2-2010a solo código

Embed Size (px)

Citation preview

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

LED_ON_OFF.asm LED_RB0_RB1.asm CONMUTADOR SOFT.asm CONMUTADOR HARD.asm CONTA_MINaMAX.asm INT EXT.asm INT RB4_7 INTE.asm INT RB4_7 PULSA.asm TMR0.asm TMR1.asm TMR1ext.asm TMR2.asm SLEEP INT EXT.asm WATCHDOG.asm CAPTURA.asm COMPARA.asm MULTIPLEX INT EXT 00a99.asm MULTIPLEX INT EXT 000a999.asm MULTIPLEX CONTA TMR0.asm ADC.asm PWM_AD.asm EEPROM.asm RS232.asm I2C.asm

;---------------------------------------------------------------------; 01 - LED_ON_OFF.asm ; Ciclo de encendido (1 s) y apagado (1 s) de LED conectado en RB0 ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones __CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC ORG GOTO 0x00 INICIO 0x70 0x71 0x72 ; Inicio del cdigo ; Reserva de memoria RAM ; Reserva de memoria RAM ; Reserva de memoria RAM

PDel0 EQU PDel1 EQU PDel2 EQU

;---------------------------------------------------------------------; *********************** RETARDO DE 1 s *********************** ;---------------------------------------------------------------------DELAY_1s movlw .14 ; 1 set number of repetitions (C) movwf PDel0 ; 1 | PLoop0 movlw .72 ; 1 set number of repetitions (B) movwf PDel1 ; 1 | PLoop1 movlw .247 ; 1 set number of repetitions (A) movwf PDel2 ; 1 PLoop2 clrwdt ; 1 clear watchdog decfsz PDel2,1 ; 1 + (1) is the time over? (A) goto PLoop2 ; 2 no, loop decfsz PDel1,1 ; 1 + (1) is the time over? (B) goto PLoop1 ; 2 no, loop decfsz PDel0,1 ; 1 + (1) is the time over? (C) goto PLoop0 ; 2 no, loop PDelL1 goto PDelL2 ; 2 cycles delay PDelL2 clrwdt ; 1 cycle delay return ; 2+2 Done ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB ; Inicializa PORTB BCF BSF STATUS,RP1 STATUS,RP0 ; BANCO 1 ;

MOVLW B'11111110' ; RB0 Salida, el resto Entradas MOVWF TRISB BCF BCF CICLO BSF CALL BCF CALL GOTO END PORTB,0 DELAY_1s PORTB,0 DELAY_1s CICLO ; ; ; ; ; RB0=1 Retardo 1s RB0=0 Retardo 1s Salto a CICLO STATUS,RP1 STATUS,RP0 ; BANCO 0 ;

; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 02 - LED_RB0_RB1.asm ; encendido y apagado de un led en RB2 con ; pulsadores en RB0 (encendido) y RB1 (apagado). ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones __CONFIG 0x3F71; __CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

ORG 0x00 ; Inicio del cdigo GOTO INICIO ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB BANCO_1 MOVLW B'11111011' ; RB2 salida, el resto entradas MOVWF TRISB ; BANCO_0 TEST_0 BTFSC PORTB,0 GOTO TEST_1 BSF PORTB,2 TEST_1 BTFSC GOTO BCF GOTO END PORTB,1 TEST_0 PORTB,2 TEST_0

; RB0 es 0? ; si RB0 no es 0 salta a leer RB1 ; si RB0 es 0 enciende LED ; ; ; ; ; RB1 es 0? si RB1 no es 0 salta a leer RB0 si RB1 es 0 apaga LED salta a leer RB0 FIN DEL PROGRAMA

;---------------------------------------------------------------------; 03 CONMUTADOR SOFT.asm ; Enciende LED en RB2, con pulsador en RB0 y RB1 y Apaga LED en RB2, con ; los mismos pulsadores. ; Se elimina rebotes al pulsar y soltar (que podemos omitir) ; Usamos la instruccion XORWF,F (or exclusivo entre W y F) ; W F SALIDA en F ; 0 0 0 ; 0 1 1 ; 1 0 1 ; 1 1 0 ; Subrutina de retardo 20ms para rebote de contactos ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones __CONFIG 0x3F71; __CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

PDel0 EQU PDel1 EQU

0x70 0x71

ORG 0x00 ; Inicio del cdigo GOTO INICIO ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;--------------------------------------------------------------; RETARDO DE 20 ms ; Generado con PDEL ver SP r 1.0 el 08/11/2009 Hs 10:27:42 p.m. ; Descripcion: Delay 20000 ciclos ;--------------------------------------------------------------RET_20ms movlw .21 ; 1 set numero de repeticion (B) movwf PDel0 ; 1 | PLoop1 movlw .237 ; 1 set numero de repeticion (A) movwf PDel1 ; 1 | PLoop2 clrwdt ; 1 clear watchdog decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A) goto PLoop2 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B) goto PLoop1 ; 2 no, loop PDelL1 goto PDelL2 ; 2 ciclos delay PDelL2 clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB ; inicializa PORTB BANCO_1 MOVLW B'11111011' ; PORTB como entrada excepto RB2 MOVWF TRISB ; BCF OPTION_REG, NOT_RBPU BANCO_0

TEST_0 BTFSC GOTO CALL BTFSC GOTO SUELTA_0 BTFSS GOTO

PORTB,0 TEST_1 RET_20ms PORTB,0 TEST_0 PORTB,0 SUELTA_0

; ; ; ; ;

pulsaron? (RB0 es 0?) si no pulsaron (RB0 = 1), lee otra vez si pulsaron, retardo de 20 ms (si RB0=0, ret. de 20 ms) se mantiene pulsado? (RB0 sigue en 0?) si no, falsa alarma, chequea otra vez

; soltaron? (RB0 paso a uno?) ; no soltaron (RB0 sigue en 0), queda en loop ; hasta que suelten ; pulsaron? (RB1 es 0?) ; si no pulsaron (RB1 = 1), lee otra vez RB1 ; si pulsaron, retardo de 20 ms (si RB1=0, ret. de 20 ms) ; se mantiene pulsado? (RB1 sigue en 1?) ; si no, falsa alarma, chequea otra vez ; soltaron? (RB1 paso a uno?) ; no soltaron (RB1 sigue en 0), queda en loop ; hasta que suelten ; ; ; ; ; ; si soltaron, retardo de 20 ms (si RB0,1=0, ret. de 20 ms) probar sin este retardo (normalmente no se requiere) carga W con 0000 0100 conmuta estado del LED salta a leer RB0 FIN DEL PROGRAMA

GOTO CONMUTA TEST_1 BTFSC PORTB,1 GOTO TEST_0 CALL BTFSC GOTO SUELTA_1 BTFSS GOTO GOTO CONMUTA CALL RET_20ms PORTB,1 TEST_1 PORTB,1 SUELTA_1 CONMUTA RET_20ms

MOVLW 0x04 XORWF PORTB,F GOTO TEST_0 END

;---------------------------------------------------------------------; 04 CONMUTADOR HARD.asm ; Enciende LED en RB2, con pulsador en RB0 y RB1 y Apaga LED en RB2, con ; los mismos pulsadores. ; Se elimina rebotes al pulsar y soltar (que podemos omitir). ; Subrutina de retardo 20ms para rebote de contactos. ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

PDel0 EQU PDel1 EQU

0x70 0x71

ORG 0x00 ; inicio del cdigo GOTO INICIO ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;--------------------------------------------------------------; RETARDO DE 20 ms ; Generado con PDEL ver SP r 1.0 el 08/11/2009 Hs 10:27:42 p.m. ; Descripcion: Delay 20000 ciclos ;--------------------------------------------------------------RET_20ms movlw .21 ; 1 set numero de repeticion (B) movwf PDel0 ; 1 | PLoop1 movlw .237 ; 1 set numero de repeticion (A) movwf PDel1 ; 1 | PLoop2 clrwdt ; 1 clear watchdog decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A) goto PLoop2 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B) goto PLoop1 ; 2 no, loop PDelL1 goto PDelL2 ; 2 ciclos delay PDelL2 clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB ; inicializa PORTB BANCO_1 MOVLW B'11111011' ; PORTB como entrada excepto RB2 MOVWF TRISB ; BANCO_0 TEST_0 BTFSC PORTB,0 GOTO TEST_1 CALL RET_20ms BTFSC PORTB,0 GOTO TEST_0 SUELTA_0 BTFSS PORTB,0

; ; ; ; ;

pulsaron? (RB0 es 0?) si no pulsaron (RB0 = 1), lee RB1 si pulsaron (si RB0=0), retardo de 20 ms se mantiene pulsado? (RB0 sigue en 0?) si no, falsa alarma, chequea otra vez

; soltaron? (RB0 paso a uno?)

GOTO

SUELTA_0

; no soltaron (RB0 sigue en 0), queda en loop ; hasta que suelten ; pulsaron? (RB1 es 0?) ; si no pulsaron (RB1 = 1), lee RB0 ; si pulsaron (si RB1=0), retardo de 20 ms ; se mantiene pulsado? (RB1 sigue en 0?) ; si no, falsa alarma, chequea otra vez ; soltaron? (RB1 paso a uno?) ; no soltaron (RB1 sigue en 0), queda en loop ; hasta que suelten ; ; ; ; ; ; ; ; ; ; si soltaron, retardo de 20 ms (si RB0,1=0, ret. de 20 ms) probar sin este retardo (normalmente no se requiere) Probar estado actual del LED. RB2 est apagado? Si est encendido, apaga el LED Si est apagado, enciende el LED LED ON salta a leer RB0 LED OFF salta a leer RB0 FIN DEL PROGRAMA

GOTO CONMUTA TEST_1 BTFSC PORTB,1 GOTO TEST_0 CALL BTFSC GOTO SUELTA_1 BTFSS GOTO GOTO CONMUTA CALL BTFSC GOTO GOTO BSF GOTO BCF GOTO END RET_20ms PORTB,1 TEST_1 PORTB,1 SUELTA_1 CONMUTA RET_20ms PORTB,2 OFF ON PORTB,2 TEST_0 PORTB,2 TEST_0

ON OFF

;----------------------------------------------------------------------------; 05 - CONTA_MINaMAX.asm ; contador binario en RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 decimal ; 0 0 0 0 0 0 0 0 .0 ; 0 0 0 0 0 0 0 1 .1 ; 0 0 0 0 0 0 1 0 .2 ; 0 0 0 0 0 0 1 1 .3 ; 0 0 0 0 0 1 0 0 .4 ; 0 0 0 0 0 1 0 1 .5 ; 0 0 0 0 0 1 1 0 .6 ; 0 0 0 0 0 1 1 1 .7 ; ; 0 0 0 0 0 0 0 0 .256=.0 ; El cambio de estado del contador cada medio segundo. ;----------------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

ORG GOTO

0x00 INICIO

; Inicio del cdigo

CBLOCK 0X70 ; Reserva de memoria MAX,MIN,PDel0,PDel1 ENDC ;---------------------------------------------------------------------; *********************** RETARDO DE .5 s ********************** ;---------------------------------------------------------------------RET_.5S movlw .239 ; 1 set numero de repeticion (B) movwf PDel0 ; 1 | PLoop1 movlw .232 ; 1 set numero de repeticion (A) movwf PDel1 ; 1 | PLoop2 clrwdt ; 1 clear watchdog PDelL1 goto PDelL2 ; 2 ciclos delay PDelL2 goto PDelL3 ; 2 ciclos delay PDelL3 clrwdt ; 1 ciclo delay decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A) goto PLoop2 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B) goto PLoop1 ; 2 no, loop PDelL4 goto PDelL5 ; 2 ciclos delay PDelL5 goto PDelL6 ; 2 ciclos delay PDelL6 goto PDelL7 ; 2 ciclos delay PDelL7 clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;------------------------------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;------------------------------------------------------------------------------------------INICIO CLRF PORTB ; Inicializa puertos BANKSEL TRISB MOVLW B'00000000' MOVWF TRISB BANKSEL MIN LOOP MOVLW .0 MOVWF MIN MOVLW .255 MOVWF MAX CICLO MOVF MIN,W MOVWF PORTB ; MIN a W ; PORTB = MIN ; ; MIN = 0 ; ; MAX = 255 ; PORTB SALIDA

CALL MOVF SUBWF BTFSS GOTO GOTO AUX INCF GOTO END

RET_.5S MIN,W MAX,W STATUS,Z AUX LOOP MIN,F CICLO

; retardo 0,5 segundos ; W=MIN ; MAX - MIN = 0? ; NO ; SI ; MIN=MIN+1 ; ; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 06 - INT EXT.asm ; Programa principal: LED ROJO en RB6 conmuta cada 1 s ; La temporizacion de 1 s, con generador de retardos ; LED VERDE en RB7, conmuta mediante interrupcion externa ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

CBLOCK 0X70 ; Reserva de memoria W_TEMP,STATUS_TEMP,PCLATH_TEMP,PDel0,PDel1,PDel2 ENDC ORG 0x00 ; Inicio del cdigo GOTO INICIO ORG 0x04 ; inicio de la interrupcin GOTO ISR ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;------------------------------------------------------------; RETARDO DE 1000 ms ; Generado con PDEL ver SP r 1.0 el 24/11/2009 Hs 08:02:58 a.m. ; Descripcion: Delay 1000000 ciclos ;------------------------------------------------------------DEMORA movlw .14 ; 1 set numero de repeticion (C) movwf PDel0 ; 1 | PLoop0 movlw .72 ; 1 set numero de repeticion (B) movwf PDel1 ; 1 | PLoop1 movlw .247 ; 1 set numero de repeticion (A) movwf PDel2 ; 1 | PLoop2 clrwdt ; 1 clear watchdog decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A) goto PLoop2 ; 2 no, loop decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B) goto PLoop1 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C) goto PLoop0 ; 2 no, loop PDelL1 goto PDelL2 ; 2 ciclos delay PDelL2 clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;---------------------------------------------------------------------; ************* RUTINA QUE ATIENDE INTERRUPCIN *************** ;---------------------------------------------------------------------ISR PUSH ; Guarda contexto del programa principal MOVWF W_TEMP ; W a W_TEMP SWAPF STATUS,W ; Intercambia STATUS y guarda en W CLRF STATUS ; Al Banco 0 MOVWF STATUS_TEMP ; sin modificar banderas. Guarda STATUS MOVF PCLATH,W ; si se usan pginas 1,2 y/o 3 MOVWF PCLATH_TEMP ; guarda PCLATH en W CLRF PCLATH ; pgina 0

BTFSS INTCON,INTF GOTO POP MOVLW B'10000000' XORWF PORTB,F SALIR BCF POP INTCON,INTF

; INTF=1?. Si es la interrupcin INT, lee estado RB1 ; NO, restauramos contexto ; Xoring with a 1-bit produces ; Complement bit 7, port-B ; ; ; ; ; Borra bandera de interrupcin externa Restauramos contexto del programa principal recupera PCLATH W a PCLATH Intercambia STATUS_TEMP y guarda en W. Retorna al Banco

MOVF PCLATH_TEMP,W MOVWF PCLATH SWAPF STATUS_TEMP,W original MOVWF STATUS ; W a STATUS SWAPF W_TEMP,F ; Intercambia W_TEMP SWAPF W_TEMP,W ; Intercambia W_TEMP y guarda en W RETFIE ; Retorno de subrutina de interrupcin ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB ; Inicializa PORTB BANCO_1 MOVLW B'00111111' ; RB7-RB6 Salidas, RB0 y el resto entradas MOVWF TRISB MOVLW B'10010000' ; GIE=1, INTE=1, INTF=0 MOVWF INTCON ; BCF

OPTION_REG,NOT_RBPU ; PULLUP PORTB !NO!, por estar usando antireb. por hardware ; RB6 y RB7 inicialmente apagados ; ; ; ; ; ; Mascara en 1 para RB6 de PORTB Complementa bit 1 Retardo 0,5 segundos Queda a la espera de la interrupcin FIN DEL PROGRAMA

BANCO_0 BCF PORTB,6 BCF PORTB,7 ESPERA MOVLW XORWF CALL GOTO END B'01000000' PORTB,F DEMORA ESPERA

;---------------------------------------------------------------------; 07 - INT RB4_7 INTE.asm ; LED en RB0 conmuta con cambio de estado de RB4-RB7. ; Se usan interruptores. ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

ORG GOTO ORG GOTO

0x00 INICIO 0x04 ISR

; Inicio del cdigo ; inicio de la interrupcin

W_TEMP EQU 0x70 ; Para guardar registro W STATUS_TEMP EQU 0x71 ; Guardar registro STATUS PCLATH_TEMP EQU 0X72 ; Guardar registro PCLATH ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;---------------------------------------------------------------------; ************** SUBRUTINA QUE ATIENDE INTERRUPCION ************** ;---------------------------------------------------------------------ISR PUSH ; Guardamos contexto del programa principal MOVWF W_TEMP SWAPF STATUS,W CLRF STATUS MOVWF STATUS_TEMP MOVF PCLATH,W MOVWF PCLATH_TEMP CLRF PCLATH BTFSS INTCON,RBIF GOTO EXIT BTFSC GOTO BSF GOTO ESUNO BCF EXIT MOVF BCF POP MOVF PCLATH_TEMP,W MOVWF PCLATH SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W RETFIE PORTB,F INTCON,RBIF ; Lectura para borrar latch de PORTB ; borramos bandera RBIF ; Restauramos contexto del programa principal PORTB,0 ESUNO PORTB,0 EXIT PORTB,0 ; si RBIF=1, se produjo interrupcin ; si no, EXIT ; ; ; ; si RB0=0 salta una instruccin a ESUNO RB0=1 (porque era "0") ya est invertido RB0, se va a EXIT

; RB0=0 (Porque era "1")

; Fin de la interrupcin

;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB ; Inicializa PORTB BANCO_1 MOVLW B'11111110' MOVWF TRISB ; configuramos PORTB como entrada, excepto RB0 BCF OPTION_REG,NOT_RBPU ; Pullup de PORTB habilitados BANCO_0 BSF INTCON,GIE BSF INTCON,RBIE BCF INTCON,RBIF BCF ESPERA GOTO END PORTB,0 ESPERA ; Habilita las interrupciones globalmente ; Habilita la interrupcin por cambio de nivel ; lgico en RB4 a RB7 ; Aseguramos LED apagado ; queda a la espera de la interrupcin ; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 08- INT RB4_7 PULSA.asm ; Conmutador de LED en RA0 con int. RB4-RB7, con pulsadores ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

ORG GOTO ORG GOTO

0x00 INICIO 0x04 ISR

; Inicio del cdigo ; inicio de la interrupcin

W_TEMP EQU 0x70 ; Para guardar registro W STATUS_TEMP EQU 0x71 ; Guardar registro STATUS PCLATH_TEMP EQU 0X72 ; Guardar registro PCLATH ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;---------------------------------------------------------------------; ************** SUBRUTINA QUE ATIENDE INTERRUPCION ************** ;---------------------------------------------------------------------ISR PUSH ; Guardamos contexto del programa principal MOVWF W_TEMP SWAPF STATUS,W CLRF STATUS MOVWF STATUS_TEMP MOVF PCLATH,W MOVWF PCLATH_TEMP CLRF PCLATH BTFSS INTCON,RBIF GOTO EXIT TEST_4 BTFSC GOTO BTFSC GOTO GOTO OFF_4 BCF GOTO ON_4 BSF TEST_5 BTFSC GOTO BTFSC GOTO GOTO OFF_5 BCF GOTO ON_5 BSF PORTB,4 TEST_5 PORTA,0 OFF_4 ON_4 PORTA,0 EXIT PORTA,0 PORTB,5 TEST_6 PORTA,0 OFF_5 ON_5 PORTA,0 EXIT PORTA,0 ; si RBIF=1, se produjo interrupcin ; si no, EXIT ; si RB4=0 (pulsador presionado), salta instruccin ; Si pulsador RB4 no se presiona, se prueba pulsador RB5 ; si RA0=0 (LED apagado), salta instruccin

; si RB5=0 (pulsador presionado), salta instruccin ; Si pulsador RB5 no se presiona, se prueba pulsador RB6 ; si RA0=0 (LED apagado), salta instruccin

TEST_6 BTFSC GOTO BTFSC GOTO GOTO OFF_6 BCF GOTO ON_6 BSF TEST_7 BTFSC GOTO BTFSC GOTO GOTO OFF_7 BCF GOTO ON_7 BSF EXIT MOVF BCF POP

PORTB,6 TEST_7 PORTA,0 OFF_6 ON_6 PORTA,0 EXIT PORTA,0 PORTB,7 EXIT PORTA,0 OFF_7 ON_7 PORTA,0 EXIT PORTA,0 PORTB,F INTCON,RBIF

; si RB6=0 (pulsador presionado), salta instruccin ; Si pulsador RB6 no se presiona, se prueba pulsador RB7 ; si RA0=0 (LED apagado), salta instruccin

; si RB7=0 (pulsador presionado), salta instruccin ; Si pulsador RB6 no se presiona, se sale de la subrutina ; si RA0=0 (LED apagado), salta instruccin

; Lectura para borrar latch de PORTB ; borramos bandera RBIF ; Restauramos contexto del programa principal

MOVF PCLATH_TEMP,W MOVWF PCLATH SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W RETFIE ; Fin de la interrupcin ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTA ; Inicializa PORTA CLRF PORTB ; Inicializa PORTB BANCO_1 MOVLW B'11111111' MOVWF TRISB ; configuramos todo el puerto B como entradas MOVLW B'00000110' MOVWF ADCON1 ; todos los pin1es analogicos son digitales BCF TRISA,0 ; configuramos pin RA0 como salida BCF OPTION_REG,NOT_RBPU ; Pullup de PORTB habilitados BANCO_0 BSF BSF BCF BCF ESPERA GOTO END INTCON,GIE INTCON,RBIE INTCON,RBIF PORTA,0 ESPERA ; Habilita las interrupciones globalmente ; Habilita la interrupcin por cambio de estado en RB4-7 ; borramos bandera RBIF ; Aseguramos LED apagado ; queda a la espera de la interrupcin ; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 09 - TMR0.asm ; Ciclo de encendido (1s) y apagado (1s) ; de LED conectado en RB0. Se usa TMR0 para retardo de 1s ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

ORG GOTO

0x00 INICIO

; inicio del cdigo

CONTA EQU 0x70 ; reserva de memoria RAM ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;---------------------------------------------------------------------; ***************** SURUTINA DE RETARDO DE 1 s *************** ;---------------------------------------------------------------------RET_1S MOVLW .100 ; MOVWF CONTA ; CONTA = 100 DELAY MOVLW .217 ; W = 217 MOVWF TMR0 ; TMR0 = 217 LOOP1S BTFSS INTCON,T0IF ; T0IF=1? Hay desborde en TMR0? GOTO LOOP1S ; n, esperar BCF INTCON,T0IF ; s, borrar bandera T0IF DECFSZ CONTA,F ; GOTO DELAY ; si CONTA no lleg a cero, se vuelve a cargar TMR0 RETURN ; si, retorno despus de aprox. 1 s ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB ; Inicializa PORTB BANCO_1 MOVLW B'11111110' MOVWF TRISB MOVLW B'11010111' MOVWF OPTION_REG BANCO_0 CICLO BSF CALL BCF CALL GOTO END PORTB,0 RET_1S PORTB,0 RET_1S CICLO ; ; ; ; ; ; RB0=1 Retardo RB0=0 Retardo Salto a FIN DEL 1s 1s CICLO PROGRAMA ; RB0 Salida, el resto Entradas ; ; TMR0=Timer, Prescaler al Timer, Divisor %256 ; T0CS=0, PSA=0, PS2-PS1-PS0=111

;************************************************************* ; 10 TMR1.asm ; Ciclo de encendido (1s) y apagado (1s) de un LED en RB0. ; Se usa TMR1 para retardo de 1s ; Cargamos TMR1 CON 3036d = 0x0BDC y CONT con 2 ; Para un retardo de 500 000 us x 2 = 1 segundo ; ************************************************************ LIST P=16F877A ; Tipo de microcontrolador INCLUDE P16F877A.INC ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

ORG GOTO

0x00 INICIO

; inicio del cdigo

CONTA EQU 0x70 ; reserva de memoria RAM ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;---------------------------------------------------------------------; *********************** RETARDO DE 1 s *********************** ;---------------------------------------------------------------------RET_1S MOVLW .2 MOVWF CONTA ; CONTA = 2 CICLO BCF T1CON,TMR1ON ; TMR1 OFF para Precarga MOVLW 0x0B MOVWF TMR1H ; TMR1H = Ox0B MOVLW 0xDC MOVWF TMR1L ; TMR1L = OxDC BSF T1CON,TMR1ON ; TMR1 ON despus de la Precarga ; ********** DESBORDAMIENTO ********** FLAG BTFSS PIR1,TMR1IF ; TMR1IF=1? Hay desbordamiento? GOTO FLAG ; Si no hay, esperar BCF PIR1,TMR1IF ; Si hay, borrar bandera DECFSZ CONTA,F ; si CONTA lleg a 0, salir de la subrutina GOTO CICLO ; si CONTA no lleg a cero, se vuelve a cargar TMR1 RETURN ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB ; Inicializa PORTB BANCO_1 MOVLW B'11111110' MOVWF TRISB ; RB0 salida, el resto entradas BANCO_0 ; ********** CONFIGURA TMR1 ********** BSF T1CON,T1CKPS1 ; Prescaler BSF T1CON,T1CKPS0 ; divisor por 8 BCF T1CON,TMR1CS ; Usamos fosc/4, TMR1 como temporizador ; ********** ENCIENDE Y APAGA LED EN RB1 ********** TIME BSF PORTB,0 ; RB0=1 CALL RET_1S ; Retardo 1s BCF PORTB,0 ; RB0=0

CALL GOTO END

RET_1S TIME

; Retardo 1s ; Salto a TIME

;************************************************************* ; 11 TMR1ext.asm ; Cargamos TMR1 CON 32867d = 0x8000 ; retardo de 1 000 000 us = 1s, para parpadeo LED en RB1 ; ************************************************************ LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

ORG 0x00 ; inicio del cdigo GOTO INICIO ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;------------------------------------------------------------; RETARDO DE 1 s ;------------------------------------------------------------RET_1S BCF T1CON,TMR1ON ; TMR1 OFF para Precarga MOVLW 0x00 ; MOVWF TMR1L ; TMR1L=0x00 MOVLW 0x80 ; MOVWF TMR1H ; TMR1H=0x80 BSF T1CON,TMR1ON ; TMR1 ON despus de la Precarga FLAG BTFSS PIR1,TMR1IF ; TMR1IF=1? Hay desbordamiento? GOTO FLAG ; Si no hay, esperar BCF PIR1,TMR1IF ; Si hay, borrar bandera RETURN ;------------------------------------------------------------; PROGRAMA PRINCIPAL ;------------------------------------------------------------INICIO CLRF PORTB ; Inicializa PORTB BANCO_1 BCF TRISB,1 ; RB1 salida, el resto entradas configuracin de TMR1 para usar cristal externo TMR1ON OFF, se iniciar mas tarde TMR1CS reloj externo con cristal de 32768 Hz /T1SYNC reloj externo no sincronizado para usar SLEEP T1OSCEN oscilador de TMR1 habilitado T1CKPS0 para seleccionar prescaler en 1 T1CKPS1 para seleccionar prescaler en 1 no usado no usado RB1=1 Retardo 1s RB1=0 Retardo 1s Salto a CICLO FIN DE PROGRAMA

; ; ; ; ; ; ; ; CICLO

BANCO_0 MOVLW B'00001110' ; |||||||+------||||||+-------|||||+--------||||+---------|||+----------||+-----------|+------------+-------------MOVWF T1CON BSF CALL BCF CALL GOTO END PORTB,1 RET_1S PORTB,1 RET_1S CICLO ; ; ; ; ; ;

;********************************************************************* ; 12 TMR2.asm ; Cargamos TMR2 con el valor lmite PR2=199 ; PRESCALER=4 y POSTSCALER=10 ; Para un retardo de 4x10x(199+1)=8000 us y por CONTA(125) = 1 segundo ; ******************************************************************** LIST P=16F877A ; Tipo de microcontrolador #INCLUDE P16F877A.INC ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

ORG GOTO

0x00 INICIO

; inicio del cdigo

CONTA EQU 0x70 ; reserva de memoria RAM ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;---------------------------------------------------------------------; *********************** RETARDO DE 1 s *********************** ;---------------------------------------------------------------------RET_1S MOVLW .125 MOVWF CONTA ; CONTA = 125 ; ********** DESBORDAMIENTO ********** FLAG BTFSS PIR1,TMR2IF ; TMR2IF=1? Hay desbordamiento? GOTO FLAG ; Si no hay, esperar BCF PIR1,TMR2IF ; Si hay, borrar bandera DECFSZ CONTA,F ; si CONTA lleg a 0, salir de la subrutina GOTO FLAG ; si CONTA no lleg a 0, salto a FLAG RETURN ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB ; Inicializa PORTB BANCO_1 MOVLW B'11111110' MOVWF TRISB

; RB1 salida, el resto entradas

; ********** CONFIGURA TMR2 ********** MOVLW .199 MOVWF PR2 ; PR2=199 Lmite superior de conteo de TMR2 BANCO_0 MOVLW B'01001001' MOVWF T2CON ; PRESCALER=10, TMR2=OFF, POSTSCALER=4 BSF T2CON,TMR2ON ; TMR2 ON ; ********** ENCIENDE Y APAGA LED EN RB1 ********** CICLO BSF PORTB,0 ; RB0=1 CALL RET_1S ; Retardo 1s BCF PORTB,0 ; RB0=0 CALL RET_1S ; Retardo 1s GOTO CICLO ; Salto a CICLO

END

;---------------------------------------------------------------------; 13 - SLEEP INT EXT.asm ; Despus de energizarce, el micro entra a modo SLEEP. Sale del modo ; SLEEP mediante int. Externa. Luego sigue 5 ciclos de 2 segundos cada ; uno. Dentro de cada ciclo, RB7 se enciende 1 segundo y se apaga 1 ; segundo. ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

CBLOCK 0X70 ; Reserva de memoria W_TEMP,STATUS_TEMP,PCLATH_TEMP,PDel0,PDel1,PDel2,CONTA ENDC ORG 0x00 ; inicio del programa principal GOTO INICIO ORG 0x04 ; inicio de la interrupcin GOTO ISR ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;---------------------------------------------------------------------; *********************** RETARDO DE 1 s *********************** ;---------------------------------------------------------------------RET_1s movlw .14 ; 1 set number of repetitions (C) movwf PDel0 ; 1 | PLoop0 movlw .72 ; 1 set number of repetitions (B) movwf PDel1 ; 1 | PLoop1 movlw .247 ; 1 set number of repetitions (A) movwf PDel2 ; 1 | PLoop2 clrwdt ; 1 clear watchdog decfsz PDel2,1 ; 1 + (1) is the time over? (A) goto PLoop2 ; 2 no, loop decfsz PDel1,1 ; 1 + (1) is the time over? (B) goto PLoop1 ; 2 no, loop decfsz PDel0,1 ; 1 + (1) is the time over? (C) goto PLoop0 ; 2 no, loop PDelL1 goto PDelL2 ; 2 cycles delay PDelL2 clrwdt ; 1 cycle delay return ; 2+2 Done ;---------------------------------------------------------------------; ************* RUTINA QUE ATIENDE INTERRUPCIN *************** ;---------------------------------------------------------------------ISR PUSH ; Guarda contexto del programa principal MOVWF W_TEMP ; W a W_TEMP SWAPF STATUS,W ; Intercambia STATUS y guarda en W CLRF STATUS ; Al Banco 0 MOVWF STATUS_TEMP ; sin modificar banderas. Guarda STATUS MOVF PCLATH,W ; si se usan pginas 1,2 y/o 3 MOVWF PCLATH_TEMP ; guarda PCLATH en W CLRF PCLATH ; pgina 0 BTFSS INTCON,INTF ; INTF=1?. Si es la interrupcin INT, lee estado RB1 GOTO POP ; NO, restauramos contexto SALIR

BCF POP

INTCON,INTF

MOVF PCLATH_TEMP,W MOVWF PCLATH SWAPF STATUS_TEMP,W al Banco original MOVWF STATUS ; W a STATUS SWAPF W_TEMP,F ; Intercambia W_TEMP SWAPF W_TEMP,W ; Intercambia W_TEMP y guarda en W RETFIE ; Retorno de subrutina de interrupcin;--------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB ; Inicializa PORTB BANCO_1 MOVLW B'01111111' ; RB7 Salida, el resto Entradas MOVWF TRISB MOVLW B'10010000' ; GIE=1, INTE=1, INTF=0 MOVWF INTCON ; BCF OPTION_REG,NOT_RBPU ; PULLUP PORTB !NO!, por estar usando antireb. por hardware BANCO_0 SLEEP CICLO MOVLW .10 MOVWF CONTA BCF PORTB,7 ; RB7=0 CALL RET_1s LOOP MOVLW B'10000000' ; Mascara en 1 para RB7 de PORTB XORWF PORTB,F ; Complementa bit 1 CALL RET_1s DECFSZ CONTA,F ; GOTO LOOP ; si CONTA no lleg a cero, se vuelve a conmutar RB0 SLEEP ; si CONTA lleg a cero, estado de bajo consumo GOTO CICLO END ; FIN DEL PROGRAMA

; ; ; ; ;

Borra bandera de interrupcin externa Restauramos contexto del programa principal recupera PCLATH W a PCLATH Intercambia STATUS_TEMP y guarda en W. Retorna

;************************************************************************************ ; 14 - WATCHDOG.asm. Al pulsar RA0, se enciende y apaga LED en RB1 5 veces, cada 1 s ; luego se desborda el WDT y se resetea volviendo al estado inicial ; *********************************************************************************** LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_ON & _XT_OSC

ORG GOTO

0x00 INICIO

; inicio del cdigo

CONT EQU 0x70 ; reserva de memoria RAM CONTA EQU 0X71 ; reserva de memoria RAM ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;---------------------------------------------------------------------; *********************** RETARDO DE 1 s *********************** ;---------------------------------------------------------------------RET_1S MOVLW .20 ; MOVWF CONT ; SEGUNDO = 20 DELAY MOVLW .60 ; W = 60 MOVWF TMR0 ; TMR0 = W = 60 LOOP1S CLRWDT ; Limpiar WDT para que no desborde BTFSS INTCON,T0IF ; T0IF=1? Hay desborde en TMR0? GOTO LOOP1S ; n, esperar BCF INTCON,T0IF ; s, borrar bandera T0IF DECFSZ CONT,F ; si SEGUNDO lleg a 0, pasaron 196*256+2 estados GOTO DELAY ; si SEGUNDO no lleg a cero, se vuelve a cargar TMR0 RETURN ; retorno despus de 20*[(192*256)+2] us=1003560 us=1,0004 s ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB ; Inicializa PORTB CLRWDT ; Reset del Watchdog MOVLW .6 ; MOVWF CONTA ; BANCO_1 MOVLW B'11111101' ; RB1 Salida, el resto Entradas MOVWF TRISB ; MOVLW B'11010111' MOVWF OPTION_REG BANCO_0 PULSA CLRWDT BTFSC PORTA,4 GOTO PULSA DECFSZ CONTA,F GOTO CICLO ; Evita el desbordamiento del Watchdog ; Si no se acciona el pulsador RA4 ; se espera ; ; ; TMR0=Timer, Prescaler al Timer, Divisor %256 ; T0CS=0, PSA=0, PS2-PS1-PS0=111

LOOP

GOTO CICLO BSF CALL BCF CALL GOTO BUCLE GOTO END

BUCLE PORTB,1 RET_1S PORTB,1 RET_1S LOOP BUCLE

; ; RB1=1 ; ; RB1=0 ; ; ; tras 18 ms. el micro se resetea ; FIN DEL PROGRAMA

;******************************************************************* ; 15 - CAPTURA.asm. TMR1 COMO CONTADOR SINCRONO. SE CAPTURA EL VALOR ; DE TMR1 MEDIANTE CCP1 EN EL FLANCO DE SUBIDA CADA 10 SEGUNDOS. ; Se despliega el valor de conteo de TMR1 por el pin T1CKI, en ; los puertos D y B. ;******************************************************************* LIST P=16F877A Tipo de microcontrolador INCLUDE P16F877A.INC ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

ORG GOTO

0x00 INICIO

; inicio del cdigo

PDel0 EQU 0x70 PDel1 EQU 0x71 PDel2 EQU 0x72 ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;------------------------------------------------------------; Generado con PDEL ver SP r 1.0 el 12/09/2009 Hs 07:35:32 p.m. ; Descripcion: Delay 10000000 ciclos (10 SEGUNDOS) ;------------------------------------------------------------RET_10S movlw .43 ; 1 set numero de repeticion (C) movwf PDel0 ; 1 | PLoop0 movlw .226 ; 1 set numero de repeticion (B) movwf PDel1 ; 1 | PLoop1 movlw .205 ; 1 set numero de repeticion (A) movwf PDel2 ; 1 | PLoop2 clrwdt ; 1 clear watchdog clrwdt ; 1 ciclo delay decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A) goto PLoop2 ; 2 no, loop decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B) goto PLoop1 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C) goto PLoop0 ; 2 no, loop clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTC CLRF PORTB CLRF PORTD CLRF TMR1H CLRF TMR1L BANCO_1 MOVLW B'00000000' MOVWF TRISB MOVWF TRISD MOVLW B'10111111' MOVWF TRISC ; PORTB Y PORTD SALIDAS

; RC6 SALIDA

BANCO_0 MOVLW B'00000011' MOVWF T1CON MOVLW B'00000101' MOVWF CCP1CON CARGADO CALL RET_10S BSF PORTC,6 NOP NOP NOP BCF PORTC,6 MOVF CCPR1H,W MOVWF PORTD MOVF CCPR1L,W MOVWF PORTB BCF CLRF CLRF BSF GOTO END T1CON,TMR1ON TMR1H TMR1L T1CON,TMR1ON CARGADO

; TMR1 como contador ; Modo de captura, flanco de subida ; RETARDO DE 10s ; INICIO PULSO DE SUBIDA EN RC6

; FIN PULSO DE SUBIDA EN RC6, CONECTADO A CCP1 ; SE LEE PARTE ALTA CCPR1H ; PARTE ALTA A PORTD ; SE LEE PARTE BAJA CCPR1L ; PARTE BAJA A PORTB ; ;

;**************************************************************************** ; 16 COMPARA.asm. TMR1 COMO TEMPORIZADOR. COMPARA CADA 0.5 s y ; CONMUTA LED EN RB0 cada segundo. ;**************************************************************************** LIST P=16F877A ; Tipo de microcontrolador INCLUDE P16F877A.INC ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

ORG 0x00 ; inicio del cdigo GOTO INICIO CONTA EQU 0x70 ; reserva de memoria RAM ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB ; Limpia PORTB BANCO_1 MOVLW B'11111110' MOVWF TRISB BANCO_0 MOVLW 0x24 MOVWF CCPR1L MOVLW 0xF4 MOVWF CCPR1H BCF PIR1,CCP1IF MOVLW B'00001011' MOVWF CCP1CON MOVLW ; ; ; ; ; ; ; ; MOVWF BSF CICLO MOVLW .2 MOVWF CONTA LOOP BTFSS PIR1,CCP1IF GOTO LOOP BCF PIR1,CCP1IF DECFSZ CONTA,F GOTO LOOP BTFSC PORTB,0 ; ; ; ; Se igualaron contenidos? NO, Salto a LOOP Se borra bandera CONTA = CONTA - 1 ; CONTA = 2 ; PIN RB0 SALIDA

; Cargamos valor de comparacion ; F424 = 62500 Se borra bandera CCP1, modo comparacion, PIN CCP1 no afectado, cuando TMR1 alcanza el valor de CCPR1H-CCPR1L. CCP1IF se pone a 1 CCP1M3:CCP1M0 = 1011. Se resetea TMR1 configuracin de TMR1 como temporizador TMR1ON OFF, se iniciar mas tarde TMR1CS=0 temporizador /T1SYNC=X indistinto T1OSCEN=0 oscilador de TMR1 deshabilitado T1CKPS0=1 para seleccionar prescaler en 8 T1CKPS1=1 para seleccionar prescaler en 8 no usado no usado

; ; ; ; B'00110000' ; |||||||+------||||||+-------|||||+--------||||+---------|||+----------||+-----------|+------------+-------------T1CON

T1CON,TMR1ON

; TMR1 ON despus de la Precarga

; Probar estado actual del LED

ON OFF

GOTO GOTO BSF GOTO BCF GOTO END

OFF ON PORTB,0 CICLO PORTB,0 CICLO

; Si es uno, apaga el LED ; Si es cero, enciende el LED ; LED ON ; LED OFF ; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 17 - MULTIPLEX INT EXT 00a99.asm ; Multiplexa y cuenta con interrupcin por RB0/INT ; RA0 unidades y RA1 decenas ; Display de ctodo comn RB7 = g ... RB1 = a ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

W_TEMP EQU 0x70 STATUS_TEMP EQU 0x71 PCLATH_TEMP EQU 0x72 CBLOCK 0X73 UNI, DEC, PDel0 ENDC `

; Para salvar contexto registro W ; Salvar contexto registro STATUS ; Reserva de memoria

ORG 0x00 ; Inicio del cdigo GOTO INICIO ORG 0X04 ; Inicio de la interrupcin GOTO ISR ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;------------------------------------------------------------------------------------------; ******************** RUTINA TABLADATOS ********************** ;------------------------------------------------------------------------------------------TABLADATOS ADDWF PCL,F RETLW B'01111110' ; 0 "g-f-e-d-c-b-a-INT" RETLW B'00001100' ; 1 RB"7-6-5-4-3-2-1-0" RETLW B'10110110' ; 2 RETLW B'10011110' ; 3 RETLW B'11001100' ; 4 RETLW B'11011010' ; 5 RETLW B'11111010' ; 6 RETLW B'00001110' ; 7 RETLW B'11111110' ; 8 RETLW B'11011110' ; 9 ;------------------------------------------------------------------------------------------; ********** RUTINA DE RETARDO DE 100 us=0,1 ms ************* ;------------------------------------------------------------------------------------------RETARDO movlw .23 ; 1 set numero de repeticion movwf PDel0 ; 1 | PLoop0 clrwdt ; 1 clear watchdog decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? goto PLoop0 ; 2 no, loop PDelL1 goto PDelL2 ; 2 ciclos delay PDelL2 clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;------------------------------------------------------------------------------------------; ************* RUTINA QUE ATIENDE INTERRUPCION *************** ;------------------------------------------------------------------------------------------ISR PUSH ; salvamos contexto del programa principal

MOVWF SWAPF CLRF MOVWF MOVF MOVWF CLRF BTFSS GOTO INCF MOVLW ADDWF BTFSS GOTO GOTO DECENAS CLRF INCF MOVLW ADDWF BTFSS GOTO CLRF EXIT BCF POP MOVF MOVWF SWAPF

W_TEMP STATUS,W STATUS STATUS_TEMP PCLATH, W PCLATH_TEMP PCLATH INTCON,INTF POP UNI,F D'246' UNI,W STATUS,C EXIT DECENAS UNI DEC,F D'246' DEC,W STATUS,C EXIT DEC

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

Copy Swap bank Save Only Save Page

W to TEMP register status to be saved into W 0, regardless of current bank, Clears IRP,RP1,RP0 status to bank zero STATUS_TEMP register required if using pages 1, 2 and/or 3 PCLATH into W zero, regardless of current page

INTF=1? NO, restauramos contexto Incrementa unidades Salta si carry=1 (hay acarreo)

; ; ; ; ; ; ;

Borra registro unidades Incrementa decenas Salta si carry=1 (hay acarreo) Borra registro decenas

INTCON,INTF ; Borra bandera de interrupcin externa INTF=0 ; Restauramos contexto del programa principal PCLATH_TEMP, W ; Restore PCLATH PCLATH ; Move W into PCLATH STATUS_TEMP,W ; Swap STATUS_TEMP register into W ; (sets bank to original state) MOVWF STATUS ; Move W into STATUS register SWAPF W_TEMP,F ; Swap W_TEMP SWAPF W_TEMP,W ; Swap W_TEMP into W RETFIE ; ;------------------------------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;------------------------------------------------------------------------------------------INICIO CLRF PORTA ; Inicializa puertos CLRF PORTB ; BSF STATUS,RP0 ; Banco 1 MOVLW B'00000001' ; RB1-7 sal. RB0/INT ent. MOVWF TRISB ; MOVLW B'00000110' ; todos los pines analogicos son digitales MOVWF ADCON1 ; MOVLW B'11111100' ; RA0 y RA1 salidas, el resto entradas MOVWF TRISA ; BSF BCF MOVLW MOVWF MOVLW MOVWF BCF BSF BSF OPTION_REG,INTEDG STATUS,RP0 D'0' UNI D'0' DEC ; Interrupcin en flanco de subida INTEDG=1

; Banco 0 ; Unid. y decenas en cero

INTCON,INTF ; Flag de int. RB0/INT=0 INTCON,INTE ; Habilit. interrup. por RB0/INT INTCON,GIE ; Habilit. interrup. globales

MULT MOVF CALL MOVWF BSF CALL BCF NOP NOP NOP NOP MOVF CALL MOVWF BSF CALL BCF NOP NOP NOP NOP GOTO END UNI,W TABLADATOS PORTB PORTA,0 RETARDO PORTA,0 ; ; ; ; ; ; ; UNI a W Despliega informacin RA0=1 unid. encendido RA0=0 unidades apagado Retardo de apagado

DEC,W TABLADATOS PORTB PORTA,1 RETARDO PORTA,1

; ; ; ; ; ; ;

DEC a W Despliega informacin RA1=1 dec. encendido RA1=0 decenas apagado Retardo de apagado

MULT ; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 18 - MULTIPLEX INT EXT 000a999.asm ; Multiplexa y cuenta hasta 999 con interrupcin por RB0/INT ; RA0 unidades y RA1 decenas RA2 centenas ; Display de ctodo comn RB7 = g ... RB1 = a ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

W_TEMP EQU 0x70 STATUS_TEMP EQU 0x71 PCLATH_TEMP EQU 0x72 CBLOCK 0X73 UNI, DEC, CEN, PDel0 ENDC

; Para guardar registro W ; Para guardar registro STATUS ; Para guardar registro PCLATH ; Reserva de memoria

ORG 0x00 ; Inicio del cdigo GOTO INICIO ORG 0X04 ; Inicio de la interrupcin GOTO ISR ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;------------------------------------------------------------------------------------------; ******************** RUTINA TABLADATOS ********************** ;------------------------------------------------------------------------------------------TABLADATOS ADDWF PCL,F RETLW B'01111110' ; 0 "g-f-e-d-c-b-a-INT" RETLW B'00001100' ; 1 RB"7-6-5-4-3-2-1-0" RETLW B'10110110' ; 2 RETLW B'10011110' ; 3 RETLW B'11001100' ; 4 RETLW B'11011010' ; 5 RETLW B'11111010' ; 6 RETLW B'00001110' ; 7 RETLW B'11111110' ; 8 RETLW B'11011110' ; 9 ;------------------------------------------------------------------------------------------; ********** RUTINA DE RETARDO DE 100 us=0,1 ms ************* ;------------------------------------------------------------------------------------------RETARDO movlw .23 ; 1 set numero de repeticion movwf PDel0 ; 1 | PLoop0 clrwdt ; 1 clear watchdog decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? goto PLoop0 ; 2 no, loop PDelL1 goto PDelL2 ; 2 ciclos delay PDelL2 clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;------------------------------------------------------------------------------------------; ************* RUTINA QUE ATIENDE INTERRUPCION *************** ;------------------------------------------------------------------------------------------ISR PUSH ; salvamos contexto del programa principal

MOVWF SWAPF CLRF MOVWF MOVF MOVWF CLRF BTFSS GOTO UNIDADES INCF MOVLW ADDWF BTFSC GOTO GOTO DECENAS CLRF INCF MOVLW ADDWF BTFSC GOTO GOTO CENTENAS CLRF INCF MOVLW ADDWF BTFSC CLRF GOTO EXIT BCF POP MOVF MOVWF SWAPF

W_TEMP STATUS,W STATUS STATUS_TEMP PCLATH, W PCLATH_TEMP PCLATH

; ; ; ; ; ; ;

Copy Swap bank Save Only Save Page

W to TEMP register status to be saved into W 0, regardless of current bank, Clears IRP,RP1,RP0 status to bank zero STATUS_TEMP register required if using pages 1, 2 and/or 3 PCLATH into W zero, regardless of current page

INTCON,INTF ; INTF=1? POP ; NO, restauramos contexto UNI,F D'246' UNI,W STATUS,C DECENAS EXIT UNI DEC,F D'246' DEC,W STATUS,C CENTENAS EXIT DEC CEN,F D'246' CEN,W STATUS,C CEN EXIT ; Incrementa unidades ; ; ; Salta si carry=0. No hay acarreo (no se lleg a 256) ; Borra registro decenas ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; Borra registro unidades Incrementa decenas Salta si carry=0. No hay acarreo (no se lleg a 256) Borra registro centenas Borra registro decenas Incrementa centenas Salta si carry=0. No hay acarreo (no se lleg a 256) Borra registro centenas

INTCON,INTF ; Borra bandera de interrupcin externa INTF=0 ; Restauramos contexto del programa principal PCLATH_TEMP, W ; Restore PCLATH PCLATH ; Move W into PCLATH STATUS_TEMP,W ; Swap STATUS_TEMP register into W ; (sets bank to original state) MOVWF STATUS ; Move W into STATUS register SWAPF W_TEMP,F ; Swap W_TEMP SWAPF W_TEMP,W ; Swap W_TEMP into W

RETFIE ; Retorno a programa principal ;------------------------------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;------------------------------------------------------------------------------------------INICIO CLRF PORTA ; Inicializa puertos CLRF PORTB ; BSF STATUS,RP0 ; Banco 1 MOVLW B'00000001' ; RB1-7 sal. RB0/INT ent. MOVWF TRISB ; MOVLW B'00000110' ; todos los pines analogicos son digitales MOVWF ADCON1 ; MOVLW B'11111000' ; RA0,RA1 y RA2 salidas, el resto entradas MOVWF TRISA ; BSF OPTION_REG,INTEDG ; Interrupcin en flanco de subida INTEDG=1

BCF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF BCF BSF BSF MULT MOVF CALL MOVWF BSF CALL BCF NOP NOP NOP NOP MOVF CALL MOVWF BSF CALL BCF NOP NOP NOP NOP MOVF CALL MOVWF BSF CALL BCF NOP NOP NOP NOP GOTO END

STATUS,RP0 D'0' UNI D'0' DEC D'0' CEN

; Banco 0 ; Unidades, decenas y centenas en cero

INTCON,INTF ; Flag de int. RB0/INT=0 INTCON,INTE ; Habilit. interrup. por RB0/INT INTCON,GIE ; Habilit. interrup. globales UNI,W TABLADATOS PORTB PORTA,0 RETARDO PORTA,0 ; ; ; ; ; ; ; UNI a W Despliega informacin RA0=1 unid. encendido RA0=0 unidades apagado Retardo de apagado

DEC,W TABLADATOS PORTB PORTA,1 RETARDO PORTA,1

; ; ; ; ; ; ;

DEC a W Despliega informacin RA1=1 dec. encendido RA1=0 decenas apagado Retardo de apagado

CEN,W TABLADATOS PORTB PORTA,2 RETARDO PORTA,2

; ; ; ; ; ; ;

CEN a W Recupera cdigo decimal Despliega informacin en display centenas RA2=1 centenas encendido RA2=0 centenas apagado Retardo de apagado

MULT ; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 19 - MULTIPLEX CONTA TMR0.asm ; Multiplexa y funcionamiento como contador por RA4/T0CKI ; RA0 unidades, RA1 decenas y RA2 centenas ; Display de ctodo comn RB7 = g ... RB1 = a ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

CBLOCK 0X70 UNI, DEC, CEN, PDel0 ENDC

; Reserva de memoria

ORG 0x00 ; Inicio del cdigo GOTO INICIO ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;------------------------------------------------------------------------------------------; ******************** RUTINA TABLADATOS ********************** ;------------------------------------------------------------------------------------------TABLADATOS ADDWF PCL,F RETLW B'01111110' ; 0 "g-f-e-d-c-b-a-INT" RETLW B'00001100' ; 1 RB"7-6-5-4-3-2-1-0" RETLW B'10110110' ; 2 RETLW B'10011110' ; 3 RETLW B'11001100' ; 4 RETLW B'11011010' ; 5 RETLW B'11111010' ; 6 RETLW B'00001110' ; 7 RETLW B'11111110' ; 8 RETLW B'11011110' ; 9 ;------------------------------------------------------------------------------------------; ********** RUTINA DE RETARDO DE 100 us=0,1 ms ************* ;------------------------------------------------------------------------------------------RETARDO movlw .23 ; 1 set numero de repeticion movwf PDel0 ; 1 PLoop0 clrwdt ; 1 clear watchdog decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? goto PLoop0 ; 2 no, loop PDelL1 goto PDelL2 ; 2 ciclos delay PDelL2 clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;------------------------------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;------------------------------------------------------------------------------------------INICIO CLRF PORTA ; Inicializa puertos CLRF PORTB ; BANCO_1 MOVLW B'00000001' ; RB1-7 sal. RB0/INT ent. MOVWF TRISB ;

MOVLW B'00000110' ; todos los pines analogicos son digitales MOVWF ADCON1 ; MOVLW B'11111000' ; RA0, RA1 y RA2 salidas, el resto entradas MOVWF TRISA ; MOVLW B'11111111' ; T0CS=1 (contador). T0SE=1 (Flanco de bajada). PSA=1 (Prescaler a WDT) MOVWF OPTION_REG BANCO_0 MOVLW D'0' MOVWF UNI MOVLW D'0' MOVWF DEC CLRF MULT MOVF TMR0,W MOVWF UNI MOVF CALL MOVWF BSF CALL BCF NOP NOP NOP NOP MOVF CALL MOVWF BSF CALL BCF NOP NOP NOP NOP MOVF CALL MOVWF BSF CALL BCF NOP NOP NOP NOP UNIDADES INCF MOVLW ADDWF BTFSS GOTO DECENAS CLRF INCF MOVLW ADDWF UNI,W TABLADATOS PORTB PORTA,0 RETARDO PORTA,0 ; Leemos TMR0 ; UNI=TMR0 ; ; ; ; ; ; ; UNI a W Recupera cdigo decimal Despliega informacin en display unidades RA0=1 unidades encendido RA0=0 unidades apagado Retardo de apagado TMR0 ; ; Unidades en cero ; Decenas en cero ; TMR0 en cero

DEC,W TABLADATOS PORTB PORTA,1 RETARDO PORTA,1

; ; ; ; ; ; ;

DEC a W Recupera cdigo decimal Despliega informacin en display decenas RA1=1 decenas encendido RA1=0 decenas apagado Retardo de apagado

CEN,W TABLADATOS PORTB PORTA,2 RETARDO PORTA,2

; ; ; ; ; ; ;

CEN a W Recupera cdigo decimal Despliega informacin en display centenas RA2=1 centenas encendido RA2=0 centenas apagado Retardo de apagado

UNI,F D'245' UNI,W STATUS,C MULT TMR0 DEC,F D'246' DEC,W

; Incrementa unidades ; ; ; Salta si carry=1 (si hay acarreo) ; ; Borra registro unidades ; Incrementa decenas ; ;

BTFSS GOTO CLRF CENTENAS INCF MOVLW ADDWF BTFSS GOTO CLRF GOTO END

STATUS,C MULT DEC CEN,F D'246' CEN,W STATUS,C MULT CEN MULT

; Salta si carry=1 (si hay acarreo) ; ; ; Incrementa centenas ; ; ; Salta si carry=1 (si hay acarreo) ; Borra registro centenas ; ; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 20 - ADC.asm ; Conversin Analgica /Digital de voltaje de Canal 0 (Potencimetro ; en RA0/AN0). El resultado se muestra en PORTB (parte baja) ; y PORTC (parte alta) ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

PDel0 EQU

0x70

; Reserva de memoria RAM

ORG 0X00 ; Inicio del cdigo GOTO INICIO ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;---------------------------------------------------------------------; ******************** RUTINA RETARDO 20us ******************** ;---------------------------------------------------------------------Delay20us movlw .3 ; 1 set numero de repeticion movwf PDel0 ; 1 PLoop0 clrwdt ; 1 clear watchdog decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? goto PLoop0 ; 2 no, loop PDelL1 goto PDelL2 ; 2 ciclos delay PDelL2 clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO ; Se inicializa Puertos CLRF PORTA ; Inicializa PORTA CLRF PORTB ; Inicializa PORTB CLRF PORTC ; Inicializa PORTC ; Se configura Puertos BANCO_1 MOVLW B'00000000' MOVWF TRISB MOVLW B'11111100' MOVWF TRISC MOVLW B'11111111' MOVWF TRISA

; ; PORTB salida ; ; PORTC RC0-RC1 salidas ; ; PORTA entrada Conversin A/D ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/_DONE - ADON ADCS1-ADCS0:11 (oscilador interno RC). ADON:1 (A/D habilitado) CHS2 a CHS0:000 (canal 0: AN0) ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0 ADFM:1 (Just. derecha). PCFG3 a PCFG0:1110 (AN0 analgica)

; Se inicializa Mdulo de BANCO_0 MOVLW B'11000001' ; MOVWF ADCON0 ; ; BANCO_1 MOVLW B'10001110' ; MOVWF ADCON1 ;

; Lectura del Canal analgico AN0 MAIN BANCO_0 CALL Delay20us ; Retardo para tiempo de adquisicin BSF ADCON0,GO ; Inicia la conversin WAIT ; BTFSC ADCON0,GO BTFSS PIR1,ADIF GOTO WAIT MOVF ADRESH,W MOVWF PORTC BANCO_1 MOVF ADRESL,W BANCO_0 MOVWF PORTB BCF PIR1,ADIF GOTO MAIN END ; Nota: Tambin se puede escribir ADCON0,GO_DONE ; ; Espera fin de conversin ; ; ADRESH a PORTC ; ; ADRESL a PORTB ; ; ; FIN PROGRAMA

;---------------------------------------------------------------------; 21 - PWM_AD.asm ; Conversin Analgica /Digital de voltaje de Canal 0 (Potencimetro ; en RA0/AN0). El resultado se muestra en PORTB (parte baja) ; y PORTD (parte alta). Control con GO/-DONE ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador INCLUDE P16F877A.INC ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

PDel0 EQU

0x70

; Reserva de memoria RAM

ORG 0X00 ; Inicio del cdigo GOTO INICIO ;---------------------------------------------------------------------; *************************** MACROS *************************** ;---------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;---------------------------------------------------------------------; ******************** RUTINA RETARDO 20us ******************** ;---------------------------------------------------------------------RET_20us Movlw .3 ; 1 set numero de repeticion movwf PDel0 ; 1 PLoop0 clrwdt ; 1 clear watchdog decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? goto PLoop0 ; 2 no, loop PDelL1 goto PDelL2 ; 2 ciclos delay PDelL2 clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO BANCO_0 CLRF PORTA ; Inicializa PORTA CLRF PORTB ; Inicializa PORTB CLRF PORTC ; Inicializa PORTC CLRF PORTD ; Inicializa PORTD BANCO_1 MOVLW B'11111111' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB MOVLW B'11111011' MOVWF TRISC MOVLW B'00111111' MOVWF TRISD ; ; ; ; ; ; ; ;

PORTA entrada PORTB salida RC2 SALIDA PORTD RD7-RD6 salidas Conversin A/D ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/_DONE - ADON ADCS1-ADCS0:11 (oscilador interno RC). ADON:1 (A/D habilitado) CHS2 a CHS0:000 (canal 0: AN0) ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0 ADFM:0 (Just. izquierda). PCFG3 a PCFG0:1110 (AN0 analgica)

; Se inicializa Mdulo de BANCO_0 MOVLW B'11000001' ; MOVWF ADCON0 ; ; BANCO_1 MOVLW B'00001110' ; MOVWF ADCON1 ;

BANCO_1 MOVLW .249 MOVWF PR2

; PWM Frec.=1000 Hz ; PWM Period=0,001s - Tosc=0,25x10-6 - TMR2 Prescale=4 ; PR2=.249

BANCO_0 ; PARA CAMBIAR CICLO MOVLW B'01111101' ; CALCULADO PARA 1000 Hz 0111110100b (500d) A 50% MOVWF CCPR1L ; Configurados los bits 9-2 BCF BCF BCF BSF BSF BSF BSF BSF BSF CCP1CON,CCP1X CCP1CON,CCP1Y T2CON,T2CKPS1 T2CON,T2CKPS0 T2CON,TMR2ON CCP1CON,3 CCP1CON,2 CCP1CON,1 CCP1CON,0 ; Configurado el bit 5 ; Configurado el bit 4 ; TMR2 Prescaler=4 ; T2CKPS1:0 = 01 ; TMR2 Encendido ; Se configura PWM ; CCP1CON=11XX ; ;

; Lectura del Canal analgico AN0 MAIN CALL RET_20us ; Retardo para tiempo de adquisicin BSF ADCON0,GO ; Inicia la conversin WAIT BTFSC ADCON0,GO GOTO WAIT MOVF ADRESH,W MOVWF PORTB MOVWF CCPR1L BANCO_1 MOVF ADRESL,W BANCO_0 MOVWF PORTD GOTO MAIN END ; Nota: Tambin se puede escribir ADCON0,GO_DONE ; Espera fin de conversin ; ; ADRESH a PORTB ; Se cambia valor de PWM Duty cycle ; ; ADRESL a PORTD ; ; FIN PROGRAMA

;---------------------------------------------------------------------; 22 - EEPROM.asm ; Se escribe un dato en la posicin 0x00 de la EEPROM, luego se lee ; y se lo despliega en PORTB. ;---------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador INCLUDE P16F877A.INC ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

ADDR_E DATA_E

EQU 0x70 EQU 0x71

ORG 0x00 ; Inicio del cdigo GOTO INICIO ;---------------------------------------------------------------------; ******************** ESCRITURA EEPROM ********************* ;---------------------------------------------------------------------ESCRIBE_E BANKSEL EEDATA MOVF ADDR_E,W ; direccin donde escribir MOVWF EEADR MOVF DATA_E,W ; dato a escribir MOVWF EEDATA BANKSEL EECON1 BCF EECON1, EEPGD ; se selecciona memoria EEPROM BSF EECON1, WREN ; se habilita escritura BCF INTCON, GIE ; se deshabilita interrupciones ; RUTINA OBLIGATORIA ; ; ; ; se inicia escritura ; esperar a que termine ; ciclo de escritura ; deshabilita escritura ; Enable INTs.

BANKSEL EECON2 MOVLW 0x55 MOVWF EECON2 MOVLW 0xAA MOVWF EECON2 BANKSEL EECON1 BSF EECON1,WR ESPERA BTFSC EECON1, WR GOTO ESPERA BCF BSF EECON1, WREN INTCON, GIE

BANCO_0 RETURN ;---------------------------------------------------------------------; ******************** LECTURA EEPROM ********************* ;---------------------------------------------------------------------LEE_E BANKSEL EEADR MOVF ADDR_E,W ; direccin donde escribir MOVWF EEADR BANKSEL EECON1 BCF EECON1, EEPGD BSF EECON1, RD BANKSEL EEDATA MOVF EEDATA,W RETURN ; se apunta a memoria EEPROM ; se inicia ciclo de lectura ; se lee dato de EEDATA y se almacena en W

;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;---------------------------------------------------------------------INICIO CLRF PORTB ; inicializa PORTB BANKSEL TRISB CLRF TRISB MOVLW 0x00 MOVWF ADDR_E MOVLW B'10101011' MOVWF DATA_E BANKSEL EEDATA CALL ESCRIBE_E CLRF EEDATA CALL LEE_E BANKSEL PORTB CICLO MOVWF PORTB GOTO CICLO END ; ; ; FIN PROGRAMA PRINCIPAL ; PORTB salidas ; DIRECCION ; ; DATO ; ; escribe en EEPROM ; Limpia EEDATA ; lee de EEPROM

;

;-----------------------------------------------------------------------------; 23 RS232.asm ; Usando la interrupcin del USART, desde el hyperterminal se presiona la tecla ; A RC0 = 1, a RC0 = 0, B RC1 = 1, b RC1 = 0, C RC2 = 1,c RC2 = 0 ;-----------------------------------------------------------------------------LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

W_TEMP EQU 0x70 STATUS_TEMP EQU 0x71 PCLATH_TEMP EQU 0x72 TECLA INDICE EQU 0x73 EQU 0x74

; Para guardar registro W ; Para guardar registro STATUS ; Para guardar registro PCLATH

ORG 0x00 ; Inicio del cdigo GOTO INICIO ORG 0X04 ; Inicio de la interrupcin GOTO ISR ;-------------------------------------------------------------------------------; *************************** MACROS *************************** ;-------------------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;-------------------------------------------------------------------------------; El PCL se incrementa con el valor de W proporcionando un salto ;-------------------------------------------------------------------------------TECLAS ADDWF PCL,F ; pcl + W > W RETLW A'A' ; retorna con valores para PORTC RETLW A'B' RETLW A'C' RETLW A'a' RETLW A'b' RETLW A'c' ;-------------------------------------------------------------------------------; El PCL se incrementa con el valor de W proporcionando un salto ;-------------------------------------------------------------------------------SALIDAS ADDWF PCL,F ; pcl + W > W GOTO ON_RC0 ; RC0=1 GOTO ON_RC1 ; RC1=1 GOTO ON_RC2 ; RC2=1 GOTO OFF_RC0 ; RC0=0 GOTO OFF_RC1 ; RC1=0 GOTO OFF_RC2 ; RC2=0 ON_RC0 BSF PORTC,0 RETURN ON_RC1 BSF PORTC,1 RETURN ON_RC2 BSF PORTC,2 RETURN OFF_RC0 BCF PORTC,0

RETURN OFF_RC1 BCF PORTC,1 RETURN OFF_RC2 BCF PORTC,2 RETURN ;------------------------------------------------------------------------------------------; ************* RUTINA QUE ATIENDE INTERRUPCION *************** ;------------------------------------------------------------------------------------------ISR PUSH ; Guardamos contexto del programa principal MOVWF W_TEMP SWAPF STATUS,W CLRF STATUS MOVWF STATUS_TEMP MOVF PCLATH,W MOVWF PCLATH_TEMP CLRF PCLATH BTFSS PIR1,RCIF GOTO POP ; RCIF=1? ; si no lo es, restauramos contexto y luego RETFIE (GIE=1)

MOVF RCREG,W ; MOVWF TECLA ; tecla=RCREG CLRF INDICE ; indice=0 _BUSCA_TECLA MOVF INDICE,W ; W=indice CALL TECLAS ; llama en orden, las teclas 'A' 'B' 'C' 'a' 'b' 'c' SUBWF TECLA,W ; compara tecla con los valores de la tabla TECLAS BTFSC STATUS,Z ; GOTO _SIGUE ; coincide INCF INDICE,F ; no coincide, incrementa indice MOVLW D'6' ; SUBWF INDICE,W ; compara indice con el numero 6 (total de teclas posibles) BTFSC STATUS,Z ; GOTO POP ; hace las 6 comparaciones y sale de la subrutina GOTO _BUSCA_TECLA ; ndice no es igual a 6 y sigue buscando en la tabla _SIGUE MOVF INDICE,W ; CALL SALIDAS ; toma la accin correspondiente a la tecla pulsada MOVF TECLA,W ; CALL ENVIA ; enva a la PC la tecla pulsada POP ; Restauramos contexto del programa principal MOVF PCLATH_TEMP,W MOVWF PCLATH SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W RETFIE ;************************************************* ;SUBRUTINA PARA ENVIAR UN DATO POR EL PUERTO SERIE ;************************************************* ENVIA MOVWF TXREG BANCO_1 BTFSS TXSTA, TRMT GOTO $-1 RETURN ;-------------------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL ********************* ;-------------------------------------------------------------------------------INICIO

BANCO_1 MOVLW B'11111000' MOVWF TRISC MOVLW d'25' MOVWF SPBRG BSF TXSTA,BRGH BCF TXSTA,SYNC BSF PIE1,RCIE BSF INTCON,PEIE BSF INTCON,GIE BANCO_0 BSF RCSTA,SPEN BANCO_1 BSF TXSTA,TXEN BANCO_0 BSF RCSTA,CREN CLRF PORTC BUCLE GOTO END BUCLE

; RC0-1-2 salidas, el resto entradas ; ; 9600 baudios, Xtal=4 MHz ; ; ; ; ; Seleccin de ALTA velocidad Modo asncrono Habilita INTR Recepcin Serial Habilita INTR perifricos Habilitador general de interrupciones

; habilita el puerto serie ; Activa la transmisin serial TXIF=1 ; bit de habilitacin de recepcin continua ; PORTC=0. LED apagados ; Espera interrupcin

;**************************************************************************** ; 24 I2C.asm ; Configura mdulo MSSP en modo I2C Master y se utiliza en modo Transmisin. ; Lee el contenido de PORTD y lo enva a las lneas correspondientes ; del puerto del perifrico I2C PCF8574 - Direccin 001 de U1 en el esquema. ;**************************************************************************** LIST P=16F877A ; Tipo de microcontrolador #INCLUDE ; Archivo de definiciones__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

MEMO

EQU

0x70 -302 -207

; reservamos memoria RAM ; elimina BANK WARNING ; elimina LABEL AFTER COLUMN 1

ERRORLEVEL ERRORLEVEL

ORG 0x00 ; inicio del cdigo GOTO INICIO ;-------------------------------------------------------------------------------; *************************** MACROS *************************** ;-------------------------------------------------------------------------------BANCO_0 MACRO BCF STATUS,RP1 BCF STATUS,RP0 ENDM BANCO_1 MACRO BCF STATUS,RP1 BSF STATUS,RP0 ENDM ;**************************************************************************** ; I2C_EnviaStart: Enva la condicin de Start ;**************************************************************************** I2C_EnviaStart BANCO_0 BCF PIR1,SSPIF ; Si SSPIF=1, la condicion de START fue completado por el mod. MSSP BANCO_1 BSF SSPCON2,SEN ; Activa secuencia inicio para SDA - SCL. Se limpia utomaticamente BANCO_0 Espera_Start BTFSS PIR1,SSPIF ; Fin de secuencia de transmisin? GOTO Espera_Start ; Espera fin de transmisin RETURN ;**************************************************************************** ; I2C_EnviaRStart: Enva la condicin de RStart ;**************************************************************************** I2C_EnviaRStart BANCO_0 BCF PIR1,SSPIF ; Si SSPIF=1, la condicion de START fue completado por el modulo MSSP BANCO_1 BSF SSPCON2,RSEN ; Activa secuencia de inicio para SDA - SCL. Se limpiaautomaticamente BANCO_0 Espera_RStart BTFSS PIR1,SSPIF ; Fin de secuencia de transmisin? GOTO Espera_RStart ; Espera fin de transmisin RETURN ;**************************************************************************** ; I2C_EnviaByte: Transmite el byte del W va I2C. La rutina finaliza cuando se recibe /ACK ;**************************************************************************** I2C_EnviaByte BANCO_0

BCF PIR1,SSPIF MOVWF SSPBUF Espera_Byte BTFSS PIR1,SSPIF

; Byte a transmitir pasa al buffer de salida

; Se ha recibido el bit /ACK?. Si=1, la condicion de reconocimiento ; fue completada por el modulo MSSP GOTO Espera_Byte ; No esperar RETURN ;**************************************************************************************** ;I2C_LeeByte: Lee un byte procedente del dispositivo I2C seleccionado y lo deja en W ;Seguidamente se genera y transmite el bit /ACK ;**************************************************************************** I2C_LeeByte BCF PIR1,SSPIF ; Restaura el flag del mdulo MSSP BANCO_1 BSF SSPCON2,RCEN BANCO_0 Espera_Lectura BTFSS PIR1,SSPIF GOTO Espera_Lectura BCF PIR1,SSPIF BANCO_1 BCF SSPCON2,ACKDT BSF SSPCON2,ACKEN ; Activa el modo receptor

; Se han recibidos los 8 bits ? ; No, esperar lectura ; Restaura el flag del mdulo MSSP ; Pone bit ACK a "0" ; Aciva la secuencia de generacin del bit ACK

BANCO_0 Espera_ACK BTFSS PIR1,SSPIF ; Se ha finalizado la Secuencia ACK? GOTO Espera_ACK ; No, esperar ACK MOVF SSPBUF,W ; Lee el byte recibido RETURN ;**************************************************************************** ; stop_i2c ;**************************************************************************** stop_i2c BANCO_0 BCF PIR1,SSPIF BANC0_1 BSF SSPCON2,PEN ; Envia bit STOP i2c [P] BANCO_0 BTFSS PIR1,SSPIF ; Ciclo de bit de parada completado? GOTO $-1 RETURN ;**************************************************************************** ; Programa principal ;**************************************************************************** INICIO CLRF PORTC CLRF PORTD BANCO_1 MOVLW B'11111111' MOVWF TRISC MOVWF TRISD

; Configura PORTC y PORTD como entrada ; RC3/SCL y RC4/SDA entradas

;*******INICIALIZA MODULO MSSP********************************** MOVLW B'10000000' MOVWF SSPSTAT ; Velocidad estndar con niveles I2C MOVLW .9 MOVWF SSPADD ; Velocidad del bus I2C 100 kHz ;*************************************************************** ;Configuramos el mdulo MSSP en el modo Master I2C

BANCO_0 MOVLW B'00101000' MOVWF SSPCON CALL I2C_EnviaStart MOVLW B'01000010' CALL I2C_EnviaByte Bucle MOVF CALL GOTO END PORTD,W I2C_EnviaByte Bucle

; Mdulo MSSP en On ; Enva condicin de Start ; Enva la direccin al PCF8574 - U2 ; Carga en W el valor del PORTD ; Envia Byte al PCF8574 - U2 ; Fin del programa