Hi, ich bin schon seit mehreren Jahren begeisterter Elektronik-Bastler. Zu meinen Basteleien gehört z.B. Repartur von Röhrenradios, Fernsehern, HiFi-Geräten, Netzgeräten usw. Alles uralte Geräte, die n paar Tage älter sind und noch ohne µC auskamen. Da der µC in der E-Technik immer mehr an Bedeutung gewinnt und auch ein sehr interessantes Thema ist (finde ich) habe ich mir gedacht, dass ich da mal irgendetwas machen muss. Gesagt getan. Ich habe mich für eine digitale Temperaturanzeige entschieden. Da ichim Bereich µC noch sehr unsicher war und noch bin hab ich mir ein bestehendes Projekt aus dem Netz geladen. Um den ganzen Aufbau kennen zu lernen. Hardware auf gebaut und Software mit winavr und dem sp12 in den µC geladen. und die sache lief auf anhieb. Nun habe ich die Platine seit einigen wochen bei mir im zimmer und sie funktioniert wirklich tadellos. Da auf dem Board noch 2 unbenutze taster zu finden sind dachte ich mir noch ne min max wert abfrage einzubauen. Diese Änderung findet ja nur Software mäßig statt. Und genau hier liegt mein Problem. Ich hatte in der Schule mal n C-Crash-Kurs. Aber ich komme trotzdem nicht weiter. Die Taster sind an PB0 und PB1 angeschlossen. Mit DDRB=0x18werden PB4 und PB3 als Ausgang geschaltet und die restlichen als Eingang. Mit PORTB=0x03 habe ich die internen Pull-Up's eingeschaltet (für PB0 und PB1) Die Abfrage für die Taster müsste so lauten: if(!(PINB&(1<<PB0))) if(!(PINB&(1<<PB0))) Man könnte ne Variable anlegen und diese immer mit dem wert "data"vergleichen. Wenn "data" größer ist soll die Variable mit "data" gleich gesetzt werden wenn nicht dann nicht. Mit dem Taster will ich den Wert der Variable anzeigen lassen. Das war jetzt nur so ne Überlegung. Aber wie baue ich das ganze da ein?? Im voraus schon mal vielen Dank hightower
Zuallererst trennst du erst mal das Bestimmen der Temperatur von der Anzeige. Am besten machst du dir mal eine Funktion, die einen Zahlenwert anzeigt.
1 | void Anzeige( int Wert ) |
2 | {
|
3 | if( Wert < 0 ) { |
4 | //PORTA |= (1 << 8); // Bit 8 in PORTA wird gesetzt
|
5 | //PORTA &= ~(1 << 8); // Bit 8 in PORTA wird geloescht
|
6 | Wert = abs( Wert ); |
7 | einer = get_segment_minus( Wert%10 ); |
8 | zehner = get_segment_minus( Wert/10 ); |
9 | |
10 | }
|
11 | else { |
12 | //PORTA |= (1 << 8); // Bit 8 in PORTA wird gesetzt
|
13 | //PORTA &= ~(1 << 8); // Bit 8 in PORTA wird geloescht
|
14 | einer = get_segment( Wert % 10 ); |
15 | zehner = get_segment( Wert / 10 ); |
16 | }
|
17 | }
|
Mit dieser Funktion ändert sich deine temperatur Funktion zu
1 | void temperatur() |
2 | {
|
3 | data = read_adc(0x9a); |
4 | data -=34; |
5 | }
|
und deine main() wird zu
1 | int main() |
2 | {
|
3 | .....
|
4 | |
5 | while (1) |
6 | {
|
7 | temperatur(); |
8 | Anzeige( data ); |
9 | delay_loop( 20 ); |
10 | }
|
11 | }
|
Dadurch hast du erst mal die Temperaturbestimmung vom angezeigten Wert entkoppelt. Vor allen Dingen hast du erreicht, dass du jeden beliebigen Wert anzeigen kannst, nicht nur data. Was jetzt kommt ist daher naheliegend: in der temperatur() Funktion bestimmst du nicht nur den aktuellen Temperaturwert, sondern auch ob er größer als das bisherige Maximum , bzw. kleiner als das bisherige Minimum ist. So wie du das in deinem Posting angedeutet hast. Und die Tasten kannst du dann auch ganz leicht einbauen: In der main() machst du einfach eine Unterscheidung je nach gedrückter Taste rein. Ist keine Taste gedrückt, zeigst du data an, so wie bisher. Ist eine Taste gedrückt, so zeigst du anstelle von data den jeweiligen Wert an. Also etwa so:
1 | int main() |
2 | {
|
3 | .....
|
4 | |
5 | while (1) |
6 | {
|
7 | temperatur(); |
8 | |
9 | if( !( PINB & (1<<PB0) ) ) |
10 | Anzeige( minimum ); |
11 | |
12 | else if( !( PINB & (1<<PB0) ) ) |
13 | Anzeige( maximum ); |
14 | |
15 | else
|
16 | Anzeige( data ); |
17 | |
18 | delay_loop( 20 ); |
19 | }
|
20 | }
|
PS: Du musst dir noch was dazu überlegen, wie du minimum und maximum wieder zurücksetzen kannst.
Vielen Vielen Dank! Ich werd mich gleich ransetzen und das mal ausprobieren. Werde mich nachher hören lassen ob es geklappt hat oder nicht. hightower
Karl heinz Buchegger wrote:
Habs jetzt erst gesehen:
>
1 | > int main() |
2 | > { |
3 | > ..... |
4 | >
|
5 | > while (1) |
6 | > { |
7 | > temperatur(); |
8 | >
|
9 | > if( !( PINB & (1<<PB0) ) ) |
10 | > Anzeige( minimum ); |
11 | >
|
12 | > else if( !( PINB & (1<<PB0) ) ) |
13 | |
14 | else if( !( PINB & (1<<PB1) ) ) |
15 | |
16 | > Anzeige( maximum ); |
17 | >
|
18 | > else |
19 | > Anzeige( data ); |
20 | >
|
21 | > delay_loop( 20 ); |
22 | > } |
23 | > } |
24 | >
|
Du willst natürlich 2 verschiedene Tasten für maximum und minimum nehmen. PB0 und PB1
HI, Das mit dem Enkoppeln der Temperaturbestimmung von der Anzeige hat prima geklappt. Nur die Ermittlung der min und max werte will nicht so wie ich mir das vorgestellt habe. Habe die Temperaturfunktion wie fogt abgeändert: void temperatur() { data=read_adc(0x9a); data-=36; maximum=-36; minimum=99; if(data>maximum) maximum=data; if(data<minimum) minimum=data; } DAmit zeigt er immer den aktuellen Wert und nicht den größten seid dem letzen Reset an, da maximum ja immer größer ist als -36. bei minimum das gleiche. Wie muss ich hier vorgehen? Lasse ich die beiden if-funktionen weg, wird entweder -36 oder 99 angezeigt. die taster funktionieren also. Ich bin blutiger C Anfänger
hi, wenn ich maximum=-36 und minimum=99 weg lasse, funktioniert die max Anzeige im positiven Bereich. Drücke ich jedoch die min-taste wird 00 angezeigt. Kühle ich den Sensor auf -36°C ab, wird beim drücken der min taste auch -36 angezeigt. Es sollen aber auch die niedrigsten temperaturen im psitiven bereich angezeigt werden. Genauso sollen die max-werte im negativen Bereich angezeigt werden. Nur wie? Danke im voraus! hightower
Vielleicht sollte man noch nachgucken/abfragen, ob der Wert kleiner 0 ist, bevor man ihn speichert.
stimmt der wert ist null. Darum zeigt er bei drücken der min taste null an. Weil 0 der erste und kleinste wert ist. Ich bräuchte den ersten data Wert als Bezugswert Dazu habe noch folgendes probiert: ... maximum=data; minimum=data; if(data>maximum) maximum=data; if(data<minimum) minimum=data; ... Das klappt jedoch nicht, da maximum und minimum bei jedem durchlauf wieder mit data gleich gesetzt werden. Wenn maximum und minimum nur ein einziges mal mit data (dem ersten data Wert nach den einschalten) gleichgestzt werden, müsste es klappen oder? Wie kann ich den µC dazu bringen maximum=data; minimum=data; nur einmal auszuführen?
@ Heiko M. (hightower) >Das klappt jedoch nicht, da maximum und minimum bei jedem durchlauf >wieder mit data gleich gesetzt werden. Wenn maximum und minimum nur ein >einziges mal mit data (dem ersten data Wert nach den einschalten) >gleichgestzt werden, müsste es klappen oder? Ja, warum machst du es nicht so? Besser ist es ausserdem, das einfach so zu machen.
1 | minimum = 500; |
2 | maximum = 0; |
Durch dieses "über Kreuz" Zuweisen (Minimum ist Maximalwert und umgekehrt) startet die Routine immer richtig. >Wie kann ich den µC dazu bringen >maximum=data; >minimum=data; >nur einmal auszuführen? Indem ma es an die richtige Stelle im Quelltext schreibt, der beim Start nur einmal ausgeführt wird? Manche Fragen sind wirklich . . . MFG Falk
Moin Moin, tut mir mir leid, dass ich mich so lange nicht hören lassen habe. Ich habe jetzt erst wieder zeit gefunden an der µC Platine weiter zu experimentieren. Ich bin mit eurer Hilfe und ein paar eigenen Überlegungen zu dem angehängten Programm gekommen, was jetzt auch einwandfrei arbeitet. :-) freu. Nochmal vielen Dank für eure Hilfe. Ihr seit echt super. Im nachhinein war meine letzte frage wirklich blöd. Naja aus Fehlern lernt man. Ich finde die µC-Technik nach wie vor eine sehr interesanten Bereich der Elektronik. Trotz alle dem habe ich noch eine Frage zu dem Programm. Der positive Messbereich reicht von 0 bis 99°C. Weiter geht die zweistellige Anzeige ja auch nicht. Aber warum geht der negative Bereich nur bis -36°C? In meinem Zimmer werden zwar keine negativen Temperaturen erreicht ;-P ,aber es würde mich mal einfach interessieren. vielen Dank im voraus! mfg hightower
@ Heiko M. (hightower) >Dateianhang: fertigestempprog.txt (3,9 KB, 1 Downloads) Wenn den Quellcode ohne jegleich Änderung als *.c Datei anhängst, wird er sogar mit Syntaxhighlightig angezeigt ;-) >Trotz alle dem habe ich noch eine Frage zu dem Programm. Der positive >Messbereich reicht von 0 bis 99°C. Weiter geht die zweistellige Anzeige >ja auch nicht. Aber warum geht der negative Bereich nur bis -36°C? In >meinem Zimmer werden zwar keine negativen Temperaturen erreicht ;-P >,aber es würde mich mal einfach interessieren. Hmmm, deine main loop sieht gefährlich aus! Gewöhn dir so eine Formatierung gar nicht erst an! Das geht mal fix schief in C. Richtige einrücken bzw. Klammern setzen. Eher so.
1 | while (1) |
2 | {
|
3 | temperatur(); |
4 | if(!(PINB&(1<<PB0))) |
5 | Anzeige(minimum); |
6 | else
|
7 | if(!(PINB&(1<<PB1))) |
8 | Anzeige(maximum); |
9 | else
|
10 | Anzeige(data); |
11 | |
12 | delay_loop(20); |
13 | }
|
14 | return 0; |
15 | }
|
1 | dataADC += (ADCW>>7); //Wandlungsergebnisse aufaddieren |
Ist das nicht ein Shift zuviel? Ausserdem kannst du dir das sparen, wenn du den ADC ganz normal mit rechtjustiertem Ergebnis betreibst.
1 | data = read_adc(0x9a); |
2 | data -=36; |
Warum übergibst du nicht einfach NUR die Kanalnummer an die Funktion. Du machst hier auch noch gleich die Konfiguration. Das ist eher schlecht. Warum subtrahierst du immer 36? MfG Falk
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.