Autor Tema: temporizadores en 16f84a  (Leído 1779 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado flara

  • PIC10
  • *
  • Mensajes: 9
temporizadores en 16f84a
« 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.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: temporizadores en 16f84a
« Respuesta #1 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
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: temporizadores en 16f84a
« Respuesta #2 en: 20 de Diciembre de 2007, 21:52:39 »
comparto la misma opinion que Sander, para poder orientarte  :D

Desconectado flara

  • PIC10
  • *
  • Mensajes: 9
Re: temporizadores en 16f84a
« Respuesta #3 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

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: temporizadores en 16f84a
« Respuesta #4 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.
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube