Temperaturmessung mit dem R8C/13

Software und Quellcodes für Microcontroller

Software und Quellcodes für Microcontroller

Moderator: Moderatorengruppe

Temperaturmessung mit dem R8C/13

Neuer Beitragvon Menson am Sonntag 4. November 2012, 17:27

Hallo

Ich versuche gerade ein kleines Programm zu schreiben, dass mir die gemessene Temperatur eines LM61C auf ein LC-Display zaubert.
Da ich keine Programmierkentnisse habe, tappe ich stets im dunkeln.

Ich brauche blos eine Funktion, die die Spannung am ADC liest und ans Display schickt.
Der LM61C hat einen Temperaturkoeffizienten von 10mV/°C. Bei 0°C liefert er 600mV.
Der Messbereich soll zwischen -20°C und +50°C liegen. Eine Auflösung von 0,1°C wäre wünschenswert.
Der R8C/13 wird mit 5V versorgt.

Kann mir dabei jemand bei Schreiben der Funktion helfen ?

mfg, Menson
Sie haben keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Menson
Threadstarter
48624
Bronze Mitglied
 
Beiträge: 37
Registriert: Mittwoch 12. November 2008, 19:35

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon Menson am Sonntag 11. November 2012, 13:59

Über 600 mal gelesen, und keine einzige Antwort ?!
Ist mein Vorhaben denn sooooo kompliziert.
Ich ging eigentlich davon aus, dass so eine Funktion, für jemanden der einen µC programmieren kann, ein Klacks ist.

Bin ich hier im falschen Forum, oder in der falschen Rubrik ?

lg, Menson
Menson
Threadstarter
48672
Bronze Mitglied
 
Beiträge: 37
Registriert: Mittwoch 12. November 2008, 19:35

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon anders am Sonntag 11. November 2012, 16:54

Ich ging eigentlich davon aus, dass so eine Funktion, für jemanden der einen µC programmieren kann, ein Klacks ist.

Bin ich hier im falschen Forum, oder in der falschen Rubrik ?
Nein, aber die Hitachi Prozessoren sind hierzulande nicht sehr verbreitet und hardwarenahe Programme kann man nicht schreiben, ohne die verwendete Hardware und den Schaltplan zu kennen.
anders
48675
Moderator
 
Beiträge: 3924
Registriert: Freitag 28. Februar 2003, 13:46

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon Menson am Sonntag 11. November 2012, 18:35

Vielen Dank für deine Info.

Was muss ich also machen um mein Ziel zu erreichen ?

Ich kann nur den R8C/13 flashen. Für andere Controller habe ich keine Entwicklungsumgebung. Für den R8C/13 habe ich die HEW am laufen, und auch der Chip selber ist hier :-)

Hab ja schon fast das ganze Programm fertig - blos die Funktion für die Spannungsmessung fehlt noch.

lg
Menson
Threadstarter
48678
Bronze Mitglied
 
Beiträge: 37
Registriert: Mittwoch 12. November 2008, 19:35

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon BernhardS am Sonntag 11. November 2012, 20:45

Mikrokontroller ist hier nicht so stark vertreten.

Stell die Frage doch mal bei mikrocontroller.net. Wenn Du gleich dazuschreibst, daß man hier nicht helfen konnte, dann kriegst Du auch keinen Rüffel wegen crossposting.
$2B OR NOT $2B = $FF
BernhardS
48680
Moderator
 
Beiträge: 3697
Registriert: Donnerstag 17. Februar 2005, 17:50
Postleitzahl: 84028
Land: Germany / Deutschland

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon Menson am Montag 12. November 2012, 06:55

Stell die Frage doch mal bei mikrocontroller.net. Wenn Du gleich dazuschreibst, daß man hier nicht helfen konnte, dann kriegst Du auch keinen Rüffel wegen crossposting.


Den hab ich schon vorher bekommen.
Die meinten ich soll gefälligst selber eine Programmiersprache lernen und meine Arbeit selber machen.
Sind nicht sehr kooperativ da. Die glaubten vllt. sie sollten meine Schulaufgaben machen. Dabei will ich gar kein Programmierer werden. Bin Pensionist und möchte blos meinen R8C/13 aus der Elektor sinnvoll nutzen - nichts weiter.
Ist aber nicht so einfach. Programmierer sind scheinbar ein sehr eigenes Volk :roll:
Menson
Threadstarter
48681
Bronze Mitglied
 
