Relais schaltet aus statt ein

OP #2056919
Lesenswert?

Hallo,

ich habe ein Relais wie hier beschrieben an den Atmega angeschlossen:
http://i40.tinypic.com/2cfqsz5.jpg

zudem ist ein 1Wire ds18s20 mit dran (PC0) dessen Temp. über LED's 
ausgegeben wird.
Es sind 8 LED dafür angeschlossen (PORTB) über die man die Temp addieren 
kann.
und zwar so:
LED Nr | Wert in °C
--------------------
1      |  1
2      |  2
3      |  4
4      |  8
5      |  10
6      |  20
7      |  40
8      |  80

Bei mir im Raum hat es 21°C und die LED's 1 und 6 sind an.
Geschickter weise habe ich die LED's als active low Variante gelöted was 
im Code dazu führt das ich das p invertieren muss.

Es noch einen 8er Dipschalter mit dem man eine Solltemperatur nach dem 
selben Prinzip wie bei den LED vorgeben kann (PIND).

Der Ablauf soll so sein das wenn die Soll- und die gemessene Ist-Temp 
gleich sind soll das Relais abschalten und bis dahin ein schalten.

Bei mir macht es das z.Z. umgekehrt - das Relais ist so lange aus bis 
die Solltemp. erreicht ist und geht dann an.

^^Kann mir jemand helfen wie ich das richtig herum bekomme, so das das 
Relais an ist bis die Solltemp. erreicht ist?


Vielen Dank

Rocco
1
        do
2
        {
3

4
                // Kommando an den Sensor (Messung starten)
5
                // >>Notiz>> Wir gehen einfach von einem Erfolg aus <<
6
                start_meas();
7
        
8
                // Temperatur vom Sensor holen
9
                t = read_meas_fast();
10
        t = t/8;
11
        u = t;
12

13
                // Temperatur in Grad Celsius:
14
                tC = (t >> 1) | (t & 0xFF00);
15
                if(tC < 0) tC = -tC; //Vorzeichen entfernen
16
                        
17

18
                //reset (alle LEDs aus)
19
                p = 0x00;
20

21
           //Konfiguration der Pins für LEDs setzen
22
                // (0 = LED an, 1 = LED aus)
23
                if(tC >= 80) { p |=(1<<7); tC -= 80; } //Pin7 f?r 80?C an
24
                if(tC >= 40) { p |=(1<<6); tC -= 40; } //Pin6 f?r 40?C an
25
                if(tC >= 20) { p |=(1<<5); tC -= 20; } //Pin5 f?r 20?C an
26
                if(tC >= 10) { p |=(1<<4); tC -= 10; } //Pin4 f?r 10?C an
27
                if(tC >= 8)  { p |=(1<<3); tC -= 8;  } //Pin3 f?r 8?C  an
28
                if(tC >= 4)  { p |=(1<<2); tC -= 4;  } //Pin2 f?r 4?C  an
29
                if(tC >= 2)  { p |=(1<<1); tC -= 2;  } //Pin1 f?r 2?C  an
30
                if(tC >= 1)  { p |=(1<<0); tC -= 1;  } //Pin0 f?r 1?C  an
31

32
           t_ist = ~p;
33
        //Solltemp. in der Schleife abholen ermöglicht Solltemp nachzuregeln
34
        t_soll = PIND;        //Status von D in SchalterD speichern
35

36

37
        p = ~p;            //LED Signal invertieren weil LED falsch angelötet
38
        //p = p-0,5;        //Eichung des Thermometers
39
        LED_OUT = p;    
40
      
41
        ///Hysterese...Relais
42
        ///t_ist/    kommt vom Temp. - sensor
43
        ///t_soll/  kommt von PIND
44

45
        if((t_ist <= t_soll + 1)) //&& !(PORTC & (1<<RELAIS_C)))
46
        {
47
         //Heizung //an //(Relais HIGH)
48
         PORTC |= (1<<RELAIS_C);
49
        }
50
        else if((t_ist >= t_soll - 1))// && (PORTC & (1<<RELAIS_C)))
51
        {
52
         //Heizung////aus //(Relais LOW)//
53
         PORTC &= ~ (1<<RELAIS_C);
54
        }
55

56

57
        // ein wenig warten verhindert,
58
                // dass der Sensor durch Selbsterw?rmung
59
                // falsche Ergebnisse liefert
60
                _delay_ms(1000);
61

62
         
63

64

65

66
        }while(1);
Gast #2057110
Lesenswert?

glaub dein problem ist die umrechnung deines soll und istwertes.

sollwert 19 ergibt bei dir das muster: 0001 1001
deine abfrage macht ein +1 ergbit:     0001 1010

das zweite bitmuster ist aber nach deiner umrechnungform ungültig. 
rechne am besten alles binär codiert. der sensor gibt dir den wert ja 
schon du, deine taster und leds musst du eben umrechnen.

welchen wert gibst du derzeit als sollwert vor?

ps: active low ist eigentlich sogar üblich, also kein grund das 
umzulöten
wenn du den internen pullup nehmen willst müssen deine schalter sogar 
active low sein

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren