Forum: Mikrocontroller und Digitale Elektronik R8C/13 Software-Verständnisfrage


von Alfred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich versteh z.Z. die Weld nicht mehr.
Meine Programmierkentnisse sind zugegeben mehr als gering. Aber mit 
folgendem Verhalten komm ich einfach nicht klar.

Ich spreche ein LC-Display an. Es soll ein bestimmtes Zeichen im Display 
erscheinen. Im gegebenen Fall ein großes "C".
1
lcddata (67);   // Ascii C

Das funktioniert auch so.
Möchte ich aber zwei "C" schreiben, also zweimal die gleiche Zeile:
1
lcddata (67);   // Ascii C
2
lcddata (67);   // Ascii C

... dann bekomm ich eine Fehlermeldung.
siehe Screenshots

Ist zum Haare raufen - was läuft hier falsch.

Bitte um Hilfe.

lg. Fred

von Nico (nico123)


Lesenswert?

Werden die Fehler unten im Ausgabefenster nicht genauer erklärt?
Scroll mal höher!

von Alfred (Gast)


Angehängte Dateien:

Lesenswert?

Die beiden Screenshots hier, zeigen den ganzen Text vom unteren 
Ausgabefenster.

lg, Fred

von Olaf (Gast)


Lesenswert?

> Die beiden Screenshots hier, zeigen den ganzen Text vom unteren
> Ausgabefenster.

Das steht doch der Fehler. Musst ihn nur lesen. :-)

Deine Section Romdata liegt auf dem Platz wo sich die Interruptverktoren 
befinden. Der Grund ist das dein Programm so gross geworden ist das es 
nicht mehr in den Controller passt. Dadurch ist der Programmplatz in die 
Interruptvektoren reingewachsen.

von Alfred (Gast)


Lesenswert?

Hallo

So groß ist es doch garnicht.
Es sind insgesamt 312 Zeilen (die Hälfte davon Leerzeilen).

lg

von Karl H. (kbuchegg)


Lesenswert?

Alfred schrieb:
> Hallo
>
> So groß ist es doch garnicht.
> Es sind insgesamt 312 Zeilen (die Hälfte davon Leerzeilen).

Da kommt ja auch noch was vom C-runtime System dazu.
Im übrigen: Das ist das was dein Compiler/Linker sagt.
Und der hat immer recht.

(Gibts da keinen Optimizer? Aus deinem Output ist das nicht ersichtlich, 
ob es da sowas gibt, bzw. ob der eingeschaltet ist. So wie jetzt, nach 
dem zu urteilen, was man im Screenshot sieht, ist dein Programm mehr als 
umständlich.
zb
wozu
   u = u - (2*u);

warum nicht einfach
   u = -u;

Die ganze Sequenz
1
   if (u < 0){
2
     u = u - (2*u);
3
     lcd_pos(1,7);
4
     lcd_data(45);}
5
     else
6
     {lcd_pos(1,8);}

könnte man so schreiben
1
   if (u < 0)
2
   {
3
     lcd_data( '-' );
4
     u = -u;
5
   }
6
   else
7
     lcd_data( ' ' );

welche einfacher ist und auch richtiger. Denn so würde beim 
Überschreiben von Zahlen ein nicht mehr gebrauchtes 'Vorzeichen' dann 
auch vom Display gelöscht werden, was bei dir nicht passiert.

PS: deine Codeformatierung ist grauenhaft.

von xfr (Gast)


Lesenswert?

ASCII-Zeichen kann man übrigens auch direkt in den C-Code schreiben, man 
muss nicht die dezimale Nummer nachschlagen.

Statt
1
lcddata (67);   // Ascii C

also besser:
1
lcddata('C');

von Olaf (Gast)


Lesenswert?

> So groß ist es doch garnicht.

Kuck dir mal an was dein Linker alles an Files einbindet. Es sieht so 
aus als wenn du deinen armen alten untermotorisierten R8C mit bergeweise 
Fliesskommaoperationen quaelst.

Olaf

von Alfred (Gast)


Lesenswert?

> Statt
1
lcddata (67);   // Ascii C
> also besser:
1
lcddata('C');

Danke! Wieder was dazugelernt :-)
lg

