TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: gonz147 en 13 de Agosto de 2010, 18:30:20
-
Buenas tardes, estoy tratando de retomar la programación en assembler, ya que siempre he programado en C, para eso tome un modulito que hice con un PIC16F873A y un display 16x2, e hice un programita para prender un led, como era de esperar no funciono, pero después de bajar ejemplos y renegar un buen rato no logro detectar el problema, aca les dejo el programa, básicamente prende y apaga las salidas del puerto A y C, el cristal es de 20MHz, la demora es de 300ms aprox
;------------------------------------------------------------------------------------
list P=16F873A
include <P16F873A.inc>
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC ; code protec off
; power up timer on
; watchdog off
; osc HS
CBLOCK 0X20
PDel0
PDel1
PDel2
Delay
Nibble
ENDC
RESET
ORG 0x00
goto inicio
org 0x05
inicio
BSF STATUS,5 ; activa la pagina 1
MOVLW 0x06 ; Configure all pins
MOVWF ADCON1 ; as digital
MOVLW 0x00 ; carga 00000 en W
MOVWF TRISA ; puerto a todos salidas
MOVLW 0xFF ; carga 00000000 en W
MOVWF TRISB ; puerto b todos entradas
MOVLW 0x00 ; carga 00000000 en W
MOVWF TRISC ; puerto b todos salidaS
BCF STATUS,5 ; volvemos a la pagina 0
band1
MOVLW 0x00 ; ponemos a cero el
MOVWF PORTC ; el puerto c
MOVWF PORTA ; el puerto a
call DEMORA
MOVLW 0xF0 ; ponemos a uno el
MOVWF PORTC ; el puerto c
MOVLW 0xFF ; ponemos a uno el
MOVWF PORTA ; el puerto a
call DEMORA
goto band1
;-------------------------------------------------------------
; Generado con PDEL ver SP r 1.0 el 12/08/2010 Hs 18:05:57
; Descripcion: Delay 1000000 ciclos
;-------------------------------------------------------------
DEMORA movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------------------------------------
end
Lo extraño es que en el modo debug (MPLAB y PICKIT2) y dandole paso a paso funciona bien, pero en modo normal no. Sospecho que es el oscilador.
Me olvidaba, el modulo anda lo mas bien cuando le cargo programas que hice con el CCS
Saludos
-
Hola gonz147, creo ver un error:
band1
MOVLW 0x00 ; ponemos a cero el
MOVWF PORTC ; el puerto c
MOVLW 0X00
MOVWF PORTA ; el puerto a
estas declarando las variables Delay y Nibble y en cambio no las usas.
Que alguien me corrija si me equivoco
Miquel_S
-
Gracias Miquel, corregí todo eso y nada, hice una pruebita similar con un 16f84a y anduvo, sigo probando...
saludos
-
El programa funciona bien, la demora es de 200ms no de 300, en el PORTA solo te encienden los 6 ultimos LEDs, es decir en lugar de FF solo te pone 3F (0011 1111) esto es porque tienes el oscilador en los pines 6 y 7. Tiene que ser algo del hardware que te esta fallando.
Saludos
-
Hice muchas pruebas mas y no anda, desisto y sigo con ccs que si anda, implemetare rutinas en assembler y listo.
Gracias por todo.
Saludos
-
Hola de nuevo hay otro error que me paso por alto, ADCON1 esta en el banco 1 por lo tanto deberias tener la configuracion de otra manera:
BSF STATUS,5 ; activa la pagina 1
BCF STATUS,RP1
MOVLW 0x06 ; Configure all pins
MOVWF ADCON1 ; as digital
MOVLW 0x00 ; carga 00000 en W
MOVWF TRISA ; puerto a todos salidas
MOVLW 0xFF ; carga 00000000 en W
MOVWF TRISB ; puerto b todos entradas
MOVLW 0x00 ; carga 00000000 en W
MOVWF TRISC ; puerto b todos salidaS
BCF STATUS,5 ; volvemos a la pagina 0
Saludos
-
Le pone bien el ADCON1, ademas el programa corre correctamente sin ningun problema, por lo menos en el MPLAB, que creo que es bastante fiable.
Esta es la poscion del adcon1, es la ultima del banco2.
ADCON1 9Fh
Gonz no te desanimes esto es logico que pase, si lo simulas en el MPLAB veras que el prgrama no tiene problema, a mi por lo menos me funciona bien.
Saludos y dale caña
-
Hola tapi8 siento tener que rectificarte pero el ADCON1 es la ultima del banco 1 :mrgreen:
Saludos
-
No hay error en el programa.
El problema tiene que estar en el hardware
Una vez tuve problemas con los condensadores que usa el cristal. Se los saqué y salió andando. Prueba que no tengas el mismo error.
-
Miquel no lo sientas en absoluto, no me molesta que me corrijan errores que pueda tener, precisamente para eso estamos aqui para rectificarnos unos a otros y asi aprender. Pero esto en concreto esta bien, aqui pongo los reg. ADCON0 y ADCON1 copiados del data sheet:
DIRECCION
1Fh ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE — ADON 0000 00-0 127, 150
9Fh ADCON1 ADFM ADCS2 — — PCFG3 PCFG2 PCFG1 PCFG0 00-- 0000 128, 151
Si no fuera asi, si no estuviera bien, el MPLAB al simularlo no dejaria poner los bits analogicos a 1, y el programa lo simule y anda bien.
Hace algun tiempo, cuando me pase a la serie 16f88X porque la 87X la dejaban de fabricarla, no puse a 0X00 los reg. ANSEL y ANSELH, y el MPLAB no me dejaba poner a 1 estos pines del PORTA y PORTB, si el MPLAB deja activarlos y desactivarlos es porque estan bien configurados.
Leon en el mensaje anterior creo que querias poner HARDWARE en lugar de SOFTWARE, VERDAD?
-
El registro ADCON1 es quien coloca los pines en analógicos o digitales. Los bit son del PCFG3 al PCFG0.
En el datasheet hay una pequeña rutina para colocar las salidas en digitales:
BCF STATUS,RP0
BCF STATUS,RP1
CLRF PORTA
BSF STATUS,RP0 ;BANCO 1
MOVLW 0X06
MOVWF ADCON1 ;TODAS DIGITALES
MOVLW 0XCF
MOVWF TRISA
Por lo tanto, lo que hizo gonz147 está bien.
Si, me refería al HARDWARE, ya lo modifico.
También puede haber otro problema. los 8 pines del puerto B están como entrada, si las mismas están en el aire, es una hermosa antena para las RF y hacen que el pic se comporte de cualquier manera.
Otra cosa que se me pasó por alto, son los fuses. Seguramente no lo has configurado correctamente a la hora de quemar el pic. Como no lo has echo en el programa presente, lo tienes que hacer con el programa para cargar el software.
Dinos Gonzalo, ¿con qué programa cargaste el programa al PIC? ¿Cómo configuraste la configuración del PIC? Se me hace que tenés habilitado el perro guardián y la programación a bajo voltaje, también habilitado (LVP).
-
Buenas gente, definitivamente el problema era el haber puesto el puerto b como entrada, lo tenia así porque en el puerto b tengo conectado un display.
Gracias a todos por las respuestas
Saludos