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
Der Abschnitt selbst sieht richtig aus. Womöglich liegt der Fehler im nicht gezeigten Programmrest? Davon ab ist PD7=7?
@ 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?
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ß
Ist PD7 auch als Ausgang konfiguriert? Wenn nicht, schaltet man nur den internen Pull Up ein und aus . . .
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ß
Socke schrieb: > Jemand eine Idee ja, zeig den ganzen Code (am besten soweit reduziert dass der Fehler noch auftritt) und den Schaltplan
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.
Hier mal der Codeausschnitt worauf es eigentlich ankommen sollte. Gruß
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 |?
@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 &!
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.