Probleme de lecture avec EEPROM
Bonjour,
j'ai un drôle de problème qui concerne encore un sujet sur l'eeprom,
voila je fait une ecriture a des adresses d'eeprom
et je faits une lecture à l'initialisation des datas se trouvant à ces
adresses puis je fait un printf des datas mais ça ne correspond pas après le reset
du microcontrolleur, pourquoi pourtant mon code semble logique ?
voici la capture après le reset:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
Relisez les priorités attribuées puis corriger
Priority MIC >> PA set to : 1Ah
Priority GUI >> PA set to : 3h
Priority RAD >> PA set to : 3h
Priority AUX >> PA set to : 2h
Priority IN1 set to : 2h
Priority IN2 set to : 6h
Priority IN3 set to : 6h
Read 1
Write 1
CS0 1
CS1 1
CS0 0
CS1 1
AO 1
A1 1
A2 1
PIO_PWR 0
PIO_RESET 0
-> Please press any key to exit |
voici la capture lors de la configuration, ecriture:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
Relisez les priorités attribuées puis corriger
Priority MIC >> PA set to : 3h
Priority GUI >> PA set to : 4h
Priority RAD >> PA set to : 2h
Priority AUX >> PA set to : 5h
Priority IN1 set to : 6h
Priority IN2 set to : 7h
Priority IN3 set to : 8h
Read 1
Write 1
CS0 1
CS1 1
CS0 0
CS1 1
AO 1
A1 1
A2 1
PIO_PWR 0
PIO_RESET 0
-> Please press any key to exit |
Les fonctions basiques :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
/**********************************************************************************
Function: EEP2408_write_byte
***********************************************************************************/
void EEP2408_write_byte(unsigned char MyByte1, unsigned char MyByte2)
{
I2C_TEA6320 = 0;
I2C_PCF8574 = 0;
I2C_EEPwrit = 1;
I2C_EEPread = 0;
EA = 1;
I2C_Byte1 = MyByte1; // Word Address
I2C_Byte2 = MyByte2; // Data
I2C_Status = I2C_BUSY; // I2C is now busy
SSCON = 0xC0; // enable I2C - no acknowledgements will be generated
SSCON = SSCON | 0x20; // request to transmit a start condition
while(I2C_Status == I2C_BUSY); // wait until I2C is no longer busy
SSDAT = 0xFF; //re-init SSDAT
}
/**********************************************************************************
Function: EEP2408_read_byte
***********************************************************************************/
void EEP2408_read_byte(unsigned char MyByte1)
{
I2C_TEA6320 = 0;
I2C_PCF8574 = 0;
I2C_EEPwrit = 0;
I2C_EEPread = 1;
EA = 1;
I2C_Byte1 = MyByte1; // Word Address
I2C_Status = I2C_BUSY; // I2C is now busy
SSCON = 0xC0; // enable I2C - no acknowledgements will be generated
SSCON = SSCON | 0x20; // request to transmit a start condition
while(I2C_Status == I2C_BUSY); // wait until I2C is no longer busy
SSDAT = 0xFF; //re-init SSDAT
} |
La fonction à l'initialisation et où je suis sur que le programme passe (test1 = 0 à l'init):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
void init_priority(void)
{
if (Test1 == 0)
{
EEP2408_ADDRESS = 0x05;
EEP2408_read_byte(EEP2408_ADDRESS);
#ifdef DEBUG_ME2 //testali0304
printf("\n");
#endif //testali0304
prior_MicDrive = EEP_READ;
pm = EEP_READ;
EEP2408_ADDRESS = 0x06;
EEP2408_read_byte(EEP2408_ADDRESS);
#ifdef DEBUG_ME2 //testali0304
printf("\n");
#endif //testali0304
prior_MicGui = EEP_READ;
pg = EEP_READ;
EEP2408_ADDRESS = 0x07;
EEP2408_read_byte(EEP2408_ADDRESS);
#ifdef DEBUG_ME2 //testali0304
printf("\n");
#endif //testali0304
prior_Rad = EEP_READ;
pr = EEP_READ;
EEP2408_ADDRESS = 0x08;
EEP2408_read_byte(EEP2408_ADDRESS);
#ifdef DEBUG_ME2 //testali0304
printf("\n");
#endif //testali0304
prior_Aux = EEP_READ;
pa = EEP_READ;
EEP2408_ADDRESS = 0x09;
EEP2408_read_byte(EEP2408_ADDRESS);
#ifdef DEBUG_ME2 //testali0304
printf("\n");
#endif //testali0304
prior_IN1 = EEP_READ;
pIN1 = EEP_READ;
EEP2408_ADDRESS = 0x0A;
EEP2408_read_byte(EEP2408_ADDRESS);
#ifdef DEBUG_ME2 //testali0304
printf("\n");
#endif //testali0304
prior_IN2 = EEP_READ;
pIN2 = EEP_READ;
EEP2408_ADDRESS = 0x0B;
EEP2408_read_byte(EEP2408_ADDRESS);
#ifdef DEBUG_ME2 //testali0304
printf("\n");
#endif //testali0304
prior_IN3 = EEP_READ;
pIN3 = EEP_READ;
}
Test1 = 1;
} |
la fonction pour afficher les datas :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
/*************************************************************************************
Function: debug_prior
Remarque: Pémermet de débuger des erreurs à l'attribution des priorités
**************************************************************************************/
void debug_prior(void)
{
#ifdef DEBUG_MEPrior //testali0304
printf ("Relisez les priorités attribuées puis corriger\n\r ");
printf ("Priority MIC >> PA set to : %Xh\n\r",prior_MicDrive);
printf ("Priority GUI >> PA set to : %Xh\n\r",prior_MicGui);
printf ("Priority RAD >> PA set to : %Xh\n\r",prior_Rad);
printf ("Priority AUX >> PA set to : %Xh\n\r",prior_Aux);
printf ("Priority IN1 set to : %Xh\n\r",prior_IN1);
printf ("Priority IN2 set to : %Xh\n\r",prior_IN2);
printf ("Priority IN3 set to : %Xh\n\r",prior_IN3);
#endif //testali0304
Read = P3_7;
Write = P3_6;
MIC = P1_0;
RAD = P1_1;
C_select1 = P5_2; //0605 re
C_select2 = P5_3; //0605 re
A_O = P0_0;
A_1 = P0_1;
A_2 = P0_2;
PIO_WR = P5_0;
PIO_RESET = P4_2; //0605 re
#ifdef DEBUG_MEPrior //testali0304
printf("Read %X\n",Read);
printf("Write %X\n", Write);
printf("CS0 %X\n", CS0);
printf("CS1 %X\n", CS1);
printf("CS0 %X\n", C_select1); //0605 ajout
printf("CS1 %X\n", C_select2); //0605 ajout
printf("AO %X\n", A_O);
printf("A1 %X\n", A_1);
printf("A2 %X\n", A_2);
printf("PIO_PWR %X\n", PIO_WR);
printf("PIO_RESET %X\n", PIO_RESET);
#endif //testali0304
} |
Enfin les routines du menu pour voir et configurer les priorités donc
pour ecrire dans l'eeprom.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
|
// r: To read priority
if (STR_IN[31]==0x72)/*||(STR_IN[31]==0x6F))*/
{
debug_prior();
Menu_Flag=0;
#ifdef DEBUG_MEPrior //testali0304
printf("-> Please press any key to exit\n");
#endif //testali0304
for (j=0;j<32;j++) STR_IN[j]=STR_IN[j+1];
STR_IN[31]=getchar0();
#ifdef DEBUG_MEPrior //testali0304
printf("%c\n",STR_IN[31]);
#endif //testali0304
}
// Q: Change Priority
if (STR_IN[31]==0x51) /*||(STR_IN[31]==0x71))*/
{
#ifdef DEBUG_MEPrior //testali0304
printf ("\nVeillez suivre les intructions SVP\n\r");
printf ("\n!CAUTION: Les priorités sont comprises entre 02-->08 inclus \n\r");
#endif //testali0304
ordre = 1;
do
{
if (ordre == 1)
{
ordre = 2;
prior_cond = 0x00;
EEP2408_ADDRESS = 0x05;
#ifdef DEBUG_MEPrior //testali0304
printf("La priorité actuel du MIC >> PA est : %Xh\n",prior_MicDrive);
printf("Introsuisez l'ordre de priorité pour MIC >> PA + <INTER>\n");
#endif //testali0304
do
{
for (j=0;j<32;j++) STR_IN[j]=STR_IN[j+1];
STR_IN[31]=getchar0();
#ifdef DEBUG_MEPrior //testali0304
printf("%c",STR_IN[31]);
#endif //testali0304
}
while (STR_IN[31]!=0x0D);
#ifdef DEBUG_MEPrior //testali0304
printf("\n\r");
#endif //testali0304
switch (STR_IN[29])
{
case 0x30:EEP2408_VALUE = 0x00; break;
default:
#ifdef DEBUG_MEPrior //testali0304
printf("ERROR WRONG PRIORITY Please Try again!\n\r");
#endif //testali0304
ordre = 1;
EEP2408_VALUE = 0xEE;
prior_cond = 0x01;
break;
}
if ( STR_IN[29] == 0x30)
{
switch (STR_IN[30])
{
case 0x32:EEP2408_VALUE+= 0x02; break;
case 0x33:EEP2408_VALUE+= 0x03; break;
case 0x34:EEP2408_VALUE+= 0x04; break;
case 0x35:EEP2408_VALUE+= 0x05; break;
case 0x36:EEP2408_VALUE+= 0x06; break;
case 0x37:EEP2408_VALUE+= 0x07; break;
case 0x38:EEP2408_VALUE+= 0x08; break;
default:
#ifdef DEBUG_MEPrior //testali0304
printf("ERROR WRONG PRIORITY Please Try again!\n\r");
#endif //testali0304
ordre = 1;
EEP2408_VALUE = 0xEE;
prior_cond = 0x01;
break;
}
#ifdef DEBUG_MEPrior //testali0304
printf(" DATA %Xh\n",EEP2408_VALUE);
#endif //testali0304
prior_MicDrive = EEP2408_VALUE;
pm = EEP2408_VALUE; // WARNING CHAR >< INT
Menu_Flag=0;
EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE); // Ecrit dans le EEPROM à l'adresse 05
}
}
if (ordre == 2)
{
ordre = 3;
prior_cond = 0x00;
EEP2408_ADDRESS = 0x06;
#ifdef DEBUG_MEPrior //testali0304
printf("La priorité actuel du GUIDE >> PA est : %Xh\n",prior_MicGui);
printf("Introsuisez l'ordre de priorité pour GUIDE >> PA + <INTER>\n");
#endif //testali0304
do
{
for (j=0;j<32;j++) STR_IN[j]=STR_IN[j+1];
STR_IN[31]=getchar0();
#ifdef DEBUG_MEPrior //testali0304
printf("%c",STR_IN[31]);
#endif //testali0304
}
while (STR_IN[31]!=0x0D);
#ifdef DEBUG_MEPrior //testali0304
printf("\n\r");
#endif //testali0304
switch (STR_IN[29])
{
case 0x30:EEP2408_VALUE = 0x00; break;
default:
#ifdef DEBUG_MEPrior //testali0304
printf("ERROR WRONG PRIORITY Please Try again!\n\r");
#endif //testali0304
ordre = 2;
EEP2408_VALUE = 0xEE;
prior_cond = 0x01;
break;
}
if ( STR_IN[29] == 0x30)
{
switch (STR_IN[30])
{
case 0x32:EEP2408_VALUE+= 0x02; break;
case 0x33:EEP2408_VALUE+= 0x03; break;
case 0x34:EEP2408_VALUE+= 0x04; break;
case 0x35:EEP2408_VALUE+= 0x05; break;
case 0x36:EEP2408_VALUE+= 0x06; break;
case 0x37:EEP2408_VALUE+= 0x07; break;
case 0x38:EEP2408_VALUE+= 0x08; break;
default:
#ifdef DEBUG_MEPrior //testali0304
printf("ERROR WRONG PRIORITY Please Try again!\n\r");
#endif //testali0304
ordre = 2;
EEP2408_VALUE = 0xEE;
prior_cond = 0x01;
break;
}
#ifdef DEBUG_MEPrior //testali0304
printf(" DATA %Xh\n",EEP2408_VALUE);
#endif //testali0304
prior_MicGui = EEP2408_VALUE;
pg = EEP2408_VALUE; // WARNING CHAR >< INT
Menu_Flag=0;
EEP2408_write_byte(EEP2408_ADDRESS,EEP2408_VALUE); // Ecrit dans le EEPROM à l'adresse 06
if (prior_MicDrive == prior_MicGui)
{
ordre = 2;
prior_cond1 = 0x01;
#ifdef DEBUG_MEPrior //testali0304
printf("ERROR!!La Priorité %X déjà Attribuée!! Please Try again!\n\r",EEP2408_VALUE);
#endif //testali0304
}
else {prior_cond1 = 0x00;}
}
}
if (ordre == 3)
{
ordre = 4;
prior_cond = 0x00;
EEP2408_ADDRESS = 0x07;
#ifdef DEBUG_MEPrior //testali0304
printf("La priorité actuel du RAD >> PA est : %Xh\n",prior_Rad);
printf("Introsuisez l'ordre de priorité pour RAD >> PA + <INTER>\n");
#endif //testali0304
do
{
for (j=0;j<32;j++) STR_IN[j]=STR_IN[j+1];
STR_IN[31]=getchar0();
#ifdef DEBUG_MEPrior //testali0304
printf("%c",STR_IN[31]);
#endif //testali0304
}
while (STR_IN[31]!=0x0D);
...... |
Pouvez vous dire la raison pour laquelle la capture après
le reset n'est pas la même?
Merci