komplizierte Berechnung

OP #2355914
Lesenswert?

Hallo Forum,
unzwar gibt es folgendes Problem:


Ich baue gerade einen Temperaturmesser mit dem AT90PWM316 und die 
Temperatur soll anschließend auf 4 7-Segment-Anzeigen dargestellt 
werden.

Die Anzeigen(im Multiplexbetrieb) sind direkt mit dem Controller 
verbunden.


Die Temperatur wird über den MCP9700 gemessen, dass heißt der 90PWM316 
bekommt z.B. den Wert "200" vom Sensor.

Das Problem hierbei ist, dass ich nicht weiß wie ich den Wert vom Sensor 
in einen binären Wert umwandeln soll, um die dezimale Temperatur an den 
7 Segment-Anzeigen darzustellen.



freue mich auf eure Antworten,
MB
Gast #2355921
Lesenswert?

Hi,

du hast doch eine Formel, mit der du aus deinem Wert (200) die 
entsprechende Temperatur berechnest.

Diese Temperatur ( z.B. 25,2°C) würde ich in die einzelnen 
Ziffernaufteilen (Zehner-Wert, einser-Wert, Zehntel-Wert). Dann musst ja 
nur noch (vielleicht per switch/case) sagen, was bei welchem wert 
ausgegeben werden soll.
OP #2355954
Lesenswert?

Udo Schmitt schrieb:
> M. B. schrieb:
>> Die Temperatur wird über den MCP9700 gemessen, dass heißt der 90PWM316
>> bekommt z.B. den Wert "200" vom Sensor.
>
> Kommt der Wert über eine Schnittstelle als ASCII String?
> Und welcher Temperatur entspricht die 200?
> Was sagt denn das Datenblatt des Sensors?


200 entspricht 25°C bzw. 500mV die über PC0 eigelesen werden

Die Refferenzspannung beträgt 2,56V
#2355958
Lesenswert?

Ich hab gerade mal ins Datenblatt geschaut.
Was denkst du denn was "Output voltage at Ta = 0°C" ist
Und was "Temperature coeffizient" in der Einheit "mV/°C"?

Und du kannst sicher sein, daß ein Wert aus dem ADC binär ist. Den musst 
du nicht mehr umwandeln

M. B. schrieb:
> dass ich nicht weiß wie ich den Wert vom Sensor
> in einen binären Wert umwandeln soll
OP #2355992
Lesenswert?

Sorry,

vom ADC wird ein hexadezimaler Wert eingelesen z.B. 0x0C8 (bei 25°C)
und dieser muss jetzt auf den 4 7-Segment-Anzeigen richtig dargestellt 
werden.

so eine Art  HEX to 7-Segment umrechner, wobei
1.Segm = 10er-Stelle
2.Segm =  1er-Stelle
3.Segm = Decimalpoint
4.Segm = 10tel-Stelle
Moderator (Firma: Titel) Persönliche Seite #2355995
Lesenswert?

Udo Schmitt schrieb:
> Und wo ist jetzt dein Problem?
Das Problem dürfte sein, dass es nicht 1 Problem (Aufgabe) ist, sondern 
gleich 2:
1. Umwandeln des Wertes in eine Zahl, die z.B. zehntel Grad darstellt
   (also 251 = 25,1°C oder 1234 = 123,4°C)
2. Darstellen dieser Zahl auf 4 Stück 7-Segmentanzeigen

Wobei sich Punkt 2. wieder auf verschiedene Teilaufgaben aufteilen 
lässt:
a) Zerlegen der Zahl in einzelne Zehnerstellen
   (1234 -> hunderter=1, zehner=2, einer=3, zehntel=4)
b) Ausgabe dieser Einzelstellen an die entsprechenden LED-Anzeigen

Wobei sich die Aufgabe b) in weitere Unteraufgaben zerlegen lässt:
I.  Bilden einer Lookup-Tabelle für die 7 Segmente
II. Multiplexen der Anzeigen

Wobei sich Punkt II. weiter aufteilen lässt:
*)  Erzeugen eines geeigneten Taktes
**) .....


Motto: Teile und herrsche.
Gast #2356016
Lesenswert?

Da ist die allereinfachste Berechnung
die jeders chinesische Billigthermometer beherrscht.

In K&R C:

char temp[6];
itoa(ADC0,temp);
lcd(temp[0]);
lcd[temp[1]);
lcd('.');
lcd(temp[2]);

falls man auf Fehlerbehandlung verzichtet, oder

int temp=ADC0;
lcd('0'+temp/100);
lcd('0'+(temp/10)%10);
lcd('.');
lcd('0'+temp%10);

Wer will, kann es auch in Assembler probieren.
#2356065
Lesenswert?

Achso zu Punkt 1:
Ganz so simple ist es nicht. Der Sensor liefert eine Ausgangsspannung 
von 500mV bei 0°C und dann pro weiteres Grad 10mV.
Das heisst er muss zuerst noch von seinem gemessenen Wert auf die 
Tempertur umrechnen.
Aber alles vorkauen ist nicht, der Junge soll ja auch noch was lernen.
Gast #2356067
Lesenswert?

> Könntest du mir das bitte etwas genauer erklähren

char temp[6];  // Speicherplatz für bis zu 5 Zeichen unter dem Namen 
temp
itoa(ADC0,temp); // Wandlerwert den Analogeingangs ADC0 als Ziffernfolge 
in temp schreiben
lcd(temp[0]); // erste Ziffer auf Display ausgeben (Fehler: "Temperatur 
unter 10 Grad" derzeit nicht behandelt)
lcd[temp[1]); // zweite Ziffer auf Display ausgeben
lcd('.');     // Dezimalpunkt auf Display ausgeben
lcd(temp[2]); // dritte Ziffer auf Display ausgeben

Die Funktion lcd hjab ich frei erfunden, weil ich
aus deinem Beitrag nicht wissen kann, wie dein Display
angeschlossen ist.
Also 4-stelliges LED Multiplexdisplay wird es 4
Speichertsellen geben in denen die leuchtenden LEDs
gespeichert sind, und eine Routine, die diese bits
auf die Ausgänge multiplext. Dort transpotiert die
Funktion LCD also einfach die Zeichen in diese
Speicherstellen.
#2356138
Lesenswert?

M. B. schrieb:
> Sorry,
>
> vom ADC wird ein hexadezimaler Wert eingelesen z.B. 0x0C8 (bei 25°C)
> und dieser muss jetzt auf den 4 7-Segment-Anzeigen richtig dargestellt
> werden.

Von deinem Sensor kommt kein hex-Wert sondern einfach nur eine Zahl.

Diese Zahl musst du zerlegen in Zehner, Einer

Dazu kannst du zb die Operatioenn / (wie Division) und % (Moldulo 
Division) benutzen. Modulo ist ganz einfach der "Rest bei einer 
Division". So wie in: Wenn sich 3 Kinder 14 Äpfel teilen und jeder 
gleich viele ganze Äpfel kriegt, wieviele Äpfel bleiben dann übrig?

  14 / 3  ->  4      jeder kriegt 4 Äpfel
  14 % 3  ->  2      und 2 Äpfel bleiben übrig

denn 3 * 4 + 2 macht wieder 14

  deine Zahl sei zb 823

  823 % 10 ->  3          da haben wir die Einer
  823 / 10 -> 82
  82 % 10  ->  2          und die Zehner
  82 / 10  ->  8          und zu guter letzt die Hunderter



kannst du deine Multiplex-Anzeige schon ansteuern?
Gast #2356400
Lesenswert?

> Das bringt ihn nicht weiter. Er hat kein LCD
> Er hat 7-Segment Anzeigen!

Tja, left as an exercise to the reader,
schliesslich war er zu faul aufzumalen wie er die
Displays angeschlossen hat.

Er könnte ja mal in eine Application Note gucken,
in der der Hersteller zeigt wie man 7-Segment LED
Displays an seine Controller anschliesst und
programmtechnisch bedient.
#2356932
Lesenswert?

Langsam wirds nervig.
Du lässt dir die Würmer aus der Nase ziehen, regierst nur auf einen 
Bruchteil der Vorschläge und keiner weiß ob und was du schon verstanden 
hast.
Jetzt raus mit der Sprache:
1. Hast du verstanden wie du das Problem aufteilst in Unterprobleme
2. Kannst du die notwendige Mathematik (Geradengleichung)
3. Welche Programmierkenntnisse hast du?
4. Kannst du schon Werte in dein Display schreiben

Was hast du verstanden und was fehlt?

Wenn man dir helfen soll, muß was von dir kommen, programmieren heisst 
nicht irgendwelche Codefragmente zusammenzukopieren und den Rest in 
Foren nachfragen.
#2356936
Lesenswert?

Und Code, damit man sich wenigstens die fehlenden Sachen aus dem Code 
zusammensuchen könnte, gibts auch keinen.
Udo hat recht. Sehr kooperativ bist du wirklich nicht.

Es ist DEIN Projekt, nicht unseres.

(Und wenn ich das sagen darf: Du hast da scheinbar Probleme, die jemand 
der ein derartiges Projekt angeht, überhaupt nicht haben sollte.)
Gast #2356958
Lesenswert?

> So habe ich die 7-Segment Anzeigen an den Mikrocontroller angeschlossen

Wie dunkel auch immer die LEDs mit einem mittleren Strom von 2.5mA sein 
werden wenn sie für 10mA spezifiziert sind....

Der Code ist eher einfach:

char segment[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,0xFE,0xBE};
int poweroften[]={1000,100,10,1};
int temp;
// hier Portinitialisierung
while(1)
{
    temp=((ADC0-200)*10)/4; // ADC0 stellvertretend für A/D-Wandlung
    digit=(digit+1)%4;
    PORTB=(PBIN&0x0B)|(0x10<<digit)|(digit==2?0x04:0);
    PORTC=(PCIN&0xFE)|segment[(temp/stelle[i])%10];
}

Wer das komplizierte Berechnug nennt, ist meilenweit weg vom Stand der 
Chinesen und wird sie nie mehr einholen.
OP #2359300
Lesenswert?

Sorry,
ich weiß das ich nicht oft antworte, dass liegt daran das ich wenig Zeit 
habe.

Ich probiere wahrscheinlich morgen den Code so umzuändern, dass er 
funktioniert.


Ein großes DANKE an euch für eure Unterstützung
und
ich melde mich wieder wenn es Updates gibt.

mfG. MB

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren