Variable mit EEMEM Makro anlegen

OP #4751994
Hallo zusammen,

ich möchte mit dem EEMEM Makro eine Variable im EEPROM anlegen, diese 
beschreiben und anschließend wieder auslesen.

Um zu sehen was in der Variable steht, übertrage ich die Variable mit 
dem Uart.

Ich beschreibe die Variable test_byte mit 0x40 was nach der ASCII 
Tabelle das @ Zeichen ist. Leider bekomme ich dieses Zeichen aber nicht 
angezeigt. Was mache ich falsch?

1
Atmel ATmega328p, Arduino Uno 
2

3
#define EEMEM __attribute__ ((section (".eeprom")))
4

5
#define F_CPU 16000000UL
6
#define BAUDRATE 9600
7
#define BAUD_PRESCALLER (((F_CPU / (BAUDRATE * 16UL))) - 1)
8

9

10
#include <avr/eeprom.h>
11
#include <avr/io.h>
12
#include <util/delay.h>
13

14
unsigned char test_byte EEMEM = 0x40;
15

16
void usart_init()
17
{
18
  // Baudrate einstellen
19
  UBRR0H = (unsigned char)(BAUD_PRESCALLER >> 8);
20
  UBRR0L = (unsigned char)(BAUD_PRESCALLER);
21
  // asynchroner USART Modus
22
  UCSR0C &= ~((1 << UMSEL01)|(1 << UMSEL00));
23
  // 8-Datenbits
24
  UCSR0C |= (1 << UCSZ00)| (1 << UCSZ01);
25
  // 1-Stoppbit
26
  UCSR0C &= ~(1 << USBS0);
27
  // USART Sende- und Empfangseinheiten aktivieren
28
  UCSR0B = (1 << RXEN0)|(1 << TXEN0);  
29
}
30

31
void usart_put_byte(unsigned char data)
32
{
33
  while((UCSR0A & (1 << UDRE0)) == 0); // Senderegister frei?
34
  UDR0 = data;
35
}
36

37
void usart_put_string(char *string_ptr)
38
{
39
  while(*string_ptr != 0x00)
40
  {
41
    usart_put_byte(*string_ptr);
42
    string_ptr++;
43
  }
44
}
45

46
int main(void){
47
  
48
  unsigned char test;
49
  usart_init();
50
  while(1)
51
  {
52
    test = eeprom_read_byte(&test_byte);
53
    usart_put_string(" &test_byte =");
54
    usart_put_byte(test);
55
    //usart_put_byte(0x0A);
56
    _delay_ms(1000);
57
  }
58
  return 0;
59
}
Angehängte Dateien:
#4752107
Kann es sein, dass das Eeprom beim Programmieren nicht beschrieben wird? 
Je nach Entwicklungsumgebung wird beim Programmieren alles (Flash und 
Eeprom) oder aber nur das Flash beschrieben.

Probier mal mit
1
    usart_put_string(" &test_byte =");
2
    test = 0x40;
3
    usart_put_byte(test);
ob Deine Variable test richtig übertragen wird.
Wenn das klappt, dann kannst Du das Eeprom vom Prograamm aus 
beschreiben, bevor Du es benutzt:
1
  usart_init();
2
  eeprom_write_byte(&test_byte, 0x40);
3
  while(1)
4
  {

Gruß, Stefan
OP #4753168
Rainer B. schrieb:
> Welche Toolchain und welches Flashtool/Bootloader

Ich verwende die Atmel AVR GNU Toolchain. Um mit dem Arduino zu 
kommunizieren den Avrdude Bootloader.

Stefan K. schrieb:
> Kann es sein, dass das Eeprom beim Programmieren nicht beschrieben wird?

Ja, das scheint so zu sein. Ich habe versucht was du geschrieben hast. 
Die Initialisierung mit 0x40 funktioniert nicht:
1
unsigned char test_byte EEMEM = 0x40;

Stefan K. schrieb:
> Je nach Entwicklungsumgebung wird beim Programmieren alles (Flash und
> Eeprom) oder aber nur das Flash beschrieben.

Muss ich also eien andere Einstellung im AVR Studio / Toolchain wählen, 
damit die Initialisierung so funktionniert?
#4753178
Es gibt doch die Funktion eeprom_write_byte(). Damit würde ich einfach 
nach dem ersten Senden die gewünschten 0x40 reinschreiben. Oder auch 
jeden Durchlauf einen anderen Wert von 0x30..0x39.
Die eeprom-Daten werden übrigens in ein eigenes File gepackt und werden 
nicht immer automatisch "mitgeladen".
#4753294
Ich benutze das Atmel Studio 6.2, und da kannst Du unter Project 
Properties das Verhalten beim Programmieren einstellen:
Wenn Du das Eeprom beim Programmieren beschreiben willst, dann musst Du 
den Haken bei "Preserve Eeprom" entfernen.

Gruß, Stefan

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 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.