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


von Marco G. (marcoglatz)


Angehängte Dateien:

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.

von Marco G. (marcoglatz)


Angehängte Dateien:

Lesenswert?

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

von Michael (Gast)


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

von Michael (Gast)


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.

von Marco G. (marcoglatz)


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

von Michael (Gast)


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

von Karsten (Gast)


Lesenswert?

Gut finde ich ich Ersatzwiderstände... ;-)

von Karsten (Gast)


Lesenswert?

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

von Marco G. (marcoglatz)


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

von Michael (Gast)


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.

von Vorsicht (Gast)


Lesenswert?

Deine LEDs werden nie leuchten...

von Marco G. (marcoglatz)


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

von Vorsicht (Gast)


Lesenswert?

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

von Marco G. (marcoglatz)


Angehängte Dateien:

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

von MaWin (Gast)


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.

von Marco G. (marcoglatz)


Lesenswert?

meintest du den letzten abschnitt mit der z-diode?

von MaWin (Gast)


Lesenswert?

Alles.

von Marco G. (marcoglatz)


Angehängte Dateien:

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.

von MaWin (Gast)


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.

von Marco G. (marcoglatz)


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.
1
//#include <C:\Programme\bknd\CC5X\16F84A.h>
2
#pragma chip PIC16F84A
3
4
5
/**
6
 * config:
7
 *
8
 * watchdog      off
9
 * oszilator    HS
10
 * power-on-timer  on
11
 */
12
#pragma config WDTE=off, FOSC=HS, PWRTE=on
13
14
15
/**
16
 * PORTA = Eingang
17
 * PORTB = Ausgang
18
 *
19
 * PORTA.0 = RS-232 Eingang (Signal von PC)
20
 * PORTA.1 =
21
 * PORTA.2 =
22
 * PORTA.3 = Taster
23
 *
24
 * PORTB.0 = RS-232 Ausgang (Signal an PC)
25
 * PORTB.1 =
26
 * PORTB.2 =
27
 * PORTB.3 =
28
 * PORTB.4 = Relais
29
 * PORTB.5 = LED Rot (Relais nicht angezogen)
30
 * PORTB.6 = LED Grün (Relais angezogen)
31
 * PORTB.7 =
32
 */
33
34
35
void delay_ms(uns16 millisec)
36
{
37
    char next = 0;
38
39
    OPTION = 2; // prescaler divide TMR0 rate by 8
40
    TMR0   = 2; // deduct 2*8 fixed instruction cycles delay
41
42
    do  {
43
        next += 125;
44
    clrwdt();  // needed only if watchdog is enabled
45
46
    // 125 * 8 = 1000 (= 1 ms)
47
        while (TMR0 != next);
48
    } while ( -- millisec != 0);
49
}
50
51
52
void main()
53
{
54
  PORTA = 0b.0000.0000;
55
  TRISA = 0b.0000.1001; //0 = Output, 1 = Input
56
57
  PORTB = 0b.0000.0000;
58
  TRISB = 0b.0000.0000; //0 = Output, 1 = Input
59
60
  char i;
61
62
  char relais = 0;  // status relais. 0=aus, 1=an
63
  char state  = 0;  // state-machine
64
65
  // start: relais aus, rote led ein, grüne led aus
66
  PORTB = 0b.0010.0000;
67
68
  while(1) {
69
70
    switch(state) {
71
72
      // warte auf taster
73
      case 0:
74
        if (PORTA.3 == 1) {
75
          if(relais == 0) {
76
            relais = 1;
77
            state  = 1;
78
          } else {
79
            relais = 0;
80
            state  = 2;
81
          }
82
        }
83
        break;
84
85
      // relais aus -> relais ein, rote led aus, grüne led ein
86
      case 1:
87
        PORTB = 0b.0101.0000;
88
        state = 0; // wieder auf taster warten
89
        break;
90
91
      // relais an -> meldung an pc
92
      case 2:
93
        PORTB   = 0b.0101.0001;
94
        PORTA.0 = 1;
95
        state   = 3;
96
        break;
97
98
      // warte auf rückmeldung vom pc
99
      case 3:
100
        if(PORTA.0 == 1) {
101
          state = 4;
102
        }
103
        break;
104
105
      // rückmeldung da, starte timer zum ausschalten und grüne led blinken lassen
106
      case 4:
107
        for(i=0; i < 5; i++) {
108
          delay_ms(250);
109
          PORTB = 0b.0001.0001;
110
          delay_ms(250);
111
          PORTB = 0b.0101.0001;
112
        }
113
114
        state = 5;
115
        break;
116
117
      // timer abgelaufen -> relais aus, rote led ein, grüne led aus
118
      case 5:
119
        PORTB = 0b.0010.0000;
120
        state = 0; // wieder auf taster warten
121
        break;
122
    }
123
  }
124
}

von Wolfgang M. (womai)


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

von Marco G. (marcoglatz)


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.

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.