Ein Reed-Relais besteht aus einer Spule und einem Reedkontakt. Der Spulendraht ist um den Reedkontakt gewickelt. Fließt durch die Spule ein Strom, wird der Reedkontakt durch die erzeugte Magnetkraft betätigt. Das Reed-Relais hat eine wesentlich kleinere Bauform als ein normales Relais, kann aber nur bis zu 100 V betrieben werden und maximal 2 A schalten. Das Reed-Relais hat durch seinen Aufbau eine Schaltleistung von 100 Millionen Schaltspielen. Die maximale Schaltfrequenz beträgt 300 Hz.
Bauen sie die Schaltung aus Abbildung 59 auf. Da der Pullup Widerstand des Taster S16 zu hochohmig (10 k) ist, muss das Reed-Relais über die Relais-Schaltung angesteuert werden. Wird die Taste betätigt, schließt sich der Kontakt im Reed-Relais und die LEDB0 in der LED-Zeile leuchtet auf.
F !! Die dick eingezeichneten Linien stellen die Steckverbindungen dar. !!
F !! Das Reed-Relais können sie z. von Conrad Best-Nr. 504572-14. !!
|
|
Abbildung 59 Aufbau einer Reed-Relais Schaltung mit einem Taster
Abbildung 61 enthält die Steckverbindungen für die Reed-Relais Schaltung.
|
|
Abbildung 60 Steckverbindungen für die Reed-Relais Schaltung
Erstellen sie ein Programm, das das Reed-Relais anstatt über den Taster mit dem Portpin P2.0 ansteuert. Die Schaltung muss wie in Abbildung 61 aufgebaut werden. Der Portpin kann in der Betriebsart „Quasi-Bidirektional“ betrieben werden.
|
|
Abbildung 61 Aufbau einer Reed-Relais Schaltung mit dem Portpin P2.0
Für den Portpin P2.0 wird eine sbit-Deklaration verwendet (siehe Listing 63, ). Die Betriebsart „Quasi-Bidirektional“ wird mit der Funktion „v_PortConfig()“ eingestellt (siehe ‚). In der while-Schleife wird jetzt das Reed-Relais ein- und ausgeschaltet (siehe ƒ). Damit die Schaltfrequenz klein ist, wird die Variable „uiLoop“ hochgezählt (siehe „).
|
Projektname |
Verzeichnis |
Verwendete Sourcemodule |
|
Test_ReedRelais |
Test_ReedRelais |
TestReedRelais.c |
|
|
..\Library |
PortConfig.c |
Tabelle 65 Projekt Test_ReedRelais
|
‚
ƒ „ |
#include <REG932.H> #include <PortConfig.H>
sbit sbReedRel = P2^0;
void main(void) { unsigned int uiLoop; v_PortConfig(Port2, Pin0, BiDir); while(1) { sbReedRel = !sbReedRel; for (uiLoop=0; uiLoop < 65000; uiLoop++); } } |
Listing 63 Inhalt von TestReedRelais.c
Für die Reed-Relais wird eine Ansprechzeit und eine Prellzeit angegeben. Diese liegt je nach verwendetem Typ zwischen 0,5 und 2 ms. Abbildung 62 zeigt das Verhalten des Typs „3563 1231 053“ (1 Umschalter).
|
|
Abbildung 62 Ansprech-/Prellzeit beim Reed-Relais
Erstellen sie ein Programm, das die Ansprechzeit des Reed-Relais (Zeit zwischen H-L-Flanke des Ports und H-L-Flanke an Pin 1 des Relais: 301µs in Abbildung 62) ermittelt. Verwenden sie für die Messung der Zeit den Timer 1. Der Timer 1 soll gestoppt werden, wenn am Reed-Relais eine fallende Flanke erkannt wird. Dieses Verhalten kann mit der Gate-Funktion des Timers 1 realisiert werden. In der ISR des externen Interrupts 1 soll die Ansprechzeit ermittelt werden. Für das Abspeichern der Ansprechzeit wird eine globale Variable verwendet (siehe Listing 64, ). Der Timer 1 wird in der Betriebsart 1 (16-bit Timer) betrieben (siehe ‚). Der externe Interrupt 1 wird auf „fallende Flanke“ eingestellt und freigegeben (siehe ƒ). Nach der Aktivierung des Reed-Relais (siehe „) wird der Timer 1 gestartet (siehe …). Das Programm befindet sich nun solange in der while(1)-Schleife, bis eine fallende Flanke am externen Interrupt 1 anliegt. In der ISR wird zuerst der Timer 1 gestoppt (siehe †). Danach wird die Ansprechzeit ermittelt. Ein Timerwert entspricht 1 PCLK (0.27µs bei CCLK = 7.3728 MHz). Da bei der 4k-Version keine float-Arithmetik zugelassen ist, kann die Zeit auch über eine Multiplikation und Division errechnet werden (siehe ‡). In der Variablen ist der gerundete Wert in µs abgespeichert.
F !! Eine ausführliche Beschreibung zur Gate-Funktion des Timers 0/1 finden sie im „Kapitel 10.10 Timer 0/1 [3]“.
|
Projektname |
Verzeichnis |
Verwendete Sourcemodule |
|
Mess_ReedRelais |
Mess_ReedRelais |
MessReedRelais.c |
|
|
..\Library |
PortConfig.c, TimerLibrary.c |
Tabelle 66 Projekt Mess_ReedRelais
|
‚ ƒ ƒ ƒ
„ …
†
‡ |
#include <REG932.H> #include <PortConfig.H> #include <TimerLibrary.H>
sbit sbReedRel = P2^0; unsigned int uiDelayTime = 0;
void main(void) { sbReedRel = 1; v_PortConfig(Port2, Pin0, BiDir); v_InitTimer1(MODE1 | TIMER); IT1 = 1; // getriggert auf fallende Flanke EX1 = 1; // ext. Interrupt 1 freigeben EA = 1;
sbReedRel = 0; TR1 = 1; // Timer starten while(1); }
void v_ExtInt1(void) interrupt 2 { TR1 = 0; uiDelayTime = TH1 * 256 + TL1; uiDelayTime = (uiDelayTime * 27)/100; // Berechnung in µs } |
Listing 64 Inhalt von MessReedRelais.c
Erweitern sie das Projekt Mess_ReedRelais so, das die Ansprechzeit auf der 7-Segment LED in µs ausgegeben wird.
F !! Da die Ausgabe auf der 7-Segment LED muss außerhalb der ISR vom externen Interrupt 2 erfolgen, weil die I²C-Funktionen auch mit einer ISR arbeiten. !!
Um zu erkennnen, dass die ISR des externen Interrupts 2 abgearbeitet ist, wird die globale Variable btFinish benötigt (siehe Listing 65, ). Diese wird nach dem Start des Timers 1 gelöscht (siehe ‚). Danach wird solange gewartet, bis die ISR durchlaufen wurde (siehe ƒ). Am Ende der ISR wird die Variable auf „1“ gesetzt (siehe „). Der Wert wird jetzt in Dezimal umgerechnet (siehe …).
|
Projektname |
Verzeichnis |
Verwendete Sourcemodule |
|
Mess_ReedRelais |
Mess_ReedRelais |
MessReedRelais.c |
|
|
..\Library |
PortConfig.c, TimerLibrary.c, I2C_LIB.c, SAA1064_LIB.c |
Tabelle 67 Projekt Mess_ReedRelais (erweitert um Ausgabe auf 7-Segment LED)
|
‚ ƒ
…
„ |
#include <REG932.H> #include <PortConfig.H> #include <TimerLibrary.H> #include <I2C_LIB.H> #include <SAA1064_LIB.h>
sbit sbReedRel = P2^0; unsigned int uiDelayTime = 0; bit btFinish;
void main(void) { sbReedRel = 1; v_PortConfig(Port2, Pin0, BiDir); v_InitTimer1(MODE1 | TIMER); v_InitI2C(); IT1 = 1; // getriggert auf fallende Flanke EX1 = 1; // ext. Interrupt 1 freigeben EA = 1; v_InitSAA1064(DYNAMIC_MODE);
sbReedRel = 0; TR1 = 1; // Timer starten btFinish =0; while(btFinish == 0); Slave.DataLen = 0; Slave.Adr = 0x70; // Adresse SAA1064 v_SetNextI2CVal(1); // Subadresse auf 1 (Daten-Byte) v_ConvVal(uiDelayTime/1000); // Umrechnung (MSB) uiDelayTime = uiDelayTime % 1000; v_ConvVal(uiDelayTime/100); uiDelayTime = uiDelayTime % 100; v_ConvVal(uiDelayTime /10); uiDelayTime = uiDelayTime % 10; v_ConvVal(uiDelayTime); // Umrechnung des Reloadwertes (LSB) v_StartI2CandWait(); while(1); }
void v_ExtInt1(void) interrupt 2 { TR1 = 0; uiDelayTime = TH1 * 256 + TL1; uiDelayTime = (uiDelayTime * 27)/100; // Berechnung in µsec btFinish = 1; } |
Listing 65 Inhalt von MessReedRelais.c