TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Sacahe en 04 de Julio de 2006, 15:22:10
-
Que tal compañeros???
Bueno les comento:
Hice un programita que me escribe en la memoria flash de programa una serie de datos (un programa que prende y apaga un led) a partir de la direccion h'90'. El programa principal que me hace la secuencia de escritura de la flash funciona bien menos cuando con un "goto" lo mando a la direccion h'90', es decir, la instruccion goto h'90' no hace el salto que deseo para luego ejecutar el otro progamita (led on/off), si no que se queda ahi mismo "pegado" cuando lo simulo en mplab y en el proteus...Este es el programa resumidito
inicio clrf eeadrh
movlw h'90'
movwf eeadr
movlw h'01'
movwf eedath
movlw h'86'
movwf eedata
call writeflash
incf eeadr . . .
. .
. .
. .
. .
goto h'90' ---> aca se queda pegado y no salta a la direccion 90
Porque no salta?....Amigos espero nuevamente su colaboracion...GRACIAS
-
Amigo dificil adivinar si tener todo el código.
Pero dejame comentarte algo, si haces una escritura de la flash 'durante la ejecución' lo que cambiará será la memoria de programa y deberás simular con la ventana "Program Memory" la sección de código que deseas ver!
No podrás hacerlo desde la ventana EDIT con el texto porque sencillamente no es código que sea generado por el ensamblador, sino que se genera durante la ejecución por el simulador.
Saludos
-
Amigos este es el codigo completo:
LIST P=16F877A ;TIPO DE PROCESADOR
INCLUDE "P16F877A.INC" ;DEFINICON DE LOS SFR
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF & _BODEN_ON & _WRT_OFF & _LVP_OFF & _CPD_OFF & _DEBUG_OFF
INICIO ORG H'0000'
GOTO START
;****************************************************************
WRITEF
BANKSEL EECON1 ;BANCO3
BSF EECON1,EEPGD ;SELECCIONAMOS ACCESO A LA FLASH
BSF EECON1,WREN ;SE HABILITA ESCRITURA EN LA FLASH
BCF INTCON,GIE ;SE PROHIBEN LAS INTERRUPCIONES
MOVLW H'55'
MOVWF EECON2
MOVLW H'AA'
MOVWF EECON2
BSF EECON1,WR ;SE DA LA ORDEN DE ESCRITURA
NOP
NOP
BSF INTCON,GIE ;SE HABILITAN LAS INTERRUPCIONES
BCF EECON1,WREN ;SE PROHIBE LA ESCRITURA DE NUEVOS DATOS
BANKSEL EEADR ;BANCO2
;
RETURN
;****************************************************************
START
BANKSEL EEADR ;BANCO2
CLRF EEADR ;LIMPIAMOS PARTE BAJA DEL DIRECCIONADOR DE LA FLASH
CLRF EEADRH ;LIMPIAMOS PARTE ALTA DEL DIRECCIONADOR DE LA FLASH
MOVLW H'90'
MOVWF EEADR
MOVLW H'01'
MOVWF EEDATH
MOVLW H'86'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'16'
MOVWF EEDATH
MOVLW H'83'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'10'
MOVWF EEDATH
MOVLW H'06'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'12'
MOVWF EEDATH
MOVLW H'83'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'14'
MOVWF EEDATH
MOVLW H'06'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'20'
MOVWF EEDATH
MOVLW H'09'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'10'
MOVWF EEDATH
MOVLW H'06'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'20'
MOVWF EEDATH
MOVLW H'09'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
;==========================================
MOVLW H'28'
MOVWF EEDATH
MOVLW H'04'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'30'
MOVWF EEDATH
MOVLW H'C8'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'00'
MOVWF EEDATH
MOVLW H'A0'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'30'
MOVWF EEDATH
MOVLW H'6E'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'00'
MOVWF EEDATH
MOVLW H'A1'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'00'
MOVWF EEDATH
MOVLW H'00'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'0B'
MOVWF EEDATH
MOVLW H'A1'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'28'
MOVWF EEDATH
MOVLW H'0D'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
;==========================================
MOVLW H'0B'
MOVWF EEDATH
MOVLW H'A0'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'28'
MOVWF EEDATH
MOVLW H'0B'
MOVWF EEDATA
CALL WRITEF
INCF EEADR,1
MOVLW H'00'
MOVWF EEDATH
MOVLW H'08'
MOVWF EEDATA
CALL WRITEF
GOTO H'0090'
;==========================================
END
-
Sacahe primero que todo te quiero comentar que tu código si funciona.
El problema está en "qué" es lo que estas grabando a partir de 0x0090.
He visto y tu código genera lo siguiente:
Address Mnemonico
0090 CLRF PORTB
0091 BSF STATUS, 0x5
0092 BCF PORTB, 0
0093 BCF STATUS, 0x5
0094 BSF PORTB, 0
0095 CALL 0x9
0096 BCF PORTB, 0
0097 CALL 0x9
0098 GOTO 0x4
0099 MOVLW 0xc8
009A MOVWF 0x20
009B MOVLW 0x6e
009C MOVWF 0x21
009D NOP
009E DECFSZ 0x21, F
009F GOTO 0xd
En el address 0x0095 hay un "call" a la línea 0x0009. Eso hace que tu programa haga cualquier cosa.
Pero simulando, el puntero va perfectamente a 0x0090 ejecuta las líneas en secuencia hasta que llega a ese call.
Saludos