von Alfred (Gast)


Lesenswert?

> Da kommt ja auch noch was vom C-runtime System dazu.
> Im übrigen: Das ist das was dein Compiler/Linker sagt.
> Und der hat immer recht.
>
> (Gibts da keinen Optimizer? Aus deinem Output ist das nicht ersichtlich,
> ob es da sowas gibt, bzw. ob der eingeschaltet ist. So wie jetzt, nach
> dem zu urteilen, was man im Screenshot sieht, ist dein Programm mehr als
> umständlich.


Das mein Code etwas um die Ecke ist, ist mir schon klar. Aber das das 
Programm zu groß ist, kann ich nicht verstehen. Hab schon Programme 
geschrieben, die waren deutlich größer und dabei gab es keine solchen 
Error-Meldungen.

Hat sich evtl. bei irgendwelchen Einstellung des Compielers was 
'verdreht', so dass dieses kleine Programm zu groß erscheint?


Mit dem Optimizer das weis ich nicht. Ob es sowas gibt oder nicht - ist 
mir bislang jedenfalls noch nicht untergekommen.

lg

von Karl H. (kbuchegg)


Lesenswert?

> Das mein Code etwas um die Ecke ist, ist mir schon klar. Aber das das
> Programm zu groß ist, kann ich nicht verstehen.

Wir auch nicht.
Und dabei hast du sogar dein Vorteil, dass du dein Programm vor dir auf 
dem Bildschirm sehen kannst. Etwas, was wir nicht können. Nimm doch mal 
die Rückwand von deinem Monitor ab, dann kann man vielleicht von dieser 
Seite des Bildschirms auch was sehen.

von Blub (Gast)


Lesenswert?

Olaf schrieb:
> deinen armen alten untermotorisierten R8C

Das ist ein 16 Bit Rechner, der fährt schon gut.

von Alfred (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
>> Das mein Code etwas um die Ecke ist, ist mir schon klar. Aber das das
>> Programm zu groß ist, kann ich nicht verstehen.
>
> Wir auch nicht.
> Und dabei hast du sogar dein Vorteil, dass du dein Programm vor dir auf
> dem Bildschirm sehen kannst. Etwas, was wir nicht können. Nimm doch mal
> die Rückwand von deinem Monitor ab, dann kann man vielleicht von dieser
> Seite des Bildschirms auch was sehen.

Bei meinem Monitor bestimmt nicht, aber vllt. bei deinem.
Was willst du den sehen damit du mir helfen kannst ?

lg

von Karl H. (kbuchegg)


Lesenswert?

Alfred schrieb:

> Was willst du den sehen damit du mir helfen kannst ?

Gute Frage. Und so schwer zu beantworten!


Na zum Beispiel dein komplettes Programm (aber bitte nicht wieder als 
Screenshot. Es ist nicht verboten hier ganz einfach dein C-File als 
Attachment anzuhängen).
Denn mit dem Programm könnte man es mal auf typische Problemstellungen 
durchsehen, die Speicher verschlingen.

von Olaf (Gast)


Lesenswert?

> Das ist ein 16 Bit Rechner, der fährt schon gut.

Ich glaub ich weiss schon was ein ein R8C/M16C ist. Ich bin sogar in der 
Lage zu sehen was der Linker alles aus der r8clib holt. Damit 
ueberfodert man das kleine Flash des R8C/13 vielleicht etwas.

Olaf

von Alfred (Gast)


Angehängte Dateien:

Lesenswert?

> Na zum Beispiel dein komplettes Programm (aber bitte nicht wieder als
> Screenshot. Es ist nicht verboten hier ganz einfach dein C-File als
> Attachment anzuhängen).


Hast wohl sonst nichts zu lachen heute, also willst du dich über einen 
Anfänger lustig machen - viel Spaß.

Zum Thema:
Blos die Funktion "Voltmeter" habe ich abgeändert. Alles andere ist von 
einem Beispiel übernommen. Im Bsp. wurde die angelegte Spannung an AN6 
gemessen und am LC angezeigt.

Meine Änderung in dieser Funktion hat zum Ziel, die anliegende Spannung 
(an AN6) zu messen und den Wert abzüglich 600mV am LC anzuzeigen.
Die zu messende Spannung stammt von einem Temeratursensor vom Typ LM61C.
Der liefert bei 0°C 600mV. Und 10mV/°C.
Mein Ziel ist also die gemessene Temperatur im LC anzuzeigen.
Der Temperatur soll so zwischen -20°C und +50°C erfasst werden.

lg, Fred

von Karl H. (kbuchegg)


Lesenswert?

> void voltmeter()
> {
>   float u;

Muss das unbedingt float sein?

Heinweis:
anstelle von zb 1.08 kann man eine Zahl mit 2 Nachkommastellen auch als 
108 (also als Integer) ansehen, wenn man sich merkt, dass bei der 
Ausgabe zwischen 'Hunderter' und 'Zehner' ein Dezimalpunkt rein muss.

Vorteil: die ganze Floating Point Bibliothek (und die ist meistens 
ziemlich unfangreich) fällt mit einem Schlag weg.

Deine jetzige komplizierte Ausgabe der float-Zahl mutiert dann zu einer 
Variation von lcd_integer(), bei der einfach nur an geeigneter Stelle 
noch ein '.' ausgegeben wird.


Die Hauptumstellung ist dann, einen Ersatz für
1
  u = (float) ad_in(6); 
2
  u = u / 1023.0 * 5.0;
3
  u = u - 0.6;
zu finden, so dass bei dieser Rechnung das Hundertfache rauskommt. Das 
sollte aber nicht wirklich schwer sein
1
  u = ad_in(6); 
2
  u = u * 500L / 1023 - 60;

u als int. Eine spezielle Version von lcd_integer, die sich um die 
korrekte Behanldlung des Vorzeichens kümmert:
1
void lcd_signed_integer( int i )
2
{
3
  if( i >= 0 )
4
  {
5
    lcddata( ' ' );
6
    lcd_scaled_integer( i );
7
  }
8
  else
9
  {
10
    lcddata( '-' );
11
    lcd_scaled_integer( -i );
12
  }
13
}
und eine Version von lcd_integer, die den Dezimalpunkt zwischen 
Hunderter und Zehner einfügt
1
void lcd_scaled_integer( int i )
2
{
3
  ...
4
}

und die Sache ist ohne Floating Point erledigt.
Und dann linsen wir nochmal auf den Speicherverbrauch des Programmes.

von Alfred (Gast)


Lesenswert?

Danke für deine Mühe

Ich hab deine Änderungen mal reinkopiert. Jetzt hab ich aber nur noch 
Müll am Display ?!

von Karl H. (kbuchegg)


Lesenswert?

Alfred schrieb:
> Danke für deine Mühe
>
> Ich hab deine Änderungen mal reinkopiert. Jetzt hab ich aber nur noch
> Müll am Display ?!

Dann hast du irgendwo einen Fehler gemacht :-)

Womit wir wieder an der Stelle sind, dass man von hier so schlecht auf 
deinen Monitor sehen kann.

Es ist doch wirklich nicht schwer. Wenn du Probleme mit deinem Programm 
hast, dann zeig dein Programm. Sonst bleibt uns nur die Glaskugel und 
magische Beschwörungsrituale. Und das willst du nicht wirklich.

von Alfred (Gast)


Angehängte Dateien:

Lesenswert?

> Womit wir wieder an der Stelle sind, dass man von hier so schlecht auf
> deinen Monitor sehen kann.


Sobald ich die 'lcd_signed_integer'-Funktion reinkopier hab ich 3 Error.

Guckst du Anhang - Danke.

lg

von Karl H. (kbuchegg)


Lesenswert?

Alfred schrieb:
>> Womit wir wieder an der Stelle sind, dass man von hier so schlecht auf
>> deinen Monitor sehen kann.
>
>
> Sobald ich die 'lcd_signed_integer'-Funktion reinkopier hab ich 3 Error.

C Grundlagen!

Wenn du dein Programm von oben nach unten liest, dann kannst du eine 
Funktion erst dann verwenden, wenn sie schon bekannt ist. Damit also die 
lcd_signed_integer eine Funktion lcd_scaled_integer aufrufen kann, muss 
die DAVOR im Code stehen
1
void lcd_scaled_integer( int i )
2
{
3
  //...
4
}
5
6
void lcd_signed_integer( int i )
7
{
8
  ...
9
}

und eigentlich war das ganze so gedacht, dass DU die Funktion 
lcd_scaled_integer schreibst.

von Karl H. (kbuchegg)


Lesenswert?

Alfred schrieb:
> Danke für deine Mühe
>
> Ich hab deine Änderungen mal reinkopiert. Jetzt hab ich aber nur noch
> Müll am Display ?!

Wie kannst du Müll am Display haben, wenn dein Programm gar nicht 
compiliert, bzw. vollständig ist?

von Alfred (Gast)


Lesenswert?

> Wie kannst du Müll am Display haben, wenn dein Programm gar nicht
> compiliert, bzw. vollständig ist?


Ohne die beiden Funktionen im Code

von Karl H. (kbuchegg)


Lesenswert?

Und falls du es noch nicht gerafft hast, die Funktion voltemeter() sieht 
dann so aus
1
void voltmeter()
2
{
3
  int u;
4
5
  u = ad_in(6);
6
  u = u * 500L / 1023 - 60;
7
8
  lcd_pos (1,7);      // Position
9
  lcd_signed_integer( u );
10
}



Grundsätzlich:
Du wirst hier im Forum meistens keine Komplett-Rundum-Sorglos Pakete 
bekommen, sondern du musst immer mitdenken, wie die Dinge gemeint sind, 
und wie sie eingebaut werden und was das für deinen Code bedeutet. Hier 
im Forum halten wir sehr viel davon, dir insofern zu helfen, dass wir 
dich auf den richtigen Pfad bringen. Aber tragen tun wir dich nicht.

von Alfred (Gast)


Lesenswert?

> Wenn du dein Programm von oben nach unten liest, dann kannst du eine
> Funktion erst dann verwenden, wenn sie schon bekannt ist. Damit also die
> lcd_signed_integer eine Funktion lcd_scaled_integer aufrufen kann, muss
> die DAVOR im Code stehen
> void lcd_scaled_integer( int i )
> {
>   //...
> }
>
> void lcd_signed_integer( int i )
> {
>   ...
> }
>
> und eigentlich war das ganze so gedacht, dass DU die Funktion
> lcd_scaled_integer schreibst.

Das es da ne Reihenfolge zu beachten gibt ist mir neu. Noch nie was 
davon gehört. Aber Danke.
Jetzt ist kein Error mehr.
Müll im Display bleibt aber.

Abr was soll ich denn in die 'lcd_scaled_integer' schreiben?

lg

von Karl H. (kbuchegg)


Lesenswert?

Alfred schrieb:
>> Wie kannst du Müll am Display haben, wenn dein Programm gar nicht
>> compiliert, bzw. vollständig ist?
>
>
> Ohne die beiden Funktionen im Code

Na logisch.
Du hast ja das ganze Floating Point Geraffel deswegen immer noch im 
Code. Das fällt ja deswegen nicht irgendwie magisch weg, nur weil du 
andere Funktionen schreibst. D.h. solange du deine voltmeter() Funktion 
nicht umschreibst, ist dein Programm immer noch zu lang.

von Karl H. (kbuchegg)


Lesenswert?

Alfred schrieb:

> Abr was soll ich denn in die 'lcd_scaled_integer' schreiben?

Na du hast doch auch die Funktion lcd_integer geschrieben!

Ob da jetzt eine Funktion ist, die eine Zahl 8576 als
'8' '6' '7' '6' ausgibt, oder ob die jetzt nach den Hundertern noch 
einen '.' ausgibt, und damit dann am Display '8' '5' '.' '7' '6' (also 
85.76) steht, ist jetzt wirklich keine Raketentechnik!

lcd_scaled_integer funktioniert wie lcd_integer. Nur dass sie nach den 
Hundertern und vor den Zehnern noch einen '.' ausgibt. Wo ist da jetzt 
das Problem?

von Karl H. (kbuchegg)


Lesenswert?

Den Inhalt von lcd_integer übernehmen und an geeigneter Stelle den '.' 
ausgeben lassen.
Ist doch wirklich kein Hexenwerk. Oder?
1
void lcd_scaled_integer (unsigned int data)
2
{
3
  unsigned char byt;
4
  byt = data / 1000;
5
  data = data - byt * 1000;
6
  lcddata(byt + 48);
7
  byt = data / 100;
8
  data = data - byt * 100;
9
  lcddata(byt + 48);
10
11
12
  lcddata( '.' );
13
14
15
  byt = data / 10;
16
  data = data - byt * 10;
17
  lcddata(byt + 48);
18
  lcddata(data + 48); 
19
}

und wenn die Funktion die Zehntausender auch noch behandeln würde, wäre 
es auch nicht schlecht. Hängt aber zugegebenermassen auch von dem zu 
erwartenden Zahlenbereich ab.

von Alfred (Gast)


Angehängte Dateien:

Lesenswert?

> Na du hast doch auch die Funktion lcd_integer geschrieben!

Nein hab ich nicht. Das war schon im Beispiel drin.
Ich hab nur in der Funktion 'Voltmeter' rumgeschrieben.

Hab auch keine Ahnung was da vorsich geht.


> lcd_scaled_integer funktioniert wie lcd_integer. Nur dass sie nach den
> Hundertern und vor den Zehnern noch einen '.' ausgibt. Wo ist da jetzt
> das Problem?

Hab das jetzt mal so gemacht wie ich mir das denke. Verstehen tu ich da 
aber nix mehr. Deshalb auch gleich 9 Error :-|

von Alfred (Gast)


Angehängte Dateien:

Lesenswert?

So, jetzt hab ich deine Funktion eingesetzt - und alle Errors sind weg.

Irgendwas muss aber noch nicht ganz stimmen, denn der Müll im Display 
ist immer noch.

lg

von Flatus Silentius (Gast)


Lesenswert?

Also das wär mir jetzt zu blöd.

von MaWin (Gast)


Lesenswert?

> So groß ist es doch garnicht.

Der R8C ist aber auch eher klein.

Ausserdem hast du vermutlich vergessen die Speichergrösse
beim Erstellen des Projekts zu überprüfen, und dort steht
immer noch 8k statt der 16k die der R8C/13 hat.

Bei float ist doch sozusagen schon eine Addition 8k lang.
Na ja, nicht ganz, aber ganz schön.

von Alfred (Gast)


Lesenswert?

> Ausserdem hast du vermutlich vergessen die Speichergrösse
> beim Erstellen des Projekts zu überprüfen, und dort steht
> immer noch 8k statt der 16k die der R8C/13 hat.

Daran hab ich auch schon gedacht.
Bin aber beim Erstellen des Projets so vorgegangen wie es beschrieben 
ist.
Jetzt klappts ja soweit, dass keine "unbegründeten" Errors mehr kommen. 
War also doch das Projekt zu groß. Wie auch immer.

Tja, nun muss ich auf den Karl Heinz warten, denn das Display zeigt 
immer noch Müll an. Und ich weis nicht woran dass nun wieder liegt.

lg
Fred

von Alfred (Gast)


Angehängte Dateien:

Lesenswert?

Zwischendurch mal ein 'Müllfoto' :-)

lg, Fred

von Alfred (Gast)


Angehängte Dateien:

Lesenswert?

Nach ein paar Änderungen werden zumindest schon mal ein paar Zahlen 
sichtbar. Aber so kalt ists hier bestimmt nicht ;-)
Und der Rest ist immer noch schwarz.
Bin schon gespannt was Karl Heinz dazu sagt ...

