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/contad2este 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