TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Nick en 12 de Diciembre de 2007, 13:50:43
-
Hola
Un saludo a todos! soy nuevo aca y tambien nuevo usando el PIC16F819, para comenzar diseñe un programa en asm que realiza la cuenta de un digito por pulsación de un pulsador.
Este programa lo tenía hecho para un 16F84A en este me corre sin ningun problema, me da la impresion que el problema pasa por el oscilador interno pues el micro no hace nada.
La configuración la he realizado asignando la palabra de configuración al registro OSCCON para 4 Mhz, pero sin ningun resultado.
Por favor si alguien me puede ayudar viendo el programa. :)
Gracias.
;Programa que cuenta el número de veces que se oprime un pulsador indicando en un display
list p=pic16f819 ; Pic a utilizar 16F819
status equ 03h ;registro de estados
porta equ 05h ;puerto A en la dirección 5h de la RAM
portb equ 06h ;puerto B en la dirección 6h de la RAM
trisa equ 85h ;dirección de configuración puerto A
trisb equ 86h ;dirección de configuración puerto B
osccon equ 8fh ;dirección de registro del reloj
conta equ 0ch ;dirección de configuración registro conta
lazo1 equ 0dh ;dirección de configuración registro lazo1
lazo2 equ 0eh ;dirección de configuración registro lazo2
z equ 02h ;bandera de 0 del registro de estados
;
;
;
reset org 00h ;el vector reset esta en la posicion 00
goto inicio ;se salta al programa principal
;
org 05h ;el programa empieza en la posicion de memoria 0
;
;----- SUBRUTINA de retardo de 100 milisegundos ----
;
retardo movlw d'100' ;registro W contiene 100 decimal
movwf lazo1 ;registro lazo1 contiene cantidad de milisegundos
ciclo1 movlw d'110' ;registro W contiene 110 decimal
movwf lazo2 ;carga numero de milisegundos en lazo2
ciclo2 nop
nop
nop
nop
nop
nop
decfsz lazo2 ;pregunta si termino 1 ms
goto ciclo2
decfsz lazo1 ;pregunta si termino el retardo
goto ciclo1
retlw 00h ;salta instruccion despues de call
inicio bsf status,5 ;se ubica en el segundo banco de memoria RAM
movlw b'1100000' ;se guarda en W el valor a usar del reloj en binario 110
movwf osccon ;se configura el reloj interno a 4Mhz
movlw 0f0h ;carga el literal 0f0h (11110000)al registro W
movwf trisa ;activa como salidas el puerto A
movlw 0ffh ;carga el literal 0ffh (11111111) al registro W
movwf trisb ;activa como entradas el puerto B
bcf status,5 ;se ubica en el primer banco de memoria RAM limpiando
clrf conta ;limpia conta iniciando contador en 0
ciclo movf conta,w ;pone valor de conta en W
movwf porta ;pone valor de W en puerto A
call retardo ;salta a subrutina retardo
pulsa btfsc portb,0 ;pregunta si puerto b0 esta oprimido
goto pulsa ;sino esta oprimido vuelve a preguntar
call retardo ;si esta oprimido retarda 100 ms
btfsc portb,0 ;confirma si sigue oprimido
goto pulsa ;sino esta oprimido retorna a preguntar por primera vez
incf conta ;incrementa registro conta en 1
movf conta,w ;carga el registro W con el valor de conteo
xorlw 0ah ;hace operacion XOR para ver si es igual a 0ah (si llego a 10 decimal)
btfsc status,z ;prueba si el contador llego a 0ah (10 decimal)
goto inicio ;si llega a 10 reinicia
goto ciclo ;sino ha llegado a 10 sigue contando
end
-
Bienvenido al foro nick.... y exitos futuros..
Fijate que estas poniendo mal la direccion de los registros generales que comienzan en 20h, y los registros generales de acceso desde cualquier banco estan a partir de la direccion 40h.
Suerte....
-
Hola Nick
Cuando cambies de microcontrolador , revisa la hoja de especificaciones , asi sabras que contiene tu nuevo uC.
Primero
En el pic16F84 no tiene Oscilador interno, el pic16f819 si
no ADC ; si ADC - COnvertidor analogico digital
La seleccion del oscilador la veo correcta , pero te falta habilitar los pines como digitales ya que de inicio estan como análogas.
Cuando enciendes tu uC los pines RA0 a RA4 estan configurados como entradas análogas.
EN el registro ADCON1 se configura el pin , ya sea digital u análogo.
En la hoja de especificaciones viene este ejemplo, nada de magía
BANKSEL PORTA ; cambio de banco donde se encuentre PORTA
CLRF PORTA ; Inicias PORTA latch
BANKSEL ADCON1 ; seleccional el banco donde este el registro ADCON1-----
MOVLW 0x06 ; Configuras todos los pines como digitales
MOVWF ADCON1 ;
MOVLW 0xF0 ; ahi ya depende de como lo necesites, en tu ejemplo usas el nible bajo como salida.
MOVWF TRISA
Espero te sea de ayuda.
-
Bienvenido al foro nick.... y exitos futuros..
Fijate que estas poniendo mal la direccion de los registros generales que comienzan en 20h, y los registros generales de acceso desde cualquier banco estan a partir de la direccion 40h.
Suerte....
Picnic, tu ojo de aguíla me saco del problema, efectivamente era ese el problema tenia mal configurado las direcciones de memoria de los registros de proposito general....... me diste un gran alivio :-) :) Gracias !!!
-
Hola Nick
Cuando cambies de microcontrolador , revisa la hoja de especificaciones , asi sabras que contiene tu nuevo uC.
Primero
En el pic16F84 no tiene Oscilador interno, el pic16f819 si
no ADC ; si ADC - COnvertidor analogico digital
La seleccion del oscilador la veo correcta , pero te falta habilitar los pines como digitales ya que de inicio estan como análogas.
Cuando enciendes tu uC los pines RA0 a RA4 estan configurados como entradas análogas.
EN el registro ADCON1 se configura el pin , ya sea digital u análogo.
En la hoja de especificaciones viene este ejemplo, nada de magía
BANKSEL PORTA ; cambio de banco donde se encuentre PORTA
CLRF PORTA ; Inicias PORTA latch
BANKSEL ADCON1 ; seleccional el banco donde este el registro ADCON1-----
MOVLW 0x06 ; Configuras todos los pines como digitales
MOVWF ADCON1 ;
MOVLW 0xF0 ; ahi ya depende de como lo necesites, en tu ejemplo usas el nible bajo como salida.
MOVWF TRISA
Espero te sea de ayuda.
Lo tendre encuenta AKENAFAB, ya que mi objetivo final es diseñar un programa que controle y verifique fallas para un cargador de bateria NiMH.
Gracias ! :-) :)
-
De nada...
Todo es por causa de muchas pastillas de 'geniol' que tome cuando empece a usar distintos pic... :D :D :D
Saludos