www.mikrocontroller.net

Forum: Compiler & IDEs attiny26 min max wert Temperatuanzeige


Autor: Heiko M. (hightower)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Heiko M. (hightower)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier noch den schaltplan

hightower

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zuallererst trennst du erst mal das Bestimmen der Temperatur
von der Anzeige.

Am besten machst du dir mal eine Funktion, die einen Zahlenwert
anzeigt.
void Anzeige( int Wert )
{
  if( Wert < 0 ) {
      //PORTA |= (1 << 8);    // Bit 8 in PORTA wird gesetzt
      //PORTA &= ~(1 << 8);    // Bit 8 in PORTA wird geloescht
    Wert = abs( Wert );
    einer  = get_segment_minus( Wert%10 );
    zehner = get_segment_minus( Wert/10 ); 
      
  }
  else {
      //PORTA |= (1 << 8);    // Bit 8 in PORTA wird gesetzt
      //PORTA &= ~(1 << 8);    // Bit 8 in PORTA wird geloescht
    einer  = get_segment( Wert % 10 );
    zehner = get_segment( Wert / 10 ); 
  }
}

Mit dieser Funktion ändert sich deine temperatur Funktion zu
void temperatur()
{
  data = read_adc(0x9a);
  data -=34;
}

und deine main() wird zu
int main()
{
   .....

  while (1)
  {
    temperatur();
    Anzeige( data );
    delay_loop( 20 );
  }
}

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:
int main()
{
   .....

  while (1)
  {
    temperatur();

    if( !( PINB & (1<<PB0) ) )
      Anzeige( minimum );

    else if( !( PINB & (1<<PB0) ) )
      Anzeige( maximum );

    else
      Anzeige( data );

    delay_loop( 20 );
  }
}

PS: Du musst dir noch was dazu überlegen, wie du minimum und
maximum wieder zurücksetzen kannst.

Autor: Heiko M. (hightower)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:

Habs jetzt erst gesehen:

>
> int main()
> {
>    .....
> 
>   while (1)
>   {
>     temperatur();
> 
>     if( !( PINB & (1<<PB0) ) )
>       Anzeige( minimum );
> 
>     else if( !( PINB & (1<<PB0) ) )

      else if( !( PINB & (1<<PB1) ) )

>       Anzeige( maximum );
> 
>     else
>       Anzeige( data );
> 
>     delay_loop( 20 );
>   }
> }
> 

Du willst natürlich 2 verschiedene Tasten für maximum und minimum
nehmen. PB0 und PB1

Autor: Heiko M. (hightower)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Heiko M. (hightower)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht sollte man noch nachgucken/abfragen, ob der Wert kleiner 0 
ist, bevor man ihn speichert.

Autor: Heiko M. (hightower)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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.
minimum = 500;
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

Autor: Heiko M. (hightower)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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.
while (1)
  {
    temperatur();
    if(!(PINB&(1<<PB0)))
      Anzeige(minimum);
    else
      if(!(PINB&(1<<PB1)))
        Anzeige(maximum);
      else
        Anzeige(data);

    delay_loop(20);
  }
  return 0;
}
    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.
    data = read_adc(0x9a);
    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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.