Fred

von Alfred (Gast)


Angehängte Dateien:

Lesenswert?

Nach noch ein paar Änderungen sieht es schon mal ganz ordentlich aus.
Leider hat aber der angezeigte Wert nicht viel mit der Temperatur 
gemein.
Hier hat es bestimmt mehr als 16°.
Und wenn ich mit dem Kältespray auf den Sensor sprühe fällt die Anzeige 
nicht unter 10°.

Da stimmt wohl was mit der Umrechnung nicht.
1
u = u * 500L / 1023 - 60;

Aber da blick ich nicht durch. Was ist/sind zB. "500L" ?

Fred

von Olaf (Gast)


Lesenswert?

> Bin schon gespannt was Karl Heinz dazu sagt ...

Vielleicht ist der noch so klein das er schon ins Bett muss?

Vielleicht bist du aber auch schon so gross das du mal den Debugger 
benutzt der in deine Oberflaeche integriert ist, im Singlestep durch 
deinen Code gehst und dabei pruefst ob der Inhalt der Variablen deinen 
Erwartungen entspricht?
Okay, du setzt dich dabei dem Risiko aus etwas zu lernen. Aber das leben 
ist manchmal halt hart.

Ola

von Alfred (Gast)


Lesenswert?

Olaf schrieb:
>> Bin schon gespannt was Karl Heinz dazu sagt ...
>
> Vielleicht ist der noch so klein das er schon ins Bett muss?
>
> Vielleicht bist du aber auch schon so gross das du mal den Debugger
> benutzt der in deine Oberflaeche integriert ist, im Singlestep durch
> deinen Code gehst und dabei pruefst ob der Inhalt der Variablen deinen
> Erwartungen entspricht?
> Okay, du setzt dich dabei dem Risiko aus etwas zu lernen. Aber das leben
> ist manchmal halt hart.
>
> Ola

