Variable mit EEMEM Makro anlegen

OP #4751994
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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".

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren