mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Relais schaltet aus statt ein


Autor: Rocco L. (kaufparkangucker)
Datum:

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

                // Kommando an den Sensor (Messung starten)
                // >>Notiz>> Wir gehen einfach von einem Erfolg aus <<
                start_meas();
        
                // Temperatur vom Sensor holen
                t = read_meas_fast();
        t = t/8;
        u = t;

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

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

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

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


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

        if((t_ist <= t_soll + 1)) //&& !(PORTC & (1<<RELAIS_C)))
        {
         //Heizung //an //(Relais HIGH)
         PORTC |= (1<<RELAIS_C);
        }
        else if((t_ist >= t_soll - 1))// && (PORTC & (1<<RELAIS_C)))
        {
         //Heizung////aus //(Relais LOW)//
         PORTC &= ~ (1<<RELAIS_C);
        }


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

         



        }while(1);

Autor: IchBinSoKluk (Gast)
Datum:

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

Autor: bastelwastel (Gast)
Datum:

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

Autor: IchBinSoKluk (Gast)
Datum:

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

Autor: IchBinSoKluk (Gast)
Datum:

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

Autor: Rocco L. (kaufparkangucker)
Datum:

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

Autor: Rocco L. (kaufparkangucker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und löte es auch gleich wieder zurück an C

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ersetze
 t_ist = ~p;
durch
 t_ist = p;

Autor: Rocco L. (kaufparkangucker)
Datum:

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

Autor: Rocco L. (kaufparkangucker)
Datum:

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

Autor: Nils (Gast)
Datum:

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

Autor: Rocco L. (kaufparkangucker)
Datum:

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

Autor: guest (Gast)
Datum:

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

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.