[Anfänger] Simple Relais-Schaltung mit dem PIC16F84

OP #1533692
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.
Angehängte Dateien:
Gast #1533700
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. ;)
OP #1533706
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 :)
Gast #1533727
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 ;)
OP #1533746
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 ;)
Gast #1533754
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.
OP #1534513
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.
Angehängte Dateien:
Gast #1534614
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.
OP #1544606
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
}
OP #1567090
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

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