Autor Tema: contador configurable con alarma  (Leído 4143 veces)

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

Desconectado ciztema

  • PIC10
  • *
  • Mensajes: 13
contador configurable con alarma
« en: 24 de Junio de 2005, 04:57:00 »
Hola a todos nuevamente y en especial a este tipo tan atento antoniof , mi duda es la siguiente , tengo armado ya n contador con pic 16f84a que funciona bien , pero el tema seria si puedo modificar este o bien armar otro en el cual pueda programar un numero "X" y cuando el contador llegue a "X" suene una me de un aviso (alarma) seria para hacer una alarma de linea de empaque , el uso especifico seria , salen unidades de una maquina , las cuales el contador "cuenta" , los paquetes se deben armar de 1000 unidades cada uno , pero la idea es que se pueda programar por ejemplo que cuando el contador llegue a 980 , de un aviso de que esta proximo y el colmo seria que cuando llegue a 1000 se pueda resetear y volver de cero .
el contador es el de la pagina de pablin .
el circuito el el siguiente
http://www.pablin.com.ar/electron/circuito/mc/contad2

este es el asembler

;Contador de 4 digitos con displays de 7 segmentos
;Se utilizan los ocho pines del puerto B para manejar el display
;y los cinco del puerto a para controlar el sistema

indir   equ   0x00      ;Registro de direccionamiento indirecto
estado   equ   0x03      ;Registro de estados
puntero   equ   0x04      ;Puntero de direccionamiento indirecto
ptoa   equ   0x05      ;Puerto A
ptob   equ   0x06      ;Puerto B
loop1   equ   0x10      ;Utilizados para las demoras
loop2   equ   0x11
loop3   equ   0x12
disp   equ   0x13      ;Indicador de display activo
dig1   equ   0x14      ;Acumuladores de conteo
dig2   equ   0x15
dig3   equ   0x16
dig4   equ   0x17

#define   Carry   estado, 0   ;Define el flag Carry
#define   Zero   estado, 2   ;Define el flag Zero
#define RP0   estado, 5   ;Define el bit selector de pagina
#define   Jump1   ptoa, 0      ;Jumper 1 para seleccion de tiempo del anti rebote
#define   Jump2   ptoa, 1      ;Jumper 2 para seleccion de tiempo del anti rebote
#define   SelAR   ptoa, 2      ;Entrada de seleccion de anti rebote
#define   EntA   ptoa, 3      ;Entrada de disparo por flanco ascendente
#define EntD   ptoa, 4      ;Entrada de disparo por flanco descendente

   bsf   RP0      ;Configura los puertos
   movlw   0x00      ;Puerto B completo como salidas
   movwf   ptob
   movlw   0x1f      ;Puerto A completo como entradas
   movwf   ptoa
   bcf   RP0

   clrf   dig1      ;Inicializa los acumuladores
   clrf   dig2
   clrf   dig3
   clrf   dig4
   clrf   ptob      ;Apaga los cuatro digitos

ciclo   btfss   EntD      ;Bajo la linea de disparo por flanco descendente ?
   call   increm      ;Incrementa en uno la cuenta
   btfsc   EntA      ;Subio la linea de disparo por flanco ascendente ?
   call   increm      ;Incrementa en uno la cuenta
   call   display      ;Muestra la cuenta en los displays
   goto   ciclo

increm   incf   dig1, 1      ;Incrementa la cuenta de unidades
   movf   dig1, 0      ;Carga en W la cuenta de unidades
   sublw   d"10"      ;Le resta 10 para ver si tiene que acarrear
   btfsc   Zero      ;Si el indicador de cero esta bajo no acarrea
   call   mas10      ;Ejecuta la rutina de acarreo
   btfss   SelAR      ;Esta en alto el selector de anti rebote ?
   call   ART      ;Ejecuta el anti rebote por tiempo
   btfsc   SelAR      ;Esta en bajo el selector de anti rebote ?
   call   ARLR      ;Ejecuta el anti rebote por linea en reposo
   return

ART   movlw   d"25"      ;W arranca con 25
   btfss   Jump1      ;Debe agregar 25 a W ?
   addlw   d"25"      ;Le agrega 25 a W si corresponde
   btfss   Jump2      ;Debe agregar 100 a W ?
   addlw   d"100"      ;Le agrega 100 a W si corresponde
   movwf   loop3
   call   display
   decfsz   loop3, 1
   goto   $ - 2
   return

ARLR   call   display      ;Muestra la cuenta en los displays
   btfss   EntD      ;Espera que vuelva al estado de reposo la linea
   goto   $ - 2
   call   display      ;Muestra la cuenta en los displays
   btfsc   EntA      ;Espera que vuelva al estado de reposo la linea
   goto   $ - 2
   return

mas10   clrf   dig1      ;Pone a cero el contador de unidades
   incf   dig2, 1      ;Incrementa el contador de decenas
   movf   dig2, 0      ;Carga en W la cuenta de decenas
   sublw   d"10"      ;Le resta 10 para ver si tiene que acarrear
   btfsc   Zero      ;Si el indicador de cero esta bajo no acarrea
   call   mas100      ;Ejecuta la rutina de acarreo
   return

mas100   clrf   dig2      ;Pone a cero el contador de decenas
   incf   dig3, 1      ;Incrementa el contador de centenas
   movf   dig3, 0      ;Carga en W la cuenta de centenas
   sublw   d"10"      ;Le resta 10 para ver si tiene que acarrear
   btfsc   Zero      ;Si el indicador de cero esta bajo no acarrea
   call   mas1000      ;Ejecuta la rutina de acarreo
   return

mas1000   clrf   dig3      ;Pone a cero el contador de centenas
   incf   dig4, 1      ;Incrementa el contador de millares
   movf   dig4, 0      ;Carga en W la cuenta de millares
   sublw   d"10"      ;Le resta 10 para ver si tiene que acarrear
   btfsc   Zero      ;Si el indicador de cero esta bajo no acarrea
   clrf   dig4      ;Pone en cero el contador de millares
   return

display   movlw   0x01      ;iniciar un 1 en el registro de rotacion
   movwf   disp
   movlw   dig1      ;Apunta al primer acumulador (unidades)
   movwf   puntero
otro   movf   indir, 0   ;Carga en W el contenido de registro apuntado
   movwf   ptob      ;Carga eb el puerto B el contenido de W
   btfsc   disp, 0      ;Debe encender el display de x1 ?
   bsf   ptob, 4
   btfsc   disp, 1      ;Debe encender el display de x10 ?
   bsf   ptob, 5
   btfsc   disp, 2      ;Debe encender el display de x100 ?
   bsf   ptob, 6
   btfsc   disp, 3      ;Debe encender el display de x1000 ?
   bsf   ptob, 7
   call   delay      ;Espera a que los datos se fijen en los leds
   clrf   ptob      ;Apaga el display
   btfsc   disp, 3      ;Llego al ultimo display ?
   return         ;Vuelve al programa principal
   bcf   Carry      ;Limpia el carry
   rlf   disp, 1      ;Rota a la izquiera el indicador de display
   incf   puntero, 1   ;Incrementa en 1 el puntero
   goto   otro

delay   movlw   d"3"      ;Rutina de demora de aprox. 3ms
   movwf   loop1
top2   movlw   d"110"
   movwf   loop2
top   nop
   nop
   nop
   nop
   nop
   nop
   decfsz   loop2, 1
   goto   top
   decfsz   loop1, 1
   goto   top2
   return

   end

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: contador configurable con alarma
« Respuesta #1 en: 24 de Junio de 2005, 18:11:00 »
Buenas Ciztema.

Lo que comentas es fácil de realizar. Yo añadiría una subrrutina más en el bucle "ciclo" que comprobara los 4 registros dispX con los cuatro números 0980 para detectar la alarma. El problema que encuentro es que no tienes pines de E/S para activar dicha alarma. Una solución es utilizar alguna de las entradas del antirrebote configurable como salida para la alarma, es decir, perder cierta capacidad de configuración por ejemplo anular el Jump2 y utilizar este pin como salida hacia el Buzzer o el LED que quieras utilizar como alarma.

En cuanto al reseteo a 1000, lo puedes hacer en la misma rutina de comprobación de alarma. También comparando con un número (1000) puedes borrar los 4 dígitos y desactivar la alarma.

Desconectado ciztema

  • PIC10
  • *
  • Mensajes: 13
RE: contador configurable con alarma
« Respuesta #2 en: 25 de Junio de 2005, 01:26:00 »
Hola antoniof , ante nada gracias de nuevo , usted con la gentileza que lo caracteriza , bueno , ya voy a entender algun dia jejej , voy aprendiendo , lento pero seguro , le cuento , este contador tiene algunas cositas que no utilizo , por ejemplo el pulso descendente, y tambien podria eliminar alguno de los antirebote , con que cuente un solo digito cuando suma por mas que quede apretado me alcanza, y por otra parte , lo ideal seria (no se como expresarlo, pero voy a tratar ) seria que pueda programar un numero antes de iniciar la cuenta y que al llegar a dicho numero me de una alarma , eso seria lo optimo , o sea , que pueda programarle , 10 o 9900 y que active cuando llegue a ese numero , (estimo que por comparacion o algo similar) y que estos parametros queden definidos por lo menos hasta terminar la jornada , mi idea seria que por ejemplo poder utilizar dos swich para programar decenas y otro centenas , ya le digo , las opciones de antirrebote y cuenta desendente no las utilizo asi que podria modificar esto .
si cree que esto es posible y cuanta con tiempo le agradeceria (espero no agararle el brazo con esto ) si pudiera pasarme las modificaciones que crea necesarias en el asembler y que pines modicar para llevarlo a cabo , bueno creo que le estoy dando un trabajo barbaro y desde ya infinitas gracias , Jose Luis ciztema , quien le manda un fuerte abrazo desde buenos aires , argetina
algo que me olvidaba es que no podria programarlo para que en 1000 de la vuelta , ya que a veces se usan otras cantidades , pero ese no seria problema , el operador podria resetear al llegar a las unidades necesarias.

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: contador configurable con alarma
« Respuesta #3 en: 25 de Junio de 2005, 07:01:00 »
Bueno ciztema en primer lugar decirte que no hace falta que me trates de usted, ya que tengo 10 años menos que tu y estamos entre amigotes.Sonrisa GiganteSonrisa GiganteSonrisa GiganteSonrisa Gigante

En cuanto a las modificaciones, he tomado como salida de la alarma el puerto A,4 y como entrada para seleccionar el número con el que se compara la alarma el JUMP2. Como sólo se tiene un switch para seleccionar el dispara de la alarma, lo más sencillo es prefijar un par de números a los cuales salte la alarma. Aqui tienes el programa modificado:

Codigo:
;Contador de 4 digitos con displays de 7 segmentos
;Se utilizan los ocho pines del puerto B para manejar el display
;y los cinco del puerto a para controlar el sistema

indir   equ   0x00      ;Registro de direccionamiento indirecto
estado   equ   0x03      ;Registro de estados
puntero   equ   0x04      ;Puntero de direccionamiento indirecto
ptoa   equ   0x05      ;Puerto A
ptob   equ   0x06      ;Puerto B
loop1   equ   0x10      ;Utilizados para las demoras
loop2   equ   0x11
loop3   equ   0x12
disp   equ   0x13      ;Indicador de display activo
dig1   equ   0x14      ;Acumuladores de conteo
dig2   equ   0x15
dig3   equ   0x16
dig4   equ   0x17

#define   Carry   estado, 0   ;Define el flag Carry
#define   Zero   estado, 2   ;Define el flag Zero
#define RP0   estado, 5   ;Define el bit selector de pagina
#define   Jump1   ptoa, 0      ;Jumper 1 para seleccion de tiempo del anti rebote
#define   Al_sel  ptoa, 1      ;Dip_switch para seleccionar entre los dos número preconfigurados para la alarma
#define   SelAR   ptoa, 2      ;Entrada de seleccion de anti rebote
#define   EntA   ptoa, 3      ;Entrada de disparo por flanco ascendente
#define Al_out  ptoa, 4      ;Salida de disparo de la alarma: 0 --> Alarma apagada; 1 --> Alarma encendida

#define alarma1_1 0
#define alarma2_1 8
#define alarma3_1 9
#define alarma4_1 0      ;Primer número de salto de la alarma N1 = 980

#define alarma1_2 0
#define alarma2_2 0
#define alarma3_2 9
#define alarma4_2 9      ;Segundo número de salto de la alarma N2 = 9900

   bsf   RP0      ;Configura los puertos
   movlw   0x00      ;Puerto B completo como salidas
   movwf   ptob
   movlw   0x0f      ;Puerto A completo como entradas excepto el bit 4 como salida
   movwf   ptoa
   bcf   RP0

   clrf   dig1      ;Inicializa los acumuladores
   clrf   dig2
   clrf   dig3
   clrf   dig4
   clrf   ptob      ;Apaga los cuatro digitos
   bcf   Al_out      ;Apaga la alarma

ciclo   btfsc   EntA      ;Subio la linea de disparo por flanco ascendente ?
   call   increm      ;Incrementa en uno la cuenta
   call   display      ;Muestra la cuenta en los displays
   call   alarma      ;Comprueba si debe activar la alarma
   goto   ciclo

