TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: flara en 20 de Diciembre de 2007, 21:17:06

Título: temporizadores en 16f84a
Publicado por: flara en 20 de Diciembre de 2007, 21:17:06
Buen dia


Señores estoy realizando un proyecto que consiste en un pulsador conectado a RA0 y todas los otros pines de los puertos estan programados como salidas, lo que hace el sistema es que cada vez que oprimo el pulsador se debe prender una salida por 1 segundo, lo anterior lo esta haciendo perfecto, ahora necesito es que si oprimo nuevamente el pulsador durante el tiempo que esta encendida una salida, prenda la siguiente durante 1 segundo y si oprimo otra dentro de este tiempo se prenda otra salida.

Espero haberme hecho entender.
Título: Re: temporizadores en 16f84a
Publicado por: sander en 20 de Diciembre de 2007, 21:21:48
Podrias comenzar posteando el codigo que usaste para lo primero , y ahi se podria ver que modificaciones hacerle

Saludos
Título: Re: temporizadores en 16f84a
Publicado por: poseidon20 en 20 de Diciembre de 2007, 21:52:39
comparto la misma opinion que Sander, para poder orientarte  :D
Título: Re: temporizadores en 16f84a
Publicado por: flara en 21 de Diciembre de 2007, 00:27:51
Este es el codigo del programa

#include "P16F84a.INC"
LIST P = 16F84a
__config  _XT_OSC & _WDT_OFF & _PWRTE_ON
RADIX HEX
TMR0_OPT   EQU      0X01
CONTA0      EQU      0x20
SALIDA1      EQU      0X21
SALIDA2      EQU      0X22
NSALIDAS   EQU      0X32      ;numero de salidas
TIEMPO      EQU      0X35      ;numero de segundos
TEMPO1      EQU      0X0E
            ORG     0
          goto   inicio     
inicio      bcf      STATUS,RP1
         bsf      STATUS,RP0      ;seleccion banco 1
         clrf   TRISB         ;definir puerta B como salidas
         movlw   b'00000001'
         movwf   TRISA
         movlw   b'00000111'      ;mover siete a registros TMR0 y OPTION   
         movwf   TMR0_OPT      ;para indicar predivisor 256
         bcf      STATUS,RP0
         movlw   0X03         ;NUMERO DE SALIDA
         movwf   NSALIDAS
         movlw   b'11111111'
         movwf   PORTA
         movwf   PORTB   
         call   DELAYS
         clrf   PORTA
         clrf   PORTB
PULSADOR   btfss   PORTA,0         ;pulsador on
         goto   $-1            ;no, volver a verificar
         movlw   0x05         ;si, carga cinco en W retardo de 60us
         movwf   CONTA0         ;carga cinco en CONTA0
         decfsz   CONTA0,1      ;decrementa hasta cero
         goto   $-1            ;no, vuelve a decrementar CONTA0
         btfsc   SALIDA1,0      ;si, salida 1 ya se activo?
         goto   OUT2         ;si, ver salida 2
         bsf      PORTB,0         ;no, salida 1 en ON
         bsf      SALIDA1,0      ;flag de salida 1 a ON
         call   DELAYS         ;llamar tiempo
         bcf      PORTB,0         ;apargar salida 1
         movlw   0X01
         subwf   NSALIDAS,0         ;resto  Nº salida programada - 1 = W
         btfsc   STATUS,Z      ;Nº de salida es 1 W=0
         clrf   SALIDA1
         goto   PULSADOR
OUT2      btfsc   SALIDA1,1
         goto   OUT3
         bsf      PORTB,1
         bsf      SALIDA1,1
         call   DELAYS
         bcf      PORTB,1
         movlw   0X02
         subwf   NSALIDAS,0         ;resto 1 - Nº salida programada = W
         btfsc   STATUS,Z      ;Nº de salida es 1 W=0
         clrf   SALIDA1
         goto   PULSADOR
OUT3      btfsc   SALIDA1,2
         goto   OUT4
         bsf      PORTB,2
         bsf      SALIDA1,2
         call   DELAYS
         bcf      PORTB,2
         movlw   0X03
         subwf   NSALIDAS,0         ;resto 1 - Nº salida programada = W
         btfsc   STATUS,Z      ;Nº de salida es 1 W=0
         clrf   SALIDA1
         goto   PULSADOR
OUT4      btfss   SALIDA1,3
         goto   PULSADOR
         bsf      PORTB,3
         bsf      SALIDA1,3
         call   DELAYS
         bcf      PORTB,3
         movlw   0X04
         subwf   NSALIDAS,0         ;resto 1 - Nº salida programada = W
         btfsc   STATUS,Z      ;Nº de salida es 1 W=0
         clrf   SALIDA1
         goto   PULSADOR
DELAYS      movlw   0X01         ;NUMERO DE SEGUNDOS
         movwf   TIEMPO
DELAY      btfsc   PORTA,0         ;pulsador on
         movlw   0X64
         movwf   TEMPO1
VOLVER      bcf      INTCON,2
         movlw   0XD9
         movwf   TMR0_OPT
         btfss   INTCON,2
         goto   $-1
         decfsz   TEMPO1,F
         goto   VOLVER
         decfsz   TIEMPO,1
         goto   DELAY
         return               ;volver al programa segun la pila
         end
Título: Re: temporizadores en 16f84a
Publicado por: sander en 21 de Diciembre de 2007, 10:54:04
Viendo tu codigo creo que es muy "lineal" , por decirlo de alguna forma, me explico, cuando prendes una de las salidas vas una rutina de retardo y el microcontrolador se queda ahi esperando que pase un segundo sin hacer nada, y luego vuelves para apagar la salida y volver a revisar el teclado.

Para el problema que planteas debes seguir revisando el teclado mientras te encuentras realizando el retardo , para esto podrias convertir las rutinas que usas para prender las salidas en subrutinas , y asi llamarlas mediante call de acuerdo al estado del pulsador y las otras salidas, todo esto mientras estas en la rutina de retardo.

Otra opcion seria usar la interrupcion del TMR0 para controlar el retardo de 1 seg, pero en la rutina de interrupcion ir controlando el inicio y el fin del retardo para cada salida.

En realidad no es un problema tan simple como pareceria a primera vista, pero tampoco es irresoluble.

Saludos.