www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [Anfänger] Simple Relais-Schaltung mit dem PIC16F84


Autor: Marco Glatz (marcoglatz)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

eins vorweg: was das thema mikrokontroller und elektronik angeht bin ich 
nicht allzu sehr bewandert, aber lernwillig ;)

folgendes: ich habe mir mit einem embedded-pc, einer ssd und einem lcd 
einen kleinen mp3-player fürs wohnzimmer gebaut. ein atx-netzteil kann 
ich aber nicht anschließen, und dem ding einfach den saft abdrehen ist 
etwas unschön, deswegen hatte ich mir folgendes überlegt:

das netzteil ist immer an, nur die stromverbindung zum board etc. ist 
durch ein relais getrennt. drücke ich nun einen taster wird das relais 
über den pic angezogen. ob das relais angezogen ist oder nicht merke ich 
mir im pic intern. drücke ich nun den taster erneut, wird das relais mit 
einer zeitverzögerung abgeschaltet. gleichzeitig erfolgt ein signal an 
die rs-232 schnittstelle am board. diese wird vom betriebssystem 
überwacht. kommt nun das signal an fahre ich alle laufenden programme 
runter, unmounte die festplatte etc. (das zeitfenster für die 
zeitverzögerung bevor das relais trennt muss halt entsprechend angepasst 
werden).

ich habe mich durch verschiedene infoseiten gewühlt und anhand von 
beispielen und datenblättern eine schaltung gebastelt, siehe anhang.

folgende fragen hätte ich nun bevor ich mich ans programmieren setze:

- ist der schaltplan so in ordnung?
- was ich noch nicht rausgefunden habe ist die geschichte mit dem quarz. 
hat die geschwindigkeit einen einfluß auf mein programm? denke mal ja. 
ist die geschwindigkeit vom quarz wichtig? habe hier noch mehrere 
rumliegen, von 3,nochwas bis 10 Mhz.

gruß,
marco

p.s. den PIC16F84 wollte ich verwenden weil ich von denen 2 hier hab.

Autor: Marco Glatz (marcoglatz)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Edit: der schaltplan ist etwas klein, ich hab ihn nochmal etwas größer 
exportiert

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Schaltplan ist fast OK. Was fehlt ist der Widerstand von MCLR nach 
Vcc. MCLR muss nämlich während des Betriebes auf High sein. Ich würde 
mir zudem noch überlegen bzgl. der RS232-Schnittstelle eine Rückführung 
vom PC zum PIC zu machen, so können beide miteinander reden. Idee 
dahinter: Pic sagt dem PC "Fahr mal alles runter, ich will dir den Saft 
abdrehen." PC fährt dann alles runter und wenn er fertig ist sagt er 
dann dem PIC "Kannst den Saft abdrehen, ich bin bereit" und der Pic 
schaltet den PC ab. Wenn du schon ne RS232-Kommunikation aufbaust nutz 
sie doch gleich in beide Richtungen ;)
Dein Programm ist natürlich vom Quartz abhängig, genaueres dazu verrät 
das Datenblatt. Das ist mir hier jetzt zuviel zu erklären wie und was 
und warum. ;)

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Die Entstörkondensatoren an der Versorgung des PICs und der 
Versorgungsspannung halte ich mal für Selbstverständlich und hast du 
sicherlich nur deshalb nicht mit eingezeichnet nehm ich an.

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
guten morgen :)

danke für die fixe antwort. das mit der rückmeldung ist ja so ne art 
chicken-and-egg problem. der pic soll das relais abschalten nachdem der 
pc fertig ist mit runterfahren, wenn ich umount -a und /sbin/shutdown 
ausgeführt habe ist ja kein kernel mehr da der das programm ausführen 
könnte ;)

obwohl, gedankenblitz: der pc könnte ja dem pic zurückmelden "jo ok, 
signal angekommen. ich fahr die schüssel runter, starte du mal eine 
zeitverzögerung"

ja genau, so mach ich das :)

ich möchte ja nur den taster drücken zum bequemen und sorglosen 
abschalten wenn ich aus dem zimmer geh, wenn das board noch 2 sekunden 
länger strom bekommt ist ja nicht so tragisch.


Michael schrieb:
> PS: Die Entstörkondensatoren an der Versorgung des PICs und der
> Versorgungsspannung halte ich mal für Selbstverständlich und hast du
> sicherlich nur deshalb nicht mit eingezeichnet nehm ich an.

ähm ja husthust die kommen noch hinzu :)

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>obwohl, gedankenblitz: der pc könnte ja dem pic zurückmelden "jo ok,
>signal angekommen. ich fahr die schüssel runter, starte du mal eine
>zeitverzögerung"

Mehr noch, der PC könnte sagen "Hab alles runtergefahren und deaktivere 
nun meine RS232, in 10 Sekunden kannst du den Saft abdrehen." Ist ja 
dann nur eine Frage was man wann runterfährt. Man kann ja bei den 
Programmen z.B. anfangen ;)

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut finde ich ich Ersatzwiderstände... ;-)

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Quartz solltest Du einen verwenden, der eine fehlerfreie, 
standardisierte Baud-Rate zulässt. (Mehr dazu auch im Datenblatt)

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karsten schrieb:
> Gut finde ich ich Ersatzwiderstände... ;-)

du meinst an den unbenutzen ein/ausgängen?



Karsten schrieb:
> Beim Quartz solltest Du einen verwenden, der eine fehlerfreie,
> standardisierte Baud-Rate zulässt. (Mehr dazu auch im Datenblatt)

gut das du mich daran erinnerst, jetzt war ich grad im elektronikladen 
und hab doch prompt den quarz vergessen grummel



Michael schrieb:
> Mehr noch, der PC könnte sagen "Hab alles runtergefahren und deaktivere
> nun meine RS232, in 10 Sekunden kannst du den Saft abdrehen." Ist ja
> dann nur eine Frage was man wann runterfährt. Man kann ja bei den
> Programmen z.B. anfangen ;)

wie bereits gesagt, da läuft nur ein minimaler linux-kernel drauf mit 
busybox und meinem steuerprogramm für die mp3-dateien und das lcd mit 
keypad, mehr nicht. und wenn kein kernel mehr läuft kann ich 
logischerweise auch nix mehr ausführen ;)

das einzige was möglich wäre ich kann abfragen ob das mp3-programm nicht 
mehr läuft und die festplatte nicht mehr eingehängt ist, und kann dann 
sagen "ok, nur der kernel läuft noch, schalt mal in 3 sekunden aus"

dann verbesser ich den schaltplan und mach mich mal schlau ob ich auch C 
verwenden kann, ansonsten notgedrungen assembler lernen ;)

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Gut finde ich ich Ersatzwiderstände... ;-)
>>
>du meinst an den unbenutzen ein/ausgängen?

Unbenutzte IOs setzt man per SW auf "Ausgang" und spart sich so 
Widerstände. Welchen Widerstand man sich nicht sparen kann ist wie schon 
oben geschrieben den zwischen Vcc und MCLR. Ist der net da kann es immer 
wieder zu zufälligen resets kommen was vielleicht nicht unbedingt 
gewollt ist.

Autor: Vorsicht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine LEDs werden nie leuchten...

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorsicht schrieb:
> Deine LEDs werden nie leuchten...


ja das weiß ich auch. ich hab mir eagle letzte nacht zum ersten mal 
runtergeladen, gestartet und den schaltplan zusammengeklickt und das 
richtige symbol nicht gleich gefunden. it'ler sind von natur aus faul :)

Autor: Vorsicht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist nicht das Symbol. Die Anode muss auf +5V nicht auf Gnd.

Autor: Marco Glatz (marcoglatz)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
so, hier mal der überarbeitete schaltplan. die led's leuchten nun, die 
unbenutzen eingänge haben nen pullup, der pc kann dem pic nun auch was 
sagen und die stromversorgung für den MAX232 ist auch drin. wie heißt 
denn im eagle das symbol wenn ich anschlüsse nochmal getrennt darstellen 
will?


gruß,
marco

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies auch mal das:
http://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.25.2

Nicht das es nicht heisst, wir hätten dich nicht gewarnt.

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
meintest du den letzten abschnitt mit der z-diode?

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles.

Autor: Marco Glatz (marcoglatz)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
wie gesagt, ich bin laie, ich versteh nicht alles komplett was da steht. 
ich hab den schaltplan angepasst, mit siebelko, der z-diode und Vcc/GND 
vom relais direkt an den siebelko. mehr konnte ich aus der faq auch 
nicht rauslesen. und Vcc kommt direkt aus einem fix und fertig gekauften 
netzteil, der part mit dem 7805 entfällt bei mir also.

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Z-Didoe muss nicht sein, deine Freilaufdiode vorher war genau so gut 
wenn es dir nicht auf schnelle(re)s Abschalten des Relais ankommt (und 
darauf kommt es meist nicht an), du kannst also wählen, was du in der 
Bastelkiste hast.

Die Leitungen direkt zum Elko zu führen, ist klug, allerdings sollte das 
der Siebelko vor dem 5V Spannungsregler sein. Wenn du dort nicht 
hinkommst, weil die die Spannungserzeugung nicht selbst machst, sondern 
5V 'bekommst', wie du schreibst, ist es trotzdem klug, sie erst mal mit 
dem Elko zu filtern, und von dort mit 2 getrennten Leitungen zum Relais 
und zum uC zu gehen, dann sollten beide (+5V und 0V) Leitungen dicht 
beinanderliegen, als Draht verdrillt sein oder so, und am Ende, beim uC, 
hast du wieder Stützkondensatoren, die 100nF Dinger. Bau das Relais noch 
möglichst weit weg vom uC, vor allem die geschaltete Spannung.

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kurzer zwischenstand:

