www.mikrocontroller.net

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


Autor: delicious_cake (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
/
#define CHANNELS  8
#define BUTTONS    CHANNELS + 1

*---------------------------------------------------------------------------------------------------------------------------------------------------
 * Learning-Mode: When an IR signal arrives, it is saved in an array position related to the actual servo positions
 *---------------------------------------------------------------------------------------------------------------------------------------------------
 */
void Learn(void)
{
  WaitForKeyRelease();
  while(1)
  {
    Flash(200,200,1);                   // fast flash LED 10 times to indicate a learned code

    if (irmp_get_data (&IR_data))        // when IR code is decoded,
    {
      IR_data.flags = 0;                 // ignore repeat-flag
      stored_ir_data[selection] = IR_data;      // populate the array
      Flash(25,25,5);                   // fast flash LED 10 times to indicate a learned code
    break;
    }
  if(KEY2==0)
  {
      Flash(100,100,2);                   // fast flash LED 10 times to indicate a learned code
    break;
  }
  }
  // Write to EEPROM  
  eeprom_write_block(&stored_ir_data,&ee_ir_data,sizeof(unsigned char)BUTTONS*6);
}

while(1){....}
}

und das ist der anfang des programms mit der lesefunktion:
int main (void)
{ int i;

  cpu_clock_init();
  io_init();
  timer_init();                                                             // initialize timer

  sei ();                                                                   // enable interrupts

  if (eeprom_read_byte(&ee_check)!=0xE7) // When EEPROM is uninitialized, do it now
  {
    for (i=0;i<8;i++)
    {
        stored_ir_data[i].protocol = 0;
        stored_ir_data[i].address = 0;
        stored_ir_data[i].command = 0;
        stored_ir_data[i].flags = 0;    
    } 
    
    eeprom_write_byte(&ee_check, 0xE7);
    eeprom_write_block(&stored_ir_data,&ee_ir_data,sizeof(unsigned char)*BUTTONS*6);
  }

  else                                   // else, read in the contents
  {
    eeprom_read_block(&stored_ir_data,&ee_ir_data,sizeof(unsigned char)*BUTTONS*6);
  }

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

Autor: delicious_cake (Gast)
Datum:

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

Autor: Stephan W. (sir_wedeck)
Datum:

Bewertung
0 lesenswert
nicht 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????
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.