mikrocontroller.net

Forum: Analoge Elektronik und Schaltungstechnik Thermospannung --> Temperatur


Autor: Sebastian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hubert.G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if((e < EmV[x])&(e > EmV[(x-1)]))
Nach deiner Beschreibung müssen beide Bedingungen wahr sein, sollte da
nicht ein && stehen

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hubert,
danke für den Tipp aber es zeigt sich leider keine Veränderung.

Sebastian

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
könnte es sein das das Ram überfüllt ist, wenn ja wie kann ich das
prüfen.

Sebastian

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur kurz reingeschaut:
Nimm doch mal die Tabelle aus der Funktion raus und mache sie global,
lokal braucht sie halt ziemlich viel Stack ...

Walter

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja,
wenn e > 54819 gibts wohl Unsinn
Walter

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber im Beispiel ist die Tabelle doch innerhalb der Funktion
definiert???

Walter

Autor: Sebastian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Walter,
sorry war vielleicht etwas ungeschickt formuliert. Ich habe es mit der
Tabelle ausserhalb der Funktion getestet und es hat nicht
funktioniert.

Sebastian

Autor: Roland Praml (pram)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Sebastian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dürfte an _attribute_ ((progmem)) liegen, siehe pgmspace.h.
Statt progmem _progmem_

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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-Tu...

Gruß
Roland

Autor: Sebastian Arnd (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wenn ich die Variablen mit long deklariere geht es. Hat jemand eine
Ahnung wieso.

Sebastian

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.