TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: mibspy en 11 de Noviembre de 2004, 13:54:00
-
hola, ¿¿como estan???
tengo un problema con un proyecto.
se trata de un contador con tres o cuatro digitos(representados por display), al presionar un pulsador(boton) debe aumentar y al presionar otro pulsador debe disminuir.
ya tengo realizado el montaje y el programa para 4 display(el montaje y el programa los obtuve de la siguiente direccion: http://www.pablin.com.ar/electron/circuito/mc/contador/index.htm ), pero para realizar el cambio de agregar el pulsador de la resta (con el respectivo cambio en el codigo) hay que remover uno de los display (el que me indica los 1000) y remover el transistor que le lleva corriente al display, esto con el motivo de liberar uno de los pines del puerto A del pic 16f84.
mi dilema está en no saber como cambio el programa y estoy muy enredado con los ciclos de decremento (no tengo practica en esto ya que apenas estoy comenzando a estudiar la programación de pics)
muchas gracias por su atención y suerte
-
Hola!
Como dicen por aca: "Si no pegas el codigo para verlo, es dificil poder ayudar"
-
este es el programa que me solicitaste, muchas gracias por lo que puedan hacer
;Contador de 4 digitos.
indo equ 00h ;registro de indireccion
pc equ 02h ;contador de programa
status equ 03h ;registro de estado
fsr equ 04h ;registro de seleccion
ptoa equ 05h ;puerto a
ptob equ 06h ;puerto b
rota equ 0fh ;variable para desplazamiento de display
trisa equ 85h ;configuracion puerto a
trisb equ 86h ;configuracion puerto b
dig1 equ 10h ;acumulador miles
dig2 equ 11h ;acumulador centenas
dig3 equ 12h ;acumulador decenas
dig4 equ 13h ;acumulador unidades
loops equ 1dh ;variables usadas en retardos
loops2 equ 1eh
z equ 02h ;flag de cero
ram equ 05h ;bit de seleccion de pagina de memoria
c equ 00h ;flag de acarreo
w equ 00h ;bit de destino a variable de trabajo
reset org 00
goto inicio
org 05h
retardo ;subrutina de retardo
movwf loops ;la variable de trabajo contiene la cant.
top2 movlw d"110" ;de ms a demorar
movwf loops2
top nop
nop
nop
nop
nop
nop
decfsz loops2 ;controla si termina 1mS
goto top
decfsz loops ;controla si termina el retardo completo
goto top2
retlw 0
s1000 ;rutina de incremento x 1000
clrf dig2 ;pone a cero las centenas
incf dig1 ;incrementa el contador de miles
movf dig1, w ;carga en work el conteo de los miles
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
clrf dig1 ;inicializa los miles
return
s100 ;rutina de incremento x 100
clrf dig3 ;pone a cero las decenas
incf dig2 ;incrementa el contador de centenas
movf dig2, w ;carga en work el conteo de las centenas
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s1000 ;incrementa los miles
return
s10 ;rutina de incremento x 10
clrf dig4 ;pone a cero las unidades
incf dig3 ;incrementa el contador de decenas
movf dig3, w ;carga en work el conteo de las decenas
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s100 ;incrementa las centenas
return
subir ;rutina de incremento
incf dig4 ;incrementa el contador de unidades
movf dig4, w ;carga en work el conteo de las unidades
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s10 ;incrementa las decenas
movlw d"250" ;retardo de 100ms
call retardo
return
tabla ;genera los numeros sobre el display
addwf pc ;agrega al cont. programa el valor de work
retlw b"00111111" ;genera el 0
retlw b"00011000" ;genera el 1
retlw b"01110110" ;genera el 2
retlw b"01111100" ;genera el 3
retlw b"01011001" ;genera el 4
retlw b"01101101" ;genera el 5
retlw b"01101111" ;genera el 6
retlw b"00111000" ;genera el 7
retlw b"01111111" ;genera el 8
retlw b"01111101" ;genera el 9
inicio ;programa principal
bsf status, ram ;selecciona el banco de memoria alto
movlw b"00010000" ;configura el puerto a
movwf trisa ;bit 4 entrada, demas bits salidas.
movlw 00h ;configura el puerto b
movwf trisb ;como salidas
bcf status, ram ;selecciona el banco de memoria bajo
clrf dig1 ;inicializa acumuladores
clrf dig2
clrf dig3
clrf dig4
movlw 00 ;envia ceros a los transistores para apagar
movwf ptoa ;todos los displays
empe btfss ptoa, 4 ;chequea el pulsador
call subir ;llama la rutina de incremento
movlw 08h ;iniciar un 1 en el registro de rotacion
movwf rota
movlw dig1 ;con el registro selector (fsr) se apunta
movwf fsr ;al primer dato que se va a mostrar
disp movlw 00h ;colocar en cero el dato del display
movwf ptob ;para apagarlos
movf rota, w ;pasa rotacion del 1 a la variable work
movwf ptoa ;enciende el transistor (display)
movf indo, w ;lee el dato del registro apuntado por fsr
call tabla ;genera el digito de 7 segmentos
movwf ptob ;envia el digito al puerto b
movlw 03h ;retardo de 3ms para visualizacion
call retardo
btfsc rota, 0 ;controla si terminaron las cuatro rotaciones
goto empe ;si termino, vuelve desde el comienzo
bcf status, c ;carry en cero para no afectar las rotaciones
rrf rota ;desplaza el 1 que enciende los displays
incf fsr ;incrementa el puntero. Apunta el proximo
goto disp ;digito a mostrar
end
como lo dije en el anterior mensaje el montaje esta en la pagina http://www.pablin.com.ar/electron/circuito/mc/contador/index.htm
y la dificultad que tengo es agregarle un pulsor al montaje que me produzca los decrementos, y no se como hacer el codigo correspondiente para este decremento.
muchas gracias por su atencion
SUERTE!!!
-
Hola!
No te hace falta quitarle un 7 segmentos, podes usar los 4, ya que te queda el pin13 del PIC libre para que lo uses como entrada, con el pulsador que va a decrementar. Conectado tal cual esta el pulsador que incremeta "I" con una R a VCC.
Lo demas dejalo como esta.
Espera que analizo el codigo, despues te digo.
-
que pena la demora en responder, gracias pos tu paciencia y espero que me puedas ayudar.
mibspy
Suerte!!!
-
Hola!
Master, mira por ahora no pude crear alguna rutina que haga lo que queres, ya que he estado corto de tiempo.
He analizado el codigo y lo que necesitas no es muy dificil, fijate bien como funcionan las lineas que incrementan los distintos digitos (unidades, decenas, centenas, u. de mil).
El decremento seria algo parecido, usa la instruccion inverza al incremento.
Tambien tenes que tener en cuenta que cuando decrementas las unidades (cuando llega a cero) le pide o decrementa en uno a las decenas y asi sucesivamente, volviendo las unidades a 9.
Debes preguntar si lo que vas a decrementar llego a cero, para "pedir" un uno al digito superior, se entiende?
Sino practica los casos con papel y lapiz, como seria el algoritmo, con diagramas de flujo, y una vez que lo tengas claro mandate con el codigo.
Proba este algoritmo con los ejemplos numericos de abajo (o con el que se te ocurra a vos), creo que anda:
Ahora trata de convertirlo en codigo assembler
unidades igual a cero?
no: entonces decremento unidades
si: entonces decenas igual a cero?
no: entonces decremento decena y hago unidades igual a "9"
si: entonces centenas igual a cero?
no: entonces decremento centenas y hago decenas y unidades iguales a "9"
si: entonces u. de mil igual a cero?
no: entonces decremento u. de mil y hago centenas, decenas y unidades iguales a "9"
si: no puedo seguir decrementando, llegue a "0000"
4890
4889
5000
4999
0001
0000