TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: fco1306 en 07 de Febrero de 2013, 18:30:37
-
Estoy comenzando a programar en asm y estoy intentando grabar en la memoria eeprom del 16f628a. He buscado y probado varias rutinas, pero no consigo hacerlo funcionar ¿donde puede estar el fallo?
list p=16f628A
#include <p16f628A.inc>
__CONFIG _CP_OFF &_CPD_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC & _LVP_OFF & _MCLRE_OFF
CLOCK equ 4000000
conta_1 equ 0x20
conta_2 equ 0x21
conta_3 equ 0x22
EEPROM_GuardaINTCON equ 0x23
; ----- Macros
SEL_BANK_0: macro
bcf STATUS,RP0 ; macros for data access
bcf STATUS,RP1
endm
SEL_BANK_1: macro
bsf STATUS,RP0
bcf STATUS,RP1
endm
FXTAL equ D'8000000'
BaudRate equ D'62500' ; Xbus serial speed
HIGH_BAUD equ (((D'10'*FXTAL/(D'16'*BaudRate))+5)/D'10')-1 ; BRGH = 1
LOW_BAUD equ (((D'10'*FXTAL/(D'64'*BaudRate))+5)/D'10')-1 ; BRGH = 0
;**** Definicion de variables ****
rs485 equ 5 ; Definimos Led como el bit cero de un registro, en este caso PORTB5.-
poweron equ 1 ; Definimos Led como el bit cero de un registro, en este caso PORTA1.-
Pulsador equ 0 ; Definimos Pulsador como el bit 0, en este caso sera para PORTA
;**** Configuracion de puertos ***
Reset org 0x00 ; Aqui comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
org 0x05 ; Origen del codigo de programa.-
Inicio:
movlw 0X07;CARGA W CON 0X07 PARA DESHABILITAR COMPARADORES
movwf CMCON
SEL_BANK_1
movlw b'11100' ; Muevo 11111 a W.-
movwf TRISA ; Cargo en TRISA.-
movlw b'00000000'
movwf TRISB
SEL_BANK_0
bsf PORTA,poweron ; Comienza encendido.portb5-
bsf PORTB,rs485 ; Comienza encendido.-porta1
;call Retardo_1s
bcf PORTA,poweron ; Comienza encendido.-
bcf PORTB,rs485 ; Comienza encendido.-
SEL_BANK_1
movlw 0x02 ;Referecia a la posición 02 de la memoria
movwf EEADR
movlw 0x0A ;Dato a escribir en la posición 02 de la memoria
movwf EEDATA
call EEWR
;Retardo_1s:
;movlw D'10'
;movwf conta_3
;movlw D'100'
;movwf conta_2
;movlw D'250'
;movwf conta_1
;nop
;decfsz conta_1,F
;goto $-.2
;decfsz conta_2,F
;goto $-.6
;decfsz conta_3,F
;goto $-.10
;return
EEWR:
;SEL_BANK_1 ;HABILITA EL BANCO 1
BSF EECON1,WREN ;HABILITA ESCRITURA EN EEPROM
BCF INTCON, GIE ; DESHABILITA INTERRUPCIONES
MOVLW H'55' ;PREPARA SECUENCIA DE SEGURIDAD
MOVWF EECON2 ;ESCRIBE PRIMER DATO DE SECUENCIA
MOVLW H'AA' ;SEGUNDO DATO
MOVWF EECON2 ;ESCRIBE SEGUNDO DATO DE SECUENCIA
BSF EECON1,WR ;INICIA CICLO DE ESCRITURA
EW: BTFSC EECON1,WR ;MALLA PARA ESPERAR AL FINAL DEL CICLO
GOTO EW ;SI WR=1, CICLO DE ESCRITURA AUN NO TERMINA
BCF EECON1, WREN ;DESHABILITA ESCRITURA
BSF INTCON, GIE ;HABILITA INTERRUPCIONES
RETURN
end
-
en que linea se te queda el programa en bucle infinito?
si es en esta linea: BTFSC EECON1,WR ;MALLA PARA ESPERAR AL FINAL DEL CICLO
cambiala por esta otra:BTFSS EECON1,WR ;MALLA PARA ESPERAR AL FINAL DEL CICLO
haber si te funciona.es que no estoy muy seguro de que instruccion tiene que llevar.ya que tengo el programa en otro PC y no puedo mirarlo ahoramismo.
pero a mi este truco me ha funcionado muchas veces.aunque no quiere decir de que sea la intruccion correcta a elegir.muchas veces una mala configuracion en algun registro puede hacer que se presente este error.
-
Pues no es eso.
He hecho un pequeño programa en pic simulator y pasado el asm a mplab.
Funciona siempre y cuando no haga un call para llamar a la rutina de grabación .
list p=16f628A
#include <p16f628A.inc>
__CONFIG _CP_OFF &_CPD_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC & _LVP_OFF & _MCLRE_OFF
CLOCK equ 4000000
conta_1 equ 0x20
conta_2 equ 0x21
conta_3 equ 0x22
EEPROM_GuardaINTCON equ 0x23
; ----- Macros
SEL_BANK_0: macro
bcf STATUS,RP0 ; macros for data access
bcf STATUS,RP1
endm
SEL_BANK_1: macro
bsf STATUS,RP0
bcf STATUS,RP1
endm
FXTAL equ D'8000000'
BaudRate equ D'62500' ; Xbus serial speed
HIGH_BAUD equ (((D'10'*FXTAL/(D'16'*BaudRate))+5)/D'10')-1 ; BRGH = 1
LOW_BAUD equ (((D'10'*FXTAL/(D'64'*BaudRate))+5)/D'10')-1 ; BRGH = 0
;**** Definicion de variables ****
rs485 equ 5 ; Definimos Led como el bit cero de un registro, en este caso PORTB5.-
poweron equ 1 ; Definimos Led como el bit cero de un registro, en este caso PORTA1.-
Pulsador equ 0 ; Definimos Pulsador como el bit 0, en este caso sera para PORTA
;**** Configuracion de puertos ***
Reset org 0x00 ; Aqui comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
org 0x05 ; Origen del codigo de programa.-
Inicio:
movlw 0X07;CARGA W CON 0X07 PARA DESHABILITAR COMPARADORES
movwf CMCON
SEL_BANK_1
movlw b'11100' ; Muevo 11111 a W.-
movwf TRISA ; Cargo en TRISA.-
movlw b'00000000'
movwf TRISB
SEL_BANK_0
bsf PORTA,poweron ; Comienza encendido.portb5-
bsf PORTB,rs485 ; Comienza encendido.-porta1
;call Retardo_1s
bcf PORTA,poweron ; Comienza encendido.-
bcf PORTB,rs485 ; Comienza encendido.-
BSF STATUS,RP0
movlw 0x00 ;Referecia a la posición 02 de la memoria
movwf EEADR
movlw 0x0A ;Dato a escribir en la posición 01 de la memoria
movwf EEDATA
;call eewr
eewr:
BSF EECON1,WREN
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR
L0002: BTFSC EECON1,WR
GOTO L0002
BCF EECON1,WREN
BCF STATUS,RP0
BCF PIR1,EEIF
;Retardo_1s:
;movlw D'10'
;movwf conta_3
;movlw D'100'
;movwf conta_2
;movlw D'250'
;movwf conta_1
;nop
;decfsz conta_1,F
;goto $-.2
;decfsz conta_2,F
;goto $-.6
;decfsz conta_3,F
;goto $-.10
;return
end
Pues no sé donde está el fallo, he mirado y probado códigos y nada
-
me parece recordar que despues de llamar a la subrutina de grabacion a la eeprom,hay que esperar un tiempo.prueba a poner un retardo despues de la llamada.haber que pasa.