TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: FrankPI en 14 de Junio de 2006, 10:19:21
-
hola necesito ayuda, quiero hacer un contador de dos digitos con transitores, tngo el programa hehco pero en la practica se queda a 00 los displays ayuda porfavor.
tngo el .HEX q alguien me ayude muchas gracias.....
-
Hola. Bueno...con transistores???
Si tenes el .hex va a ser bastante mas complicado modificar el programa que si tuvieses el .asm...
Saludos.
-
Hola amigo!
Seria posible que pases el esquema del circuito? Por ahi podemos sugerir algo si lo vemos.....
Saludos! :mrgreen:
-
hola amigos muchas gracias, estoy desesperado mñn viernes tngo q entregarlo y os agradeceira q me ayudarais, tngo el circuito y el .asm, estoy q me tiro de los pelos no tngo ni idea porqeu no me cuenta bien. mi programa es el siguiente(lo saque de internet, y es para 4 transistores, pero lo quiero para 2)
;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
y he hecho una modificacion para los antirebotes (( q es para q cuando mantenga pulsado el boton solo cuente un digito))
LIST P=16f84
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
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
Mm equ 0x0c
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
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
clrf dig3 ;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
bsf Mm,4
bcf ptoa,2
bcf ptoa,3
clrf dig3
clrf dig4
movlw 00 ;envia ceros a los transistores para apagar
movwf ptoa ;todos los displays
empe btfsc ptoa,4
goto cambiar_Mm
btfsc Mm,4
goto cuenta
goto mov_rota
cuenta call subir
bcf Mm,4
goto mov_rota
cambiar_Mm btfsc Mm,4
goto mov_rota
bsf Mm,4
goto mov_rota
mov_rota movlw 0x08
movwf rota
movlw dig3 ;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
-
Hola, soy novato en esto, y la verdad que no me he leido todo tu programa, pero lo que veo mal es ésto:
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
deberías poner addwf pc,1 para guardarlo en el mismo registro, y así poder direccionar el registro al lugar adecuado.
Gracias y saludos.
-
muchas gracias pero sige sin funcionar q :( madre mia...... no voy a poder presentarlo mñn.
si no es mucho pedir nadie sabe hacer un contador con 2 digitos, tienen dos transistores, para q se enciendan los displays,
las patillas 1 y 2 son los transistores y la 3 es el pulsador , 4 es el reset y las patillas 11 10 9 8 7 6 12 son los segmentos del display.....
MUCHAS GRACIAS
-
Compañero el que has subido anteriormente es el programa completo?
-
bueno prueva este contador para ver como te va.
PROGRAMA DE CONTEO REGRESIVO DEL 99 HASTA 0
display de anodo comun
2 transistores 3904
colectares uno a cada comun de display
Emisor a 5vdc
base a salida del puertoa
SI NO TE MULTIPLEZA VARIA EL RETARDO HASTA QUE TE VEA BIEN.
suerte """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""";;;;;;;
LIST P=16F84A
#INCLUDE<P16F84A.INC>
REG1 EQU 23
REG2 EQU 24
REG3 EQU 25
decenas EQU 20
unidad equ 21
org 00
goto inicio
penate ADDWF PCL,1
RETLW B'11000000' ;0
RETLW B'11111001' ;1
RETLW B'10100100' 2
RETLW B'10110000' 3
RETLW B'10011001' 4
RETLW B'10010010' 5
RETLW B'10000010' 6
RETLW B'11111000' 7
RETLW B'10000000' 8
RETLW B'10011000' 9
return
inicio bsf status,5
movlw b'000000' ;para transistores
movwf porta
clrf portb
bcf status,5
clrf portb
coveñas
movlw .9
movwf decenas
fer movlw .9
movwf unidad
call ben
since decfsz unidad,1
goto sanmarc
call ben
decf decenas,1
movf decenas,0
xorwf .1,0
btfss status,2
goto fer
clrf decenas
movlw .9
movwf unidad
er decfsz unidad,1
goto etris
goto coveñas
etris call ben
goto er
sanmarc call benito
goto since
ben movf unidad,0
call penate
bcf porta,2
movwf portb
call retardo
bsf porta,2
movf decenas,0
call penate
bcf porta,3
movwf portb
call retardo
bsf porta,3
return
retardo MOVLW .9
MOVWF REG1
DEC3 MOVLW .9
MOVWF REG2
DEC2 MOVLW .5
MOVWF REG3
DEC1 DECFSZ REG3,1
GOTO DEC1
DECFSZ REG2,1
GOTO DEC2
DECFSZ REG1,1
GOTO DEC3
RETURN
end
BUENO SIMULAR HABER SI
-
si q es el programa completo pero nose porque no funciona, los transistores son 546B, pasara algo???? weno muchas gracias por todo, espero q salga bien.....
Microcom te pediria un favor podrias agregarme a fagoro18@hotmail.com, despues si queires me borras pero me gustaria que me ayudaras muchas gracias a todos!!
-
mis displays son SC03-12HWA, creo q son de catodo comun, q hago para modificarlo en el programa??? muchas gracias a rtodos
-
loa emisores ban a tierra
los colectores ban los comunes del display
los segmentos ban al puertoB como dice la tabla.
para activar los transistores cambiar bcf por bsf y quedaria = bsf porta,2 bsf porta,3
y despues tienes que desactivarlos con bcf porta,2 y bcf porta,3
peñate ;siete segmentos display CATODO comun.
ADDWF PCL,1
RETLW B'00111111' ;0 prende segmentos fedcba
RETLW B'00000110' ;1 prende segmentos cb
RETLW B'01011011' ;2 prende segmentos gedba
RETLW B'01001111' ;3 prende segmentos gdcba
RETLW B'01100110' ;4 prende segmentos gfcb
RETLW B'01101101' ;5 prende segmentos gfdca
RETLW B'01111101' ;6 ......
RETLW B'00000111' ;7 ............
RETLW B'01111111' ;7 ..................
RETLW B'01100111' ;9 .......................
-
bueno prueva este contador para ver como te va.
PROGRAMA DE CONTEO REGRESIVO DEL 99 HASTA 0
display de catodo comun
2 transistores 3904 NPN el transistor debe ser npn
colectares uno a cada comun de display
Emisor a tierra
la base del transistor va a salida del puertoa
SI NO TE MULTIPLEZA VARIA EL RETARDO HASTA QUE TE VEA BIEN.
suerte """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""";;;;;;;
LIST P=16F84A
#INCLUDE<P16F84A.INC>
REG1 EQU 23
REG2 EQU 24
REG3 EQU 25
decenas EQU 20
unidad equ 21
org 00
goto inicio
peñate ;siete segmentos display CATODO comun.
ADDWF PCL,1
RETLW B'00111111' ;0 prende segmentos fedcba
RETLW B'00000110' ;1 prende segmentos cb
RETLW B'01011011' ;2 prende segmentos gedba
RETLW B'01001111' ;3 prende segmentos gdcba
RETLW B'01100110' ;4 prende segmentos gfcb
RETLW B'01101101' ;5 prende segmentos gfdca
RETLW B'01111101' ;6 ......
RETLW B'00000111' ;7 ............
RETLW B'01111111' ;7 ..................
RETLW B'01100111' ;9 .......................
inicio bsf status,5
movlw b'000000' ;para transistores
movwf porta
clrf portb
bcf status,5
clrf portb
coveñas
movlw .9
movwf decenas
fer movlw .9
movwf unidad
call ben
since decfsz unidad,1
goto sanmarc
call ben
decf decenas,1
movf decenas,0
xorwf .1,0
btfss status,2
goto fer
clrf decenas
movlw .9
movwf unidad
er decfsz unidad,1
goto etris
goto coveñas
etris call ben
goto er
sanmarc call benito
goto since
ben movf unidad,0
call penate
movwf portb
bsf porta,2 ;transistor de unidad
bcf porta,3
call retardo
movf decenas,0
call penate
movwf portb
bsf porta,3 ;transistor de decenas
bcf porta,2
call retardo
bcf porta,3
bcf porta,2
clrf portb
return
retardo MOVLW .9
MOVWF REG1
DEC3 MOVLW .9
MOVWF REG2
DEC2 MOVLW .5
MOVWF REG3
DEC1 DECFSZ REG3,1
GOTO DEC1
DECFSZ REG2,1
GOTO DEC2
DECFSZ REG1,1
GOTO DEC3
RETURN
end
BUENO SIMULAR HABER SI
-
no tira, muchas gracias
si no fuera mucho pedir, como cn 2 transistores nofunciona a ver si podeis ayudar solo cn uno q cuente del 0-9 y ya esta, asi no seria tan jaleoso.... muchas gracia!!!!
-
Este es un contador de 0 a 9 incrementa con un pulso por RA0 la salida es por el puertob . bebes dejar de presionar el pulsador y luego presionar de nuevo para que siga incrementando. incrementa de uno en uno.
;no necesita decodificador display de cátodo
es.........................................................*
list p=16f84A
include"p16f84A.INC"
con1 equ 0x0c
con2 equ 0x0d
con3 equ 0x0e
unidades equ 0x0f
temp equ 0x11
porta equ 0x05
portb equ 0x06
status equ 0x03
pcl equ 0x02
intcon equ 0x0b
z equ 0x02
trisa equ 85h
trisb equ 86h
org 0
goto inicio
org 5
retardo movlw .1 ;30
movwf con3
c_con2 movlw .1 ;100
movwf con2
repeat decfsz con2,f
goto repeat
decfsz con3,f
goto c_con2
return ;termino subrutina de retardo
tabla addwf pcl,f
retlw b'00111111';0
retlw b'00000110';1
retlw b'01011011';2
retlw b'01001111';3
. retlw b'01100110';4
retlw b'01101101';5
retlw b'01111100';6
retlw b'00000111';7
retlw b'01111111';8
retlw b'01100111';9
visu movf unidades,w
call tabla
movwf portb
call retardo
return
inicio bsf status,5
movlw 0x01 ;ra0 pulsador
movwf porta
movlw b'00000000' portb salida para segmentos del display
movwf portb
bcf status,5
clrf unidades
ciclo call visu
btfss porta,0
goto ciclo ;comprobación de pulsador
call retardo ;antirrebote
btfss porta,0
goto ciclo
incf unidades,1
movlw .10
xorwf unidades,w
btfss status,z
goto soltar
clrf unidades
soltar call visu
btfsc porta,0
goto soltar
call retardo
btfsc porta,0
goto soltar
goto ciclo
end
-
hola ya tngo el programa q funciona 100% lo unico q pasa q mi placa, es de 2 transistores, y no se q tngo q quitar.....
el prgorama es para 4 transistores y yo solo quiero cojer 2.... pero no se q elegir y q quitarr del programa asi q si alguien puede ayudarme.... muchas gracias... ( patillas de salida la numero 2 y 1)
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
-
Ya hay un contador con PIC que puede usar de uno a cuatro digitos, simplemente se le quitan los displays.
www.josepino.com/pic_projects/indexsp.pl (http://www.josepino.com/pic_projects/indexsp.pl)