Beiträge: 37
Registriert: Mittwoch 12. November 2008, 19:35

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon Jens am Montag 12. November 2012, 07:13

Menson hat geschrieben:Programmierer sind scheinbar ein sehr eigenes Volk :roll:

Bitte nicht so verallgemeinern. Ich kenne sehr freundlichen Programmiererforen. Allerdings nicht im Microcontrollerbereich. µC.net empfinde ich allerdings auch als sehr ruppiges Forum.

Gruß Jens
(Hauptberuflicher Programmierer)
Jens
48682
Bronze Mitglied
 
Beiträge: 135
Registriert: Donnerstag 15. Dezember 2011, 13:39
Postleitzahl: 49824
Land: Germany / Deutschland

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon Menson am Montag 12. November 2012, 08:13

Bitte nicht so verallgemeinern. Ich kenne sehr freundlichen Programmiererforen. Allerdings nicht im Microcontrollerbereich. µC.net empfinde ich allerdings auch als sehr ruppiges Forum.


Schon klar - man kann nicht alle in einen Topf werfen.

Nun hab ichs eben mal hier versucht. Wenns nichts wird, muss ichs eben noch anderswo weiter versuchen. So unlösbar kanns ja nicht sein.

lg
Menson
Threadstarter
48683
Bronze Mitglied
 
Beiträge: 37
Registriert: Mittwoch 12. November 2008, 19:35

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon anders am Montag 12. November 2012, 11:54

möchte blos meinen R8C/13 aus der Elektor sinnvoll nutzen
Ach daher hast du diesen Exoten.
Was haben die denn damit gemacht?

Das Hauptproblem wird sein, daß es nicht allzu viele gibt, die mit diesem Teil spielen, und daß die meisten solch kurze Programme von vielleicht 50 Maschinenbefehlen nicht in C, sondern in Assembler schreiben.
Bei heutigen Prozessern, die mit ADC, Komparatoren, Timern und PWM vollgestopft sind, ist der schwierigste Teil oft nicht das eigentliche Programm, sondern die korrekte Initialisierung dieser Maschinerie.
Dazu ist das sorgfältige Studium des Datenblatts erforderlich, denn man kann in diese Dinger nicht hineinschauen und mit einem Oszilloskop messen, warum irgend ein Modul nicht so tickt, wie beabsichtigt.
Deshalb ist zweckmäßig, daß man gezielt einen Maschinenbefehl nach dem anderen hinschreibt, anstatt darauf zu vertrauen, daß der Compiler es schon "irgendwie" richten wird.
Kann sein, daß das so funktioniert, aber wenn nicht, hast du eine harte Zeit vor dir.

Langer Rede kurzer Sinn:
Ich denke, daß du deine Nerven und die deiner Mitmenschen schonst, wenn du für derart kleine Sachen einen der gängigen Prozessor von Atmel oder Microchip wählst, und in Assembler programmierst. Dafür gibt es tausende von Hobby- und Berufsprogrammieren, die dich unterstützen können.
Den Assemblerdialekt des betreffenden Prozessors musst du ohnehin verstehen, sonst wird es dir auch in C kaum gelingen die Hardware in den Griff zu bekommen.
Zuletzt geändert von anders am Montag 12. November 2012, 11:58, insgesamt 2-mal geändert.
anders
48686
Moderator
 
Beiträge: 3924
Registriert: Freitag 28. Februar 2003, 13:46

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon Menson am Montag 12. November 2012, 16:16

Den Assemblerdialekt des betreffenden Prozessors musst du ohnehin verstehen, sonst wird es dir auch in C kaum gelingen die Hardware in den Griff zu bekommen.


Ich hab die Schaltung ja längst auf der Steckplatte aufgebaut. Und mit dem PC zum Flashen verbunden. Die Hardware ist also kein Problem.

lg
Menson
Threadstarter
48695
Bronze Mitglied
 
Beiträge: 37
Registriert: Mittwoch 12. November 2008, 19:35

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon derguteweka am Montag 12. November 2012, 18:47

Moin,

Fuer die Endlosschleife in der main() wuerd' ich folgendes vorschlagen:

Code: Alles auswählen
while(1)
        {
                lcd_pos (2,4);
                lcd_integer(temperatur(ad_in(6)));
                delayus(50000);
        }


