Forum: Compiler & IDEs EEprom Routine


von flyingwolf (Gast)


Lesenswert?

Hallo Leute, hallo Jörg ;-)
Der Versuch das EEPROM meines CAN128 anzusprechen wurde mal wieder im
Keim erstickt. Zwar ist die Routine für ein Byte in der
Bedienungsanleitung beschrieben, aber wer will schon ein Byte sichern?
Die Vorgefertigenten Routinen von WinAVR unterstützen natürlich den
CAN128 nicht.
Die Theorie ist klar. Eine Array definieren und Byteweise in den
Speicher schieben und dabei die Adresse hochzählen.
Bevor ich das Rad nun neu erfinden muss, wollte ich fragen ob jemand da
schon was Fertiges hat, dass er mir zur Vefügung stellen würde?
Viele Grüße
fw

von Jörg Wunsch (Gast)


Lesenswert?

Nimm eeprom.S aus dem Quellcode der avr-libc und kompiliere sie als
Bestandteil deines eigenen Projektes.  Die in der Bibliothek
mitgelieferte Version funktioniert nur deshalb nicht, weil beim
AT90CAN128 die EEPROM-Register woanders liegen als bei den meisten
AVRs, der Code selbst funktioniert aber schon.

von flyingwolf (Gast)


Lesenswert?

<... der Code selbst funktioniert aber schon
Na darum hab ich ja auch geschrieben "unterstützt" den CAN128 nicht
;-)
Ich würde denken das "eeprom.S" eine Datei ist? Ich stell mich wohl
mal wieder zu doof an, ich find sie nicht.

von Jörg Wunsch (Gast)


Lesenswert?

Ja, es ist eine Datei.

Ich glaube, du brauchst mehr als eine Datei.  Siehe z. B. hier:

http://savannah.nongnu.org/cgi-bin/viewcvs/avr-libc/avr-libc/libc/misc/

von flyingwolf (Gast)


Lesenswert?

Ah ja! Assembler?! Du hast Recht. Ich glaube auch, ich brauche mehr als
eine Datei. Da wird es dann wohl doch auf selber tippeln hinauslaufen.

von Jörg Wunsch (Gast)


Lesenswert?

Nein, warum denn?  Warum ziehst du dir denn nicht einfach die
genannten Dateien, schmeißt sie als Assemblerquellen zu deinem Projekt
dazu, fertich die Laube?

von flyingwolf (Gast)


Lesenswert?

@Jörg,
klar ist das einfach, wenn man weiß wie es geht. Es ist gewiß auch
genauso einfach, die Subroutinen in eigene c-files zu packen, damit man
beim schreiben nicht immer durch das ganze Programm scrollen muss. Ich
habe auch kein Problem eine existierende .c Datei einzubinden und die
Funktionen darin aufzurufen, aber wenn ich selbst versuche so eine
Subroutine zu schreiben springt mir der Compiler mit dem Arsch ins
Gesicht.
Wenn der ver.... Compiler meine Subroutinen in ausgelagerten c-files
nicht mag, schreib ich sie eben alle ins main.c und wenn ich den Inhalt
 oder die Verwendung der Subroutinen nicht verstehe, schreib ich halt
was, womit es schlußendlich auch geht. Ein Verzeichnis der Funktionen
ist für die heutigen Compiler ja offenbar unzumutbar, selbst für die,
für die man 2000 Flocken hinblättert. Ich bräuchte hier wohl erst mal
eine Einweisung in das Basiswissen uC-Programmierung.

von OldBug (Gast)


Lesenswert?

>Ich bräuchte hier wohl erst mal
>eine Einweisung in das Basiswissen uC-Programmierung.

Ersetze "uC" durch "C"...

von Jörg Wunsch (Gast)


Lesenswert?

Ja, in der Tat.

Ansonsten: führe diese Dateinamen hinter ASRC in deinem Makefile auf.

von flyingwolf (Gast)


Lesenswert?

< Ansonsten: führe diese Dateinamen hinter ASRC in deinem Makefile auf.
Danke. Ich versuch mal mein Glück.

von flyingwolf (Gast)


Lesenswert?

Hallo liebe Forenuser, hallo Jörg ;-)
Also mit "eeprom.S" komme ich leider nicht weiter. Das gibt
Fehlermeldungen ohne Ende. Dafür bin ich auf was anderes gestoßen. Der
Mega168 wird nach der Auskunft der eeprom.h auch nicht unterstützt und
was finde ich in der Software zum Butterfly?

#include "eeprom.h"
void StoreEEPROM(char *pBuffer, char num_bytes, unsigned int
EEPROM_START_ADR)
{
    unsigned char i;
    for (i=0;i<num_bytes;i++)
        __EEPUT(EEPROM_START_ADR++, pBuffer[i]); // Store parameters
}
und so weiter.
Wie kann das gehen? Mache ich mir vieleicht ein Problem wo keines ist?
Und warum eigentlich

<< ... weil beim AT90CAN128 die EEPROM-Register woanders liegen
 ??
Wenn ich das oben richtig interpretiere, muss ich doch eh die Adresse
angeben, an der ich die Bytes speichern will oder gibt es da noch was,
was mir bisher entgangen ist?
Ich würde jetzt einfach rotzfrech die Routine aus dem Butterfly
abkupfern wenn da keine elementaren Probleme zu erwarten sind

