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
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.
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?
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
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
M. B. schrieb: > 200 entspricht 25°C bzw. 500mV die über PC0 eigelesen werden Und wo ist jetzt dein Problem?
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
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.
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.
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.
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 !!!
Les dir in deinem C Buch mal durch was zu der Funktion itoa() steht. Dann verstehst du das.
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.
> 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.
MaWin Das bringt ihn nicht weiter. Er hat kein LCD Er hat 7-Segment Anzeigen!
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?
> 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.
So habe ich die 7-Segment Anzeigen an den Mikrocontroller angeschlossen
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?
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.
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.)
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.
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.