Ansteuerung von Reed-Relais

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 be­tä­tigt, schließt sich der Kontakt im Reed-Relais und die LEDB0 in der LED-Zeile leuch­tet 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 Be­triebsart „Quasi-Bidirektional“ wird mit der Funktion „v_PortConfig()“ eingestellt (sie­he ). 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) er­mit­telt. Ver­wen­den 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 Verhal­ten 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 Ansprech­zeit 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 gerun­dete 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-Seg­ment LED in µs ausgegeben wird.

F !! Da die Ausgabe auf der 7-Segment LED muss außer­halb 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 glo­ba­le Varia­ble 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