von Jörg Wunsch (Gast)


Lesenswert?

> Also mit "eeprom.S" komme ich leider nicht weiter. Das gibt
> Fehlermeldungen ohne Ende.

Dann löse sie auf, statt die nächste Baustelle zu versuchen.

> Wie kann das gehen?

Ich kenne den Butterfly-Code nicht genug, möglicherweise bringen die
einfach ihre eigene Bibliothek dafür mit.

> Wenn ich das oben richtig interpretiere, muss ich doch eh die
> Adresse angeben, an der ich die Bytes speichern will oder gibt es da
> noch was, was mir bisher entgangen ist?

Ja, du sprichts von den Adressen im EEPROM, ich von den Adressen der
IO-Register, mit denen man auf den EEPROM zugreift.

Wie geschrieben, beseitige die Fehlermeldungen, die du siehst.  Ich
sehe sie nicht, also weiß ich auch nicht, wie ich sie beseitigen soll.

von flyingwolf (Gast)


Lesenswert?

Jörg sei bitte nicht sauer, aber das mit dem Assembler ist wirklich
nicht mein Ding. Ich verstehe es auch nicht. Der Tip mit der EEprom.s
war ja wohl nicht falsch, aber ich bekomme die Datei schon garnicht
runtergeladen. Ich muss den Text im Browserfenster kopieren und in ein
Projekt im AVR-Studio einfügen. Den Rest meiner Versuche das in mein
Programm einzubinden erspare ich Dir.
Wenn ich es in C hinkriege, bin ich schon zufreiden und alles Andere
nehme ich mir vor, wenn ich Zeit habe.
Wenn ich Dich Recht verstehe, heißt Diene Zeile oben, dass ich, wenn
ich auf EEARH zugreife, ggf. die dahinter in der eeprom.h hinterlegte
Adresse falsch ist? (ist nur ein hypothetisches Beispiel, ich habe es
nicht überprüft!)
Dann könnte ich das Problem doch umgehen, wenn ich eeprom.h in
eepromf.h kopiere und umbenenne und die Adressen einfach korregiere,
oder nicht?
fw

von Jörg Wunsch (Gast)


Lesenswert?

Hmm, vielleicht solltest du ja mal lernen, einen Webbrowser zu
bedienen...  Rechte Maustaste, Speichern unter... oder sowas.

Mit AVR Studio und seinen Projekten hat das alles gar nichts zu tun.
AVR Studio hat derzeit kein API, um externe Compiler anzubinden, also
lass es bitte außen vor und benutze es bestenfalls als Simulator,
aber nicht als Editor, Projektverwaltung, ...

Den Assemblerkram musst du ja nicht verstehen, um ihn benutzen zu
können, du musst lediglich in der Lage sein, ein paar Dateien, die auf
.S enden, in das Verzeichnis abzuladen, in dem sich dein C-Programm
befindet, dein Makefile zu editieren (die Zeile mit ASRC=), und dann
alles neu zu bauen.

Nein, umbenennen von irgendwelchen Headerdateien wird deine Probleme
überhaupt nicht lösen.  Solange du nicht wenigstens ansatzweise
verstehst, was wobei passiert, wird allerdings (sorry) vermutlich
nichts und niemand deine Probleme lösen können.

von Joerg Wunsch (Gast)


Angehängte Dateien:

Lesenswert?

Hier nochmal alle genannten Dateien.

von flyingwolf (Gast)


Lesenswert?

<< Hmm, vielleicht solltest du ja mal lernen, einen Webbrowser zu
bedienen...  Rechte Maustaste, Speichern unter... oder sowas.

Nun ja, das bekomme ich gerade noch hin, geht aber nicht. Ich mag zwar
in C und Assembler eine Niete sein, aber die Grundfunktionen des
Webbrowsers habe ich ganz gut unter Kontrolle.
Aber viele Webseiten funktionieren halt nicht wie gewohnt, wenn man
nicht den ver@'!?$$!!  MakroSchrott InternetExplodierer verwendet.
Du hast aber Recht. Ich hätte die Pagesorce anzeigen können und die
dann als eeprom.S speichern können.
Hätte mich aber auch nicht weiter gebracht ...
Ich versuchs noch mal mit dem was Du mir geschickt hast, ohne es zuvor
in WinAvr zu kompilieren ...
Schauen wir mal.
Danke erst mal
fw

von OldBug (Gast)


Lesenswert?

Ich wage mal zu bezweifeln, daß auch nur eine einzige Seite von
"Savane" auf den IE optimiert ist lol

von flyingwolf (Gast)


Lesenswert?

Mein geändertes Make-File

# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = ee_rb.s \
ee_rblk.s \
ee_rw.s \
ee_wb.s \
ee_wblk.s \
ee_ww.s \
eeprom.s \

# List any  ...

 Und was der Compiler dazu meint :
Er ist ja sehr blumig in seiner Aussprache, und klar ist, das der
fehler bei mir liegt, weil es ja mit so viel fehlern nicht den Weg auf
die Savanna - Page finden würde ...