Ja, dass hab ich schon als erstes gelernt: Das die HEW abstürzt wenn ich 
den Debugger starten will. Und zwar ganz ordentlich, so dass man den 
Rechner neu starten muss um die HEW wieder öffnen zu können.
Hat sich sogar schon mal mein Enkel damit beschäftigt - konnte aber das 
Problem auch nicht finden oder gar lösen.
Ich vermute mal, dass die Entwicklungsumgebung nicht mehr ganz mit Win7 
kompatibel ist. Wie auch immer - den Debugger hab ich noch nie zu 
Gesicht bekommen. Und das wird wohl auch so bleiben :-|

Soviel dazu ...

lg

von Alfred (Gast)


Lesenswert?

Guten Morgen
Mal sehen ob der Karl Heinz schon wach ist und einen Tipp für mich hat, 
damit ich die Temperatur vom LC ablesen kann ?

lg, Fred

von Karl H. (kbuchegg)


Lesenswert?

Och das ist leicht:

lern erst mal C, ehe du dich an ein Projekt wagst.

Das ist doch lächerlich, was du hier aufführst.

> Aber da blick ich nicht durch. Was ist/sind zB. "500L" ?
http://www.mikrocontroller.net/articles/FAQ#Welche_Datentypen_haben_Konstante.3F


