Guten Abend, ich komme einfach nicht weiter. Ich will mit einem ATMEGA16 über den ADC eine Spannung messen und diese in den EEPROM schreiben. Dann Adresse erhöhen und beim nächsten Durchlauf meiner Hauptschleife wieder die neu gemessene Spannung in den EEPROM schreiben. Später sollen diese Werte über den PC und STK500 ausgelesen werden. Ich benutze Code::Blocks als IDE. Zu meinem Problem. Der Compiler spuckt bei dem folgenden Code ( zu Großteil aus dem AVR-GCC-Tutorial) immer eine Fehlermeldung aus. uint8_t eeFooByte EEMEM = 1; int main(void) { uint8_t ureal; while(1){ u=ReadChannel(0); //Spannung messen ureal= ((u/1024)*5); //in Volt umrechnen eeprom_write_byte(&eeFooByte, ureal); eeFooByte ++; if (eeFooByte > 512) { eeFooByte=1; } ........ Hier ist die Fehlermeldung: -------------- Build: Debug in bz_rccar5_mit Speicher --------------- Compiling: main.c Linking console executable: bin/Debug/bz_rccar5_mit Speicher.elf avr-g++: Speicher.elf.map,--cref: No such file or directory Process terminated with status 1 (0 minutes, 0 seconds) 0 errors, 0 warnings Kann mir bitte jemand sagen wo der Fehler steckt? Ich komm einfach nicht weiter! Gruß
Hmm, des sind zwar Unterstriche und die haben mir bis jetzt noch nie Probleme gemacht. Wenn ich aber ein neues Projekt ohne die _ anlege kommt kein Fehler mehr! Wann machen die Ärger und wann nicht? Danke für die Hilfe.
Rentner Uralt schrieb: > Hmm, des sind zwar Unterstriche und die haben mir bis jetzt noch nie > Probleme gemacht. "bz_rccar5_mit Speicher.elf" Ein Leerzeichen zwischen "mit" und "Speicher" ;)
Rentner Uralt schrieb: > Hmm, des sind zwar Unterstriche und die haben mir bis jetzt noch nie > Probleme gemacht. Rentner Uralt schrieb: > Linking console executable: bin/Debug/bz_rccar5_mit Speicher.elf ^^^ Unterstrich? ( hüstel )
Rentner Uralt schrieb: > while(1){ > ... > eeprom_write_byte(&eeFooByte, ureal); > eeFooByte ++; > if (eeFooByte > 512) > { > eeFooByte=1; > } In einer Endlosschleife immer in den EEPROM schreiben ist mutig. Wenn man bedenkt, dass eine EEPROM-Zelle etwa nur 10.000 Löschzyklen hält. Ich würde lieber in einen RAM Buffer schreiben und den Buffer erst nach Auslösen durch einen Benutzer (z.B. durch Tastendruck) in den EEPROM übertragen, falls es denn sein muss. Gruß, bix
Hi Dem letzteren Beitrag würd ich auch etwas mehr Aufmerksamkeit widmen. Es macht keinen Sinn, den EEProm Bereich ständig zu überschreiben. Sollen mit dem µC Werte an den PC gesendet werden, sind die Werte im SRam genauso Sinnvoll. Um die ersten 10 Meßzyklen vielleicht zu übergehen, könnte man die Ausgabe solange unterbinden. Sollte es notwendig sein, nach einem Spannungsausfall auf die letzten Werte zuzugreifen, denk ich, das da eine Detektierung der Versorgungsspannung erfolgen sollte und bei Ausfall über eine Spannungspufferung die letzten Werte in den EEprom schreiben. Hier reicht vielleicht ein entsprechend großer Kondensator. Einfach die Versorgungsspannung mit einer Diode an VCC und Kondensator, aber direkt an einen freien Eingang. Dann muß erst mal 10000x die Spannung ausfallen, bevor der Speicher seinen Dienst versagt..... Beim Neustart kann dann eine Initialisierungs-Routine die EEProm-Werte in den SRAM schreiben und von da aus gehts mit der normalen Datenübertragung an den PC. Gruß oldmax
Hi, eigentlich wollte ich den ATMEGA aus der Schaltung ziehen und zum auslesen ins STK stecken. Aber ich werde nun die Datenspeicherung/-übertragung wie vom Max und bix beschrieben versuchen. Hatte als Spannungspuffer (Versorgungsspannung bricht öfter ab) schon einen 1F Kondensator reingepackt. Sollte nach meinen Berechnungen circa 1 bis 2 Minuten (Wenn Schaltung zusätzlich belastet wird) überbrücken können. Kann ich dann alles in den RAM schreiben und über den ISP-->STK-->PC auslesen? Gruß
bix schrieb:
> dass eine EEPROM-Zelle etwa nur 10.000 Löschzyklen hält.
100.000
warum nicht einfach per UART an den PC übretragen?
usb/seriell (mit ttl + RS232 Pegeln) Adapter gibts in der Bucht für 10€.
Alternativ kann man sich auch einen selber bauen suche mal nach "AVR
CDC"
Ich halte die Lösung das RAM per UART auszulesen wie von Vlad Tepesch vorgeschlagen für den sinnvollsten Weg. Per ISP hast Du keinen Zugriff auf das RAM. Ich verwende das EEPROM zwar hin und wieder ganz gerne als Temporären Datenspeicher (während der Entwicklung). Solange die Schreibzyklen (lt. DB 100000) ausreichen, mag das interne EEPROM verwendbar sein. Wenn es denn nur über EEPROM geht und viele Schreibzyklen nötig sind gibt es preisgünstig externe serielle EEPROMs, die ca. 10 mal soviel Zyklen mitmachen. Notfalls geht auch ein mit einer Knopfzelle gepuffertes SRAM, habe ich auch schon verwendet, für Testzwecke OK, aber nichts für Serie oder Dauereinsatz.
Hi Um nicht mißverstanden zu werden: Natürlich die Daten in den SRam und dann ohne EEProm an den PC senden. Lediglich, wenn keine Daten verloren gehen dürfen oder man genau wissen will, was vor dem Netzausfall war, die Daten retten und ins EEProm schreiben, damit man sie beim Spannungswiederkehr zur Verfügung hat. Deswegen schrieb ich auch: erst die Daten ins Ram und dann mit normaler Übertragung vom Ram zum PC. Ich benutze den EEprom nur für dauerhafte Parametereinstellung, also Werte, die einmal per PC in den Controller geschickt und dann dem völlig autarken µC sagen, wo's langgeht. Erst, wenn sich Parameter ändern, werden diese mit PC neu beschrieben. Gruß oldmax
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.