GUÍA DE EJERCICIOS RESUELTOS TEMA 4

  • 7,807 views
Uploaded on

 

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
7,807
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
811
Comments
0
Likes
4

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. GUÍA DE EJERCICIOS RESUELTOS TEMA 5: TIMER 0 E INTERRUPCIONES Prof. Luis Zurita 1 Microcontroladores I
  • 2. 1. Genere una señal cuadrada de 200 Hz. Diseño libre. Paso 1. Enunciado y delimitación del problema: Como no se ha especificado por cual pin del microcontrolador saldrá la señal, asumiremos RB0. Cuando se trabaja con el Timer 0, se deben incluir los cálculos que se hayan realizado para generar el retardo deseado. 1 1 1 Para una frecuencia de 200 Hz, tendremos un período de: ‫=ܨ‬ ‫= = ܶ݁ݑݍ ݈ݎ݋݌‬ ‫݋‬ = 5݉‫ݏ‬ ܶ ‫ݖܪ 002 ܨ‬ Como no se ha especificado el ciclo de trabajo, asumiremos el 50 %, por lo que el período en alto y en bajo serán iguales, es decir 2,5 ms Hagamos los cálculos para 2,5 ms: De la fórmula proporcionada en la Unidad IV, despejando nos quedará: ܶ݁݉ ‫ ݅ݎ݋݌‬ó݊ ‫݅ܿܽݖ‬ ்ܸெ ோை = 4 ∗ ܶ‫0ܴ ܯܶݎ݋ݏ ݅݀݁ݎܲ ∗ܿݏ݋‬ ‫݅ݒ‬ Sustituyendo los valores (Como no se nos especificó el oscilador, 2,5 ݉ ‫ݏ‬ asumiremos el estándar de 4 MHz: ்ܸெ ோை = = 39,0625 ≅ 39 1 4 ∗ ቀ4‫ݖܪ ܯ‬ቁ∗ 64 ்ܸெ ோை = 256 − ܸ݈ܽ ‫݈ܸܽ → 0ܴ ܯ݈ܴܶܽ݁ݎ݋‬ ‫்ܸ − 652 = 0ܴ ܯ݈ܴܶܽ݁ݎ݋‬ெ ோை = 256 − 39 = 217 Por lo que el valor a cargar en el TMR0= 217 Prof. Luis Zurita 2 Microcontroladores I
  • 3. Paso 2. Diagrama de Flujo: FORMA A INICIO DELAY5MS Configurar Cargamos valor calculado Puerto B en el TIMER0 Configurar Borramos el OPTION_REG Señalizador TOIF Inicializamos PORTB NO ¿TOIF=1? RB0=1 SI return DELAY5MS RB0=0 DELAY5MS Prof. Luis Zurita 3 Microcontroladores I
  • 4. Paso 3. Lenguaje ensamblador: FORMA A. POR EXPLORACIÓN (POLLING) DEL BIT TOIF: list P=16F84A include P16F84A.inc org 00H goto INICIO ;*************************** ;***PROGRAMA PRINCIPAL*** ;*************************** INICIO bsf STATUS,5 ;Zona de configuraciones clrf TRISB movlw B'00010101' ;Predivisor= 128 movwf OPTION_REG Prof. Luis Zurita 4 Microcontroladores I
  • 5. bcf STATUS,5 clrf PORTB ;Inicializamos el Puerto B nop CICLO bsf PORTB,0 ;Señal a nivel alto call DELAY2_5MS ;Llamamos subrutina 2,5 ms bcf PORTB,0 ;Señal a nivel bajo call DELAY2_5MS ;Llamamos subrutina 2,5 ms goto CICLO ;Repetimos ciclo DELAY2_5MS movlw .217 ;Cargamos TMR0 con valor movwf TMR0 ;calculado previamente bcf INTCON,2 ;Borramos el señalizador ESPERA btfss INTCON,2 ;Se desbordó el TMR0? goto ESPERA ;No. Seguimos esperamos return ;Si, han transcurrido 2,5 ms end FORMA B. POR INTERRUPCIÓN list P=16F84A include P16F84A.inc org 00H goto INICIO org 04H goto RSI ;******************************** ;***RUTINA DE INTERRUPCIÓN*** ;******************************** RSI bcf INTCON,7 ;Deshabilitamos las interrupciones btfss INTCON,2 ;La causa de la interrupción es desborde ;del TIMER0 TOIF=1? goto SALIR ;No, Salimos bcf INTCON,2 ;Si, borramos el señalizador TOIF movlw .01 xorwf PORTB,1 movlw .217 ;Cargamos el valor del TMR0 Prof. Luis Zurita 5 Microcontroladores I
  • 6. movwf TMR0 ;Para una nueva temporización SALIR bsf INTCON,7 ;Habilitamos las interrupciones retfie ;*************************** ;***PROGRAMA PRINCIPAL*** ;*************************** INICIO bsf STATUS,5 clrf TRISB movlw B'00010101' ;Predivisor= 128 movwf OPTION_REG movlw B'10100000' ; Habilitamos las interrupciones movwf INTCON ;Con GIE=1 y TOIE=1 bcf STATUS,5 clrf PORTB ;Inicializamos el Puerto B movlw .217 ;Cargamos el TMR0 con el movwf TMR0 ;valor previamente calculado SINFIN clrwdt ;Usamos esta instrucción para goto SINFIN ;evitar reinicio del programa ;De resto, el programa se queda en este bucle sin fin esperando el desborde ;del TMR0, que ocurrirá según sea el tiempo calculado. end Nota: Generalmente cuando los puertos A y/o B pueden sufrir modificaciones dentro de la rutina de interrupción, se salva el entorno (Se verán en los ejemplos 3, 4 y 5), sin embargo para este ejemplo, no se modifican otros bits de los puertos, por lo que no es necesario salvar el entorno. Prof. Luis Zurita 6 Microcontroladores I
  • 7. 2. Genera la siguiente señal. (Use Timer 0 e interrupción) 100 ms 2 segundos Paso 1. Enunciado y delimitación del problema: Como no se ha especificado por cual pin del microcontrolador saldrá la señal, asumiremos RB0. Cuando se trabaja con el Timer 0, se deben incluir los cálculos que se hayan realizado para generar el retardo deseado. En la gráfica, podemos extraer el período de la señal cuadrada cuyo valor es de 100 ms, y asumiendo un ciclo de trabajo del 50 %, tendremos que la señal en alto es igual a la señal en bajo, por lo tanto su duración o período será de 50 ms. Hagamos los cálculos para 50 ms: De la fórmula proporcionada en la Unidad IV, despejando nos quedará: ܶ݁݉ ‫ ݅ݎ݋݌‬ó݊ ‫݅ܿܽݖ‬ ்ܸெ ோை = 4 ∗ ܶ‫0ܴ ܯܶݎ݋ݏ ݅݀݁ݎܲ ∗ܿݏ݋‬ ‫݅ݒ‬ Sustituyendo los valores (Como no se nos especificó el oscilador), 50 ݉ ‫ݏ‬ asumiremos el estándar de 4 MHz: ்ܸெ ோை = = 195,31 ≅ 195 1 4 ∗ ቀ4‫ݖܪ ܯ‬ቁ∗ 256 ்ܸெ ோை = 256 − ܸ݈ܽ‫݈ܸܽ → 0ܴ ܯ݈ܴܶܽ݁ݎ݋‬ ‫்ܸ − 652 = 0ܴ ܯ݈ܴܶܽ݁ݎ݋‬ெ ோை = 256 − 195 = 61 Por lo que el valor a cargar en el TMR0= 61 Prof. Luis Zurita 7 Microcontroladores I
  • 8. ¿Por qué el predivisor de 256? Sencillo, repasando la teoría, recordaremos que el valor del Timer 0 a cargar no podrá exceder bajo ningún concepto 256. Si colocamos otro predivisor del rango disponible, el resultado será mayor a 256. ¿Cómo encaro el problema? En esta señal solicitada, si nos damos cuenta, la señal cuadrada se genera 10 veces, dando un tiempo de 1 segundo, si la señal entera, antes de que se repita el ciclo nuevamente, es de 2 segundos, vale decir que durante 10 veces el tiempo de 100 ms, la señal no bascula u oscila, por lo que podemos utilizar un contador de temporización para determinar si la señal oscilará o no. Durante las primeras 20 temporizaciones de 50 ms, la señal de salida oscilará, durante las siguientes 20 temporizaciones de 50 ms, la señal de salida no oscilará, utilizando el contador resolveremos este problema. ¿Y dónde utilizo el contador? El desarrollo de la señal se fundamenta en una interrupción por desborde del Timer0 para los 50 ms calculados, por lo tanto el contador se utilizará dentro de la rutina de servicio de la interrupción. Veamos el Diagrama de flujo para entenderlo mejor: Prof. Luis Zurita 8 Microcontroladores I
  • 9. Paso 2. Diagrama de Flujo: INICIO RSI Declarar Deshabilitar CONTADOR Interrupciones Configurar NO Puerto A y B ¿TOIF=1? SALIR SI Configurar INTCON y OPTION_REG Borramos el Señalizador TOIF Inicializamos CONTADOR y PORTB ¿Contador NO ¿Contador >20? >40? Cargamos valor calculado en el TIMER0 SI Bascular RB0 CONTADOR=0 Para evitar un reinicio del programa Limpiamos el Perro Guardián CONTADOR=CONTADOR+1 SALIR Habilitar Interrupciones retfie Paso 3. Lenguaje ensamblador: list P=16F84A include P16F84A.inc CONTADOR equ 20H ;Declaramos el registro org 00H goto INICIO org 04H goto RSI Prof. Luis Zurita 9 Microcontroladores I
  • 10. ;******************************** ;***RUTINA DE INTERRUPCIÓN*** ;******************************** RSI bcf INTCON,7 ;Deshabilitamos las interrupciones btfss INTCON,2 ;La causa de la interrupción es ;desborde del TIMER0 TOIF=1? goto SALIR ;No, Salimos bcf INTCON,2 ;Si, borramos el señalizador TOIF movlw .20 subwf CONTADOR,0 ;Contador-20. btfsc STATUS,0 ;C=0? ó Contador < 20? goto NOBASCULA ;No. BASCULA movlw .01 ;Si. xorwf PORTB,1 ;Basculamos (Toggle) RB0 goto SUBECONT NOBASCULA movlw .40 subwf CONTADOR,0 ;Contador-40. Contador>40? btfsc STATUS,0 ;C=0? goto LIMPIAR SUBECONT incf CONTADOR,1 ;Contador=Contador+1 movlw .61 ;Cargamos el valor del TMR0 movwf TMR0 ;Para una nueva temporización bsf INTCON,7 ;Habilitamos las interrupciones retfie ;Salimos de la RSI LIMPIAR clrf CONTADOR ;Limpiamos el contador SALIR bsf INTCON,7 ;Habilitamos las interrupciones retfie ;Salimos de la RSI ;*************************** ;***PROGRAMA PRINCIPAL*** ;*************************** INICIO bsf STATUS,5 ;Zona de configuraciones clrf TRISB movlw B'00010111' ;Predivisor=256 movwf OPTION_REG movlw B'10100000' ;Habilitamos las interrupciones movwf INTCON ;Con GIE=1 y TOIE=1 bcf STATUS,5 Prof. Luis Zurita 10 Microcontroladores I
  • 11. clrf PORTB clrf CONTADOR bcf PORTB,0 movlw .61 ;Cargamos el valor del TMRO movwf TMR0 ;Previamente calculado SINFIN clrwdt goto SINFIN end A C1 B U1 C 22p 16 17 X1 15 OSC1/CLKIN RA0 18 CRYSTAL OSC2/CLKOUT RA1 D C2 1 RA2 4 2 MCLR RA3 3 VDD RA4/T0CKI 22p R1 6 RB0/INT VSS 7 RB1 330R 8 RB2 9 RB3 10 RB4 11 D1 RB5 LED-GREEN 12 RB6 13 RB7 PIC16F84A VSS Señal en el osciloscopio del Proteus Prof. Luis Zurita 11 Microcontroladores I
  • 12. 3. Diseñe un control de nivel para un tanque. Se tiene un interruptor selector de “MODO”  Si “MODO” es manual, las bombas se activan sin importar el nivel del tanque subterráneo.  Si “MODO” es automático, la activación de las bombas dependerá de:  Si el nivel del agua está por debajo del nivel mínimo, se activará la bomba 1 hasta que se alcance el nivel Máximo, y procederá a apagarse.  Si el nivel del agua está por encima del nivel mínimo, pero por debajo del nivel máximo, se activará la bomba 2 hasta que se alcance el nivel Máximo y procederá a apagarse.  Se debe monitorear si ha cambiado el “MODO”.  Importante: Si no hay agua en el tanque subterráneo, se deben apagar las bombas hasta que el nivel del tanque de trabajo alcance al sensor de operación MODO Manual Auto OPERACIÓN PARADA SOLUCIÓN: Paso 1. Enunciado y delimitación del Hardware: Tenemos el enunciado, sin embargo debemos delimitar el hardware. Para lograr esta tarea debemos asignar los pines de control de Entrada y de salida, con la finalidad de saber qué vamos a controlar y quién nos dará la información. Como el sensor de parada se va a utilizar por interrupción de cambio de nivel de RB0, este será configurado como entrada Prof. Luis Zurita 12 Microcontroladores I
  • 13. Debemos identificar cuales elementos son entrada y cuales salida: ENTRADA ¿Qué pin SALIDA ¿Qué pin Asignamos? Asignamos? Interruptor “INICIO” RA0 Bomba B1 RB3 Sensor Máximo RA1 Bomba B2 RB1 Sensor Mínimo RA2 Indicador RB2 Manual Sensor Parada RB0 Indicador Auto RB3 Sensor Operación RA3 ¿Y si quiero asignar otros pines? Perfecto, queda a libre elección. VDD MANUAL R1 RB4 1k AUTO RB2 RA0 VSS MODO VSS SENSOR NIVEL ALTO VDD NIVEL MÁXIMO R2 1k RA1 TANQUE VSS RB3 RB1 VDD PRINCIPAL M1 B1 B2 M2 SENSOR NIVEL BAJO VDD VDD R1B 1k OPERACIÓN R1A R3 PARADA 1k 1k VSS VSS RA3 RA2 VSS RB0 TANQUE SUBTERRÁNEO VSS VSS C1 22p U1 X1 16 OSC1/CLKIN RA0 17 RA0 15 18 C2 OSC2/CLKOUT RA1 RA1 1 RA2 RA2 4 2 MCLR RA3 RA3 3 VSS VDD RA4/T0CKI 22p 6 RB0/INT RB0 7 RB1 RB1 8 RB2 RB2 9 RB3 RB3 10 RB4 RB4 11 RB5 12 RB6 13 RB7 PIC16F84A Prof. Luis Zurita 13 Microcontroladores I
  • 14. Paso 2. Diagrama de Flujo: INICIO RSI Configurar Deshabilitar INTCON Interrupciones Salvar entorno Configurar Puerto A y B NO Bomba 1= OFF ¿INTF=1? SALIR Bomba 2=OFF SI M Bomba 1= OFF SI Bomba 1= ON Bomba 2= OFF ¿Manual? Bomba 2= ON Auto NO NO ¿Llegó a Noperación? ¿Nivel NO ¿Nivel NO M SI Mínimo? Máximo? SALIR SI SI Restaurar entorno Bomba 1= OFF Bomba 1= ON INTF=0 Bomba 2= ON Bomba 2= OFF Habilitar Interrupciones ¿Nivel NO Máximo? retfie SI Bomba 1= OFF Bomba 2= OFF M Prof. Luis Zurita 14 Microcontroladores I
  • 15. Paso 3. Del Diagrama de Flujo al Lenguaje Ensamblador: list P=16F84A include P16F84A.INC WTEMP equ 20H ;Declaramos registros para PBTEMP equ 21H ;Utilizarse para salvar y restaurar STATEMP equ 22H ;El entorno org 00H ;Vector de Inicio goto INICIO org 04H ;Vector de Interrupción goto RSI ;************************************* ;***Rutina de servicio de Interrupción*** ;************************************* RSI bcf INTCON,7 ;Interrupciones deshabilitadas PUSH movwf WTEMP ;Salvamos el entorno movf STATUS,0 movwf STATEMP movf PORTB,0 movwf PBTEMP btfss INTCON,1 ;INTF=1? Fue por RB0/INT? goto PULL ;No. Salimos de la RSI SI bcf PORTB,2 bcf PORTB,3 ;Bomba 1= OFF bcf PORTB,1 ;Bomba 2= OFF OPER btfsc PORTA,3 ;Nivel de Operación? goto OPER ;No. Esperamos a que se alcance el ;nivel de operación PULL movf PBTEMP,0 ;Restauramos el entorno movwf PORTB movf STATEMP,0 movwf STATUS movf WTEMP,0 bcf INTCON,1 ;Borramos el señalizador bsf INTCON,7 ;Interrupciones habilitadas retfie ;Salimos de las interrupciones Prof. Luis Zurita 15 Microcontroladores I
  • 16. ;*********************** ;***Programa Principal*** ;*********************** INICIO bsf STATUS,5 ;Vamos al banco 1 a configurar movlw 1FH movwf TRISA movlw B'00000001' ;RB0= Entrada, Resto Salidas movwf TRISB movlw B'10010000' ;Habilitamos las interrupciones movwf INTCON ;Con GIE=1 y INTE=1 movlw B'01000000' ;Configuramos el tipo de flanco movwf OPTION_REG ;De activación de RB0/INT bcf STATUS,5 ;Vamos al banco 0 a trabajar clrf TRISB ;Bombas=OFF MODO btfsc PORTA,0 ;MODO AUTO? goto AUTO MANUAL bsf PORTB,2 ;No. Modo manual= ON bcf PORTB,4 ;Modo Auto=OFF bsf PORTB,3 ;Bomba 1=ON bsf PORTB,1 ;Bomba 2=ON goto MODO AUTO btfsc PORTA,2 ;MÍNIMO? goto DOS ;Hay Agua bsf PORTB,2 ; Modo Auto=ON bcf PORTB,4 ;Modo Manual=OFF bsf PORTB,3 ;Bomba 1=ON bcf PORTB,1 ;Bomba 2=OFF CERR btfss PORTA,1 ;(NHA)MÁXIMO? goto CERR ;No Hay Agua MODO2 bcf PORTB,2 ; Modo Auto=OFF bcf PORTB,3 ;Bomba 1=ON bcf PORTB,1 ;Bomba 2=OFF goto MODO DOS btfsc PORTA,1 ;(NHA)MÁXIMO? goto MODO ;HA MODO1 bcf PORTB,2 ; Modo Auto=OFF bcf PORTB,3 ;Bomba 1=OFF bsf PORTB,1 ;Bomba 2=ON goto CERR end Prof. Luis Zurita 16 Microcontroladores I
  • 17. 4. Realice la automatización de la mezcladora de pinturas, mostrada en la figura siguiente, bajo la siguiente secuencia de funcionamiento:  El sistema de mezclado se inicia al pulsarse “MARCHA”, mediante el cual, se activa B1, por espacio de por espacio de 10 minutos. B2, MM, VD, MA deben estar apagados. Se enciende un led verde que indica que el sistema esta en marcha.  Transcurrido este tiempo, se enciende B2. B1, MM, VD, MA, deben estar apagados.  B2 se mantiene encendido hasta que el sensor “Nivel alto” se activa, mediante el cual se detiene B2, se activa MM. B1, VD, MA, se mantienen apagados.  MM se mantiene encendido por espacio de 2 minutos. B1, B2, VD, MA se mantienen apagados. Una vez transcurrido este tiempo, se detiene MM.  Se activa VD, hasta que se activa el sensor “Nivel bajo”, mediante el cual se cierra VD y se activa MA por espacio de 7,5 minutos, reiniciándose el proceso nuevamente.  El sistema cuenta con un pulsador de “PARE”, que al activarse en cualquier momento detiene todo el proceso, apagando B1, B2, VD, MM y MA, activando un led rojo y apagando al led verde, indicando que existe una parada del proceso.  Para reiniciar el proceso nuevamente en donde se quedó al momento de detenerlo, se debe pulsar “REINICIO”. Nota: Utilice el TMR0 para generar la rutina de 1 segundo. Prof. Luis Zurita 17 Microcontroladores I
  • 18. MEZCLADORA DE PINTURAS PINTURA 1 PINTURA 2 B1 B2 Nivel Alto TANQUE MEZCLADOR Nivel Bajo MM VD PINTURA PINTURA LISTA LISTA MA Prof. Luis Zurita 18 Microcontroladores I
  • 19. Nomenclaturas: B1: Bomba 1 B2: Bomba 2 MM: Motor de Mezclado VD: Válvula de Desagüe MA: Motor de Avance Paso 1. Enunciado y delimitación del Hardware: Tenemos el enunciado, sin embargo debemos delimitar el hardware. Debemos identificar cuales elementos son entrada y cuales salida: ENTRADA ¿Qué pin SALIDA ¿Qué pin Asignamos? Asignamos? Pulsador “MARCHA” RA0 Led Marcha RB1 Pulsador “REINICIO” RA1 Led PARE RB2 Sensor Nivel Alto RA2 Válvula RB3 Pintura 1 Sensor Nivel Bajo RA3 Válvula RB4 Pintura 2 Sensor “PARE” RB0 Motor RB5 Mezclado Válvula RB6 Desagüe Motor RB7 Avance Prof. Luis Zurita 19 Microcontroladores I
  • 20. El circuito quedaría de la siguiente manera: RB3 RB4 VDD PINTURA 1 PINTURA 2 VDD VDD CAJA DE CONTROL VSS VSS MARCHA NIVEL ALTO RA0 VDD RB1 TANQUE RA2 PARE RB0 RB2 MEZCLADOR VDD REINICIO RB5 RA1 NIVEL BAJO VSS RB6 RA3 MOTOR MZ VÁLVULA DESAGUE VSS VSS PINTURA PINTURA RB7 LISTA LISTA MOTOR AVANCE RB7 Prof. Luis Zurita 20 Microcontroladores I
  • 21. Paso 2. Diagramas de Flujo: INICIO 1 RSI Declarar Registros de Deshabilitar trabajo VD=ON Interrupciones Configurar Salvar entorno NO INTCON y OPTION_REG ¿NBAJO =0? Configurar SI NO Puerto A y B ¿INTF=1? SALIR A VD=OFF SI Limpiar Registros en general MA=ON B1=OFF y Puerto B B2=OFF MM=OFF RET7_5S VD=OFF MA=OFF NO LMARCHA=OFF ¿MARCHA MA=OFF LPARE=ON =0? SI 1 B1=ON ¿REINICIO NO B2=OFF =0? MM=OFF VD=OFF LEYENDA: SI MA=OFF VD=Válvula de Desagüe LMARCHA=ON B1= Válvula de Llenado Pintura 1 LPARE=OFF LPARE=OFF B2= Válvula de Llenado Pintura 2 LMARCHA= Led Marcha LPARE= Led Pare Restaurar entorno NALTO= Sensor Nivel Alto RET13SEG NBAJO=Sensor Nivel Bajo INTF=0 MM= Motor Mezclado MA= Motor de Avance SALIR B1=OFF MARCHA= Pulsador de inicio B2=ON Habilitar PARE= Pulsador de parada LMARCHA=ON Interrupciones REINICIO= Pulsador de reinicio del proceso LPARE=OFF Lógica de los sensores= 0=Activado retfie 1= Desactivado NO ¿NALTO =0? SI B2=OFF MM=ON RET1M MM=OFF 1 Prof. Luis Zurita 21 Microcontroladores I
  • 22. Paso 3. Lenguaje Ensamblador: list P=16F84A include p16F84A.inc W_TEMP equ 20H ;Declaramos los registros ESTADO_TEMP equ 21H ;A utilizar para salvar y restaurar PB_TEMP equ 22H ;El entorno REGAUX1 equ 23H ;Registros para generar retardos REGAUX2 equ 24H ;Por Software org 00H goto INICIO org 04H goto RSI ;*********************************** ;***Rutina de Servicio de Interrupción*** ;*********************************** RSI btfss INTCON,1 ;INTF=1? goto SALIR ;No. Salimos de la Interrupción movwf W_TEMP ;Salvamos el entorno swapf W_TEMP,1 movf STATUS,0 movwf ESTADO_TEMP movf PORTB,0 movwf PB_TEMP movlw b'00000100' ;Si. Todo OFF. LPARE= ON movwf PORTB ;(ROJO=ON) REINI btfsc PORTA,1 ;Se pulsó REINICIO? goto REINI ;Esperamos bcf INTCON,1 ;Borramos señalizador INTF movf PB_TEMP,0 ;Restauramos el entorno movwf PORTB movf ESTADO_TEMP,0 movwf STATUS swapf W_TEMP,0 SALIR bsf INTCON,7 ;Habilitamos las interrupciones retfie ;Salimos de la RSI Prof. Luis Zurita 22 Microcontroladores I
  • 23. ;********************** ;***Programa Principal *** ;********************** INICIO bsf STATUS,5 ;Configuramos los Puertos movlw 01FH movwf TRISA ;PA como entrada movlw b'00000001' movwf TRISB ;PB como entrada/salida movlw b'01000111' ;Prescaler= 256 movwf OPTION_REG ;Y configuramos el flanco de RBO/INT movlw b'10010000' ;GIE= 1 y INTE=1 movwf INTCON bcf STATUS,5 clrf PORTB ;Limpiamos el Puerto B EMPIEZA btfsc PORTA,0 ;Se pulsó “INICIO” goto EMPIEZA ;No. Esperamos REPITE bsf PORTB,3 ;B1= ON bsf PORTB,1 ;Led Marcha=ON (Verde= ON) bcf PORTB,2 ;Led PARE=OFF bcf PORTB,4 ;B1=OFF bcf PORTB,5 ;MM=OFF bcf PORTB,6 ;VD=OFF bcf PORTB,7 ;MA=OFF call RET13 ;Llamamos a Subrutina de 13 seg. bcf PORTB,3 ;B1= OFF bsf PORTB,4 ;B2= ON NAOK btfsc PORTA,2 ;Nivel Alto= 0? goto NAOK ;No. Esperamos bcf PORTB,4 ;B2= OFF bsf PORTB,5 ;MM= ON call RET1M ;Llamamos subrutina de 1 minuto. bcf PORTB,5 ;MM= OFF bsf PORTB,6 ;VD= ON NBOK btfsc PORTA,3 ;Nivel Bajo= 0? goto NBOK ;No. Esperamos bcf PORTB,6 ;VD= OFF bsf PORTB,7 ;MA= ON call RET7_5 ;Subrutina de 7,5 seg Prof. Luis Zurita 23 Microcontroladores I
  • 24. bcf PORTB,7 goto REPITE ;************************** ;***Rutina de 7,5 segundos*** ;************************** RET7_5 bcf INTCON,2 movlw d'114' movwf REGAUX1 RECAR75 bcf INTCON,2 clrf TMR0 ESPERA1 btfss INTCON,2 goto ESPERA1 decfsz REGAUX1,1 goto RECAR75 return ;************************** ;***Rutina de 13 segundos*** ;************************** RET13 bcf INTCON,2 movlw d'198' movwf REGAUX1 RECAR13 bcf INTCON,2 clrf TMR0 ESPERA2 btfss INTCON,2 goto ESPERA2 decfsz REGAUX1,1 goto RECAR13 return ;********************** ;***Rutina de 1 minuto*** ;********************** RET1M movlw d'30' ;Original= 60, se cambió para la simulación movwf REGAUX2 RECAR4 movlw d'15' movwf REGAUX1 RECAR5 bcf INTCON,2 clrf TMR0 ESPERA4 btfss INTCON,2 Prof. Luis Zurita 24 Microcontroladores I
  • 25. goto ESPERA4 decfsz REGAUX1,1 goto RECAR5 decfsz REGAUX2,1 goto RECAR4 return end ;Fin del programa Prof. Luis Zurita 25 Microcontroladores I
  • 26. 5. Se desea automatizar una lavadora “CHACACHACA” bajo dos modos de lavado (uno de Lavado Rápido de 30 minutos de duración y otro de Lavado Lento de 50 minutos de duración), el sistema constará de un pulsador de “INICIO” y un interruptor selector de modo de lavado. Automatice bajo las siguientes condiciones:  Se elige entre lavado rápido ó lento  Se presiona “INICIO” y realiza lo siguiente:  Se llena la CHACACHACA hasta el nivel de agua máximo; lava ó “bate” por la mitad del tiempo; se detiene; se vacía; se llena otra vez de agua; lava ó “bate” hasta que falten tres minutos; se detiene; se vacía; se llena otra vez de agua; lava ó “bate” por el resto del tiempo; se vacía nuevamente y emite una alarma sonora por espacio de 10 segundos; y se detiene a la espera de un nuevo proceso de lavado.  Si no hay agua en el depósito de agua, se detiene el lavado, se cierra la válvula de llenado y se emite una alarma sonora hasta que se solucione el problema agregando agua al depósito hasta el nivel mínimo de lavado.  ML: Motor de Lavadora. VD: Válvula de Desagüe. VLL: Válvula de Llenado.  Nmínimo, Nmáximo, Nmínimo de lavado, Nivel de alarma: Sensores de nivel. Prof. Luis Zurita 26 Microcontroladores I
  • 27. Nota: Utilice el TMR0 para generar la rutina de 1 segundo. Paso 1. Enunciado y delimitación del Hardware: Tenemos el enunciado, sin embargo debemos delimitar el hardware. Debemos identificar cuales elementos son entrada y cuales salida: ENTRADA ¿Qué pin SALIDA ¿Qué pin Asignamos? Asignamos? Interruptor “MODO” RA0 Motor de RB1 de Lavado Lavadora Pulsador “INICIO” RA1 Válvula de RB2 Desagüe Sensor Nivel Mínimo RA2 Válvula de RB3 Llenado Sensor Nivel Máximo RA3 Led RB4 “INICIO” Sensor Nivel Mínimo RA4 Led RB5 de lavado “Rápido” Sensor Nivel de RB0 Led “Lento” RB6 Alarma ALARMA RB7 Como podemos observar, de manera común, se asignan las entradas al puerto A y las salidas al puerto B. Prof. Luis Zurita 27 Microcontroladores I
  • 28. El circuito del hardware a simular quedaría de la siguiente manera: VDD RB7 RA4 VSS ALARMA NMÍNIMO DE LAVADO VDD DEPÓSITO VSS DE AGUA RB3 RB0 VSS VÁLVULA DE LLENADO NIVEL DE ALARMA PANEL DE CONTROL VDD VDD VSS ON NIVEL ALTO RA1 INICIO RB4 LAVADORA RA3 VDD RÁPIDO RB5 VDD LENTO LAVADO RA0 RB6 RB1 NIVEL BAJO RB2 RA2 MOTOR MZ VÁLVULA DESAGUE VSS VSS Prof. Luis Zurita 28 Microcontroladores I
  • 29. Paso 2. Diagramas de Flujo: INICIO LEYENDA: 1 VD=Válvula de Desagüe VLL= Válvula de Llenado Declarar Registros de NMAX= Sensor Nivel Máximo trabajo NMIN=Sensor Nivel Mínimo VLL=OFF NMINLAV=Sensor Nivel Mínimo de Lavado MotorL=OFF MotorL= Motor Lavadora VD=ON Configurar CONTA=Contador de minutos INTCON y OPTION_REG CONTAMEDIO=Contador precargado con la mitad del tiempo Configurar CONTALAV=Contador precargado con el NO Puerto A y B tiempo total de lavada ¿NMIN=0? Lógica de los sensores= A 0=Activado SI Limpiar Registros en general 1= Desactivado y Puerto B VD=OFF VLL=ON (Lento) Led Rápido=OFF NO Led Lento=ON ¿INTLAV? ContaMed=12 NO ContaLav=25 ¿NMAX=0? (Rápido) SI SI Led Rápido=ON Led Lento=OFF VLL=OFF ContaMed=22 MotorL=ON ContaLav=45 SI NO CONTALAV=CONTALAV-3 ¿INICIO? RET1MIN VD=OFF Led Inicio=ON CONTA=CONTA+1 VLL=ON NO ¿CONTA= NO CONTALAV? ¿NMAX=0? SI SI VLL=OFF VLL=OFF MotorL=ON MotorL=OFF VD=ON RET1MIN NO ¿NMIN=0? CONTA=CONTA+1 SI NO ¿CONTA= SI 1 2 CONTAMEDIO? Prof. Luis Zurita 29 Microcontroladores I
  • 30. 2 RSI SI Deshabilitar VD=OFF Interrupciones VLL=ON Salvar entorno NO ¿NMAX=0? NO ¿INTF=1? SALIR SI SI VLL=OFF ALARMA=ON MotorL=ON MotorL= OFF VLL= OFF VD=OFF RET1MIN ¿Llegó a NO RET1MIN NMINLAV? SI RET1MIN ALARMA=OFF SALIR VLL=OFF Restaurar entorno MotorL=OFF VD=ON INTF=0 Habilitar NO Interrupciones ¿NMIN=0? SI retfie RET10SEG Vamos al Inicio del programa para una nueva A lavada Prof. Luis Zurita 30 Microcontroladores I
  • 31. Paso 3. Lenguaje Ensamblador: LIST P=16F84A INCLUDE P16F84A.INC ;Declaraciones de registros: RET4 EQU 2DH ;Registros para generar RET5 EQU 2EH ;Rutinas de retardo RET6 EQU 2FH W_TEMP EQU 30H ;Registros para salvar el STATUS_TEMP EQU 31H ;Entorno durante la interrupción PA_TEMP EQU 32H PB_TEMP EQU 33H PC_TEMP EQU 34H CONTA EQU 35H ;Registro contador de comparación CONTAMED EQU 20H ;Registro que se cargará con el tiempo ;medio de la duración del lavado CONTALAV EQU 21H ;Registro que posee el tiempo total de ;lavado CONTASEG EQU 22H ;Registro contador de segundos ORG 00H GOTO INICIO ORG 04H GOTO RUTIN ;*********************************** ;***Rutina de Servicio de Interrupción*** ;*********************************** RUTIN BCF INTCON,7 ;Deshabilitamos las interrupciones BTFSS INTCON,5 GOTO SALIR MOVWF W_TEMP ;Salvamos el entorno durante la SWAPF W_TEMP,1 ;Interrupción al modificarse el Puerto B MOVF STATUS,0 ;dentro de la RSI MOVWF STATUS_TEMP MOVF PORTA,0 MOVWF PA_TEMP MOVF PORTB,0 MOVWF PB_TEMP ESPERA BSF PORTB,7 ;SSONORA=ON Prof. Luis Zurita 31 Microcontroladores I
  • 32. BCF PORTB,1 ;ML=OFF BCF PORTB,2 ;VD=OFF BCF PORTB,3 ;VLL=OFF BTFSC PORTA,4 ;NMINLAV? GOTO ESPERA BCF PORTB,7 ;SSONORA=OFF POP MOVF PB_TEMP,0 MOVWF PORTB MOVF PA_TEMP,0 MOVWF PORTA MOVF STATUS_TEMP,0 MOVWF STATUS SWAPF W_TEMP,1 MOVF W_TEMP,0 BCF INTCON,1 ;INTF=0 SALIR BSF INTCON,7 ;GIE=1 RETFIE ;********************* ;***Programa Principal*** ;********************* INICIO BSF STATUS,5 ;Configuramos los Puertos A y B MOVLW 1FH MOVWF TRISA MOVLW B'00000001' ;RB0 como entrada MOVWF TRISB BCF OPTION_REG,6 ;Configuramos el flanco de RB0/INT MOVLW B'10010000' ;Activamos GIE y INTE MOVWF INTCON BCF STATUS,5 NUEVOLAV CLRF CONTASEG ;Inicializamos los registros CLRF CONTA ;Y el Puerto B CLRF PORTB MODO BTFSS PORTA,0 ;¿Qué MODO es? GOTO MODOLENTO ;Ir al modo lento BSF PORTB,5 ;Modo RÁPIDO= ON BCF PORTB,6 ;LENTO OFF Prof. Luis Zurita 32 Microcontroladores I
  • 33. MOVLW D'12' ;Precargamos los valores MOVWF CONTAMED ;Para el lavado rápido MOVLW D'25' MOVWF CONTALAV GOTO MARCHA ;Va a preguntar si se pulsó INICIO MODOLENTO BCF PORTB,5 ;Activamos el MODO lento BSF PORTB,6 MOVLW D'22' ;Y precargamos los valores MOVWF CONTAMED ;de este modo MOVLW D'45' MOVWF CONTALAV GOTO MARCHA MARCHA BTFSC PORTA,1 ;¿INICIO? GOTO MODO ;No, vamos a explorar el MODO ESPLL1 BSF PORTB,4 ;LEDINI=ON BSF PORTB,3 ;VLL ON BTFSC PORTA,3 ;NMAX? GOTO ESPLL1 BCF PORTB,3 ;VLL OFF BSF PORTB,1 ;ML ON SUBEMIN1 CALL RET1s ;PARA SIMULACION, ES UN MINUTO INCF CONTA,1 MOVF CONTAMED,0 SUBWF CONTA,0 ;CONTA=CONTAMED? BTFSS STATUS,2 ;Z=1? GOTO SUBEMIN1 ESPVAC BCF PORTB,3 ;VLL OFF BCF PORTB,1 ;ML OFF BSF PORTB,2 ;VD ON BTFSC PORTA,2 ;NMIN? GOTO ESPVAC ESPLL2 BCF PORTB,2 ;VD OFF BSF PORTB,3 ;VLL ON BTFSC PORTA,3 ;NMAX=0? GOTO ESPLL2 BCF PORTB,3 ;VLL OFF BSF PORTB,1 ;ML ON Prof. Luis Zurita 33 Microcontroladores I
  • 34. DECF CONTALAV,1 DECF CONTALAV,1 DECF CONTALAV,1 ;A FALTA DE 3 MINUTOS SUBEMIN2 CALL RET1s ;PARA SIMULACION, ES UN MINUTO INCF CONTA,1 MOVF CONTALAV,0 SUBWF CONTA,0 ;CONTA=CONTALAV? BTFSS STATUS,2 ;Z=1? GOTO SUBEMIN2 ESPVAC2 BCF PORTB,3 ;VLL OFF BCF PORTB,1 ;ML OFF BSF PORTB,2 ;VD ON BTFSC PORTA,2 ;NMIN? GOTO ESPVAC2 ESPLL3 BCF PORTB,2 ;VD OFF BSF PORTB,3 ;VLL ON BTFSC PORTA,3 ;NMAX? GOTO ESPLL3 BCF PORTB,3 ;VLL OFF BSF PORTB,1 ;ML ON CALL RET1s CALL RET1s ;ESPERA 3 MINUTOS FINALES CALL RET1s ;(SE SIMULA CON 1 SEG) ESPVAC3 BCF PORTB,3 ;VLL OFF BCF PORTB,1 ;ML OFF BSF PORTB,2 ;VD ON BTFSC PORTA,2 ;NMIN? GOTO ESPVAC3 BCF PORTB,2 ;VD OFF PITAZO BSF PORTB,7 ;ALARMA SONORA ON CALL RET1s INCF CONTASEG,1 MOVLW D'10' SUBWF CONTASEG,0 BTFSS STATUS,2 ;10 SEG? GOTO PITAZO BCF PORTB,7 ;ALARMA SONORA OFF GOTO NUEVOLAV Prof. Luis Zurita 34 Microcontroladores I
  • 35. ;*************************************** ;***Rutina de 1 segundo. Generada por PDEL*** ;*************************************** RET1s movlw .14 ; 1 set numero de repeticion (C) movwf RET4 ; 1| PLoop0 movlw .72 ; 1 set numero de repeticion (B) movwf RET5 ; 1| PLoop1 movlw .247 ; 1 set numero de repeticion (A) movwf RET6 ; 1| PLoop2 clrwdt ; 1 clear watchdog decfsz RET6, 1 ; 1 + (1) es el tiempo 0 ? (A) goto PLoop2 ; 2 no, loop decfsz RET5, 1 ; 1 + (1) es el tiempo 0 ? (B) goto PLoop1 ; 2 no, loop decfsz RET4, 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. END Prof. Luis Zurita 35 Microcontroladores I