Autor Tema: Pic18F45k20 no escribe en flash  (Leído 2266 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado migueldemalaga

  • PIC10
  • *
  • Mensajes: 1
Pic18F45k20 no escribe en flash
« en: 21 de Abril de 2010, 11:25:44 »
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...


 

anything