Autor Tema: Al borrar Row flash, se cuelga el PIC, SOLUCIONADO!!!!  (Leído 1784 veces)

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

Desconectado culebrasx

  • PIC10
  • *
  • Mensajes: 39
Al borrar Row flash, se cuelga el PIC, SOLUCIONADO!!!!
« en: 30 de Julio de 2010, 06:08:01 »
Hola, sucede algo (para mi) muy raro, este es un cogido simplificado de otro pero falla igual, borro una row de la flash para luego llenarla con los datos mofdificados, simula en mplab 8.5 perfecto pero en el micro se cuelga, y ni siquiera responde a un apagado-encendido, tengo que volver a grabarlo para que funcione y se vuelva a colgar.

-Mas o menos hace lo siguiente, con un pulsador modifico el valor de OC1RS, y cuando le doy a otro pulsador quiero que se borre la row(previo backup), modificar el bakcup y grabarlo en la flash...

-como (todavia) no tengo icd2 he puesto unas señales luminosas para ver que parte del codigo se llega a utilizar, y la señal luminosa que hay detrás del borrado de la flash nunca se llega a producir, y si una que justo delante del borrado.

pongo todo el codigo por si acaso...

-Añadir que a veces me da este error el simu mplab
CORE-E0004: Trap due to unimplemented FLASH memory access, occurred from instruction at 0x000424

-Puede ser que al borrar esa parte de memoria del tiron,borre algo necesario para que el programa pueda funcionar???, por lo que yo tengo entendido en la flash program memory eligo yo unicamente que datos se guardarán,no?
Código: [Seleccionar]
#include <p24fj16ga002.h>
 _CONFIG2(FNOSC_FRC & OSCIOFNC_ON)
 _CONFIG1(FWDTEN_OFF &  WINDIS_OFF & POSCMOD_NONE & JTAGEN_OFF)
#define FCY 8000000UL
#include <libpic30.h>


void _ISRFAST _T2Interrupt( void)
{
_T2IF = 0; // clear interrupt flag
} //T3Interrupt

int unsigned color1_r __attribute__ ((space(auto_psv))),color1_r=0x99;
int unsigned color1_g __attribute__ ((space(auto_psv)));
int unsigned color1_b __attribute__ ((space(auto_psv)));


int unsigned color1_r_s ;
int unsigned  color1_g_s ;
int unsigned  color1_b_s ;
int tbloffset;


