Ich hatte mal einen Tastdimmer mit DMX Ausgang gebastelt. War eher Quick
& Dirty, da es nur darum ging, den LED-Treiber zu testen. Lief mit dem
Code problemlos.
'DMX Tastdimmer für einen Kanal
'Christian Kreuzer 19.02.2012
$regfile = "m16def.dat"
$crystal = 8000000
Ddra = 255
Porta = 0
Ddrb = 0
Portb = 255
Ddrc = &B00000011
Portc = &B11111100
Ddrd = &B00000010
Portd = &B11111111
'PD1 Ausgang zum RS485 Transmitter
'PD2 Taster Eingang
Taster Alias Pind.2
Ausgang Alias Portd.1
Const Timerwert = 99 '20ms Takt
Dim Wert As Byte 'Speicher
des aktuellen Dimmwertes
Dim Tastdauer As Byte 'Zähler für
die Tastdauer
Dim Sendezaehler As Byte 'Zähler für
500ms Sendeintervall
Dim Dimmrichtung As Bit '0 dunkler;
1 heller
Dim I As Byte
Config Com1 = 250000 , Synchrone = 0 , Parity = Disabled , Stopbits = 2
, Databits = 8
Ucr.3 = 0 'Transmitter
aus
Ucr.4 = 0 'Receiver
aus
Config Timer2 = Timer , Prescale = 1024 '20ms Takt
Timer2 = Timerwert
On Timer2 20ms_takt_irq
Enable Timer2
Enable Interrupts
Do
If Taster = 1 Then 'Taster
losgelassen oder nicht gedückt
If Tastdauer > 3 And Tastdauer <= 25 Then 'kurzer
Tastendruck
If Wert = 0 Then
Wert = 255
Else
Wert = 0
End If
Gosub Senden
End If
If Tastdauer > 25 Then Toggle Dimmrichtung
'Dimmrichtung umkehren nach langen Tastendruck
If Wert = 0 Then Dimmrichtung = 1
'Dimmrichtungsumkehr am Endpunkt
If Wert = 255 Then Dimmrichtung = 0
Tastdauer = 0
End If
If Taster = 0 And Tastdauer > 25 Then 'langer
Tastendruck
If Dimmrichtung = 0 And Wert > 0 Then Wert = Wert - 1 'dunkler
dimmen
If Dimmrichtung = 1 And Wert < 255 Then Wert = Wert + 1
'heller dimmen
Sendezaehler = Sendezaehler + 3 'öfter
senden
End If
If Sendezaehler > 24 Then Gosub Senden '500ms
Sendetakt
Portc.1 = 0
Power Idle
Portc.1 = 1
Loop
Senden:
'Break
Ausgang = 0
Portc.0 = 1
For I = 0 To 60
nop
Next I
Portc.0 = 0
Ausgang = 1
For I = 0 To 20
nop
Next I
'Startbyte und Daten
Ucr.3 = 1
Printbin 0 ; Wert
Ucr.3 = 0
Ausgang = 1
Sendezaehler = 0
Porta = Wert
Return
20ms_takt_irq:
Timer0 = Timerwert
Sendezaehler = Sendezaehler + 1
If Taster = 0 And Tastdauer < 255 Then Tastdauer = Tastdauer + 1
'Taster gedrückt, Überlauf verhindern
Return
Christian_RX7