Forum: Compiler & IDEs EEPROM wird falsch beschrieben oder falsch gelesen


von delicious_cake (Gast)


Lesenswert?

hallo.

ich arbeite gerade an nem kleinen über IR fernsteuerbaren aktor mit 8 
kanälen. ich verwende den IRMP Decoder dazu. ich kann momentan für jeden 
Kanal von praktisch jeder fernsteuerung einen code lernen und mit diesem 
dann den kanal ein- und ausschalten. die codes werden dann im eeprom 
abgelegt und beim start wieder gelesen.

bis gestern hat alles auch hervorragend funktioniert. ich habe mir nur 
gedacht ein knopf auf der fernsteuerung der alle kanäle ausschalten kann 
wäre praktisch. gesagt, getan. ging beim ersten versuch. dann hab ich 
überprüft ob auch noch richtig gespeichert wird.

und da war das problem. es werden nur die tasten für die 2 ersten kanäle 
richtig geladen und der rest ist weg.

Das ist meine Lernfunktion. (abgeändert von Servo-Controlled 
IR-Transmitter) die funktion habe ich aber seit sie einmal funktioniert 
hat nicht mehr verändert.
1
/
2
#define CHANNELS  8
3
#define BUTTONS    CHANNELS + 1
4
5
*---------------------------------------------------------------------------------------------------------------------------------------------------
6
 * Learning-Mode: When an IR signal arrives, it is saved in an array position related to the actual servo positions
7
 *---------------------------------------------------------------------------------------------------------------------------------------------------
8
 */
9
void Learn(void)
10
{
11
  WaitForKeyRelease();
12
  while(1)
13
  {
14
    Flash(200,200,1);                   // fast flash LED 10 times to indicate a learned code
15
16
    if (irmp_get_data (&IR_data))        // when IR code is decoded,
17
    {
18
      IR_data.flags = 0;                 // ignore repeat-flag
19
      stored_ir_data[selection] = IR_data;      // populate the array
20
      Flash(25,25,5);                   // fast flash LED 10 times to indicate a learned code
21
    break;
22
    }
23
  if(KEY2==0)
24
  {
25
      Flash(100,100,2);                   // fast flash LED 10 times to indicate a learned code
26
    break;
27
  }
28
  }
29
  // Write to EEPROM  
30
  eeprom_write_block(&stored_ir_data,&ee_ir_data,sizeof(unsigned char)BUTTONS*6);
31
}
32
33
while(1){....}
34
}

und das ist der anfang des programms mit der lesefunktion:
1
int main (void)
2
{ int i;
3
4
  cpu_clock_init();
5
  io_init();
6
  timer_init();                                                             // initialize timer
7
8
  sei ();                                                                   // enable interrupts
9
10
  if (eeprom_read_byte(&ee_check)!=0xE7) // When EEPROM is uninitialized, do it now
11
  {
12
    for (i=0;i<8;i++)
13
    {
14
        stored_ir_data[i].protocol = 0;
15
        stored_ir_data[i].address = 0;
16
        stored_ir_data[i].command = 0;
17
        stored_ir_data[i].flags = 0;    
18
    } 
19
    
20
    eeprom_write_byte(&ee_check, 0xE7);
21
    eeprom_write_block(&stored_ir_data,&ee_ir_data,sizeof(unsigned char)*BUTTONS*6);
22
  }
23
24
  else                                   // else, read in the contents
25
  {
26
    eeprom_read_block(&stored_ir_data,&ee_ir_data,sizeof(unsigned char)*BUTTONS*6);
27
  }

ich nehme an ich habe irgendwo einen ganz kleinen fehler gemacht und ich 
finde ihn nur nicht. ich freue mich aber über jede hilfe

von delicious_cake (Gast)


Lesenswert?

write to eeprom sieht in der learn funktion natürlich so aus:
1
// Write to EEPROM  
2
eeprom_write_block(&stored_ir_data,&ee_ir_data,sizeof(unsigned char)*BUTTONS*6);

von Stephan W. (sir_wedeck)


Lesenswert?

Hi,
Eigentlich wollte ich nichts schreiben, weil dies hier wieder so eine 
Glaskugel-Geschichte ist.
Aber ich versuche es mal:

Alle Änderungen die gemacht worden sind, seit dem es nicht mehr läuft, 
rückgängig machen. Dann Schrittweise die Änderungen hinzufügen und jedes 
mal auf Funktion, das Programm testen.

mal eine Frage:
Wo hast du so was gelernt????
1
eeprom_write_block(&stored_ir_data,&ee_ir_data,sizeof(unsigned char)*BUTTONS*6);
das ist unterstes Level!!!
Wenn sich die Struktur oder der Buffer ändert, bekommt das die Funktion
nicht mit!

Wie sind denn die sizeof Werte der beiden?
Wenn die Größen nicht stimmen, hast du deinen Fehler schnell gefunden.

Stephan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.