Buenas. Tengo un pic18F45k20 en una plaquita que trae con el kit del programador PICKIT3 de microchip. Siguiendo muchos de vuestras entradas no consigo hacer funcionar el pic adecuadamente ya que aparentemente funciona mal. El programa que aquí les pongo les sonará a mas de uno ya que he cogido las fuentes de un poco de todos ustedes hasta crearme el programa. Este lo programo en el pic y en modo DEBUG puedo ver paso a paso de forma real cómo funciona y que registros se modifican y funciona a la perfección. Pero cuando se programa de forma normal. El pic no funciiona , se bloquea al mostrar el primer caracter por el puerto D. Segurarmente es problemas de los DB ya que si programo cualquier programa escrito para pic18f4550 que andan por aquí funciona perfectamente, siempre que no se use DB o programen en la flash.
;******************************************************************************
; Nombre:tabla2.asm
; 17 abril 2010
; V1.00
; Autor: Miguel Rodriguez
;***************************************************************************
;******************************************************************************
; Notas:Este programa realiza una secuencia de leds de rotacion a intervalo de 1 segundo
; en el puerto D usando tablas de datos.
;******************************************************************************
LIST P=18F45K20 ;Directiva para definir el procesador
#include <P18F45K20.INC> ;Definicion de SFRs para el procesador
;******************************************************************************
;Bits de Configuracion
;******** Configuracion del Oscilador **********
CONFIG FOSC = INTIO67 ;Osc interno.
;******** Otros bits de configuracion **********
CONFIG PWRT= OFF ;PWRT no habilitado
CONFIG BOREN = SBORDIS ;Brown out reset
CONFIG BORV = 30 ;Resetea por debajo de los 3.0 voltios.
CONFIG WDTEN = OFF ;Watchdog deshabilitado
CONFIG MCLRE = OFF ;MCLR como entrada
CONFIG PBADEN = ON ;los pines PORTB<4:0> como entradas analogicas
CONFIG LVP = OFF ;Programacion en bajo voltaje apagado. NO LO USA PICKIT3
CONFIG IESO = OFF ;Switch oscilador interno/externo a OFF.
CONFIG LPT1OSC = OFF ;Timer1 desabilitado.
CONFIG STVREN = ON ;Habilitamos el desbordamiento de pila.Si esto ocurre resetea.
CONFIG CCP2MX = PORTC ;Multiplexado al bit RC1
CONFIG XINST = OFF
;********* Bits de proteccion ******************
CONFIG CP0 = OFF ;los bloques del codigo de programa
CONFIG CP1 = OFF ;no estan protegidos
CONFIG CP2 = OFF
CONFIG CP3 = OFF
CONFIG CPB = OFF ;Sector Boot no esta protegido
CONFIG CPD = OFF ;La EEPROM no esta protegida.
CONFIG WRT0 = OFF ;Protección de escritura de bloque a off.
CONFIG WRT1 = OFF
CONFIG WRT2 = OFF
CONFIG WRT3 = OFF
CONFIG WRTB = OFF
CONFIG WRTC = OFF
CONFIG WRTD = OFF
CONFIG EBTR0 = OFF ;Protección contra lectura de tablas a off.
CONFIG EBTR1 = OFF
CONFIG EBTR2 = OFF
CONFIG EBTR3 = OFF
;************+ Variables para la temporizacion y subrrutinas ************************************
CBLOCK 0x000 ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
Cantms:2 ;variable de 16 bits para generar hasta 65535 ms
CantSeg ;Variable para producir retardos de hasta 255 seg
Contador ;contador para secuencia de datos.
ENDC
;******************************************************************************
; MACROS
PunteroRom macro
movlw UPPER TablaDatos ; Cargamos parte mas alta de la tabla
movwf TBLPTRU,A ; Y LO PASAMOS AL PUNTERO TABLA
movlw HIGH TablaDatos
movwf TBLPTRH,A
movlw LOW TablaDatos
movwf TBLPTRL,A ; AHORA TENEMOS LA DIRECCION COMPLETA DEL PRIMER DATO A REPRESENTAR
endm
; Vector de Reset.
; Este codigo comenzara a ejecutarse cuando suceda un reset
ORG 0x0000
goto Inicio ;Se va al inicio del codigo principal
;******************************************************************************
; Vector de interrupcion de alta prioridad
ORG 0x0008
retfie
;******************************************************************************
; Vector de interrupcion de baja prioridad y rutina
ORG 0x0018
retfie
;******************************************************************************
;***********************************************************************************************
; Comienzo del programa principal
Inicio movlw B'11011110' ;Ajustamos el oscilador interno a 4 MHz
movwf OSCCON,A
movlw B'00001111'
setf ANSEL,A ; NOS ASEGURA QUE EL POTENCIOMETRO NO METE TENSION EN EL PIN SIENDO ESTA COMO SALIDA I/O.
setf TRISA,A ; Ponemos EL PUERTO A COMO ENTRADA ANALOGICA.
movlw 0x01 ; Ponemos el bit RB0 como entrada DIGITAL, resto salidas DIGITALES.Switch
movwf TRISB,A
clrf TRISC,A
clrf TRISD,A
clrf TRISE,A
clrf LATD,A ; Ponemos todos los leds a 0.
clrf Contador,A
NuevoCiclo
PunteroRom ;Macro para insertar direccion en puntero de tabla.
Incre tblrd*+ ; leemos el primer valor de la tabla creado por db Y LO INCEMENTAMOS
movf TABLAT,W,A ; LO PASAMOS AL W
movwf LATD,A ; SACAMOS EL DATO POR EL PUERTO D
movlw .5 ; cargamos el tiempo de espera ( 1 segundo)
movf CantSeg,F,A
rcall RetardoSeg
incf Contador,F,A
movlw .7 ; contamos los 7 digitos que vamos a representar
cpfseq Contador,A ; Ha llegado a 7???
bra Incre ; no vuelve a secuencia
tblrd*- ; se decrementa en una posicion ya que apunta a una posicon vacia.
Reverse movlw .1 ; cargamos el tiempo de espera ( 1 segundo)
movf CantSeg,F,A
rcall RetardoSeg
decf Contador,F,A
tblrd*- ; leemos el primer valor de la tabla creado por db Y LO decrementamos
movf TABLAT,W,A ; LO PASAMOS AL W
movwf LATD,A ; SACAMOS EL DATO PUERTO D
clrf WREG,A
cpfseq Contador,A ; Ha llegado a 0?
bra Reverse
bra NuevoCiclo
;**************************** RetardoSeg **********************************
; RetardoSeg Realiza una espera de la cantidad de segundos indicados
; mediante la variable CantSeg. CantSeg es de 8 bits
;*****************************************************************************
RetardoSeg movf CantSeg,W,A
btfsc STATUS,Z ;CantSeg == 0?
return ;Si => retornamos
movlw 0x03 ;No => hacemos Cantms = 1000
movwf Cantms+1,A ; Parte alta de la variable ( 1 byte mas peso)
movlw 0xE8
movwf Cantms,A ; Parte baja de la variable ( 1 byte menos peso)
rcall Retardo_ms ;realizamos un retardo de 1000 ms
decf CantSeg,F,A ;CantSeg --,
bra RetardoSeg ;Continuamos con el ciclo
;*****************************************************************************
;**************************** Retardo_ms **********************************
; Retardo_ms Realiza un retardo de la cantidad de milisegundos indicados
; mediante Cantms y Cantms+1, Cantms y Cantms+1 son tratados como
; variables de 16 bits.
;*****************************************************************************
Retardo_ms
rcall Retardo1ms ;realizamos un retardo de 1 ms
decfsz Cantms,F,A ;Cantms --, Cantms == 0
bra Retardo_ms ;no => vamos a Retardo_ms
movf Cantms+1,W,A ;
btfsc STATUS,Z ;Cantms+1 == 0?
return ;Si => retornamos
decf Cantms+1,F,A ;No => decrementamos
bra Retardo_ms ;Continuamos con el ciclo
;*****************************************************************************
;**************************** Retardo1ms **********************************
; Retardo1ms realiza una espera de 1 ms decrementado W 249 veces en un ciclo
; que ocupa 4 us
;*****************************************************************************
Retardo1ms movlw .249
Retardo1msP0 decfsz WREG,W,A ;W--
bra Retardo1msP0 ;No => seguimos esperando
return ;Si => ya paso 1 ms
;************* Reservamos memoria de 8 bits para los datos de la tabla *************
ORG 0X800
TablaDatos DB 0x81,0xC3,0xE7,0xFF,0x7E,0x3C,0x18
end ;Directiva fin del programa
Alguna idea,??? Yo lo programo tal y como está aquí con el mplab8.46 y el pickit3 como programador.
Tengo serias dudas si puedo escribir el programa o debo respetar el BOOT SECTOR...