praxis mikrocontroller
� elektor - 9/2008
Lasz mich indessen hier schalten und walten!Kabale und Liebe (Schiller)
Relaisplatine mit Portexpander für ATM18Von Udo Jürß und Wolfgang Rudolph
Seit jeher wollten die Menschen immer die Wirkung ihrer Taten sehen und sie auch anderen zeigen können. Bei uns Elektronikern drückt sich das oft darin aus, dass wir aus dem Computer „heraus“ eine Aktion sichtbar machen wollen. Heute sprechen wir allerdings mehr von Steuern und Regeln als über Schalten und Walten.Nachdem unser ATM18-Projekt mit dem Magnet-Schweberegler im letzten Heft richtig aktiv geworden ist, können wir jetzt mit einer Relaisplatine noch mehr Außenwirkung zeigen.
Da sitzt man entspannt im Sessel und schaltet mit einer Fernbedienung al-les, was der Bequemlichkeit dient: Lampen, Radio, Ventilator, sonst noch Ideen? Um das zu ermöglichen, wer-den mehrere Relais benötigt. Acht Ver-braucher dürften in den meisten Fäl-len ausreichen. Deshalb wird hier eine Achtfach-Relaiskarte vorgestellt.Für acht Relais würde man acht Ports benötigen. Diese Verschwendung kommt für uns aber nicht in Frage. Be-reits bei dem LC-Display haben wir Ports gespart und auch hier soll es wieder sparsam zugehen. Daher wur-de auch eine passende Interfacepla-tine entwickelt, mit deren Hilfe der Mega88 zur Ansteuerung nur zwei Ports braucht.
Zwei Ports müssen reichenAber wie schaltet man acht Relais mit zwei Bits? Auch hier heißt die Lösung wieder seriell. Es werden also die Bits von der Testplatine nacheinander zu dem uns schon bekannten Schiebere-gister 4094 gereicht. Um die Schaltung zu verstehen, bleibt uns ein Blick ins Datenblatt des 4094 nicht erspart.
Bild 1 zeigt das Innenschaltbild mit
Clock Output Strobe Data Parallel Outputs Serial Outputs
Enable Q1 QN QS(Note 1)
Q′Σ
0 X X Hi-Z Hi-Z Q7 No Change0 X X Hi-Z Hi-Z No Change Q71 0 X No Change No Change Q7 No Change1 1 0 0 QN−1 Q7 No Change1 1 1 1 QN−1 Q7 No Change1 1 1 No Change No Change No Change Q7
Bild 1. Innenschaltbild des Schieberegister-ICs 4094.
Q1
OUTPUTENABLE
Q1
(15)
STROBE
DATA
CLOCK
(1)
(2)
(3)
(4)
DCL
Q2D2
CLCL
Q2
Q2
(5)
DCL
Q3D3
CLCL
Q1D1
CLCL
Q3
Q3
(6)
DCL
Q4D4
CLCL
Q4
Q4
(7)
DCL
Q5D5
CLCL
Q5
Q5
(14)
DCL
Q6D6
CLCL
Q6
Q6
(13)
DCL
Q7D7
CLCL
Q7
Q7
(12)
DCL
Q8D8
CLCL
Q8
QS
Q8
(11)
(9)
Q’S(10)
080357 - 12
DCL
QD
CLCL
Bild 2. Die Wahrheitstabelle aus dem Datenblatt des 4094.
�9/2008 - elektor
Lasz mich indessen hier schalten und walten!Kabale und Liebe (Schiller)
Relaisplatine mit Portexpander für ATM18
acht Flipflops und zusätzlich acht Aus-gangslatches. Am Ausgang Qs (Pin 9) fallen die Bits nach dem achten Takt am Clock-Eingang (Pin 3) ins Nirwa-na. Man könnte hier den DATA-Ein-gang eines weiteren Schieberegisters anschließen und die Bits weiter ver-arbeiten. Eine besondere Rolle spielt aber der Ausgang Q’s (Pin 10). Hier er-scheint zwar ebenfalls das Signal von Q8, aber erst mit der fallenden Flanke des Clocksignals. Damit wird quasi ein neuntes Bit gespeichert. Die Wahrheits-tabelle im Datenblatt (Bild 2) zeigt es deutlich: Erst bei der fallenden Clock-flanke übernimmt Q’s den Zustand von Q7 (= Q8 im Blockschaltbild).Diese Porterweiterung ist eine kleine, eigenständige Platine die auch ohne nachgeschaltete Relaisplatine funkti-oniert. Aber nachdem nun das Schie-beregister erklärt ist, müssen wir noch über die genaue Funktionsweise der Schaltung (Bild 3) sprechen, da wir
K2
ULN2803
IC2
GND
COM 11
12
13
14
15
16
17
18I1
I2
I3
I4
I5
I6
I7
I8
O1
O2
O3
O4
O5
O6
O7
O8
10
1
2
3
6
7
8
4
5
9
K3
K1
C1
100n
IC1
4094
STR
CLK
VSS
VDD
11
12
13
14
Q1
Q2
Q3
Q4
Q5
Q6
Q7
Q8
15OE
QS10
QS
16
2
1
3
7
6
5
4
D
9
8
R1
4k7
D1
BAS40-6
DATA
CLK
+5V
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
1
2
3
4
1
+5V
GND
080357 13
Bild 3. Die Schaltung des Portexpanders mit dem Schieberegister 4094 und dem Leistungstreiber ULN2803.
praxis mikrocontroller
� elektor - 9/2008
mit zwei Bits drei Eingänge bedienen wollen. Der Ausgang Q’s wird verwen-det, um das Strobe-Signal zu verrie-geln. Nur wenn Q’s UND DATA UND
einfachen Si-Dioden wird nämlich nicht die nötige Störsicherheit erreicht.
Nun ergibt sich zwingend folgender Programmablauf für die Übertragung aller acht Bits:
1. Es werden acht Null-Bits in das Schieberegister geladen. Dazu setzt man DATA low und erzeugt acht Clock-Impulse. Die Bits werden je-weils mit der steigenden Flanke übernommen. Nun sind alle internen Q-Ausgänge low. Die Ausgangs-pins ändern sich aber noch nicht, weil Data = 0 den Strobe-Impuls blockiert.
2. Nun schiebt man ein High-Bit in den 4094. Es wird nach acht Takten an Q’s erscheinen.
3. Danach überträgt man sieben Da-tenbits mit dem jeweils gewollten Pegel (High/Low – Relais an/aus) an DATA und jeweils einem CLOCK-Im-puls. Die Daten werden mit der po-sitiven Clock-Flanke übernommen.
4. Am Ende wird das achte Bit auf eine besondere Art übertragen. Zuerst setzt man Data entsprechend dem gewünschten Wert. Diesmal folgt aber kein vollständiger Clock-Im-puls, sondern man setzt Clock zu-nächst einmal nur hoch. Damit wer-den alle Bits in die endgültige Po-sition geschoben. Q’s enthält aber noch den Zustand vom Bit davor, das also neun Taktimpulse vorher auf Eins gesetzt wurde. Nun setzt man auch noch Data high, falls die Leitung nicht schon vom letzten Bit gesetzt war. Auf diese Art und Weise wird über die Dioden-Wider-standsverknüpfung der Strobe-Im-puls erzeugt. Die acht Bits werden an die Ausgänge durchgeschaltet. Erst danach darf man DATA und CLOCK wieder wegnehmen, egal in welcher Reihenfolge.
Das Verfahren ist schnell und sicher und spart einen zusätzlichen Port.
Die RelaisplatineDie Schaltung der Relaisplatine (Bild 4) ist trivial. Eine Buchse für die Strom-versorgung und eine Diode als Verpol-ungsschutz sowie eine LED zur An-zeige der Betriebsspannung sind ob-ligatorisch. Dann haben wir noch eine zehnpolige Stiftleiste für die Eingangs-signale. Wenn wir auf die Porterwei-
CLOCK High sind, wird das Strobe-Si-gnal erzeugt. Die UND-Schaltung mit drei Eingängen verwendet eine dop-pelte Schottky-Diode BAS 40-6. Mit
JP11
RE1
G5LE
D2
1N4148
LED1
R14k
7K3
1
3
2
RE2
G5LE
D3
1N4148
LED2
R2
4k7
K4
1
3
2
RE3
G5LE
D4
1N4148
LED3
R3
4k7
K5
1
3
2
RE4
G5LE
D5
1N4148
LED4
R4
4k7
K6
1
3
2
RE5
G5LE
D6
1N4148
LED5
R5
4k7
K7
1
3
2
RE6
G5LE
D7
1N4148
LED6
R6
4k7
K8
1
3
2
RE7
G5LE
D8
1N4148
LED7
R7
4k7
K9
1
3
2
RE8
G5LE
D9
1N4148
LED8
R8
4k7
K10
1
3
2
LED9
R94k
7
C1
220µ16V
D1
1N4004K112V
2
3
4
5
6
7
8
9
10
080357 - 14
Bild 4. Schaltplan der Relaisplatine.
�9/2008 - elektor
terungsplatine (Bild 5) eine Buchsen-leiste löten, kann die Porterweiterung huckepack auf die Relaisplatine (Bild 6) gesteckt werden.
Natürlich kann man die Relaisplatine auch ohne die Porterweiterungsplati-ne betreiben, wenn man vom ATM18-Testboard Leitungen direkt von den Ausgängen des ULN2003 (K6 der Test-board-Platine) heranführt und die ULN-Eingänge (an K7 der Testboard-Plati-ne) direkt mit den Pins der Prozessor-ports verbindet. Das ist aber nicht so elegant wie unsere 2-Draht-Lösung!Paralleldioden (so genannte Freilaufdi-oden) an den Relaisspulen gehören im-mer dazu, um die hohen Spannungen kurzzuschließen, die durch Selbstin-duktion entstehen, wenn das Relais abgeschaltet wird. Ebenso ist eine LED mit ihrem Vorwiderstand hilfreich, um erkennen zu können, welchen Schalt-zustand das Relais hat.
Mit den verwendeten Relais kann man bis zu 5 A schalten, auch die Lei-terbahnen halten dies aus. Theore-
Bild 5. Die Platine der Porterweiterung.
StücklisteATM18-Porterweiterungs-Platine080��7-�
Passive Bauteile:R1 = 4k7 (SMD-Widerstand 0805)C1 = 100 n (SMD-Kondensator 0805)
Halbleiter:D1 = BAS40-1 (SMD)IC1 = 4094 (SMD SO16)IC2 = ULN2803 (DIL16)
Außerdem:K1 = 4-polige StiftleisteK2 = 8-polige StiftleisteK3 = 10-polige StiftleistePlatine ohne Bauteile 071035-5 (erhält-
lich via www.elektor.de)Mit SMD-Bauteilen bestückte Platine
071035-95 (siehe Elektor-Shop-Anzei-ge und www.elektor.de)
praxis mikrocontroller
� elektor - 9/2008
tisch könnte man auch Netzspannung (230 V) schalten - die Leiterbahnab-stände sind dafür ausreichend - aber dies sollte einem echten Homo electri-cus (oder Homo rudolfensis!) vorbehal-ten bleiben. Dann müsste die Platine
bildung dazu berechtigt.Da die Porterweiterung SMD-ICs ver-wendet, ist die Platine bereits bestückt erhältlich. Für die Relaisplatine mit ih-ren leicht zu lötenden (Groß-)Bauteilen wird hingegen ein Bausatz mit Bautei-len und Platine angeboten.
C-SoftwareWie immer gibt es ein C-Beispielpro-gramm zum Download auf der Elektor-Homepage. Das Projekt ATM18-RC5_Relais verwendet die Relaisplatine für eine komfortable Steuerung aller acht Ausgänge über eine RC5-Fernbedie-nung. Die Entscheidung, welche bei-den Portbits für die Steuerung des Por-texpanders verwendet werden, hängt davon ab, welche anderen Hardwa-refunktionen benötigt werden. Das C-Programm ist für eine Anwendung mit angeschlossenem 2-Draht-LCD ge-schrieben. Das Display zeigt dann den jeweiligen Schaltzustand an. Es belegt die Ports PB1 und PB2 (siehe Elektor 5/08). Der RC5-Empfänger liegt an PB0 (siehe Elektor 6/08). Für die Porterwei-terung wurden nun die Anschlüsse PD5 (Clock) und PD6 (Data) gewählt. Bei Bedarf lassen sich die Pins leicht anders zuweisen. In main.c (Listing 1) steht alles, was man benötigt, um das Projekt erfolgreich einzusetzen.
Wichtig ist, dass die verwendete Fern-bedienung den Gerätecode 0 (Video-recorder) verwendet. Dann kann man
in ein Gehäuse, es dürften nur Geräte geschaltet werden, die einen entspre-chenden Berührungsschutz haben (da mit den Relais nur einpolig abgeschal-tet wird) und so weiter. Also Finger weg von 230 V, wenn keine Fachaus-
Bild 6. Bestückungsplan der Relaisplatine.
StücklisteATM18-Relais-Platine080��7-�
Widerstände:R1..R9 = 4k7
Kondensatoren:C1 = 220 µ/16 V
Halbleiter:D1 = 1N4004D2..D9 = 1N4148LED1...LED9 = LED 3mm
Außerdem:JP1 = 10-polige BuchsenleisteK1 = Netzgerätebuchse für
Platinenmontage K3…K10 = 3-polige Platinenanschluss-
klemme, RM 5 mmRe1..Re8 = Relais Omron G5LEPlatine ohne Bauteile 071035-6 (erhält-
lich via www.elektor.de)Bauteilsatz (Platine mit allen Bauteilen)
071035-72
Listing 1Auszug aus main.c
RC-5 button assignment: 1..8: Switch corresponding relais on/off 0 : Switch off all relais 9 : Switch on all relais
Testboard wiring for ATM18_LCD application
COMPONENT ATM18-PIN*** LCD 2-wire interfaceCLOCK PB1 (can be changed in „application.h“)DATA PB2 (can be changed in „application.h“)
*** Port Expander 2-wire interfaceCLOCK PD5 (can be changed in „application.h“)DATA PD6 (can be changed in „application.h“)
*** IR receiver *** Receiver supply +- K4 (watch out for proper polarity!) Receiver output PB0_ICP1
79/2008 - elektor
mit den Tasten 1 bis 8 völlig unabhän-gig voneinander jedes einzelne Relais ein- und ausschalten. Mit der Taste 0 werden alle Ausgaben gelöscht. Das ist sozusagen die Feierabend-Taste: Alles aus!
BASCOM-BeispielFür den Einsteiger ist vielleicht das BASCOM-Beispielprogramm PortEx-pander1.bas leichter zu durchschauen. Es verwendet die gleiche Pinbelegung für den Portexpander, verzichtet aber auf das LCD. Stattdessen werden zu Testzwecken Daten über die serielle Schnittstelle ausgegeben. Man sieht so, welche Daten die RC5-Fernbedie-
nung sendet.Das Listing zeigt die Datenübertra-gung zum Schieberegister in der Proze-dur Sub Pe_write_byte. Port D6 ist der Data-Ausgang, D5 liefert das Clock-Si-gnal. Das Hauptprogramm liest Daten vom RC5-Empfänger und verwendet sie genau wie das C-Projekt. Mit den Tasten 1 bis 8 schaltet man also die einzelnen Relais um, während die Tas-te 0 alles löscht.
Erfahrungen mit Infrarotfernbedie-nungen haben gezeigt, dass die größ-te Schwierigkeit eigentlich nur dar-in besteht, die passende Fernbedie-nung zu finden. Wenn man eine mit RC5-Signalen gefunden hat, kann es
eine mit der falschen Geräteadresse sein. Das Basic-Programm lässt daher mit voller Absicht alle Geräteadres-sen zu. Es spielt also keine Rolle, ob die Fernbedienung zu einem Videore-corder, einem Fernseher oder einem ganz anderen Gerät gehört. Über die serielle Schnittstelle werden jeweils die Gräteadresse und das Komman-dobyte ausgegeben. Das hilft bei der Fehlersuche.
(080357e)
Listing �Das Programm Portexpander1.bas
‘ATM18 Portexpander, Relais, RC5‘Clock = PD5, Data = PD6
$regfile = “m88def.dat”$crystal = 16000000Baud = 9600
Dim Address As Byte , Command As ByteDim Mask As ByteDim N As ByteDim State As ByteDim Relais As ByteDim Ctrl As Byte , Ctrl_old As Byte
Pe_clock Alias Portd.5Pe_data Alias Portd.6Config Portd = &B01100000Config Rc5 = Pinb.0Declare Sub Pe_write_byte(d As Byte)Enable Interrupts
Print “Portexpander”Relais = 0Pe_write_byte Relais
Do Getrc5(address , Command) If Address < 255 Then Ctrl = Command And &B10000000 If Ctrl <> Ctrl_old Then Print Address Print Command Command = Command And &B01111111 If Command = 1 Then Toggle Relais.0 If Command = 2 Then Toggle Relais.1 If Command = 3 Then Toggle Relais.2 If Command = 4 Then Toggle Relais.3 If Command = 5 Then Toggle Relais.4 If Command = 6 Then Toggle Relais.5 If Command = 7 Then Toggle Relais.6 If Command = 8 Then Toggle Relais.7 If Command = 0 Then Relais = 0 Pe_write_byte Relais End If Ctrl_old = Ctrl
End IfLoop
Sub Pe_write_byte(d As Byte) ‘Write Byte To Port Expander Mask = 1 Pe_clock = 0 ‘Clear data signal Pe_data = 0 ‘Clear all stages of shift register For N = 1 To 8 Pe_clock = 1 Waitus 5 Pe_clock = 0 Next N ‘Set High Level For Qs Pe_data = 1 ‘Cock in QS Pe_clock = 1 Waitus 5 Pe_clock = 0 ‘Do this for 7 databits For N = 1 To 7 State = D And Mask If State = 0 Then Pe_data = 0 Else Pe_data = 1 End If Pe_clock = 1 ‘Clock in data with rising edge Waitus 5 Pe_clock = 0 Shift Mask , Left Next N ‘last bit Pe_data = 0 State = D And Mask State = State / Mask If State = 1 Then Pe_data = 1 ‘Set Strobe Pe_clock = 1 ‘Clock in data Pe_data = 1 Waitus 5 Pe_data = 0 Pe_clock = 0End SubEnd