nach tagelangem stöbern und pauken sowie dauer-kopfrauchen hab ich das 
programm für den pic fertiggestellt, im simulator 
(http://www.oshonsoft.com/pic.html) läuft es genau so wie erwartet :)

in den nächsten tagen sollte mein pic programmer ankommen, dann kann ich 
die schaltung "live" testen. diverse selbstbau-brenner die ich gefunden 
hatte haben leider nicht funktioniert.

//#include <C:\Programme\bknd\CC5X\16F84A.h>
#pragma chip PIC16F84A


/**
 * config:
 *
 * watchdog      off
 * oszilator    HS
 * power-on-timer  on
 */
#pragma config WDTE=off, FOSC=HS, PWRTE=on


/**
 * PORTA = Eingang
 * PORTB = Ausgang
 *
 * PORTA.0 = RS-232 Eingang (Signal von PC)
 * PORTA.1 =
 * PORTA.2 =
 * PORTA.3 = Taster
 *
 * PORTB.0 = RS-232 Ausgang (Signal an PC)
 * PORTB.1 =
 * PORTB.2 =
 * PORTB.3 =
 * PORTB.4 = Relais
 * PORTB.5 = LED Rot (Relais nicht angezogen)
 * PORTB.6 = LED Grün (Relais angezogen)
 * PORTB.7 =
 */


void delay_ms(uns16 millisec)
{
    char next = 0;

    OPTION = 2; // prescaler divide TMR0 rate by 8
    TMR0   = 2; // deduct 2*8 fixed instruction cycles delay

    do  {
        next += 125;
    clrwdt();  // needed only if watchdog is enabled

    // 125 * 8 = 1000 (= 1 ms)
        while (TMR0 != next);
    } while ( -- millisec != 0);
}


void main()
{
  PORTA = 0b.0000.0000;
  TRISA = 0b.0000.1001; //0 = Output, 1 = Input

  PORTB = 0b.0000.0000;
  TRISB = 0b.0000.0000; //0 = Output, 1 = Input

  char i;

  char relais = 0;  // status relais. 0=aus, 1=an
  char state  = 0;  // state-machine

  // start: relais aus, rote led ein, grüne led aus
  PORTB = 0b.0010.0000;

  while(1) {

    switch(state) {

      // warte auf taster
      case 0:
        if (PORTA.3 == 1) {
          if(relais == 0) {
            relais = 1;
            state  = 1;
          } else {
            relais = 0;
            state  = 2;
          }
        }
        break;

      // relais aus -> relais ein, rote led aus, grüne led ein
      case 1:
        PORTB = 0b.0101.0000;
        state = 0; // wieder auf taster warten
        break;

      // relais an -> meldung an pc
      case 2:
        PORTB   = 0b.0101.0001;
        PORTA.0 = 1;
        state   = 3;
        break;

      // warte auf rückmeldung vom pc
      case 3:
        if(PORTA.0 == 1) {
          state = 4;
        }
        break;

      // rückmeldung da, starte timer zum ausschalten und grüne led blinken lassen
      case 4:
        for(i=0; i < 5; i++) {
          delay_ms(250);
          PORTB = 0b.0001.0001;
          delay_ms(250);
          PORTB = 0b.0101.0001;
        }

        state = 5;
        break;

      // timer abgelaufen -> relais aus, rote led ein, grüne led aus
      case 5:
        PORTB = 0b.0010.0000;
        state = 0; // wieder auf taster warten
        break;
    }
  }
} 

Autor: Wolfgang M. (womai)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwischen MCLR und Gnd (0V) waere noch ein keramischer Kondensator (0.1uF 
oder 0.01uF) nett. Das schuetzt vor ploetzlichen Resets bloss weil es 
ein mal bisschen Einstreuung in die Resetleitung gibt (z.B. wenn das 
Relay schaltet).

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HILFE, ich werd noch total meschugge.

die schaltung ist soweit fertig und funktioniert auch alles wie 
erwartet. nur hab ich noch probleme mit signal pic <-> pc.

verbindung pic -> max232

pin 2 (Eingang) -> pin 11 (R1 out)
pin 7 (Ausgang) -> pin 12 (T1 in)

verbindung max232 -> pc

pin 13 (R1 in) -> pin 7 (RTS)
pin 14 (T1 out) -> pin 8 (CTS)


aber das abfragen und insbesondere das setzen vom eingang am pic haut 
überhaupt nicht hin. ich klapper seit 2 tagen google ab und hab diverse 
beispiele angeschaut, nur wird bei so sachen so gut wie immer Tx und Rx 
verwendet. aber ich will ja keine daten senden, sondern nur den ausgang 
vom pic auf high/low checken und den eingang vom pic auf low/high setzen 
über die serielle schnittstelle.

setze ich z.b den ausgang vom pic auf high, wird mir im testprogramm 
nicht wie erwartet CTS gesetzt, sondern RNG. setze ich den eingang vom 
pic auf high, hab ich -10V. setze ich den auf low, hab ich immer noch 
-5V statt wie erwartet eine positive spannung.

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.