Forum: Mikrocontroller und Digitale Elektronik Variable mit EEMEM Makro anlegen


von Hans M. (lukem)


Angehängte Dateien:

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
}

von Rainer B. (katastrophenheinz)


Lesenswert?

Welches Zeichen bekommst du denn angezeigt/was wird übertragen?
Welche Toolchain und welches Flashtool/Bootloader verwendest du?
Ist die in der Lage, neben Flash auch Eeprom-Inhalte zu übertragen?

von Stefan K. (stefan64)


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

von Hans M. (lukem)


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?

von Carl D. (jcw2)


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

von M. K. (sylaina)


Lesenswert?

Hans M. schrieb:
> Ja, das scheint so zu sein. Ich habe versucht was du geschrieben hast.
> Die Initialisierung mit 0x40 funktioniert nicht:

Hast du denn auch das EEPROM-File (endet auf .eep) an den AVR 
übertragen?

von Stefan K. (stefan64)


Lesenswert?

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

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.