increm   incf   dig1, 1      ;Incrementa la cuenta de unidades
   movf   dig1, 0      ;Carga en W la cuenta de unidades
   sublw   d"10"      ;Le resta 10 para ver si tiene que acarrear
   btfsc   Zero      ;Si el indicador de cero esta bajo no acarrea
   call   mas10      ;Ejecuta la rutina de acarreo
   btfss   SelAR      ;Esta en alto el selector de anti rebote ?
   call   ART      ;Ejecuta el anti rebote por tiempo
   btfsc   SelAR      ;Esta en bajo el selector de anti rebote ?
   call   ARLR      ;Ejecuta el anti rebote por linea en reposo
   return

ART   movlw   d"25"      ;W arranca con 25
   btfss   Jump1      ;Debe agregar 25 a W ?
   addlw   d"25"      ;Le agrega 25 a W si corresponde
   movwf   loop3
   call   display
   decfsz   loop3, 1
   goto   $ - 2
   return

ARLR   call   display      ;Muestra la cuenta en los displays
   btfss   EntD      ;Espera que vuelva al estado de reposo la linea
   goto   $ - 2
   call   display      ;Muestra la cuenta en los displays
   btfsc   EntA      ;Espera que vuelva al estado de reposo la linea
   goto   $ - 2
   return

mas10   clrf   dig1      ;Pone a cero el contador de unidades
   incf   dig2, 1      ;Incrementa el contador de decenas
   movf   dig2, 0      ;Carga en W la cuenta de decenas
   sublw   d"10"      ;Le resta 10 para ver si tiene que acarrear
   btfsc   Zero      ;Si el indicador de cero esta bajo no acarrea
   call   mas100      ;Ejecuta la rutina de acarreo
   return

mas100   clrf   dig2      ;Pone a cero el contador de decenas
   incf   dig3, 1      ;Incrementa el contador de centenas
   movf   dig3, 0      ;Carga en W la cuenta de centenas
   sublw   d"10"      ;Le resta 10 para ver si tiene que acarrear
   btfsc   Zero      ;Si el indicador de cero esta bajo no acarrea
   call   mas1000      ;Ejecuta la rutina de acarreo
   return

mas1000   clrf   dig3      ;Pone a cero el contador de centenas
   incf   dig4, 1      ;Incrementa el contador de millares
   movf   dig4, 0      ;Carga en W la cuenta de millares
   sublw   d"10"      ;Le resta 10 para ver si tiene que acarrear
   btfsc   Zero      ;Si el indicador de cero esta bajo no acarrea
   clrf   dig4      ;Pone en cero el contador de millares
   return

display   movlw   0x01      ;iniciar un 1 en el registro de rotacion
   movwf   disp
   movlw   dig1      ;Apunta al primer acumulador (unidades)
   movwf   puntero
otro   movf   indir, 0   ;Carga en W el contenido de registro apuntado
   movwf   ptob      ;Carga eb el puerto B el contenido de W
   btfsc   disp, 0      ;Debe encender el display de x1 ?
   bsf   ptob, 4
   btfsc   disp, 1      ;Debe encender el display de x10 ?
   bsf   ptob, 5
   btfsc   disp, 2      ;Debe encender el display de x100 ?
   bsf   ptob, 6
   btfsc   disp, 3      ;Debe encender el display de x1000 ?
   bsf   ptob, 7
   call   delay      ;Espera a que los datos se fijen en los leds
   clrf   ptob      ;Apaga el display
   btfsc   disp, 3      ;Llego al ultimo display ?
   return         ;Vuelve al programa principal
   bcf   Carry      ;Limpia el carry
   rlf   disp, 1      ;Rota a la izquiera el indicador de display
   incf   puntero, 1   ;Incrementa en 1 el puntero
   goto   otro

delay   movlw   d"3"      ;Rutina de demora de aprox. 3ms
   movwf   loop1
top2   movlw   d"110"
   movwf   loop2
top   nop
   nop
   nop
   nop
   nop
   nop
   decfsz   loop2, 1
   goto   top
   decfsz   loop1, 1
   goto   top2
   return

alarma   btfsc   Al_sel
   goto   alarma2      ;Si el dip_switch está a uno salta a comprobar el segundo número
   movf   dig4,w      ;Comprueba las cuatro cifras del primer número
   sublw   alarma1_4
   btfss   status,2
   return
   movf   dig3,w
   sublw   alarma1_3
   btfss   status,2
   return
   movf   dig2,w
   sublw   alarma1_2
   btfss   status,2
   return
   movf   dig1,w
   sublw   alarma1_1
   btfss   status,2
   return
   bsf   Al_out      ;Activa la alarma si todas las cifras han coincidido
   return
alarma2   movf   dig4,w      ;Comprueba las cuatro cifras del segundo número
   sublw   alarma2_4
   btfss   status,2
   return
   movf   dig3,w
   sublw   alarma2_3
   btfss   status,2
   return
   movf   dig2,w
   sublw   alarma2_2
   btfss   status,2
   return
   movf   dig1,w
   sublw   alarma2_1
   btfss   status,2
   return
   bsf   Al_out      ;Activa la alarma si todas las cifras han coincidido
   return

   end


Si tienes alguna duda no dudes en preguntar

Desconectado ciztema

  • PIC10
  • *
  • Mensajes: 13
RE: contador configurable con alarma
« Respuesta #4 en: 26 de Junio de 2005, 01:28:00 »
buenas antoniof , "como te va esntonces". te explico lo que paso
me fui al mplab y me puse a escribir el programa que me mandaste , tube que modoficar algunas cositas , ejemplo, le tube que definir "status" y lo hice asi

status  equ   0x18

despues tube que invertir los

#define alarma1_1 0
#define alarma2_1 8
#define alarma3_1 9
#define alarma4_1 0

por

#define alarma1_1 0
#define alarma1_2 8
#define alarma1_3 9
#define alarma1_4 0

y lo mismo en
alarma2

y asi me lo tomo , pero no logro tener resultados , el contador como contador anda bien , pero hice la siguiente prueba ....

puse un led entre pata 3 del pic y vcc , el led parpadea cuando  le doy reset , pero despues nunca mas prende , ni en 980 y ni en ningun lado , no se si yo estoy hac8iendo algo mal (que es lo mas problable ) o tal ves falte algun datito extra ....
bueno antoniof , te doy las gracias y te mando un abrazo ...jose luis
una preguntita mas al margen , hay manera de poder programar el pic sin quitarlo del circuito ...?

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: contador configurable con alarma
« Respuesta #5 en: 26 de Junio de 2005, 13:34:00 »
Lo de los defines se me fue la nomenclatura.

Bueno el registro "status" es el registro "estado" y lo debes definir como 0x03. Se me olvidó ese comentario. No importa que estén ambos registros definidos en la misma dirección, el MPASM sustituye ambos por el valor 0x03. Con esto te funcionará seguro.

Lo de programar el PIC en el circuito se conoce como ISP (In-Circuit Serial Programming). Mira en el datasheet del micro y verás que debes poner unas resistencias entre el portb,7 y el portb,6 y el resto del circuito, en este caso, el integrado 4511. Después saca unos jumpers o algo con lo que pinchar un cable y llevarlo a un programador convencional. Los pines que debes sacar son el MCLR, PORTB,7 PORTB,6 y GND. Con estos 4 pines y las dos resistencias lo puedes programar en el propio circuito.

Desconectado ciztema

  • PIC10
  • *
  • Mensajes: 13
RE: contador configurable con alarma
« Respuesta #6 en: 26 de Junio de 2005, 18:13:00 »
voy a ponerlo en practica ahora y te comento los resultados , esta de mas , pero gracias ...

Desconectado ciztema

  • PIC10
  • *
  • Mensajes: 13
RE: contador configurable con alarma
« Respuesta #7 en: 27 de Junio de 2005, 00:09:00 »
Bueno , le modifique el asm y lo cargue , ahora funciona "PERFECTAMENTE " Y y con estas experiencias uno va asimilando cada ves mas sobre el lenguaje , hace un par de meses leer el asembler me parecia chino , pero ahora voy entendiendo "algo" y cada ves me gusta mas .todavia no experimente lo del isp , porque ya funciono , el tema era que ayer lo saque y puse como 50 veces y pobre , las patitas pedian por favor jeje
una preguntita mas antoniof , por ejemplo para tener algo mas elaborado con este tema de contador con alarma , para programarle cualquier numero , tal ves se deba usar otro micro , pero alguna idea de como poder hacerlo ? o alguna idea de que micro se podria utilizar
la idea seria
como programar la hora de una alarma de un reloj despertador , un boton que muestra el numero a programar y algunos switch para configurar el numero y luego ya queda .....se entiende? (alarma configurable) , gracias anto y de nuevo un fuerte abrazo Giño