> damit ich die Temperatur vom LC ablesen kann ?
Wie kommst du auf die Idee, dass da die Temperatur rauskommen müsste?

von Alfred (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Och das ist leicht:
>
> lern erst mal C, ehe du dich an ein Projekt wagst.
Ich will doch blos ein Thermometer aus meinem R8C/13 machen. Nur 
deswegen möchte ich nicht gleich ne neue Programmiersprache lernen.
Wenn ich die Zündkerzen von meinem alten Käfer wechseln möchte, muss ich 
ja auch nicht drei oder vier Jahre ne Mechaniker Lehre machen. Dafür 
gibts wohl ein Forum - dachte ich zumindest.


>> Aber da blick ich nicht durch. Was ist/sind zB. "500L" ?
> http://www.mikrocontroller.net/articles/FAQ#Welche...
Verstanden. So hab ich das bisher eben noch nicht gesehen - aber gut - 
viele Wege führen nach Rom ...


>> damit ich die Temperatur vom LC ablesen kann ?
> Wie kommst du auf die Idee, dass da die Temperatur rauskommen müsste?
Weil die Spannung, die ich messe von einem Temperatursensor kommt. Und 
diese Spannung eben Temperaturabhängig ist. Hab ich ja Anfangs gepostet.

Bei meinem alten "umständlichen" Code konnte ich die Temperatur im LC 
ablesen. Deshalb auch das umständliche Künsteln mit dem Vorzeichen. 
Schlussendlich aber, wurde die Temperatur mit einer Kommastelle 
angezeigt.

Jetzt nicht mehr. Jetzt wird blos ein Zahlenwert angezeigt, der sich 
auch ein wenig mit der Temperatur ändert, aber keinen brauchbaren Wert 
in °C angibt.

Nun hab ich deinen Rat soweit befolgt und deinen abgeänderten Code 
verwendet. Nun wäre es aber auch schön, wenn wieder die Temperatur 
abzulesen wäre. Ansonst hatte ja das ganze Prozedere bis jetzt nicht 
viel Sinn.

Deshalb bitte ich dich um Hilfe.

lg, Fred

von Karl H. (kbuchegg)


Lesenswert?

Alfred schrieb:


>>> damit ich die Temperatur vom LC ablesen kann ?
>> Wie kommst du auf die Idee, dass da die Temperatur rauskommen müsste?
> Weil die Spannung, die ich messe von einem Temperatursensor kommt. Und
> diese Spannung eben Temperaturabhängig ist. Hab ich ja Anfangs gepostet.

Tja.
Dann musst du sie aber auch entsprechend umrechnen!

> Jetzt nicht mehr. Jetzt wird blos ein Zahlenwert angezeigt, der sich
> auch ein wenig mit der Temperatur ändert, aber keinen brauchbaren Wert
> in °C angibt.

Dann lass mal die -60 in der Umrechnung weg
1
  u = u * 500L / 1023;
und häng ein Voltmeter an den ADC Eingang.
Und dann vergleichst du mal die Anzeige deines Voltmeters mit dem was 
der µC anzeigt.

Vielleicht hast du dann dein Aha-Erlebnis

von Karl H. (kbuchegg)


Lesenswert?

Alfred schrieb:


>>> Aber da blick ich nicht durch. Was ist/sind zB. "500L" ?
>> http://www.mikrocontroller.net/articles/FAQ#Welche...
> Verstanden. So hab ich das bisher eben noch nicht gesehen - aber gut -
> viele Wege führen nach Rom ...

Unter anderem der, ein C-Buch durchzuarbeiten.
Da stehen nämlich solche Sachen alle drinn.
Irgendwo in den ersten Kapiteln. Und in den restlichen Kapiteln stehen 
noch haufenweise andere Dinge drinnen, die man als C-Programmierer 
(unabhängig davon, ob man µC oder Grossrechner programmiert) alle wissen 
sollte.

von Karl H. (kbuchegg)


Lesenswert?

Alfred schrieb:


> Bei meinem alten "umständlichen" Code konnte ich die Temperatur im LC
> ablesen. Deshalb auch das umständliche Künsteln mit dem Vorzeichen.
> Schlussendlich aber, wurde die Temperatur mit einer Kommastelle
> angezeigt.

Dein alter Code hat den Wert vom ADC direkt angezeigt, denn die Funktion 
voltmeter ist überhaupt nicht aufgerufen worden.

von Karl H. (kbuchegg)


Lesenswert?

> Ich will doch blos ein Thermometer aus meinem R8C/13 machen. Nur
> deswegen möchte ich nicht gleich ne neue Programmiersprache lernen.

Ooops. Jetzt erst gelesen.
Ich bin raus.

Du solltest dich bei Mikrosoft bewerben. Du suchen Leute, die von dem 
was sie tun, nichts verstehen wollen. Mit ein bischen Glück kommst du 
ins Usability-Lab und kannst dich den ganzen Tag einrauchen.
Pfffffft - olo ole - Oberfläche komplett umdrehen - supppppaaaaaa! Gib 
mal das Gras rüber!

von Mitleser (Gast)


Lesenswert?

Sehr unterhaltsam, wenn man das so passiv verfolgt:

Der eine will ein kleines Programm schreiben, hat aber keinen Schimmer 
wo hinten und vorne ist.

Und der andere, scheinbar ein Profi - da Moderator, ist nicht gewillt - 
aber wahrscheinlich auch nicht fähig, dem armen Drops zur Seite zu 
stehen.

Schade wenn einer sein Wissen nicht weitergeben kann.
Solche Leute sind genau die Lehrer, die einem Schüler das lernen so 
schwer machen, dass dann schlechte Noten folgen müssen. Hier ist nicht 
der Schüler nicht lernwillig, sondern der Lehrer nicht Lehrfähig.

Zum Glück ists hier ja blos der Moderator und hoffentlich kein Lehrer.

... dieser Thread könnte gut eine Kolumne in einer Zeitschrift füllen 
...

von Uwe (Gast)


Lesenswert?

Ein Temperatursensor gibt eine Spannung aus (naja nicht wohl ehr einen 
Widerstand, damit ist er eine Stromquelle und aus dem Strom erzeugt man 
normalweise eine Spannung, welche man mit einem AD-Wandler mißt).
Also noch mal : Man mißt eine Spannung mit dem AD-Wandler !!!
Diese Spannung muß man nun in eine Temperatur umrechnen !

von Mitleser (Gast)


Angehängte Dateien:

Lesenswert?

Der Alfred schreibt, er verwende einen LM61. Das ist ein 
Temperatursensor, dessen Ausgangs-SPANNUNG sich proportional zur 
Temperatur ändert. Also kein Strom.
Die Spannung kann dabei direkt am Sensorausgang gemessen werden. Die 
Umrechnung bei diesem Sensor ist sogar recht simpel, da der 
Temperaturkoeffizient +10mV/°C beträgt.
600mV entsprechen laut Datenblatt 0°C, entprechend wären es dann bei 
25°C 850mV.

Man braucht also von der Sensor-Ausgangsspannung nur 600mV abziegen und 
hat auch schon die Temperatur auf 0,1°C genau. +/- natürlich den 
Abweichungen des Sensors, aber darum gings ja hier gar nicht.

von Karl H. (kbuchegg)


Lesenswert?

Mitleser schrieb:
> Sehr unterhaltsam, wenn man das so passiv verfolgt:
>
> Der eine will ein kleines Programm schreiben, hat aber keinen Schimmer
> wo hinten und vorne ist.
>
> Und der andere, scheinbar ein Profi - da Moderator, ist nicht gewillt -
> aber wahrscheinlich auch nicht fähig, dem armen Drops zur Seite zu
> stehen.

Doch, ich bin/war gewillt.

Aber wenn er nichts lernen, soll er sich wen anderen suchen, der ihm 
seine Arbeit macht.

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.