Hallo Zusammen,
ich habe ein kleines Problem mit den EEPROM-Routinen.
Controller ATMEGA8,
AVR Studio und aktuelle Version Win-AVR.
Das Problem habe ich mit folgendem Aufruf:
1
uint8_teeChannelEEMEM=5;// Grundzustand
2
uint8_tChannel;
3
4
uint8_treadValueFromEprom(void)
5
{
6
returneeprom_read_byte(&eeChannel);
7
}
8
9
intmain(void)
10
{
11
channel=1;
12
// funktioniert nicht
13
channel=readValueFromEprom();
14
15
// funktioniert
16
channel=eeprom_read_byte(&eeChannel)
17
}
Warum funktioniert dieser Aufruf nicht? Die Werte werden nicht aus dem
EEPROM gelesen. eep-Datei wurde korrekt zum Controller übertragen.
Irgendwie verstehe ich da was nicht.
Könnt Ihr helfen?
Gruß
Frank
...und funktionieren tut's wahrscheinlich nicht, weil der Compiler
erkennt, dass nirgends mit dem Inhalt von channel gearbeitet wird, und
er daher alle Zuweisungen außer der letzten wegoptimiert..
Hallo Jupp,
ne, dass ist nur ein Auszug aus dem gesamten Code. Ich hatte das nur
beispielhaft aufgeführt. Den gesamten Code findest Du in der
Codesammlung
unter 'Platine und Software für ALPS-Motorpotentiometer' ganz unten in
der Version 1.1.
Das gleiche Problem habe ich auch mit eeprom_read_block.
Gruß Frank
Das ist mir dann allerdings auch ein Rätsel. Im Simulator funktioniert
die Funktion, nachdem man sie in Deinen Quelltext eingefügt hat,
zumindest einwandfrei... genau wie eeprom_read_block auch.
Genau die Erfahrung habe ich auch gemacht. Lade ich das ganze auf meinen
ATEMAG8 mit 4 MHZ funktioniert es leider nicht mehr. Und ich habe schon
alle Varianten die ich im Internet in Bezug auf die eeprom_read_block
gefunden habe ausprobiert.
Ich vermutet es ist irgendeine Kleinigkeit -:(
Irgendwann werde ich es finden oder ich bekomme den entscheidenden Tip.
Aber ohne diese Funktionen funktioniert leider auch die Lernfunktion
nicht.
Vieleicht noch eine Merkwürdigkeit, der Programmer gibt mir folgende
Meldung aus, wenn ich das eep-File ins EPROM schreibe:
'Data in file does not fit in EEPROM. Proceed and programm all bytes
that fit'
Im Anhang mal das eep-File. Man könnte meinen, dass der AVRprog mit den
Daten nicht umgehen kann. Als Processor ist der ATMEGA8 eingestellt.
Gruß und Danke für die Hilfe
Frank
Die Fehlermeldung klingt schon bedenklich. Hast Du das Eeprom nach dem
Beschreiben selber noch einmal ausgelesen und geprüft, ob es tatsächlich
die angeblich korrekt geschrieben Daten enthält?
Falls AVRprog es nicht auf die Reihe bekommt, versuche doch mal, das
Eeprom von Deinem Programm selbst beim ersten Start mit den gewünschten
Werten initialisieren zu lassen.
Hallo Jupp,
ich habe gestern mal einige andere Varianten getestet.
Unteranderem habe ich mal ein anderes Werkzeug zum Programmieren und
Auslesen des EEPROMS verwendet. Die Daten werden korrekt im EEPROM
abgelegt. Die Fehlermeldung, die ich innerhalb des Studio 4 bei Nutzung
des AVRprog beim Brennen der eep-Datei bekomme, erhalte ich dann nicht.
Ich habe dann mal versuchsweise einen der Werte aus den Arrays die im
EEPROM liegen auszulesen. Mache ich das über einen Funktionsaufruf, der
interne das eeprom_read_bytw aufruft, bekomme ich nach wie vor falsche
Werte.
Dann habe ich ein Testprogramm geschrieben, dass die Arrays direkt im
main programm initialisiert und ausliesst, dann funktionierts.
Ich bin mittlerweile mit meinem Latein vollständig am Ende -:((
WARUM KANN ICH DEN SCHEI.. NICHT INNERHALB EINES UNTERPROGRAMMS
INITIALISIEREN??????
Gruß
Frank
Es kann natürlich sein, dass der Timer0 zuschlägt und mir das ganze
versaut. Es müsste dann ja eigentlich reichen, wenn ich vor den
InitArray() ein cli() einfüge. Werde ich heute Abend mal testen.
Danke für den Hinweis.
Gruß
Frank
@ Frank Link (Firma Der Platinenshop) (franklink)
>Es kann natürlich sein, dass der Timer0 zuschlägt und mir das ganze>versaut. Es müsste dann ja eigentlich reichen, wenn ich vor den>InitArray() ein cli() einfüge. Werde ich heute Abend mal testen.
Was soll ein Interrupt bei einem LESEZUGRIFF versauen? Kritisch ist nur
der SCHREIBZUGRIFF, der darf nicht unterbrochen werden, sonst springt er
nicht an.
MFG
Falk
Hallo Michael,
an den Stack glaube ich nicht, da in dieser Routine nur von
eeprom-Arrays in ram-Arrays verschoben wird. Aber schau mal in die
Sourcen. In der Datei Button.c findest Du den Übeltäter. Wobei der
Hinweis erlaubt ist, dass der dort abgebildete Sourcecode nur ein
Stadium aller Versuche darstellt. Ich habe bereits alle Varianten die
ich im Internet gefunden habe für eeprom_read_block getestet.
Wie ich oben schon geschrieben habe, in der Simulation (debugger)
funktionierts.
Gruß
Frank
Schreibe ich hex und eep-Datei mit AVRprog funktioniert es nicht.
Schreibe ich das hex-File mit AVRprog und das eep-File mit AVROspII
funktionierts.
Mit AVROspII funktioniert beides!
Wenn jemand eine Möglichkeit kennt dieses Tool ins Studio einzubinden,
bitte posten.
Wenn jemand eine Idee hat, welche Einstellung bei AVRprog falsch ist,
bitte posten.
Ich bedanke mich bei allen die versucht haben mir zu helfen.
Gruß
Frank
hi frank,
das problem liegt m.e. darin dass du in c nach return keinen
funktionsaufruf schreiben kannst. also hol dir den wert aus
eeprom_read_byte in eine variable und gib sie dann mit return zurück.
tmp = eeprom_read_byte (...);
return tmp;
das sollte gehen
:)
koriander schrieb:> das problem liegt m.e. darin dass du in c nach return keinen> funktionsaufruf schreiben kannst.
7 Jahre zu spät, und dann auch noch Unsinn.