void main(void)
{
TRISB=0xFFF8; //B0-B2 salidas, resto entradas.
TRISAbits.TRISA3=1;
ODCA=0X0000;
ODCB=0X0000;
OC1CONbits.OCM=0;
OC2CONbits.OCM=0;
OC3CONbits.OCM=0;
OC1R=0x0000;;
OC2R=0X0000;
OC3R=0X0000;
OC1RS=0X000;  //ROJO
OC2RS=0X0000;  //VERDE;ESTE EL EL MAXIMO(0x9c77); 40.000 colores!!!!
OC3RS=0X0000;  //AZUL
OC1CONbits.OCTSEL=0;
OC2CONbits.OCTSEL=0;
OC2CONbits.OCTSEL=0;



CLKDIVbits.RCDIV=0;
CLKDIVbits.DOZE=0;
//_T2IF=1; //activa la interrupcion timer 2
//_T2IE=1; //ACTIVAR  TIMER2
//_OC1IF=1; //ACTIVA EL FLAG DEL OC1
//_OC1IE=1; //ACTIVA EL COMPARADOR 1
//_OC2IF=1;
//_OC2IE=1;
//_OC3IF=1;
//_OC3IE=1;
//_CNIE=1; //INTERRUPCION FLAG NOTIFICATION ON CHANGE ACTIVA
OC1CONbits.OCM=6; //OC1 como pwm, pin por defecto desactivado;
//hay que configurar RPORx para definir OC1
OC2CONbits.OCM=6; //Idem arriba pero de distinta forma
OC3CONbits.OCM=6; //IDEM

T2CONbits.TON=0;

T2CONbits.T32=0; //QUE TIMER2 SEA DE 16 BITS UNICAMENTE
T2CONbits.TCKPS=0;
T2CONbits.TCS=0;
T2CONbits.TGATE=0;

TMR2=0X00;
PR2=0x00FF; //para conseguir periodo 100Hz, 9C40,FFF =977Hz; 8 bits & 16KHz => FFH
IPC1bits.T2IP = 0x01; // Set Timer 2 Interrupt Priority Level
 IFS0bits.T2IF = 0; // Clear Timer 2 Interrupt Flag
 IEC0bits.T2IE = 1; // Enable Timer 2 interrupt
 T2CONbits.TON = 1; // Start Timer

RPOR0bits.RP0R=18;
RPOR0bits.RP1R=19;
RPOR1bits.RP2R=20;

AD1PCFG=0XFFFF; //CONFIGURAR I/0 COMO DIGITALES
AD1CON1bits.ADON=0; //ADC OFF
__delay_ms(1000);
while (1)
{


if(!_RB7 && (OC1RS<0X0FF)) //MAS ROJO 0x0100 es el  max ahora(15635Khz)
{
OC1RS++;}
if(!_RB8 && (OC1RS>0)) //MENOS ROJO
{
OC1RS--;
}

if(!_RB9){
TBLPAG = __builtin_tblpage(&color1_r);
  tbloffset = __builtin_tbloffset(&color1_r);
OC1RS=__builtin_tblrdl(tbloffset);
TBLPAG = __builtin_tblpage(&color1_g);
  tbloffset = __builtin_tbloffset(&color1_g);
OC2RS=__builtin_tblrdl(tbloffset);
TBLPAG = __builtin_tblpage(&color1_b);
  tbloffset = __builtin_tbloffset(&color1_b);
OC3RS=__builtin_tblrdl(tbloffset);
} //ROJO  COLOR1



if(!_RA2)
{


//*****************************   AQUI LA PRIMERA SEÑAL LUMINOSA QUE SI SE CUMPLE**********************




asm volatile("disi #15");
NVMCON=0x4042;
TBLPAG = __builtin_tblpage(&color1_g);

//WREG0=__builtin_tbloffset(&color1_r);

//asm("TBLWTL W0, [W0]");  
NVMKEY = 0x55;
NVMKEY = 0xAA;

NVMCONbits.WR=1;
Nop();
Nop();
// *********************AQUI OTRA SEÑAL LUMINOSA QUE NUNCA LLEGA A PRODUCIRSE******************************

color1_r_s=OC1RS;
color1_g_s=OC2RS;
color1_b_s=OC3RS;



asm volatile("disi #20");
asm("MOV #0x0290,W0");
asm ("MOV 0x0800, W2");
asm ("MOV #0xFFAA, W3");
asm("TBLWTL.w W2, [W0]");
asm("TBLWTH.w W3, [W0++]");
asm("mov 0x0802, W2");
asm("TBLWTL.w W2, [W0]");
asm("TBLWTH.w W3, [W0++]");
asm("mov 0x0804, W2");
asm("TBLWTL.w W2, [W0]");
asm("TBLWTH.w W3, [W0++]");



asm("MOV #0x4001, W0");
asm("MOV W0, NVMCON");
asm volatile("disi #5");
NVMKEY = 0x55;
NVMKEY = 0xAA;

NVMCONbits.WR=1;
Nop();
Nop();

// NVMCONbits.WREN=0;




} //ra2 pulsado
 __delay_ms(10);
}//while general



}//MAIN

Un saludo a tod@s
« Última modificación: 04 de Agosto de 2010, 06:04:59 por culebrasx »

Desconectado culebrasx

  • PIC10
  • *
  • Mensajes: 39
Re: Al borrar Row flash, se cuelga el PIC, SOLUCIONADO!!!!
« Respuesta #1 en: 04 de Agosto de 2010, 06:07:36 »
Despues de mucho leer me he dado cuenta que el error era una tonteria, en la secuencia de borrado habia que poner los datos que van al NVMKEy que pasen por el registro W1 para no modificar W0, tambien he puesto los datos mas altos en la flash para que no al borrar este seguro que se borran unicamente ellos,
-para ponerlos mas altos en la flash
int unsigned color1_r __attribute__ ((space(prog),aligned(_FLASH_PAGE*2)));

asm("MOV #0x4042, W0");
asm("MOV W0, NVMCON");
asm("MOV #0x0000, W0");
asm("MOV W0, TBLPAG");
asm("MOV #tbloffset(0x0C00), W0");
asm("TBLWTL W0, [W0] ")   ;
asm("DISI #5");
asm("MOV #0x55, W1");                 
asm("MOV W1, NVMKEY") ; 
asm("MOV   #0xAA, W1  ");
asm("MOV W1, NVMKEY  ");
asm("BSET NVMCON, #15");
asm(" NOP ");
asm("NOP"); 


gracias a todas las lecturas por interesarse y un saludo.....


 

anything