ATMega168, mySmart USB light und EEPROM Variable initialisieren

OP #4937538
Hallo,

ich habe folgendes Problem:
In unten stehendem Code-Ausschnitt soll eine Variable im EEPROM angelegt 
und initialisiert werden. Leider funktioniert genau das nicht.
Die Variable erhalt weder ihre Init-Werte, noch läuft das Programm 
danach sauber weiter.

Ich vermute, mein Programm hängt sich auf, weil unzulässige Werte von 
der EEPROM_READ_BLOCK zurückgegeben werden, die den ATMega zu Absturz 
bringen.

Kommentiere ich die Zeile mit EEPROM_READ_BLOCK aus, dann läuft mein 
Programm wie erwartet.

Ich vermute, dass die Variable im EEPROM schon falsch angelegt wird. Hat 
jemand Erfahrung mit Variablen im EEPROM und dem mySmartUSBlight (im 
Modus STK500)? FW ist aktuell laut myAVR.

Meine RS232 Ausgabe lautet:

Reading EEPROM...
383
0
Attentuation = 0


1
volatile mcSettings EEMEM eeSet = {.channelIndex = 0, .muteL = 1, .muteR = 0, .attentuations = {61, 61}, .brightness = 0, .eepromStartAddress = 0, .eepromWriteCycles = 0};
2
volatile mcSettings set_ram;    // once filled with EEPROM values and cyclic written to EEPROM
3

4

5
volatile uint8_t attentuation;
6

7

8
int main (void){
9
  cli();
10
  usart_puts("\n\rReading EEPROM... \n\r");
11
  usart_puti(&set_ram);
12
  usart_puts("\n\r");
13
  usart_puti(&eeSet);
14
  usart_puts("\n\r");
15
  eeprom_read_block((void*)&set_ram, (void*)&eeSet, sizeof(mcSettings));
16
  //eeprom_busy_wait();
17
  
18
  attentuation = set_ram.attentuations[set_ram.channelIndex];
19

20
  sei();
21

22
while(1){
23
    _delay_ms(300);
24
    PORTC ^= _BV(LED1);
25
    //OCR0B = 0x100F;
26

27

28

29

30
    usart_puts("Attentuation = ");
31
    unsigned char buffer[4];
32
    itoa(attentuation, &buffer, 10);
33
    usart_puts(buffer);
34
    usart_puts("\n\r");
35
        }
36
}
37
// USART
38
void usartInit(uint8_t ubrr){
39
  //Set baud rate
40
  UBRR0H = (unsigned char)(ubrr>>8);
41
  UBRR0L = (unsigned char)ubrr;
42
  //Enable receiver and transmitter
43
  UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
44
  //Set frame format: 8data, 1stop bit
45
  UCSR0C = ((1 << UCSZ01)|(1 << UCSZ00)); // Asynchron 8N1
46
}
47
unsigned char usart_receive( void )
48
{
49
  while ( !(UCSR0A & (1<<RXC0)) )                            // Wait for data to be received
50
  ;
51
  return UDR0;
52
}
53

54
void usart_puts(const char str[]){
55
  int i =0;
56
  while (str[i] != 0x00){
57
    while (!( UCSR0A & (1<<UDRE0)));                        // Wait for empty transmit buffer
58
    UDR0 = (str[i]);
59
    i++;
60
  }
61
}
Beitrag #4937620 wurde von einem Moderator gelöscht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.