Forum: Mikrocontroller und Digitale Elektronik Relais schaltet aus statt ein


von Rocco L. (kaufparkangucker)


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);

von IchBinSoKluk (Gast)


Lesenswert?

Ich hätte ja jetzt gedacht, dass man in dem Fall einfach den Inhalt des 
if-else-Blockes vertauscht, aber ich schätze, das ist zu einfach...

von bastelwastel (Gast)


Lesenswert?

zum einen sollte man s/w-Bilder als png-format anhängen, nicht als 
monster-JPG

zum anderen muss das Relais unter den Transistor, also an den Emitter, 
nicht an den Collector!

von IchBinSoKluk (Gast)


Lesenswert?

Ersteres ist richtig.

Zweiteres ist falsch. Es gilt, dass der Basisstrom nicht durch die Last 
fließen darf, somit muss die Last, wie es hier der Fall ist, an den 
Kollektor.

http://www.mikrocontroller.net/articles/Transistor#PNP.2FNPN_als_Schalter.2C_wohin_mit_der_Last.3F

von IchBinSoKluk (Gast)


Lesenswert?

Um dem vorzuwirken:
Natürlich kann man nicht pauschal sagen, dass der Transistor nicht am 
Emitter beschaltet werden darf, in diesem Fall hier jedoch schon.

von Rocco L. (kaufparkangucker)


Lesenswert?

habe das Relais jetzt an dem E - damit ist die Schaltleistung irgendwie 
geringer - es gibt gar kein schönes sattes Klick klack mehr und es 
schafft es nicht mehr durch zu schalten.

das Problem mit der falschen Schaltrichtung bleibt jedoch bestehen

von Rocco L. (kaufparkangucker)


Lesenswert?

und löte es auch gleich wieder zurück an C

von guest (Gast)


Lesenswert?

ersetze
 t_ist = ~p;
durch
 t_ist = p;

von Rocco L. (kaufparkangucker)


Lesenswert?

führt dazu das das Relais an geht aber nicht mehr aus beim Überschreiten 
der Soll Temp

von Rocco L. (kaufparkangucker)


Lesenswert?

Die Schalter für Solltemp sind übrigens so angeschlossen gewesen:
http://www.mikrocontroller.net/wikifiles/8/8a/Taster.gif

habe sie aber gerde so umgelötet:
http://www.mikrocontroller.net/wikifiles/a/a2/Active_High.gif

von Nils (Gast)


Lesenswert?

Den Pull-up kannst du eigentlich weglassen und stattdessen den internen 
Pull-up des ATmega verwenden.

von Rocco L. (kaufparkangucker)


Lesenswert?

ja, sieht sinnvoll aus und würde weitere Aufbauten ersparen - danke für 
den Tip.


ach so, seit dem ich die Schalter auf active high gelötet habe passen 
sie auch zu dem was ich programmiert habe und alles läuft

von guest (Gast)


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

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.