Forum: Mikrocontroller und Digitale Elektronik komplizierte Berechnung


von M. B. (marko_b88)


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

von matthias (Gast)


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.

von Hansen (Gast)


Lesenswert?

ADC?

von Rolf Magnus (Gast)


Lesenswert?

Hansen schrieb:
> ADC?

Was hat denn die Arbeitsgemeinschaft Deutscher Chorverbände damit zu 
tun?

von M. B. (marko_b88)


Lesenswert?

Hansen schrieb:
> ADC?

Jo

von Udo S. (urschmitt)


Lesenswert?

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?

von M. B. (marko_b88)


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

von Udo S. (urschmitt)


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

von Udo S. (urschmitt)


Lesenswert?

M. B. schrieb:
> 200 entspricht 25°C bzw. 500mV die über PC0 eigelesen werden

Und wo ist jetzt dein Problem?

von M. B. (marko_b88)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von MaWin (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

MaWin schrieb:
> lcd
Dmit wäre dann Punkt 2a erledigt.
Es bleibt nur noch zu tun, was M. B. schrieb:
> um die dezimale Temperatur an den 7 Segment-Anzeigen darzustellen.

von M. B. (marko_b88)


Lesenswert?

MaWin schrieb:
> In K&R C:
>
> char temp[6];
> itoa(ADC0,temp);
> lcd(temp[0]);
> lcd[temp[1]);
> lcd('.');
> lcd(temp[2]);



Könntest du mir das bitte etwas genauer erklähren, da ich erst vor 
kurzem angefangen habe C zu programmieren.
DANKE !!!

von Udo S. (urschmitt)


Lesenswert?

Les dir in deinem C Buch mal durch was zu der Funktion itoa() steht.
Dann verstehst du das.

von Udo S. (urschmitt)


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.

von MaWin (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

MaWin

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

von Karl H. (kbuchegg)


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?

von MaWin (Gast)


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.

von M. B. (marko_b88)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

M. B. schrieb:
> So habe ich die 7-Segment Anzeigen an den Mikrocontroller angeschlossen

Ja, ok
Und, kannst du sie ansteuern?
Weißt du das Prinzip, wie die Ansteuerung funktioniert?

von Udo S. (urschmitt)


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.

von Karl H. (kbuchegg)


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.)

von ich (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> (Und wenn ich das sagen darf: Du hast da scheinbar Probleme, die jemand
> der ein derartiges Projekt angeht, überhaupt nicht haben sollte.)

Wenn ich das ergänzen darf: Die Wahl des Titels "komplizierte 
Berechnung" für das Thema Geradengleichung würde diese Beurteilung 
deutlich unterstützen.

von MaWin (Gast)


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.

von M. B. (marko_b88)


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

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.