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.
Edit: der schaltplan ist etwas klein, ich hab ihn nochmal etwas größer exportiert
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. ;)
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.
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 :)
>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 ;)
Beim Quartz solltest Du einen verwenden, der eine fehlerfreie, standardisierte Baud-Rate zulässt. (Mehr dazu auch im Datenblatt)
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 ;)
>> 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.
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 :)
Es ist nicht das Symbol. Die Anode muss auf +5V nicht auf Gnd.
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
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.
meintest du den letzten abschnitt mit der z-diode?
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.
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.
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 | }
|
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.