eeprom.s: Assembler messages:
eeprom.s:57: Error: junk at end of line, first unrecognized character
is `('
eeprom.s:59: Error: unknown opcode `_u'
eeprom.s:60: Error: constant value required
eeprom.s:60: Error: `,' required
eeprom.s:60: Error: constant value required
eeprom.s:60: Error: garbage at end of line
eeprom.s:61: Error: garbage at end of line
eeprom.s:63: Error: constant value required
eeprom.s:63: Error: `,' required
eeprom.s:63: Error: constant value required
eeprom.s:63: Error: garbage at end of line
eeprom.s:65: Error: constant value required
eeprom.s:65: Error: `,' required
eeprom.s:65: Error: constant value required
eeprom.s:65: Error: garbage at end of line
eeprom.s:66: Error: constant value required
eeprom.s:66: Error: `,' required
eeprom.s:66: Error: constant value required
eeprom.s:66: Error: garbage at end of line
eeprom.s:67: Error: register name or number from 0 to 31 required
eeprom.s:68: Error: register name or number from 0 to 31 required
eeprom.s:68: Error: constant value required
eeprom.s:68: Error: garbage at end of line
eeprom.s:77: Error: junk at end of line, first unrecognized character
is `('
eeprom.s:79: Error: unknown opcode `_u'
eeprom.s:80: Error: constant value required
eeprom.s:80: Error: `,' required
eeprom.s:80: Error: constant value required
eeprom.s:80: Error: garbage at end of line
eeprom.s:81: Error: garbage at end of line
eeprom.s:83: Error: constant value required
eeprom.s:83: Error: `,' required
eeprom.s:83: Error: constant value required
eeprom.s:83: Error: garbage at end of line
eeprom.s:85: Error: constant value required
eeprom.s:85: Error: `,' required
eeprom.s:85: Error: constant value required
eeprom.s:85: Error: garbage at end of line
eeprom.s:86: Error: constant value required
eeprom.s:86: Error: `,' required
eeprom.s:86: Error: constant value required
eeprom.s:86: Error: garbage at end of line
eeprom.s:87: Error: constant value required
eeprom.s:87: Error: register r24, r26, r28 or r30 required
eeprom.s:88: Error: constant value required
eeprom.s:88: Error: constant value required
eeprom.s:88: Error: garbage at end of line
eeprom.s:90: Error: constant value required
eeprom.s:90: Error: `,' required
eeprom.s:90: Error: constant value required
eeprom.s:90: Error: garbage at end of line
eeprom.s:92: Error: constant value required
eeprom.s:92: Error: `,' required
eeprom.s:92: Error: constant value required
eeprom.s:92: Error: garbage at end of line
eeprom.s:93: Error: constant value required
eeprom.s:93: Error: `,' required
eeprom.s:93: Error: constant value required
eeprom.s:93: Error: garbage at end of line
eeprom.s:94: Error: register name or number from 0 to 31 required
eeprom.s:94: Error: constant value required
eeprom.s:95: Error: register name or number from 0 to 31 required
eeprom.s:95: Error: constant value required
eeprom.s:95: Error: garbage at end of line
eeprom.s:108: Error: junk at end of line, first unrecognized character
is `('
eeprom.s:110: Error: unknown opcode `_u'
eeprom.s:111: Error: constant value required
eeprom.s:111: Error: `,' required
eeprom.s:111: Error: constant value required
eeprom.s:111: Error: garbage at end of line
eeprom.s:112: Error: garbage at end of line
eeprom.s:114: Error: constant value required
eeprom.s:114: Error: `,' required
eeprom.s:114: Error: constant value required
eeprom.s:114: Error: garbage at end of line
eeprom.s:116: Error: constant value required
eeprom.s:116: Error: `,' required
eeprom.s:116: Error: constant value required
eeprom.s:116: Error: garbage at end of line
eeprom.s:117: Error: constant value required
eeprom.s:117: Error: `,' required
eeprom.s:117: Error: constant value required
eeprom.s:117: Error: garbage at end of line
eeprom.s:118: Error: constant value required
eeprom.s:118: Error: constant value required
eeprom.s:118: Error: garbage at end of line
eeprom.s:120: Error: constant value required
eeprom.s:120: Error: `,' required
eeprom.s:120: Error: constant value required
eeprom.s:120: Error: garbage at end of line
eeprom.s:121: Error: constant value required
eeprom.s:121: Error: `,' required
eeprom.s:121: Error: constant value required
eeprom.s:121: Error: garbage at end of line
eeprom.s:122: Error: constant value required
eeprom.s:122: Error: `,' required
eeprom.s:122: Error: constant value required
eeprom.s:122: Error: garbage at end of line
eeprom.s:134: Error: junk at end of line, first unrecognized character
is `('
eeprom.s:136: Error: unknown opcode `_u'
eeprom.s:137: Error: register name or number from 0 to 31 required
eeprom.s:139: Error: constant value required
eeprom.s:139: Error: constant value required
eeprom.s:139: Error: garbage at end of line
eeprom.s:141: Error: constant value required
eeprom.s:141: Error: `,' required
eeprom.s:141: Error: constant value required
eeprom.s:141: Error: garbage at end of line
eeprom.s:144: Error: constant value required
eeprom.s:144: Error: `,' required
eeprom.s:144: Error: constant value required
eeprom.s:144: Error: garbage at end of line
eeprom.s:146: Error: constant value required
eeprom.s:146: Error: `,' required
eeprom.s:146: Error: constant value required
eeprom.s:146: Error: garbage at end of line
eeprom.s:147: Error: constant value required
eeprom.s:147: Error: `,' required
eeprom.s:147: Error: constant value required
eeprom.s:147: Error: garbage at end of line
eeprom.s:149: Error: constant value required
eeprom.s:149: Error: `,' required
eeprom.s:149: Error: constant value required
eeprom.s:149: Error: garbage at end of line
eeprom.s:150: Error: constant value required
eeprom.s:150: Error: `,' required
eeprom.s:150: Error: constant value required
eeprom.s:150: Error: garbage at end of line
eeprom.s:151: Error: constant value required
eeprom.s:151: Error: `,' required
eeprom.s:151: Error: constant value required
eeprom.s:151: Error: garbage at end of line
eeprom.s:152: Error: register name or number from 0 to 31 required
eeprom.s:155: Error: constant value required
eeprom.s:155: Error: register number above 15 required
eeprom.s:156: Error: constant value required
eeprom.s:156: Error: register number above 15 required
eeprom.s:157: Error: constant value required
eeprom.s:157: Error: constant value required
eeprom.s:158: Error: register name or number from 0 to 31 required
eeprom.s:180: Error: junk at end of line, first unrecognized character
is `('
eeprom.s:182: Error: unknown opcode `_u'
eeprom.s:183: Error: constant value required
eeprom.s:183: Error: constant value required
eeprom.s:184: Error: constant value required
eeprom.s:184: Error: constant value required
eeprom.s:186: Error: unknown opcode `load_x'
eeprom.s:188: Error: constant value required
eeprom.s:188: Error: `,' required
eeprom.s:188: Error: constant value required
eeprom.s:188: Error: garbage at end of line
eeprom.s:192: Error: constant value required
eeprom.s:192: Error: `,' required
eeprom.s:192: Error: constant value required
eeprom.s:192: Error: garbage at end of line
eeprom.s:194: Error: constant value required
eeprom.s:194: Error: `,' required
eeprom.s:194: Error: constant value required
eeprom.s:194: Error: garbage at end of line
eeprom.s:195: Error: constant value required
eeprom.s:195: Error: `,' required
eeprom.s:195: Error: constant value required
eeprom.s:195: Error: garbage at end of line
eeprom.s:196: Error: constant value required
eeprom.s:196: Error: register number above 15 required
eeprom.s:197: Error: constant value required
eeprom.s:197: Error: register number above 15 required
eeprom.s:198: Error: constant value required
eeprom.s:198: Error: constant value required
eeprom.s:198: Error: garbage at end of line
eeprom.s:199: Error: constant value required
eeprom.s:200: Error: constant value required
eeprom.s:200: Error: register number above 15 required
eeprom.s:201: Error: constant value required
eeprom.s:201: Error: register number above 15 required
eeprom.s:212: Error: junk at end of line, first unrecognized character
is `('
eeprom.s:214: Error: unknown opcode `_u'
eeprom.s:215: Error: constant value required
eeprom.s:215: Error: constant value required
eeprom.s:216: Error: constant value required
eeprom.s:216: Error: constant value required
eeprom.s:218: Error: unknown opcode `load_x'
eeprom.s:219: Error: constant value required
eeprom.s:219: Error: constant value required
eeprom.s:219: Error: garbage at end of line
eeprom.s:221: Error: constant value required
eeprom.s:221: Error: `,' required
eeprom.s:221: Error: constant value required
eeprom.s:221: Error: garbage at end of line
eeprom.s:224: Error: constant value required
eeprom.s:224: Error: `,' required
eeprom.s:224: Error: constant value required
eeprom.s:224: Error: garbage at end of line
eeprom.s:226: Error: constant value required
eeprom.s:226: Error: `,' required
eeprom.s:226: Error: constant value required
eeprom.s:226: Error: garbage at end of line
eeprom.s:227: Error: constant value required
eeprom.s:228: Error: constant value required
eeprom.s:228: Error: `,' required
eeprom.s:228: Error: constant value required
eeprom.s:228: Error: garbage at end of line
eeprom.s:230: Error: constant value required
eeprom.s:230: Error: `,' required
eeprom.s:230: Error: constant value required
eeprom.s:230: Error: garbage at end of line
eeprom.s:231: Error: constant value required
eeprom.s:231: Error: `,' required
eeprom.s:231: Error: constant value required
eeprom.s:231: Error: garbage at end of line
eeprom.s:232: Error: constant value required
eeprom.s:232: Error: `,' required
eeprom.s:232: Error: constant value required
eeprom.s:232: Error: garbage at end of line
eeprom.s:233: Error: constant value required
eeprom.s:233: Error: register number above 15 required
eeprom.s:234: Error: constant value required
eeprom.s:234: Error: register number above 15 required
eeprom.s:235: Error: constant value required
eeprom.s:235: Error: register number above 15 required
eeprom.s:236: Error: constant value required
eeprom.s:236: Error: register number above 15 required

von mthomas (Gast)


Lesenswert?

im datenblatt des CAN128 stehen doch fertige routinen, die kann man 1:1
in gcc uebernehmen, ohne avr/eeprom.h zu bemuehen. ein interrupt-schutz
um den eeprom-code und das ganze entspricht von der funktion
eeprom_read/write_byte aus der avr-libc. die word/block-funktionen
lassen sich darauf aufbauend auch "von hand" implementieren. der
ansatz entspricht dem im gcc-port des BF-codes. der gezeigte
codeausschnitt ist aus dem atmel code fuer den IAR compiler.

von Jörg Wunsch (Gast)


Lesenswert?

Benenne die Dateien im Makefile bitte mit einem großen .S, genau so,
wie sie im Zip-File auch stehen.

von Joerg Wunsch (Gast)


Angehängte Dateien:

Lesenswert?

Diese Dateien musst du wohl noch in das Verzeichnis werfen, sorry,
hatte ich beim ersten Mal vergessen.

von flyingwolf (Gast)


Lesenswert?

ja ja, ich weiß, aber ich wollte ein bisschen faul sein und mich auf
fremdem Lorbeer ausruhen. Da schwebte mir dann sowas wie im Butterfly -
Code vor, zumal ich auch noch nicht genau weiß, wie ich meine Variablen
ins EEprom schreibe. Es muss ja wieder Byteweise geschen und da werde
ich bestimmt wieder sprintf bemühen müssen. Ich weiß, es geht auch mit
itoa aber das geht nicht immer und ich weiß noch immer nicht, warum es
mal geht und ein andern Mal nicht.

von flyingwolf (Gast)


Lesenswert?

@Jörg
Das passiert, wenn das "S" groß ist :

Assembling: ee_rb.S
avr-gcc -c -mmcu=at90can128 -I. -x assembler-with-cpp
-Wa,-adhlns=ee_rb.lst,-gstabs  ee_rb.S -o ee_rb.o
In file included from ee_rb.S:30:
eeprom.S:38:22: ctoasm.inc: No such file or directory
make.exe: *** [ee_rb.o] Error 1

und ich hab sie nicht umbenannt, sie stehen mit großem "S" im
Directory.


mit kleinem "S" und den zugefügten Dateien habe ich jetzt das:

vr-gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.


Compiling: main.c
avr-gcc -c -mmcu=at90can128 -I. -g -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=main.lst  -std=gnu99 main.c -o main.o

Compiling: delay.c
avr-gcc -c -mmcu=at90can128 -I. -g -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=delay.lst  -std=gnu99 delay.c -o
delay.o

Compiling: display.c
avr-gcc -c -mmcu=at90can128 -I. -g -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=display.lst  -std=gnu99 display.c -o
display.o
make.exe: *** No rule to make target `ee_rb.s', needed by `main.elf'.
 Stop.

> Process Exit Code: 2

von flyingwolf (Gast)


Lesenswert?

Ich muss das revidieren. Die .S - Files waren weg. Gehen die beim Clean
weg? Wenn ja warum und wie unterbindet man das?

von Jörg Wunsch (Gast)


Lesenswert?

Wenn du die .S-Namen unter SRC= angibst, werden sie bei make clean
gelöscht.  Bei ASRC= sollte das aber nicht passieren.

Die .inc-Dateien hatte ich separat nachgereicht, hatte ich beim ersten
Mal nicht dran gedacht.

von flyingwolf (Gast)


Lesenswert?

Ich hab da irgendwas gelesen, das er de Dateien beim Clean löscht, wenn
das "S" klein geschrieben ist, aber beim ersten Versuch wollte er sie
mit grossem "S" nicht. Ist aber auch egal, jetzt geht es und alles
Andere ist Schnee von gestern. Eine Frage habe ich jedoch noch.
In der Bedienungsanleitung meine ich gelesen zu haben, das beim
schreiben und lesen der EEprom-Daten die Interrupts abgeschaltet sein
sollen?
1. Ist das richtg?
2. Wird das durch eeprom_read_block  ... automatisch gemanagt?

von Jörg Wunsch (Gast)


Lesenswert?

Nun, da du den Quellcode aller Funktionen vorliegen hast, kannst du ja
auch gleich selbst reingucken. ;-)

Ja, meines Wissens werden die Interrupts sauber suspendiert.

von flyingwolf (Gast)


Lesenswert?

Nun, das mit dem "selbst reinschauen" ist noch nicht ganz so effektiv.
Ich war der irrigen Meinung, das mein Progamm nun mit eeprom_read_block
oder eeprom_write_block was anfangen könnte. Weit gefehlt. Ich muss
also noch irgendwas includen, aber was? eeprom.h isses nich und
eeprom.S isses auch nicht. ...?

von flyingwolf (Gast)


Lesenswert?

sorry, habe den Fehlercode zur Schonung der Glaskugel vergessen

von Jörg Wunsch (Gast)


Lesenswert?

Ja, <avr/eeprom.h> solltest du noch includen.  Du benutzt ja dieselben
Funktionen, die darin deklariert werden, nur dass du eben ganz
zufällig dafür die Implementierungen lokal herumliegen hast.

von flyingwolf (Gast)


Lesenswert?

ah ja! Probieren wir das doch gleich mal.

Was mache ich damit? Ignorieren?

avr-gcc -c -mmcu=at90can128 -I. -g -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=main.lst  -std=gnu99 main.c -o main.o
In file included from main.c:5:
C:/Programme/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr 
/eeprom.h:87:3:
warning: #warning "The functions from <avr/eeprom.h> are not supported
on this MCU."

Linking: main.elf

von flyingwolf (Gast)


Lesenswert?

Die Gute Nachricht:
Irgendetwas wird ins eeprom geschrieben.
Die Schlechte
Ich bin natürlich zu doof die Funktion zu benutzen.

sprintf(displaystring,"%-3.5f", (double)testzahl);
eeprom_write_block(displaystring,0x000,10);

funktioniert,

eeprom_write_block(displaystring,0,10);

funktioniert auch,

eeprom_write_block(displaystring,0x020,10);
funtioniert nicht und diverse anderer Versuche ...

von Jörg Wunsch (Gast)


Lesenswert?

Ja, die Warnung sollst du natürlich in diesem Falle ignorieren.  Eine
Alternative wäre es, diese Datei ebenfalls noch mit ins lokale
Verzeichnis zu kopieren, statt mit <avr/eeprom.h> dann mit
"eeprom.h"
zu includen (man achte auf die Anführungszeichen, die sind wichtig
dann) und darin die Warnung rauszulöschen.

Definiere bitte "funktioniert nicht", was passiert denn dabei?

von flyingwolf (Gast)


Lesenswert?

Hallo Jörg!
Entschuldige die blöde Nerverei, aber ich bin zu doof, ich bekomme es
nicht hin. Wenn ich eine Adresse wie 0x000 angebe macht er problemlos
mit, nur das die Daten nicht am Anfang des EEproms stehen, sondern
irgendwo mitendrin.

gebe ich 0x0010 oder etwas ähnliches ein kommt

ain.c: In function `adjust_geo_breite':
main.c:555: warning: passing arg 2 of `eeprom_write_block' makes
pointer from integer without a cast

gebe ich 0 ein spielt er mit und die Daten stehen auch an der Adresse
0000

gebe ich 10 ein

ain.c: In function `adjust_geo_breite':
main.c:555: warning: passing arg 2 of `eeprom_write_block' makes
pointer from integer without a cast

gebe ich im als Adresse "0000" oder "0010" vor klappt es
hervorragend, nur dass die Daten irgendwo im EEprom stehen und nicht
da, wo ich sie erwarte.

Noch habe ich die Daten noch nicht wieder versucht zurückzulesen, also
ob das, was da am Ende im Eeprom drin steht auch wirklich das ist was
es sein soll ist noch offen.

von Jörg Wunsch (Gast)


Lesenswert?

Nun, du solltest dir mal die Doku für die Funktion
eeprom_write_block() zu Gemüte führen:

void eeprom_write_block (const void *buf, void *addr, size_t n)

Der zweite Parameter ist eine Adresse.

Die Überführung einer 0 in eine Adresse ist im C-Standard genormt,
daher bekommst du bei Angabe einer 0 keine Warnung.  In allen anderen
Fällen versuchst du, eine Integer-Zahl in eine Adresse zu überführen,
ohne einen typecast zu benutzen.

Du solltest also »(void *)0x10« schreiben.

> gebe ich im als Adresse "0000" oder "0010" vor klappt es
> hervorragend, nur dass die Daten irgendwo im EEprom stehen und nicht
> da, wo ich sie erwarte.

Davon abgesehen, dass du dir selbst widersprichst (etwas weiter oben
schriebst du, mit 0 wäre alles OK, hier behauptest du, sie würden
,,irgendwo'' stehen), wo bitte stehen sie denn genau -- und wo
würdest du sie erwarten?

Ich würde sie für den zweiten genannten Fall jedenfalls auf Adresse 8
erwarten.

von flyingwolf (Gast)


Lesenswert?

@Hallo Jörg.
Also ich hab alles mögliche ausprobiert, aber auf (void *)0x10 wäre ich
nie gekommen.
Ich habe in der Doku uint16_t gefunden und habe es unter anderem mit
(uint16_t)0x10 versucht.
Habe ich ehrlich gesagt noch nie gesehen, diesen Ausdruck.
Was ich nicht ganz verstehe ist, dass ich doch eigentlich 1,5 also 2
Byte für die Adressierung brauchen müßte, also müßte es doch irgendwas
wie 0x0010 sein ???

Nein nein! Wiederspricht sich nicht. Es ist ein Unterscheid, ob ich   0
 oder   "0"   schreibe. "0" wird offenbar als Ascii-Zeichen
interpretiert und landet dann bei dez48 glaube ich ...
Ich versuchs jetzt erst mal mit (void *)0x10 und schau mir das Ergebnis
an...

von OldBug (Gast)


Lesenswert?

Wenn doch der Funktionsprototyp schon einen "generischen Zeiger"
erwartet (void *), sollte das doch am nächsten liegen. Wie man von void
* allerdings auf uint16_t schliessen kann, bleibt mir ein Rätsel :-)

von flyingwolf (Gast)


Lesenswert?

es steht sowas in der doku

#include <eeprom.h>

void eeprom_read_block(void* buf, uint16_t addr, size_t n);

description. Reads a block of EEPROM memory. The starting address of
the EEPROM block is specified in the addr parameter. The maximum
address depends upon the device. The number of bytes to transfer is
indicated by the n parameter. The data is transferred to an SRAM
buffer, the starting address of which is passed in the buf argument.

Ist aber unwichtig, es geht jetzt und dafür erst mal ganz herzlichen
Dank...  Jetzt muss ich bloß noch rausfinden, wie ich sprintf dazu
bringe die führenden und abschließenden Nullen mitzuzschreiben, und wie
man aus dem String, der beim lesen da rauskommt wieder eine dezimale
Zahl wird ....

von OldBug (Gast)


Lesenswert?

...das muss man aber erst zweimal lesen, bevor man weis, was Du willst
:-)

1. führende nullen? Meinst Du den Formatstring für die Ausgabe?
2. Warum überhaupt erst in einen String wandeln?

von flyingwolf (Gast)


Lesenswert?

zu 1
wenn ich Zahlen speichere, ist ja ungewiss, wieviele Stellen sie haben.
Die Anzahl der Stellen muss ich aber wissen umd die Zahl im EEprom zu
speichern. Wenn ich als 7 Stellen speichere, aber die Zahl hatte in
diesem Fall gerade nur 3 Stellen, dann dürfte ab der 4.Stelle
ziemlicher Mist in meinem EEprom stehen. Das weiß aber die Funktion die
die Zahl wieder auslesen muss nicht und liest eben die 7 Stellen
komplett aus. ...

zu 2 weil ich bis 9:52 des 4.3.05 noch nicht ahnte, dass es auch anders
geht?

von flyingwolf (Gast)


Lesenswert?

@oldbug
jetzt habe ich auf Deinen Tip hin mal ein bisschen mit
eeprom_write_word rumexperimentiert. aber da bekomme ich leider nur den
ganzzahligen Anteil meiner gespeicherten Zahl zurück.
Es wäre wirklich interessant zu efahren , wie Du das machen würdest

von Jörg Wunsch (Gast)


Lesenswert?

Was hast du denn für ein Zahlenformat?  Du musst natürlich so viel
speichern, wie groß die Zahl ist.

eeprom_write_block(&zahl, (void *)eeprom_offset, sizeof zahl);

Wenn "zahl" vom Typ double ist, dann ist sizeof zahl == 4.

von flyingwolf (Gast)


Lesenswert?

scheibenkleiser kann das alles einfach sein, wenn man weiß wie es geht.
Ich habe keine Ahnung was das & vor der Variablen macht, aber es
funktioniert hervorragend. Warum gibt es so einfache Beispiele und
Anleitungen nicht irgendwo zum anschauen, nachlesen und erklären.
Erst mal ganz herzlichen Dank. Ich habe jetzt erst mal einen Haufen
Variablen durch den Rest zu bringen.
@Jörg
Wir sehen uns im Sommer zu nem großen Bier?

von Jörg Wunsch (Gast)


Lesenswert?

Du solltest C lernen.

Lass das Bier mal, kauf dir lieber bitte einen K&R für das Geld -- und
lies ihn dann auch.

von flyingwolf (Gast)


Lesenswert?

hab ich schon, aber damit komme ich überhaupt nicht klar. Ich hab noch
ein altes Unix-C Buch das ist schon besser, geht aber nicht auf die
uC-Programmierung ein.

von OldBug (Gast)


Lesenswert?

Die Probleme, die Du bisher hattest, hatten auch rein gar nichts mit µCs
zu tun...

von flyingwolf (Gast)


Lesenswert?

damit hast Du sogar Recht. Die Hardware ist auch einigermaßen einfach zu
bewältigen und was man nicht weiß findet man in Beispielschaltungen oder
kann es sich aus anderen Projekten ableiten.
Aber die C-Bücher die ich habe sind ein nackte Katastrophe. Kennst Du
z.b. das Makrobuch von Excel4? Sowas suche ich für C. Klar, schüssig
ohne seitenfüllendes Blabla, klare Defnitionen, Kurzerklärungen,
praktische Beispiele, verwandte Funktionen, Umkehrfunktionen.
Was immer ich schlechtes über MS zu sagen habe, das Buch ist richtig
gut gewesen, leider nicht für C

von Rufus T. Firefly (Gast)


Lesenswert?

Und Du hast Dir tatsächlich den K&R angesehen? Welche Ausgabe?

In der zweiten Ausgabe (ca. 1990, erschienen im Hanser Verlag) steht in
klarer und knapper Weise alles drin, was man über ANSI-C wissen muss.

Solltest Du noch eine antiquarische erste Ausgabe (irgendwann vor 1990,
ebenfalls Hanser Verlag) erwischt haben, kann ich allerdings verstehen,
daß Du damit nicht klargekommen bist. Grauenerregend übersetzt
(vermutlich von einem Automaten), schlechte Beispiele, schlechte
Typographie (Sourcelistings in einer Proportionalschrift!) und vor
allem wird nur das antiquierte "K&R"-C ohne Typüberprüfung und
Funktionsprototypen beschrieben.

von flyingwolf (Gast)


Lesenswert?

Also ich habs grad nicht da, aber ich hab es erst vor einem halben jahr
gekauft, was, so meine ich, für eine neue Ausgabe spricht und ich meine
das K&R die Abkürzung für dieses Standart-Werk ist, dass hier gerne
empfohlen wird, ... Roter Paperback-Einband und sauteuer.
Finde ich vollkommen verfehlt. Hab ich ein paar Mal reingeschaut,
Informationen gesucht, und beiseite gelegt.
Schon das Inhaltsverzeichnis ist eine Zumutung und gibt Aufschluss über
die Organisation des Inhalts. Ich hätte sowas nie im Laden gekauft, wenn
es nicht so warm in diesem Forum gehandelt worden wäre.

von Rufus T. Firefly (Gast)


Lesenswert?

Mag natürlich sein, daß die neueren Ausgaben des K&R schlechter geworden
sind; müsste mir mal eine aktuelle Ausgabe ansehen.

Ansonsten gibt es natürlich immer individuelle Unterschiede beim Lesen
und Verstehen von Büchern, was der eine wirr findet, ist dem anderen
klar und umgekehrt.

Dennoch: Lass' den Kopf nicht hängen, man kann C programmieren
lernen, auch wenn viele "C-Programmierer" das unter Hinterlassung von
viel fehlerhaftem Quelltext zu umgehen suchen ... aber das ist bei jeder
Programmiersprache so.

von flyingwolf (Gast)


Lesenswert?

Warum den Kopf hängen lassen?
Was das Buch nicht her gibt, läßt sich doch in diesem Forum klären.
Manchmal etwas zäh, und manchen Kommentar überliest man besser, aber am
Ende zählt nur das Ergebnis.

von Jörg Wunsch (Gast)


Lesenswert?

Hmm, verkauf den K&R wieder, wenn du damit nicht klarkommst.  So ganz
verstehe ich es aber nicht, er hat schließlich schon Generationen von
C-Programmierern als Einstieg gedient.  Man sollte allerdings das
Kapitel über Pointer and Arrays (weiß nicht, wie sie es ins Deutsche
übersetzt haben) wirklich nicht aussparen.  Erst danach hat man C
einigermaßen verstanden.  (Danach kommen `Structures' und `Input and
Output', die ist man dann wieder eher geneigt zu lesen. ;-)

von flyingwolf (Gast)


Lesenswert?

also ich hab noch mal nachgeschaut und es ist K&R und ich finde es
grauenhaft. Ich habe noch ein altes aus dem TEWI Verlag von Bernhard
Davignon, das ist zwar auch nicht der Brecher, aber ich feinde es
deutlich besser, als das das KR.

von Chris (Gast)


Lesenswert?

> Was das Buch nicht her gibt, läßt sich doch in diesem Forum klären.
> Manchmal etwas zäh, und manchen Kommentar überliest man
> besser, aber am Ende zählt nur das Ergebnis.

Wenn du das wirklich glaubst, was ist denn nun das Ergebnis dieses
Threads?
Hast du tatsächlich verstanden, wieso der Code jetzt funktioniert?

von flyingwolf (Gast)


Lesenswert?

Ist das wichtig?
Es funktioniert, wenn man statt der Variablen an sich nur den Zeiger
auf die Variable reinschreibt.
Das wirft die Frage auf, ob ich in gleicher Weise das sprintf sparen
kann, wenn ich der Displayroutine statt der Variablen den Zeiger
serviere. Das werde ich einfach bei Gelegenheit ausprobieren.
Ehrlich gesagt, finde ich die EEProm-Routine etwas umständlich mit dem
ganzen Dateien, die ich im Moment dafür brauche, dafür ist die
Benutzung sehr einfach, wenn man erst mal weiß, wie es geht.
Das Ergebnis ist genau das, was ich brauche und darum ist es perfekt.

von Chris (Gast)


Lesenswert?

> Ist das wichtig?
Ja, oder möchtest du dein Leben lang ein Copy&Paste-Coder bleiben?

Nimms mir nicht übel, aber dann wirst du in spätestens ein paar Tagen
wieder mit einer trivialien Frage hier aufkreuzen...


Nimm den Rat bitte Ernst und kauf dir ein gutes C-Buch. Es hat absolut
keinen Sinn, C über ein Forum lernen zu wollen; ein Forum kann niemals
ein C-Buch ersetzen.

von flyingwolf (Gast)


Lesenswert?

@Chris
Wann ist eine Frage Trivial?
Ist eine Frage nur darum trivial, weil ich auf Anhieb die Antwort
kenne?

von Jörg Wunsch (Gast)


Lesenswert?

Vielleicht sollte man ,trivial' durch ,elementar' ersetzen.
Grundlagenwissen von C halt, was dir ganz deutlich fehlt.

von flyingwolf (Gast)


Lesenswert?

eine Frage belibt dann doch noch, die ich auch mit dem neuen C-Buch noch
nicht zu kären vermochte
warum kann ich mit
eeprom_write_block(&interval,(void *)0x0060,sizeof interval);
und
eeprom_read_block(&speicher,(void *)0x0060,sizeof interval );
meine variable ganz gervorragend im EEprom sicher und und wieder
auslesen, wenn "interval" vom Typ float ist und habe nur 00 im EEprom
zu stehen, wenn "interval" vom Typ int ist?

von Volkmar (Gast)


Lesenswert?

Welchen Typ hat den speicher? Der Typ muß identisch zum Typ von
intervall sein.

Volkmar

von flyingwolf (Gast)


Lesenswert?

na ja, speicher ist ein float, weil alle Variablen davor halt floats
sind. Ich würd mich ja auch nicht beklagen, wenn es denn am auslesen
liegen würde. Aber es steht im EEprom schon nur noch 00 drin.
Das Auslesen über speicher und die anschließende Zuweisung interval =
(int)speicher klappt übrigens problemlos.
Ich hab schon überlegt, ob ich einfach eine hilfsvariable anlege über
die ich aus dem interval eine float mache, bevor ich es speichere, aber
dass kann unmöglich der richtige Weg sein.
Ok, jetzt habe ich erst mal mein Intervall generell zu einem float
gemacht, aber es geht doch sicherlich auch mit int?

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.