Autor |
Internes ATmega48 EEPROM schreiben/lesen |
|
|
|
|
BID = 432205
stuckima Neu hier
Beiträge: 26 Wohnort: Schweiz, Bern
|
|
Hallo zusammen
Ich habe wieder einmal ein Problem und möchte gerne eure Hilfe beanspruchen.
Folgendes:
Ich will mit meine ATmega48 das interne EEPROM verwenden.
Also habe ich im Datenblatt geschaut und auch im Internet. Als ich dann einen kleinen Überblick hatte kopierte ich das C Code Beispiel aus dem Datenblatt in meinen Code hinein.
Dort Programmierte ich dann folgende Funktion:
Über einen Schalter wird ein analoger Wert eingelesen und gleich auf das EEPROM gespeichert. Mit einem anderen Schalter wird dann dieser Wert mit der Seriellen Schnittstelle übertragen und auf dem HyperTerminal dargestellt.
Serielle Schnittstelle (UART) und Analog Digital Wandler funktionieren.
Leider funktioniert dieses Programm nicht. Das HyperTerminal gibt keine Zeichen aus man kann aber erkennen, dass der Cursor vorwärts geht.
Kann mir vielleicht jemand ein C Code Beispiel zeigen wo das EEPROM beschrieben und gelesen wird?
Oder sonst ein gute Seite zu diesem Problem. Denn ich habe wie es scheint das ganze EEPROM Zeugs noch nicht richtig Begriffen.
Ich danke euch schon einmal.
Gruss Mathias
[ Diese Nachricht wurde geändert von: stuckima am 25 Mai 2007 10:57 ] |
|
BID = 432211
hajos118 Schreibmaschine
Beiträge: 2453 Wohnort: Untermaiselstein
|
|
Typischerweise greife ich auf das eeprom mit den Funktionen aus eeprom.h zu (bei mir -> C:\WinAVR\avr\include\avr\eeprom.h)
Darin sind ASM - Routinen definiert, welche den Zugriff dann ausführen.
Hat eigentlich immer geklappt (also hab' ich auch nicht die einzelnen Routinen aus dem headerfile "zerpflückt").
|
|
BID = 432247
stuckima Neu hier
Beiträge: 26 Wohnort: Schweiz, Bern
|
Danke für die schnelle Antwort.
habe meinen Code so angepasst:
Code : |
eeprom_write_byte ( 0x000A, ADC_Result ); //ADC Wert in EEPROM Speichern --> Adresse 0x000A |
|
Code : |
EEPROM_Data = eeprom_read_byte ( 0x000A ); //EEPROM Wert aus Adresse 0x000A lesen und auf Variable Speichern |
|
Nun bekomme ich aber diese Fehlermeldung beim kompilieren:
../EEPROM_test.c:128: warning: passing argument 1 of 'eeprom_write_byte' makes pointer from integer without a cast
Jetzt habe ich leider keine Ahnung (mehr) von Pointer. Was muss ich alles anschauen und lernen damit ich das EEPROM unter AVR verstehe und auch verwenden kann?
|
BID = 432258
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
So Datenblätter werden ja nicht umsonst gemacht, da sind alle Register erklärt, die man beschreiben muss, in welcher Reihenfolge und welche Funktionen jedes Bit innerhalb eines Registers hat.
Jetzt nimmst du einfach dein Datenblatt, guckst, welche Bits wie zu beschreiben sind und machst dann das nächste Register.
Mach mal nen Vorschalg und wir werden dir dann gerne weiterhelfen
PS:
Zitat :
|
eeprom_write_byte' makes pointer from integer without a cast
|
Du musst die Adresse der Variablen übergeben, das kannst du mit dem Adressoperator & machen:
Beispiel:
void sub_programm(unsigned char *argument)
{
...
};
Aufruf:
unsigned char var_1=0x10; //oder so
//unterprogramm aufrufen und Adresse von var_1 übergeben:
sub_programm(&var_1);
_________________
|
BID = 432261
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
So Datenblätter werden ja nicht umsonst gemacht, da sind alle Register erklärt, die man beschreiben muss, in welcher Reihenfolge und welche Funktionen jedes Bit innerhalb eines Registers hat.
Jetzt nimmst du einfach dein Datenblatt, guckst, welche Bits wie zu beschreiben sind und machst dann das nächste Register.
Mach mal nen Vorschalg und wir werden dir dann gerne weiterhelfen
PS:
Zitat :
|
eeprom_write_byte' makes pointer from integer without a cast
|
Du musst die Adresse der Variablen übergeben, das kannst du mit dem Adressoperator & machen:
Beispiel:
void sub_programm(unsigned char *argument)
{
...
};
Aufruf:
unsigned char var_1=0x10; //oder so
//unterprogramm aufrufen und Adresse von var_1 übergeben:
sub_programm(&var_1);
_________________
|
BID = 432276
stuckima Neu hier
Beiträge: 26 Wohnort: Schweiz, Bern
|
So mittlerweile hat es geklappt!!
Ich danke vielmals.
Folgendes hat mir geholfen:
Zitat :
| Typischerweise greife ich auf das eeprom mit den Funktionen aus eeprom.h zu (bei mir -> C:WinAVRavrincludeavreeprom.h)
Darin sind ASM - Routinen definiert, welche den Zugriff dann ausführen. |
Zitat :
| Du musst die Adresse der Variablen übergeben, das kannst du mit dem Adressoperator & machen:
Beispiel:
void sub_programm(unsigned char *argument)
{
...
};
Aufruf:
unsigned char var_1=0x10; //oder so
//unterprogramm aufrufen und Adresse von var_1 übergeben:
sub_programm(&var_1); |
Momentan verstehe ich noch nicht ganz was ich mache. Aber jetzt werde ich noch die Pointer studieren und auch noch einmal genau das Datenblatt lesen.
Wünsche ein schönes Wochenende
Gruss Mathias
|
BID = 432289
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Kurz zu Pointern:
Wenn man bei Funktionen beispielsweise Parameter übergibt, dann kann man das auf zwei Wege tun:
- Ich übergebe den Wert einer Variablen (geht für z.b. ein Byte schneller, für einen String unpraktisch/bis unmöglich beim AVR)
- Ich übergebe die Adresse (z.b. bei einer Variablen mit nur einem Byte) oder die Adressbasis (bei einer Variablen, die mehr als ein Byte belegt die Adresse der ersten Zelle)
Beispiel:
unsigned short a=0xFFFF; //Variable a vom Typ unsigned short
unsigned short *pa=&a; //Zeiger pa (pointer auf a) vom Typ Zeiger auf unsigned short
_________________
[ Diese Nachricht wurde geändert von: DonComi am 25 Mai 2007 17:24 ]
|