Hallo, ich bin gerade am schreiben einer Routine zum umrechnen einer Thermospannung in die entsprechende Temperatur da ich meine Programmier und die Rechenkünste des Atmega8 nicht so hoch einschätze habe ich versucht die Spannung aus einer Liste heraus zu suchen, und falls es nötig ist die werte anzugleichen. Auf dem PC läuft das auch gut aber der AVR bleibt bei ca 29253 µV also 702 C hängen bzw. er zeigt nur noch mist an. Hat jemand eine Idee an was das liegen könnte oder einen fertigen (C)Code der diese Aufgabe erfüllt ? Sebastian
if((e < EmV[x])&(e > EmV[(x-1)])) Nach deiner Beschreibung müssen beide Bedingungen wahr sein, sollte da nicht ein && stehen
Hallo Hubert, danke für den Tipp aber es zeigt sich leider keine Veränderung. Sebastian
Hallo, könnte es sein das das Ram überfüllt ist, wenn ja wie kann ich das prüfen. Sebastian
Nur kurz reingeschaut: Nimm doch mal die Tabelle aus der Funktion raus und mache sie global, lokal braucht sie halt ziemlich viel Stack ... Walter
Hallo Walter, Danke für den Tipp. Wenn meine Annahme stimmt das variablen die ausserhalb einer Funktion deklariert sind global sind hilft mir dein Tipp leider nichts."wenn e > 54819 gibts wohl Unsinn" damit hast du sogar doppelt recht den bei 1370 C(54819µV) verendet das Thermoelement. Gruß Sebastian
aber im Beispiel ist die Tabelle doch innerhalb der Funktion definiert??? Walter
Hallo Walter, sorry war vielleicht etwas ungeschickt formuliert. Ich habe es mit der Tabelle ausserhalb der Funktion getestet und es hat nicht funktioniert. Sebastian
Leg die Tabelle ausserdem im Flash ab (spart 276 Byte Ram), man braucht aber dann andere Zugriffsmethoden. Ich hab eigentlich genau so was änliches schon mal gemacht, allerdings ohne Divide and conquer (war mir zu Aufwändig und zu viel Overhead, bzw ich war zu faul g), sondern bin die liste einfach durch gegangen, bis ich das passende Intervall gefunden habe. Gruß Roland
Hallo Roland, habe ich auch schon versucht aber ich bekomme wenn ich versuche (siehe anhang) einen wert aus dem Flash zu lesen immer nur mist. Sebastian
Dürfte an _attribute_ ((progmem)) liegen, siehe pgmspace.h. Statt progmem _progmem_
Hab nochmal nachgeschaut. In der jetzigen(?) Version vom GCC scheints dafür extra Makros zu geben. Sihehe hier: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29 Gruß Roland
Hallo, wenn ich die Variablen mit long deklariere geht es. Hat jemand eine Ahnung wieso. Sebastian
In vorhergehenden Codes war EMV als unsigned int (16bit) declariert und Du hast mit float (32bit) verglichen (e) ohne zu casten. Durch type casten kannst Du die Look-up Tabelle auch wieder mit unsigned int machen, was Dir ne Menge Codespace spart, da Du 16bit Werte ablegst anstatt 32bit. Du solltest Dir weiterhin überlegen, ob Du wirklich float's brauchst, oder ob Du auch mit Integern arbeiten kannst. Das spart Dir auch einiges an Codespace. Ein weiterer Fehler kann auftreten, wenn Du Werte innerhalb der Tabelle hast, die 65535 überschreiten. pgm_read_word liest nur einen 16bit Wert aus dem Flash, wenn diese als unsigned long abgelegt sind. pgm_read_dword wäre hier zu empfehlen. /Michael
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.