Die Funktion temperatur() koennte dann irgendwie so aussehen:
Code: Alles auswählen
int temperatur(unsigned int adc)
{
  int t=(int) adc;
  t*=25;
  t+=4;
  t/=8;
  t*25;
  t+=8;
  t/=16;
  t-=600;
  return t;
}


Das ist kein schoener code, ich hab' auch nicht ausprobiert obs geht. Er soll folgendes machen:
Ich mutmasse mal, dass der ADC bei 5V Eingang (=5000mV) den Wert 1024 liefern wuerde.
Also muss ich den ADC Wert mal 4.8828125 nehmen, dann krieg ich mV raus. Das ist soviel wie: 625/128, das ist widerum (25/8)*(25/16). Das kann man prima mit floating point Arithmetk machen, ich weiss aber nicht, ob's die gibt. Ich weiss auch nicht wie gross eine unsigned int sein kann - deshalb rechne ich mal in kleineren Schritten und mit Integerarithmetik, dann passen die Zahlen auf jeden Fall in 16 bit. Der Code ist halt unleserlich, aber wenigstens schnell...Die Additionen vor den Divisionen sind zum richtigen Runden gedacht.
Nach der ollen Multiplikation ueber Umwege zieh' ich die 600mV ab, die bei 0°C anliegen sollen, danach sollte das Ergebnis in 0.1°C Schritten passen.

Gruss
WK
derguteweka
48705
Moderator
 
Beiträge: 1043
Registriert: Freitag 18. August 2006, 15:47

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon BernhardS am Dienstag 13. November 2012, 09:32

Menson hat geschrieben:
Stell die Frage doch mal bei mikrocontroller.net. Wenn Du gleich dazuschreibst, daß man hier nicht helfen konnte, dann kriegst Du auch keinen Rüffel wegen crossposting.


Den hab ich schon vorher bekommen.
Die meinten ich soll gefälligst selber eine Programmiersprache lernen und meine Arbeit selber machen.
Sind nicht sehr kooperativ da. Die glaubten vllt. sie sollten meine Schulaufgaben machen. Dabei will ich gar kein Programmierer werden. Bin Pensionist und möchte blos meinen R8C/13 aus der Elektor sinnvoll nutzen - nichts weiter.
Ist aber nicht so einfach. Programmierer sind scheinbar ein sehr eigenes Volk :roll:


Mein Fehler. Ich hätte das berücksichtigen können - bin mit der Empfehlung schon mal aufgelaufen.
Ich lese da ganz gerne. Über atmosphärische Störungen lese ich dort halt drüber weg und vergesse es wieder.
$2B OR NOT $2B = $FF
BernhardS
48718
Moderator
 
Beiträge: 3697
Registriert: Donnerstag 17. Februar 2005, 17:50
Postleitzahl: 84028
Land: Germany / Deutschland

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon Menson am Dienstag 13. November 2012, 11:55

Fuer die Endlosschleife in der main() wuerd' ich folgendes vorschlagen:

Code: Alles auswählen
while(1)
        {
                lcd_pos (2,4);
                lcd_integer(temperatur(ad_in(6)));
                delayus(50000);
        }


So geht das schon mal nicht. Die Endlosschleife in main() sieht so aus:

Code: Alles auswählen
   while(1)
   {
      lcd_integer(ad_in(6));
      temperatur();
      delayus(50000);
   }




Die Funktion temperatur() koennte dann irgendwie so aussehen:
Code: Alles auswählen
int temperatur(unsigned int adc)
{
  int t=(int) adc;
  t*=25;
  t+=4;
  t/=8;
  t*25;
  t+=8;
  t/=16;
  t-=600;
  return t;
}


Diese Befehle kann der Compiler so nicht lesen. Ich hab die Funktion mal so geschrieben:

Code: Alles auswählen
float u;
long int t;
u = (float) ad_in(6);
u = u / 1023.0 * 5.0;
u = u - 0.6;

initlcd();               // LCD Refresh

lcd_pos (1,8);            // LCD Position (1.Zeile, 8.Zeichen

lcddata (u);            // schreibe Variable u ins Display


t=0;
while (t<100000){t=t+1;}      // Pause (~1/10sec)


So sollte es meinen Meinung nach funktionieren. Tut es natürlich aber nicht.
Ich bekomm am Display in Zeile 1 an Position 8 nur ein schwarzes Kästchen angezeigt.


Hier mal mein Gedankengang Schritt für Schritt:

Mit dem Befehl
Code: Alles auswählen
u = (float) ad_in(6);

