Forum: Mikrocontroller und Digitale Elektronik Probleme beim Bit-Löschen


von Socke (Gast)


Lesenswert?

Hallo zusammen,

leider komme ich bei meinen kleinen Anfänger Projekt zur Zeit nicht
weiter, bin mir aber sicher, das ich mal wieder den Wald vor Bäumen 
nicht sehe.

Möchte einen Ausgang setzen bis eine gewisse Temperatur erreicht ist, 
und ihn dann wieder löschen bzw. ausschalten.

Bisher dachte ich mir das so:

 if ((ist_temp+5)<=soll_temp)
   {
     PORTD|=(1<<PD7);  //Heizelement ein
   }

    else if ((ist_temp)>=soll_temp)
    {
     PORTD&=~(1<<PD7);  //Heizelement aus
    }

Nun schaltet das Element zwar ein, jedoch nicht wieder ab wenn der Wert 
erreicht ist?


Jemand eine Idee

Gruß

: Verschoben durch User
von Felix Adam (Gast)


Lesenswert?

Der Abschnitt selbst sieht richtig aus. Womöglich liegt der Fehler im 
nicht gezeigten Programmrest?

Davon ab ist PD7=7?

von Socke (Gast)


Lesenswert?

Felix Adam schrieb:
> Davon ab ist PD7=7?

was meinst du damit?

Gruß

von Felix Adam (Gast)


Lesenswert?

PD7 ist eine Konstante. Ist diese auch 7 oder ist diese 0x80?

von Falk B. (falk)


Lesenswert?

@ Socke (Gast)

>Bisher dachte ich mir das so:

Bitte nicht soviel um die Ecke denken, das bringt nix. Schreib DIREKT 
hin was gemeint ist. Eher so. Und wenn man das mit ein paar #define 
macht, ist es sogar sehr direkt und sehr einfach lesbar. Siehe auch

Strukturierte Programmierung auf Mikrocontrollern

1
#define HEIZER_EIN PORTD |= (1<<PD7)
2
#define HEIZER_AUS PORTD &= ~(1<<PD7)
3
4
if(ist_temp <= (soll_temp-5)) {
5
  HEIZER_EIN;
6
} else if(ist_temp >= soll_temp) {
7
  HEIZER_AUS;
8
}

>Nun schaltet das Element zwar ein, jedoch nicht wieder ab wenn der Wert
>erreicht ist?

Hmm, an sich ist dein Code korrekt, der Fehler liegt woanders. Woher 
weißt du, dass ist_temp >= soll_temp ist?

von Falk B. (falk)


Lesenswert?

#define PD7 7

Das steht in den avr Headerfiles drin.

von Socke (Gast)


Lesenswert?

PD7 ist bei meinen ATMega mein 8. PIN an Port D

Gruß

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Falsches Unterforum. Bitte nach uc & Elektronik verschieben.

von Socke (Gast)


Lesenswert?

Die Solltemperaturen lege ich so fest:

soll_temp=40;

Die Temperaturwerte stammen von einen DS18B20, die passen auch, diese 
habe ich mit einem zweiten Thermometer kontrolliert. Zusätzlich auch 
noch einmal separat auf einem Display ausgeben lassen um zu 
kontrollieren ob die Werte nach der Wandlung von float in ganze Zahlen 
immer noch passt.

Gruß

von Falk B. (falk)


Lesenswert?

Ist PD7 auch als Ausgang konfiguriert? Wenn nicht, schaltet man nur den 
internen Pull Up ein und aus . . .

von Socke (Gast)


Lesenswert?

Ja ist als Ausgang konfiguriert. Kann das irgendwie damit zusammenhängen 
was für eine Datentyp die beiden Temperaturen sind? Sind beide von Typ 
Integer


Gruß

von Walter S. (avatar)


Lesenswert?

Socke schrieb:
> Jemand eine Idee

ja, zeig den ganzen Code (am besten soweit reduziert dass der Fehler 
noch auftritt) und den Schaltplan

von my2ct (Gast)


Lesenswert?

Socke schrieb:
> Zusätzlich auch noch einmal separat auf einem Display ausgeben lassen
> um zu kontrollieren ob die Werte nach der Wandlung von float in
> ganze Zahlen immer noch passt.

Die Dynamik eines Float-Datentyps für eine Temperaturangabe bei einem 
Sensor, der allenfalls zwischen -55 und +125°C arbeite, 9 Bit liefert 
und damit weder im mK- noch im GK-Bereich misst, ist dem Problem wohl 
nicht ganz angemessen. Aber eine Fixkommarechnung zu verwenden und für 
die Anzeige das Komma/Punkt an geeigneter Stelle auszugeben, ist wohl 
out. Irgendwie muss der Prozessor schließlich beschäftigt werden.

von Socke (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal der Codeausschnitt worauf es eigentlich ankommen sollte.

Gruß

von Ratze P. (ratzputzweg)


Lesenswert?

PORTD|=(1<<PD7);  //Heizelement ein
PORTD&=~(1<<PD7);  //Heizelement aus


Einmal machst du PORTD| und dann PORTD&. Warum machste einmal 
kaufmännisches Und und einmal |?

von Falk B. (falk)


Lesenswert?

@Socke (Gast)
>    Code.txt (2,03 KB, 0 Downloads)

>Hier mal der Codeausschnitt worauf es eigentlich ankommen sollte.

Und wenn du das code.c genannt hättest, würden wir alle schönes 
Syntax-Highlighting genießen können. Hmm.

Du rechnest mit int, nicht float.

>   if (restzeit<105&restzeit>90)//Solange Restzeit kleiner 105 und

Fehler. Da muss ein && hin, KEIN &!

von Falk B. (falk)


Lesenswert?

@ Ratze Putze (ratzputzweg)

>PORTD|=(1<<PD7);  //Heizelement ein
>PORTD&=~(1<<PD7);  //Heizelement aus

Vollkommen OK.

>Einmal machst du PORTD| und dann PORTD&. Warum machste einmal
>kaufmännisches Und und einmal |?

Informier dich mal zum Thema Bitmanipulation.

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.