TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: TATO_4x4 en 05 de Diciembre de 2003, 08:16:00
-
Estimados: Por casualidad entre en el tema de los pic y vi las posibilidades de uso que tienen y realmente eso me engancho a tal punto que me compre un programador y todos los componentes para realizar mi primer proyecto. Que por cierto ya lo arme. Ahora el tema es que funciona relativamente bien ya que solo cuenta hasta el 7 y despues vuelve a empezar de 0, cuando en realidad deberia llegar a 9999. En el compilador de mplab no me acusa errores por lo tanto presumo que el problema esta en el codigo (es cortito) pero no tengo el conocimiento de asembler para saber porque se manifiesta tal comportamiento. Igualmente les comento que dicho circuito y codigo lo saque de una pagina web. (PABLIN)
Un abrazo grande para todos.
Adjunto el codigo .asm
;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
-
No le veo problemas, para mi esta bien.
El hardware como es?
Probaste de ver si se reinicia por un tiempo en particular?, esto seria por ejemplo hacerlo subir hasta 3 y dejarlo a ver si reinicia.
Me desconcierta un poco...pero se le sacaran los males, danos tiempo.
-
Hola, me arriesgo... tienes conectadas las resistencias de cada pin del micro a los segmentos???
porque justamente al intentar encender el 8 (todos los digitos, o por consumo o falta de alimentacion)... quizas se reinicia...
esperamos noticias ok?
Norberto
-
Bueno, antes que todo gracias por su interes en mi problema. A modo de respuesta les envie el circuito por mail (el sistema no me permite adjuntar el grafico por falta de espacio).
Por cierto entonces (esto es para Norberto), las 7 resistencias estan a los segmentos respectivos, pero el reset no seria por consumo dado que solo se activan los displays de a uno por vez o al menos eso es lo que explica en el sitio de donde lo saque.
Siguiendo con lo que me plantea Marcos, doy tres impulsos, quedando en 0003 y a 1/2 segundo se vuelve a 0000 (tambien eso es signo de hay algo mal que no anda bien)
.
Aun asi no entiendo por que no pasa del 7 (si el codigo para generar los digitos esta bien).
Igualmente voy a dejar solo 1 display y veo si el tema pasa por el consumo.
Un abrazo grande.
Esteban
-
Hola, entonces el problema es que se te resetea por el WATCH DOG, tienes que desabilitarlo cuando vas a grabar el micro, hay una ventanita en el mplab... o puedes escribir este encabezamiento en tu programa, para que se setee solo...
__CONFIG _CP_ON & _PWRTE_OFF & _WDT_ON & _XT_OSC ;CONFIGURO
;PARA LA GRABACION, CODE PROTECT OFF, RESET DE ENCENDIDO PERRO GUARDIAN=NO ,ETC
Suerte!
Norberto
-
Norberto!!!!!!!!!!!!!!!!!!!!!!!
Excelente. Ahi estaba la madre del borrego
Anda fantastico
lo que si asi como lo copiaste me daba un error
algo como variable cp no declarada.
Entonces estudie varias de las configuraciones que habia en tus librerias de asembler para contadores y encontre esta que es la que esta funcionando.
CP_ON EQU H"000F"
_CP_OFF EQU H"3FFF"
_PWRTE_ON EQU H"3FF7"
_PWRTE_OFF EQU H"3FFF"
_WDT_ON EQU H"3FFF"
_WDT_OFF EQU H"3FFB"
_LP_OSC EQU H"3FFC"
_XT_OSC EQU H"3FFD"
_HS_OSC EQU H"3FFE"
_RC_OSC EQU H"3FFF"
list p=16F84A
__CONFIG _XT_OSC & _PWRTE_ON & _CP_ON & _WDT_OFF
La adjunto por si alguno lo llega a armar el contador de 4 digitos multiplexado.
Un abrazo grande y vamos por mas.
PD: ahora quiero armar un frecuencimetro y si me empacho ya se a quien llamar.
-
Yo pondría la protección de código en OFF
-
Pocher: Justo preguntaste algo que llama poderosamente la atencion.
En mi caso particular, se da el fenomeno de que si el CP esta en ON igualmente mi programador lee lo que hay en el pic. !!!!!!?????
Como o cuando funciona la proteccion de codigo???
Por las dudas te cuento que tengo un programador PROPIC de puerto paralelo y lo uso con el soft PROPIC2 con win millenium.
Salu2.
Esteban.-
-
No sé si será el caso, pero creo que si por programación lo pones en ON pero en el programa grabador lo pones en OFF manda lo del programa grabador. Teóricamente si está en ON, no tendría porqué leerse.
-
ESTEBAN!
si tu programador lee pic protegidos, vale millones!!!! 
Seguramente el programador, no te esta leyendo el pic, sino el .hex de la memoria de la pc 
te pediriamos que confirmes eso ok?
Porcher, en realidad le copie y pegue un encabezamiento que tenia, solo me fije en el wach dog... que era su problema...
un gran abrazo!
Norberto
-
Voy a revisar eso que dice Pocher, realmente del software programador no toque nada, uso solo 3 botones
-read pic
-load hex
-program
Consulto: Si por esa casualidad de la chatarra electronica que siempre hay tirada, uno recupera un pic 16F de otra placa (ponele que esta bloqueado)
. Supuestamente no me permitiria leer lo que tiene adentro.
-Ahora bien, puedo borrar los datos y grabar un nuevo programa???? O sea reciclar ese pic.
Salu2.
E.-
-
Hola, esa es la ventaja de la serie F , es decir FLASH, con lo cual, no es necesario el borrado, simplemente se graba "encima"...
podes emplear tu micro 16F "reciclado" sin problemas... 
Norberto