soll der Analoge Eingang ausgelesen werden. Folglich sollten in der Variablen "u" die Rohdaten sein. Also ein Zahlenwert, der dem analogen Eingang entspricht.

Im nächsten Befehl
Code: Alles auswählen
u = u / 1023.0 * 5.0;

sollen die Rohdaten / 1023 gerechnet werden (dass muss scheinbar so sein).
Dann mal 5, da der Eingang maximal 5V annehmen darf.
Die Variable "u" müsste nun die Eingangsspannung in Volt enthalten.

Im nächsten Schritt
Code: Alles auswählen
u = u - 0.6;

werden 0.6V abgezogen (0,6V entspricht der Ausgangsspannung des Temp-Sensors bei 0°C)

Dann braucht die Variable "u" nur noch ans Display übergeben werden.
Code: Alles auswählen
lcddata (u);


Raus kommt wie gesagt nur ein schwarzes Kästchen an Position 8.

Der Befehl am Ende der Funktion
Code: Alles auswählen
t=0;
while (t<100000){t=t+1;}      // Pause (~1/10sec)

sorgt für etwas Wartezeit zwischen den Abläufen, damit das Display nicht ständig hin- und herspringt.
Eine Pause von etwa 0,1 Sekunden


Ist meine Überlegung grundsätzlich falsch, oder hab ich nur einen Denkfehler ? :me:

lg
Menson
Threadstarter
48723
Bronze Mitglied
 
Beiträge: 37
Registriert: Mittwoch 12. November 2008, 19:35

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon derguteweka am Dienstag 13. November 2012, 16:57

Moin,

Menson hat geschrieben:So geht das schon mal nicht. Die Endlosschleife in main() sieht so aus:

Code: Alles auswählen
   while(1)
   {
      lcd_integer(ad_in(6));
      temperatur();
      delayus(50000);
   }

OK - Wir leben in einem freien Land, wo jeder seine main() nach seinem Geschmack ausfuellen kann...




Diese Befehle kann der Compiler so nicht lesen.

Ja, hab gesehen, dass ich da noch mindestens einen Tippfehler drinnenhab. Ueberlaufsicher ist sie auch nicht, und nachdem jetzt auch klar ist, dass das Dingens floating point kann, braucht man die Klimmzuege eh' nicht.

Ich hab die Funktion mal so geschrieben:

...

lcddata (u); // schreibe Variable u ins Display


Das ist das Problem. Diese Funktion schreibt wahrscheinlich nicht eine Integer aufs Display, sondern nur ein Byte - also ein ASCII Zeichen oder einen Steuerbefehl. Wie waers stattdessen mit
Code: Alles auswählen
lcd_integer(1000*u);// schreibe Variable u ins Display


Dann haste ne Chance, die Temperatur in 1/10 °C angezeigt zu bekommen. Den Dezimalpunkt und Vorzeichenfaxen kannste dann immernoch hinfummeln, wenn das erstmal funktioniert.

Gruss
WK
derguteweka
48728
Moderator
 
Beiträge: 1043
Registriert: Freitag 18. August 2006, 15:47

Re: Temperaturmessung mit dem R8C/13

Neuer Beitragvon Menson am Dienstag 13. November 2012, 17:37

Das ist das Problem. Diese Funktion schreibt wahrscheinlich nicht eine Integer aufs Display, sondern nur ein Byte - also ein ASCII Zeichen oder einen Steuerbefehl. Wie waers stattdessen mit
Code: Alles auswählenlcd_integer(1000*u);// schreibe Variable u ins Display

Dann haste ne Chance, die Temperatur in 1/10 °C angezeigt zu bekommen. Den Dezimalpunkt und Vorzeichenfaxen kannste dann immernoch hinfummeln, wenn das erstmal funktioniert.


Genau dass ist es :-)

Am Display erscheint eine vierstellige Zahl.
Gegenwärtig schwank sie zwischen "0196" und "0201". Entspricht also 19,6 und 20,1°C.

Frage1:
Wie bekomme ich die vorangestellte(n) Null(en) weg ?

Frage2:
Wie geht das mit dem Vorzeichen - also wenn Temperaturen unter 0°C gemessen werden?

Frage3:
Hab ich noch was vergessen ???

lg
Menson
Threadstarter
48733
Bronze Mitglied
 
Beiträge: 37
Registriert: Mittwoch 12. November 2008, 19:35

Nächste

Zurück zu Software

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste