Die Digitalisierung
Und nun fängt das Leiden mit dem Microcontroller an ...
Mein erstes Problem ... wie mache ich das mit den MOSFETs ? Bei der
analogen Schaltung hab ich mit nem Spannungsverdoppler gearbeitet damit
die MOSFETs sauber durchsteuern. Aber was nehm ich beim µC als Treiber ?
Oder benötige ich überhaupt einen Treiber ? Gibt es MOSFETs die schon
bei kleineren Spannungen durchschalten ? Also wird auf Teufel komm raus
nach einem brauchbaren MOSFET gesucht. Ich habe dabei bestimmt an die
30-40 Datenblätter von Reichelt und anderen Seiten aus dem Internet
geladen und die Steuerkennlinien verglichen. Heraus kamen folgende Typen ...
IRLU 2905 + IRLU 3410
Die waren klein, hatten einen relativ kleinen Innenwiderstand und haben
bereits bei kleinen Spannungen durchgesteuert. Meine Rettung. Also konnte
ich mir die Treibersstufen und die Spannungsverdopplung sparen.
Als Programmiergerät habe ich (der Einfachheit halber) eins für Parallelport
gebaut. Ein 25pol SubD mit ein paar Widerständen und Kabel dran. Für die
Programmentwicklung kam im Endeffekt nur das AVR-Studio in Frage. Die
Programmiertätigkeit für die Hardware mußte ich mit PonyProg erledigen, da
das AVR-Studio sich bei dem Parallelport-Progger weigerte. aber halb so
schlimm.
Den Einstieg hat mir damals die folgende Seite geebnet ...
SHuehn.de AVR-Programmierung (alte Seite)
(
SHuehn.de AVR-Programmierung die neue Seite)
Als Basis hab ich das Blink-Programm für den ATmega8 verwendet und es
nach und nach auf meine Bedürfnisse verändert und erweitert.
Was für eine Bibliothek brauch ich für den AT90S1200 und AT90S2313 ?
Wie ist das mit den Registern und Ports ? Die Befehle sehen auch eher nach
6502 aus und nicht nach Z80 die ich eher kenne. Also hab ich einige PDFs
von Atmel runtergeladen (Command-Summary, ...) und ausgedruckt. Die
lagen dann immer neben der Tastatur um mal schnell nachzuschlagen.
Aber ohne Hardware geht es auch nicht. Also mal schnell eine Platine
zusammengelötet und statt einem Quarz hab ich einen Keramik-Resonator
verwendet da Quarze empfindlich auf Erschütterungen reagieren (und zwar
mit dem Bruch des Quarzkristalls).
Bilder vom Aufbau auf dem Experimentierboard hab ich wohl leider nicht
gemacht. Darum gleich mit der entgültigen Hardware weiter ...
Hier sieht man die MOSFETs vor dem Prozessor. Die grüne Steckleiste vor
dem Prozessorsockel ist der ISP-Anschluß. Als Prozessor sitzt schon der
AT90S2313 im Sockel. Die ersten Versuche waren aber mit dem AT90S1200.
Der 1200er hatte aber keinen Befehl um Daten aus dem Flash zu lesen
(LPM). Außerdem hat er nur einen 3fach Hardware-Stack. Also wurden die
weiteren Arbeiten mit dem 2313 erledigt.
Der modulare Aufbau hat sich auf jeden Fall ausgezahlt. Ich mußte nur die
Steuerung von analog auf digital tauschen.
Auf diesem Bild sind die beiden Keramik-Kondensatoren für den Resonator
und 3 PullDown-Widerstände zu sehen. Bei mir liegen die Taster nämlich
gegen Vcc. Also brauch ich als Gegenpol PullDowns nach GND.
Auf der Unterseite sieht man den 4MHz Keramik-Resonator und die vier
SMD-Widerstände für die Gates der MOSFETs. Auf der rechten oberen
Ecke der Platine ist eine der Reed-Kontakte für den Einschalter zu sehen.
Ganz oben im Bild ist der Stecker des Parallelport-Proggers zu erkennen.
Und noch einmal von der anderen Seite. Jetzt sind zwei Reed-Kontakte
zu sehen. Am Ende hab ich drei genommen um den Einschaltwinkel groß
genug und die Strombelastung auch in einen vernünftigen Bereich zu
bringen. Und was soll ich sagen ... der Strom ist so hoch, das man im
Dimmer-Betrieb die Reed-Kontakte zirpen hört
Nun aber zum Programm ...
Eigentlich hab ich die Analogschaltung soweit auf digitaler Basis nachgebaut.
Im folgenden Text ist der interne Aufbau als Diagramm dargestellt.
Code:
; AT90S2313
; +-----------------+
; RESET --| 1 Reset VCC 20|-- +Vcc
; Taster Rot <---| 2 PD0 PB7 19|-- SCK
; Taster Gruen <---| 3 PD1 PB6 18|-- MISO
; Quarz--| 4 XTAL2 PB5 17|-- MOSI
; Quarz--| 5 XTAL1 PB4 16|---> Takt Spannungsverdoppler
; Taster Blau <---| 6 PD2 PB3 15|---> MOSFET Weiss
; Betriebs-LED <---| 7 PD3 PB2 14|---> MOSFET Blau
; | 8 PD4 PB1 13|---> MOSFET Gruen
; | 9 PD5 PB0 12|---> MOSFET Rot
; GND --|10 GND PD6 11|
; +-----------------+
;
; r16 Eingangsregister Tasten
; r17 Entprellte Tasten
; r18 Ausgangsregister
;
; r1 Entprell-Register Rot
; r2 Entprell-Register Gruen
; r3 Entprell-Register Blau
;
; r4 Dimmer Rot
; r5 Dimmer Gruen
; r6 Dimmer Blau
; r7 Dimmer Weiss
;
; r21 Dimm-Maxwert Rot
; r22 Dimm-Maxwert Gruen
; r23 Dimm-Maxwert Blau
;
; r0 LPM-Datenregister
;
; r24 Rampenzaehler fuer PWM
;
; r28 Pausenzaehler Low (Bit7 = Spannungsverdoppler-Takt)
; r29 Pausenzaehler High
;
; r30 Pointer auf Farbmischtabelle - Low
; r31 Pointer auf Farbmischtabelle - High
;
; r19 Arbeitsregister 1
; r20 Arbeitsregister 2
;
; Der folgende Plan ist von der ersten Version ohne die Farbmischtabelle.
;
; bl gn rt
; PD2 PD1 PD0 Taster nach +Vss (gedrueckt = 1)
; | | |
; V V V
; r16 [2] [1] [0]
; | | |
; : : |
; V
; [T]
; |
; |
; V
; ->[C]-----------------------
; | |
; Rot r17 -[7][6][5][4][3][2][1][0]<--
;(Gruen r18) | | | | | | | |
; (Blau r19) 1 1 1 1 1 1 1 1 (255) -> 1
; 0 0 0 0 0 0 0 0 (0) -> 0
; |
; : : |
; | | V
; r20 [2] [1] [0]
; | | |
; | | |\__ 1|
; | |\__|___ 1|--> RGB gedrueckt = weiss
; |\__|___|___ 1| |
; | | | |
; | | | V
; | | | inc
; | | | dec
; r27 Verzoegerungszaehler Low | | | |
; r28 Verzoegerungszaehler High | | | |
; | | | V
; : : | r25 Weiss
; V
; [T] -> 1 => inc (wenn <> 255)
; '---> 0 => dec (wenn <> 0)
; |
; /|/|/| Rampenzaehler r21 |
; 0,1,..,254,255,0,1,.. | V
; ------ < ---------r22 Rot (r23 Gruen , r24 Blau)
; |
; : : : | >r21 = 1 , <r21 = 0 ==> PWM
; | | | V
; r26 [4] [3] [2] [1] [0]
; | | | | |
; V V V V V
;Takt Spannungsverdoppler<--PB4 PB3 PB2 PB1 PB0 zu den MOSFET-Treibern
; ws bl gn rt
; | | |----- Led --- +Vss
; ----------------|
; | |---
; |
; MOSFET |
; GND
Die 3 Bedientasten werden abgefragt und als einzelnes Bit jeweils in ein
Schieberegister geladen. Bei 8 Durchläufen der Hauptschleife wurde also
8 mal der Eingang in das Register eingeschoben. Wenn die Taste jedes mal
gedrückt war (High am Eingang) müßte dann 0xFF (oder 0b11111111) im
Register stehen. Wenn sie alle 8 mal nicht gedrückt war sollte sich im
Register 0x00 (0b00000000) befinden. Alle anderen Werte entstehen nur
bei Kontaktprellen. Die Tasten sind also entprellt.
Wenn die Taste gedrückt wird, dann erhöht sich der Wert eines Registers
jeweils um 1. Beim loslassen der Taste wird das Register um 1 verringert.
Dieser Wert wird mit dem Inhalt eines Rampenzählers verglichen. Ist der Wert
größer als der des Rampenzählers wird er entsprechende Ausgang auf
High (1) gelegt und damit der MOSFET eingeschaltet (und dadurch auch
die LED) ansonsten wird der Ausgang auf Low (0) gelegt. Das Verhältnis
von High zu Low bestimmt das Tastverhältnis des PWM-Signals und damit
die Helligkeit der LED (des Emitters).
In einer Farbmischtabelle, deren Werte durch das Muster der gedrückten
Tasten selektiert werden, wird der Maximalwert der jeweiligen Farb-Kanäle
festgelegt. Wenn man z.B. rot und blau drückt um ein violett zu erzeugen
werden die Maximalwerte des Rot- und Blau-Anteils aus der Tabelle geholt.
Die ganze Erklärung des Programms könnte sich hier noch lang hinziehen.
Am besten ist es aber wohl direkt im Quelltext zu verstehen ...
Anhang anzeigen Magierstab_v1.0.asm
wie bei mir üblich mit vielen Bemerkungen und Erklärungen