Atmel Steckdosenleiste


1.1 Übersicht

Entwickelt wird die Steuerung für eine Steckdosenleiste. Zwei Steckdosen verfügen über ein Dimmerfunktion und zwei Steckdosen über eine Schaltfunktion. Alle Steckdosen verfügen über eine Rückkopplung, d.h. es wird detektiert, ob die angeschlossenen Lampen auch wirklich leuchten wenn sie eingeschaltet werden. Die Steuerung erfolgt über eine Infrarot Fernbedienung und/oder über eine serielle Schnittstelle.

Zusätzlich verfügt die Steuerung noch über einer Störsignalunterdrückung, denn ist ist leider so, das einige Steuer- oder Informationssignale die Phasenanschnittsteuerung erheblich stören können. Bei einer geringen Helligkeit einer Lampe und einer Steuerfrequenz, die in der Nähe eines Vielfachen der Netzfrequenz liegt, z.B. 1005 Hz, "schwebt" die Helligkeit des Lichtes mit einer Frequenz von 5 Hz.

Hier einige Beispiele für Störquellen:

1.2 Schaltplan

1.2.1 Netzteil

1.2.1.1 Gleichspannung

Eine Standardschaltung zur Erzeugung der Versorgungsspannung von +5V. Wegen der Diode D1 kann die ungeregelte Gleichspannung bis auf 5,8 Volt herunter gehen. Deswegen sollte ein Low-Drop Spannungsregler eingesetzte werden.

1.2.1.2 Filter

Hier handelt es sich um ein Bandpassfilter 1. Ordnung mit mehrfach Rückkopplung mit seiner typischen Dämpfung von -6dB/Oktave. Um Störungen im kHz Bereich zu unterdrücken reicht das vollkommen aus (-35dB bei 1kHz). Die Amplitude des Eingangssignals V2 wird durch die Zenerdiode auf 3,6 Volt begrenzt. Da nur eine Positive Versorgungsspannung zur Verfügung steht, wird das Potential an den positiven Eingängen der OPs auf 2Volt angehoben. Bei einer Verstärkungs von 1 kann das Ausgangssignal also Pegel von 0,2 bis 3,8 Volt annehmen (=2V+/-1,8V). Das ist ein sicherer Arbeitsbereich für TS912. Die Widerstände des Filters berechnen sich nach folgenden Gleichungen:

Vorgabe

Verstärkung = G = 1
Güte = Q = 5
Mittenfrequenz = f = 100Hz
C5 = C6 = C = 100nF

R1 = 79,6k = R2 parallel R3 = 100k parallel 390k

R2 = 1,624k = R4 parallel R5 = 18k parallel 1k8

R3 = 159,2k = R8 + R9 = 150k + 9k1

IC1b arbeitet als Komparator. Das Ausgangssignal hat also eine Rechteckform, die direkt auf den Interrupt Eingang des ATmega geht.

1.2.2 Steuerung

1.2.2.1 Controller

Die Beschaltung des Controllers ist sehr Einfach gehalten. ST1 ist der Anschluß für den Programmer. R5/C4 bilden den Reset. Q1 hat eine Frequenz von 3,684MHz. D-O1 liefert die Zündimpulse für den Triac des ersten Dimmers und D-O2 die Impulse für den Triac des zweiten Dimmers (Ansteuerung durch 1.2.3). D-O3 und D-O4 liefern feste Pegel zum Ein- und Ausschalten (Ansteuerung durch 1.2.4). D-I1 und D-I2 ist die Rückkopplung für Dimmer 1 und 2. D-I3 und D-I4 ist die Rückkopplung für Schalter 1 und 2 (Ansteuerung durch 1.2.5).

Das einzige besondere ist besondere ist die Erkennung des High/Low Pegels des IR-Signales. PD3 dient als Interrupt Eingang. Parallel dazu wird das Signal auf PD4 gelegt. PD4 ist ein normaler Eingang, der 1,33ms nach dem Interrupt abgefragt wird. Zu diesem Zeitpunkt ist die High/Low Information des übertragenen Bits eindeutig vorhanden.

1.2.2.2 Phasenschieber

Hinter dem Gleichrichter des Netzteils wird das 100Hz Signal für die Netzsynchronen Triggerimpulse abgeleitet. Durch den Trafo und den Bauteiltoleranzen des Filters stimmt die fallende Flanke des Rechtecks (Ausgang des Komparators) nicht mehr mit den Nulldurchgängen des 50Hz Sinus überein. Damit die erzeugten Zündimpule für den Triac aber mit den Nulldurchgängen wieder überstimmen, müssen die Flanken verschoben werden. Dazu werden die beiden Monoflops des 74HC123 benutzt. Das erste Monoflop wird durch die negative Flanke des 100Hz Signals getriggert. Die fallende Flanke dieses Ausgangsimpulses geht auf den zweiten Monoflop, der einen kurzen Impuls für den Interrupteingang erzeugt. Dieser Impuls kann also durch P1 so lange verschoben werden, bis er genau in die Nulldurchgänge des 50Hz Sinus fällt.

Der Abgleich ist relativ einfach. Über die IR-Fernbedienung wird die maximale Helligkeit eingestellt und so lange an P1 gedreht bis das Licht gerade eben nicht mehr flackert. Der erste Zündimpuls kommt in diesem Fall fast sofort nach einem Nulldurchgang. Durch diesen kleinen Phasenschieber spart man sich eine Aufwendige Berechnung und das Ausmessen von Bauteilen für den Filter und umgeht alle Unzulänglichkeiten des Trafos.

1.2.2.3 IR-Empfänger

Ohne weiteren Kommentar. Das ist eine Standardanwendung aus dem Datenblatt. Sie funktioniert ohne Probleme. Sollte des SFH506 nicht mehr verfügbar sein, kann auch der TSOP1736 benutzt werden. Eigendlich kann alles benutzt werden, was ein aufbereitet Rechtecksignal liefert.

1.2.2.4 RS232 Schnittstelle

Auch nichts besonderes. Eine Standardanwendung aus dem Datenblatt.

1.2.3 Dimmer

1.2.4 Schalter

1.2.5 Rückkoppllung

Stückliste

1.3 Mechanik

1.4 Software

Der Controller verfügt über 10 Befehle. Die Befehle können über die Infrarot Fernbedienung oder über die serielle Schnittstelle gesendet werden. Die Befehlscodes sind identisch, also auch die Reaktion auf die Befehle. Egal ob ein Befehl von der Schnittstelle oder der Fernbedienung kommt, es wird immer eine Antwort über die serielle Schnittstelle gesendet.

ASCII

HEX

Antwort Bedeutung
1 0 CR 31 30 0D 10 x1 x2 x3 x4 x5 Erhöht die Intensität für Dimmer 1
1 1 CR 31 31 0D 11 x1 x2 x3 x4 x5 Vermindert die Intensität für Dimmer 1
2 0 CR 32 30 0D 20 x1 x2 x3 x4 x5 Erhöht die Intensität für Dimmer 2
2 1 CR 32 31 0D 21 x1 x2 x3 x4 x5 Vermindert die Intensität für Dimmer 2
0 1 CR 30 31 0D 01 x1 x2 x3 x4 x5 Schaltet Licht 1 ein
0 4 CR 30 34 0D 04 x1 x2 x3 x4 x5 Schaltet Licht 1 aus
0 2 CR 30 32 0D 02 x1 x2 x3 x4 x5 Schaltet Licht 2 ein
0 5 CR 30 35 0D 05 x1 x2 x3 x4 x5 Schaltet Licht 2 aus
0 C CR 30 43 0D 0C x1 x2 x3 x4 x5 Status abfragen
CR 0D 0C x1 x2 x3 x4 x5 Wiederholt den letzten Befehl
    x1 = Lichtintensität für Dimmer 1 (01=Hell, 23=Dunkel)
x2 = Lichtintensität für Dimmer 2 (01=Hell, 23=Dunkel)
x3 = Wert für Schalter 1 (00=Aus, 01=Ein)
x4 = Wert für Schalter 2 (00=Aus, 01=Ein)
x5 = Eingangsstatus (01=Dim1, 02=Dim2, 04=S1, 08=S2, 0F=alles Ein)

Programm

Programm Listing

1.4.1 100 Hz Interrupt

Funktionsprinzip

Die fallende Flanke des 100Hz Signals löst einen Interrupt aus. In ein Vergleichsregister wird ein Wert geladen. Es wird ein Zähler bei 0 gestartet. Erreicht der Zähler den Inhalt des Vergleichsregisters, wird ein weiterer Interrupt ausgelöst. Dieser zweite Interrupt gibt einen Impuls von 80µs Dauer auf einen Portpin aus.

Je nach Inhalt des Vergleichsregisters erscheint der Ausgangsimpuls also zu unterschiedlichen Zeiten realtiv zur fallenden Flanke des 100Hz Signals. Der Ausgangsimpuls ist der Zündimpuls für den Triac.

Da Timer 1 über zwei Vergleichsregister verfügt, können die Impulse für 2 Dimmer erzeugt werden.

1.4.1.1 Initialisierung

TCCR1A 00001100 $0C  
7 COM1A1 0 OC1A Ausgang ist ausgeschaltet
6 COM1A0 0
5 COM1B1 0 OC1B Ausgang ist ausgeschaltet
4 COM1B0 0
3 FOC1A 1 Force Output Compare for channel A
2 FOC1B 1 Force Output Compare for channel B
1 WGM11 0 Normaler Counter Modus
0 WGM10 0

TCCR1B 00000101 $05  
7 ICNC1 0 Input Capture Noise Canceler ausgeschaltet
6 ICES1 0 Input Capture Edge Select = fallende Flanke
5 -    
4 WGM13 0 Normaler Counter Modus
3 WGM12 0
2 CS12 1 Vorteiler: Clock / 1024
Das sind 277,7µs pro Takt.
Das ergibt bei 10ms 36 Schritte
1 CS11 0
0 CS10 1

Die Werte für Light0 und Light1 liegen zwischen 1 und 35.

TIMSK xx0110xx $18  
7 OCIE2 x  
6 TOIE2 x  
5 TICIE1 0 Input Capture Interrupt ausgeschaltet
4 OCIE1A 1 Output Compare A Match eingeschaltet
3 OCIE1B 1 Output Compare B Match eingeschaltet
2 TOIE1 0 Overflow Interrupt ausgeschaltet
1 - x  
0 TOIE0 x  

1.4.1.2 IRQ Service für 100Hz

INT0 wird ausgelöst durch die fallende Flanke des 100Hz Signals.

1.4.1.3 IRQ Service für Dimmer 1

IRQ1 wird ausgelöst, wenn CNT1 bei CMP1A angekommen ist.

1.4.1.4 IRQ Service für Dimmer 2

IRQ2 wird ausgelöst, wenn CNT1 bei CMP1B angekommen ist

1.4.2 IR Interrupt

Der RC5 Code besteht aus einem biphasenkodierten Signal (auch als Manchester Code bekannt). Ein Datenwort besteht aus 14 Bits mit folgender Bedeutung:

Bei wechselden Tastendrücken ist das Togglebit immer 1, nur wenn die gleiche Taste mehrmals hintereinander gedrückt wird, wechselt dieses Bit seinen Zustand.

Die einzelnen Bits bestehen aus einem biphasenkodierten Impuls.

Für die Auswertung werten zwei Interrupts benutzt. Zum Einen der Interrupt, auf der das Signal vom SFH506 geht (roter Punkt) und zum Anderen ein Software Interrupt eines Compare Registers (grüner Punkt). Der Trick besteht in der Programmierung des Interrupts auf die steigende oder fallende Flanke.

Wurde ein Bit als 1 erkannt, dann wird für die Erkennung des nächsten Bits der Interrupt auf eine fallende Flanke programmiert.

Wurde ein Bit als 0 erkannt, dann wird  für die Erkennung des nächsten Bits der Interrupt auf eine steigende Flanke programmiert.

Wird ein Interrupt ausgelöst, dann wird eines der Compare Register so mit einem Wert geladen, das nach 1335 µs einen Interrupt auslöst wird. Diese Interrupt Routine prüft dann den Pegel des Signales.

1335 µs = 890 µs + 890 / 2 µs

Der Pegel wird also nach 3/4 der Zeit eines Bits gelesen. Das gibt genug Raum für Abweichungen. Die Zeit von 1,78 ms für ein Bit wird nämlich nicht von allen Herstellern von Fernbedienungen so genau genommen.

Das obige Bild zeigt eine komplette Auswertung von zwei Signalen. Kurve A ist die Verminderung der Lautstärke (Kommando = 17) eines CD-Spielers (Gerätecode = 20). Kurve B ist das gleiche Signal, aber noch einmal gedrückt. Kommando und Gerätecode sind identisch, aber das Togglebit ist jetzt eine 0. Wird die gleiche Taste jetzt noch einmal gedrückt, ist das Togglebit wieder eine 1.

Als IR-Fernbedienung wird hier die Universalfernbedienung von Conrad benutzt:

1.4.2.1 Initialisierung

TCCR2 10000110 $86  
7 FOC2 1 Non PWM Mode
6 WGM20 0 Normaler Counter Modus
5 COM21 0 OC2 Ausgang ist ausgeschaltet
4 COM20 0
3 WGM21 0 Normaler Counter Modus
2 CS22 1 Vorteiler: Clock / 256
Das sind 69,4µs pro Takt.
1 CS21 1
0 CS20 0

TIMSK 10xxxxxx $80  
7 OCIE2 1 Output Compare Match Interrupt eingeschaltet
6 TOIE2 0 Overflow Interrupt ausgeschaltet
5 TICIE1 x  
4 OCIE1A x  
3 OCIE1B x  
2 TOIE1 x  
1 - x  
0 TOIE0 x  

1.4.2.2 IRQ Service für IR

INT1 wird ausgelöst, wenn eine negative Flanke vom IR-Dekoder kommt.

1.4.2.3 IRQ für High/Low Auswertung

IRQ3 wird ausgelöst, wenn CNT2 bei CMP2 angekommen ist

1.4.2.4 Codeauswertung

1.4.3 RS232 Interrupt

Probleme gibt es beim Senden eines Bytes über die serielle Schnittstelle. Normalerweise muß das Bit UDRE im Register UCSRA getestet werden. Ein neues Byte darf erst dann gesendet werden, wenn dieses Bit 1 ist, da erst dann ein eventuell noch vorhandenes Byte vollständig gesendet ist. Dies wird durch folgenden Programmcode erledigt:

RS232Out: sbis  UCSRA,UDRE
          rjmp  RS232Out
          out   UDR,temp

Wird ein Byte nach diesem Verfahren gesendet, kommt es zu Störungen im Interrupt System. Ursache unbekannt. Abhilfe schafft die Erkennung über die Auslösung eines Interrupts, wenn das Byte vollständig gesendet wurde.

1.4.3.1 Initialisierung

1.4.3.2 IRQ Receive Service

1.4.3.3 IRQ Transmit Service