Guten Tag zusammen,
ich versuche schon seit 2 Tagen den Fehler in meinem Programm zu finden,
nun scheine ich dem Problem sehr nahe zu sein. in dem unten angehängten
programmteil soll der wert einer variablen in den EEprom geschrieben
werden und nacher wieder ausgelesen werden. wenn ich nun das programm
starte wird aber als ausgelesener wert immer 122 angezeigt...
Irgendetwas stimmt mit dem Speicherort auf dem EEPROM nicht.
Kann mir vll jemand weiterhelfen?
Es soll der intern EEPROM verwendet werden.
Hardware:
ATmega8
16 MHz Quarz
LCD an PORTB
1
#include<avr/io.h>
2
#include"lcd-routines.h"
3
#include<util/delay.h>
4
#include<stdlib.h>
5
#include<avr/eeprom.h>
6
#include<inttypes.h>
7
8
#ifndef EEMEM // alle Textstellen EEMEM im Quellcode durch __attribute__ ... ersetzen
Hi
schau dir nochmal hier das AVR-GCC-Tutorial an!
Der erste Parameter der an read und write übergeben wird ist immer der
Pointer auf die EEProm Variable und dann folgt beim write der neue Wert.
'counter' ist bei dir eine lokale Variable deshalb geht es nicht!
Und warum versuchst du an EINE Adresse ZEHN Werte zu schreiben???
Mein Vorschlag wäre ein Array!?!
1
#include<avr/io.h>
2
#include"lcd-routines.h"
3
#include<util/delay.h>
4
#include<stdlib.h>
5
#include<avr/eeprom.h>
6
#include<inttypes.h>
7
8
#ifndef EEMEM // alle Textstellen EEMEM im Quellcode durch __attribute__ ... ersetzen
thx für die Antwort.
Was bewirkt denn der Anhang EEMEM?
und das mit dem array hab ich auch schon probiert werd ich dann wohl
auch wieder umstellen.
Was mich noch ein wenig wundert, warum hast du gemeint ich will 10 werte
auf einen Speicherplatz schreiben? ich habe den schribvorgang ja in
einer for schleife, der counter wird jedes mal um 1 erhöht. Dieser dient
ja auch als angabe de Speicherortes, also wird dieser auch jedes mal um
1 erhöht.
Mfg Pat
hab den code nun ein wenig umgeschrieben, aber das ganze funktioniert
immer noch nicht. auf dem display wird folgendes angezeigt:
0*0 0*1
*20 *40
an den stellen wo ich das * eingesetzt habe sind undefinierbare zeichen
der größtteil ist schwarz und es sind alle 4 gleich
hier noch der neue Code:
1
#include<avr/io.h>
2
#include"lcd-routines.h"
3
#include<util/delay.h>
4
#include<stdlib.h>
5
#include<avr/eeprom.h>
6
#include<inttypes.h>
7
8
#ifndef EEMEM // alle Textstellen EEMEM im Quellcode durch __attribute__ ... ersetzen
Hi Patrick
du hast dir das Tutorial scheinbar nicht ausreichend angesehen.
1
ee_test1=counter*2;
2
ee_test2=counter*2+1;
Das geht NICHT!!! Du kannst nicht direkt auf Vars im EEProm zugreifen,
dafür sind ja die Funktionen da.
1
eeprom_read_byte
2
eeprom_write_byte
>Was bewirkt denn der Anhang EEMEM?
Das sorgt dafür das die Variable nicht im RAM sondern im EEProm landet.
Und damit ist die Variable nicht mehr für dich zugänglich. (s.o)
>Was mich noch ein wenig wundert, warum hast du gemeint ich will 10 werte>auf einen Speicherplatz schreiben? ich habe den Schreibvorgang ja in>einer for schleife, der counter wird jedes mal um 1 erhöht.
Also du Veränderst den Wert in der Variable 'counter' aber der
Speicherort (Adresse) bleibt immer konstant.
in deinem 2. Beispiel das selbe!
Guten Morgen zusammen,
ich glaub in dieser zEILE LIEGT DER fEHLER.
1
ee_test1=counter*2;
2
ee_test2=counter*2+1;
mein ziel war es hier den counter, welcher bei jedem durchlauf um 1
erhöht wird so zu verarbeiten, dass ich den EEPROM fortlaufend
beschreibe. Also im ersten Durchlauf, wenn der counter noch 0 ist:
Adresse für var1: counter = 0 mal 2 = 0
Adresse für var2: counter = 0 mal 2 plus 1 = 1
Also wären die Adressen in diesem ersten Durchlauf 0 und 1.
Im 2. Durchlauf wären Sie dann folglich wenn counter = 1 dann 2 und 3
Die Adresse würden dann eben so berechnet werden und dann mit dem
verfahren, welches Stefan Ernst beschrieben hat beschrieben werden.
Mfg, Pat
ich glaub ich hab eh noch ein Problem mit der Größe meiner Variablen, da
die gar nicht auf eine Adresse passen, oder passte der Compiler das dann
so weit an?
nun die Variable wird ja in einem Byte auf dem EEPROM gespeichert, wenn
sie nun aber so groß ist, dass sie beispielsweise 2 Byte belegt wird ja
das nachfolgende auch belegt. wenn zum beispiel nun das erste byte die
adresse 1 hat, hat das 2. ja im normalfall die 2 oder wird das dann so
angepasst, dass die 2 erst nach diesem block kommt?
Oh mann ich muss des tut nommel anschaun
Mfg Pat
ok ich hab nun um das ganze etwas übersichtlicher zu machen den Code so
umgeschrieben, dass er funktioniert.
Hier ist die Funktion welche die beiden Zeilen
1
ee_test1=counter*2;
2
ee_test2=counter*2+1;
übernehmen sollen vielleicht etwas besser sichtbar und es ist glaub auch
einleuchtend warum ich das nicht für 5 * 50 Adressen machen möchte xD.
Code:
1
#include<avr/io.h>
2
#include"lcd-routines.h"
3
#include<util/delay.h>
4
#include<stdlib.h>
5
#include<avr/eeprom.h>
6
#include<inttypes.h>
7
8
#ifndef EEMEM // alle Textstellen EEMEM im Quellcode durch __attribute__ ... ersetzen
Ok!
hier mal meine Version für dich.
Ich habe es aus dem Kopf gemacht, ich kann es hier nicht Übersetzen,
also könnte Schreibfehler vorhanden sein.
Melde dich nochmal wenn du es hin bekommen hast.
mfg
Stephan
Vielen Dank, dass du die Geduld hast mir das ganze zu erklären. Nur hat
mich das mit deinem Dirkter Zugriff nicht möglich!! Und ich weiß nun
auch was du damit meintest. Aber ziel dieser Zeile war es nicht den
Inhalt anzuzeigen sondern die Adresse. Also die Variable, welche die
Adresse angibt.
Dein Code läuft soweit auch nur, dass der counter stetig hochzählt und
der Inhalt jedes 2. Mal 255 ist. werd mich mal auf fehlersuche machen
und dann endlich was funktionsfähiges zusammenbauen ^^
MfG Pat
Hi
:-(
da kann ich dir erstmal so nicht weiter helfen. (mehr Infos)
Du bist sicher das deine Ausgabe (LCD) läuft?
Zum Test könntest du mal den Funktionsaufruf 'auslesen()' mit dem hier
ersetzen 'auslesen2()' und dieses in dein Programm einfügen. (vor Main)
1
#include<stdio.h>
2
3
voidauslesen2(void)
4
{
5
set_cursor(1,1);
6
sprintf_P(ITOA_Buffer,"Counter=%d",counter);
7
lcd_string(ITOA_Buffer);
8
}
Wenn die Ausgabe richtig läuft, solltest du:
Counter=0, Counter=1 ... sehen.
mfg
Stephan
jaja das funzt alles so weit der code, den ich gepostet habe
funktioniert nun auch, und zwar auch mit dieser lösung:
1
ee_test1=counter*2;
2
ee_test2=counter*2+1;
^^
thx nochmal, bin grad an meim großen coede das ganze zu verbessern, da
wird das ausm EEPROM dann per UART versendet. das einzige prob is noch
dasses nimme aufhört zu senden xD, dass also zu viel in den EEPROM
gespeichert wurde ^^
aber das wird noch, da is bestimmt irgendwo bloß ne schleife oder so ^^
MfG Pat