Forum: Mikrocontroller und Digitale Elektronik Variable mit EEMEM Makro anlegen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Hans M. (lukem)


Angehängte Dateien:

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


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


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


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


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


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


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

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]
  • [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.