Forum: Mikrocontroller und Digitale Elektronik Arduino EEPROM _read_block HOW TO?


von Daniel B. (yzdani)


Lesenswert?

Servus,

ich möchte einen 16Bit Zahlenwert in den EEPROM des Arduino MEGAS 
schreiben.

das mach ich wie folgt:
1
void loop() {
2
  // put your main code here, to run repeatedly:
3
  
4
  if(Serial.available()){
5
    int input = Serial.read();
6
 
7
 eeprom_write_block(0,&input,sizeof(2));
8
    delay(1000); 
9
 }
10
}

nach dem  delay soll er den gespeicherten  Wert wieder zurück an die 
UART senden.
kann mir wer beim auslesen helfen?

ich  verwende die AVR/EEPROM libary.

Danke im Voraus!

Gruss
Dani

von Karl H. (kbuchegg)


Lesenswert?

Daniel R. schrieb:
> Servus,
>
> ich möchte einen 16Bit Zahlenwert in den EEPROM des Arduino MEGAS
> schreiben.
>
> das mach ich wie folgt:
>
>
1
void loop() {
2
>   // put your main code here, to run repeatedly:
3
> 
4
>   if(Serial.available()){
5
>     int input = Serial.read();
6
> 
7
>  eeprom_write_block(0,&input,sizeof(2));
8
>     delay(1000);
9
>  }
10
> }
11
>
>
> nach dem  delay soll er den gespeicherten  Wert wieder zurück an die
> UART senden.
> kann mir wer beim auslesen helfen?
>

  int output
  eeprom_read_block(0,&output,sizeof(2));


anstatt sizeof(2) schreibst du besser sizeof(int) oder noch besser 
sizeof(output).

Für 16 Bit Einheiten gibt es dann auch noch die speziellen Funktionen
eeprom_read_word ( eeprom Adresse);
eepom_write_word ( eeprom Adresse, Wert);


https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM

von Karl H. (kbuchegg)


Lesenswert?

Hmmm.
Im Zusammenhang mit deiner Konfigurationsfrage im PC-Programmierung 
Bereich

Bist du sicher, dass du das
1
     int input = Serial.read();
so machen möchtest?

Wenn du am PC den Text "345" wegschickst, dann kriegst du hier nicht 
einen int mit dem Wert 345 heraus. Sondern du kriegst nacheinander die 
ASCII Codes des Buchstaben '3', '4' und '5'. Als Zahlenwerte dann eben 
51 (hex 0x33), 52 (hex 0x34) und 53 (hex 0x35).

Entweder du setzt die einzelnen Zeichen dann selbst zusammen oder du 
benutzt die Serial Memberfunktion parseInt

https://www.arduino.cc/en/Reference/Serial

von Daniel B. (yzdani)


Lesenswert?

Vielen Dank für die hilfreichen Antworten!

funktioniert wunderbar bzw.  hat....

wollt den Wert einem Delay übergeben und seit dem  bekomme ich im 
Terminal immer eine Null zurück-Warum?
1
#include <avr/eeprom.h>
2
3
int timerwert=0;
4
5
void setup() {
6
  // put your setup code here, to run once:
7
//eeprom_read_block((void*)&settings, (void*)0, sizeof(settings));
8
Serial.begin(115200);
9
pinMode(13,OUTPUT);
10
}
11
12
void loop() {
13
  
14
  if(Serial.available()){
15
   
16
   
17
   int input = Serial.parseInt();
18
   if(Serial.read()=='\n'){
19
    input = input;
20
    eeprom_write_word(0,input);
21
    delay(1000);  
22
    word output=  eeprom_read_word(0);
23
    output = timerwert;
24
  
25
    Serial.print(output);
26
    Serial.println();
27
    
28
    }
29
   
30
  }
31
 delay(timerwert);
32
  digitalWrite(13,HIGH);
33
  delay(timerwert);
34
  digitalWrite(13,LOW);
35
  
36
  
37
}

von Karl H. (kbuchegg)


Lesenswert?

Daniel R. schrieb:

>     word output=  eeprom_read_word(0);
>     output = timerwert;

Gratulation.
Du hast dir mit der Zuweisung soeben das aus dem EEPROM ausgelesene 
zerstört.

von Daniel B. (yzdani)


Lesenswert?

joap ...

Danke nochmals!

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.