Code:
' Bedienung:
' System startet im Receivermodus
' Zeigt Kanal mit Wert an
'
' Drücken der Kanal-Taste
' Nochmal Kanal sucht nächsten Kanal mit Daten
' 0-9 Kanal eingeben und Enter
' + Taste erhöht den Kanal
' - Taste erniedriegt den Kanal
'
' Drücken der Data-Taste für 0-255
' Nochmal Data 0-100
' Nochmal Data Poti
' Nochmal das ganze und dann von vorne
' 0-9 Wert eingeben und Enter
' + Taste erhöht den Wert
' - Taste erniedriegt den Wert
'
' Durch Drücken von Enter wird Menü angezeigt
' ESC bricht ab
'
' Tastatur:
' 0-9
' Enter
' ESC
' +
' -
' Kanal
' Data
'
' Display 4x20
' 12345678901234567890 12345678901234567890
' 1 KANAL: xxx/XXX REC KANAL: XXX - XXX REC
' 2 WERT BINAER : XXX 255 X x _Xx X
' 3 PROZENT: XXX 0 XxX_xxXXX______X
' 4 Statuszeile
'
' 12345678901234567890 12345678901234567890
' 1 1 Receiver 1 Kanal 1 Ein Kanal
' 2 2 Receiver 16 Kanal 2 16 Kanal
' 3 Transmitter
' 4
'
' ************************************************************
' ****** Programm
' ************************************************************
$crystal = 8000000
$baud = 250000
Config Kbd = Portb , Debounce = 20 , Delay = 50
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Lcd = 20 * 4
Config Pind.7 = Output
Config Pind.6 = Output
Config Pind.5 = Output
Config Adc = Single , Prescaler = Auto
Config Timer2 = Timer , Prescale = 1024
Dim Recval As Byte ' Wert via Serielle
Dim Status As Byte ' Statusbyte
Dim Modus As Byte ' 0 = Receiver, 1 = Transmitter
Dim Aktmodus As Byte
Dim Dmx_data As Byte ' Wert des anzeigenden Kanal 0-255
Dim Proval As Integer ' und in Prozent 0-100
Dim Tempchannel As Integer ' Kanal der eingegeben wird
Dim Viewchannel As Integer ' Angezeigter Kanal
Dim Keyval As Byte ' gedrueckte Taste
Dim Oldkey As Byte ' gedrueckte Taste
Dim Univers As Byte ' Universumsnummer
Dim Max_dmx_data As Integer ' maximal gesendete Daten
Dim Dmx_count As Integer ' Zaehler beim Empfang
Dim X As Integer ' Hilfsvariable
Dim Temp As Integer ' Hilfsvariable
Dim View_val As Integer
Dim Waittime As Integer
Dim View_string As String * 6 ' String mit Wert
Dim Num_row As Byte
Dim Num_col As Byte
Dim Num_min As Integer
Dim Num_max As Integer
Dim Num_len As Byte
Dim Num_flags As Byte
Dim Num_wert As Integer
Dim Num_string As String * 6
Dim Num_temp As Integer
Num_start Alias Num_flags.0
Num_end Alias Num_flags.1
Num_error Alias Num_flags.7
Dec_key Alias 10 '
Inc_key Alias 11
Data_key Alias 14
Channel_key Alias 13
Esc_key Alias 12
Enter_key Alias 15
Receive Alias 1 ' Empfängermodus
Transmit Alias 2 ' Sendemodus
Menue Alias 255 ' Menümodus
Foundflag Alias Status.0 ' Wert gefunden
Searchflag Alias Status.1 ' Wert am suchen
Waitflag Alias Status.2 ' Warte auf Suchergebnis
View Alias Status.3
Yes Alias 1
No Alias 0
Rs485_dir Alias Portd.6 ' Richtung des RS485-Bausteins
Lcd_light Alias Portd.7
Buzzer Alias Portd.5 ' Beeper Alias
Dmx_led Alias Portd.4
Cls
Cursor Off Noblink
Set Lcd_light
Set Dmx_led
Lcd " DMX-TESTER V0.1"
Locate 2 , 1
Lcd " (C) JR2004"
Locate 3 , 1
Lcd "fossie@fakedomain.de"
' Copyrightmeldung
For Temp = 1 To 5
Toggle Lcd_light
Toggle Dmx_led
Waitms 500
Next X
Locate 4 , 1
Lcd " Press any key"
Sound Buzzer , 250 , 600
Do
Loop Until Getkbd() <> 16
Sound Buzzer , 100 , 100
Modus = Receive
View = Yes
Aktmodus = 0
Tempchannel = 0
Viewchannel = 1
Univers = 0
Max_dmx_data = 0
Set Ucr.chr9 ' 9 Bit als 2 Stopbits setzen
On Timer2 Timer_int
On Urxc Dmx_receive ' Interruptroutine zum Empfang
Enable Timer2 ' enable the timer interrupt
Enable Urxc
Enable Interrupts
' ###### Hauptschleife ######
Do
If Lcd_light = 1 Then ' Wenn licht dann und Zeit abgelaufen
If Waittime > 300 Then Reset Lcd_light ' licht aus
End If
If Modus <> Aktmodus Then ' Modus gewechselt
Cls ' LCD loeschen
If Modus = Receive Then ' Empfangsmodus
Reset Rs485_dir
Set Ucr.rxen ' Empfang aktivieren fuer Empfang
Lcd "KANAL:"
Locate 1 , 18
Lcd "REC"
Locate 2 , 1
Lcd "WERT: b %"
Elseif Modus = Transmit Then ' Sendemodus
'Transmitter
Set Rs485_dir
Reset Ucr.rxen
Elseif Modus = Menue Then ' Menümodus
Reset Rs485_dir
Reset Ucr.rxen
Lcd "1 Receiver 1 Kanal"
Locate 2 , 1
Lcd "2 Receiver 16 Kanal"
Locate 3 , 1
Lcd "3 Transmitter"
End If
Aktmodus = Modus
End If
If Modus = Receive Then ' Receiver
If View = Yes Then ' wenn anzeige erlaubt
Locate 1 , 7
View_val = Viewchannel
Gosub Using
Lcd View_string ; "/"
View_val = Max_dmx_data
Gosub Using
Lcd View_string
Locate 2 , 7
View_val = Dmx_data
Gosub Using
Lcd View_string
Locate 2 , 13
Proval = 100 * Dmx_data
Proval = Proval / 255
View_val = Proval
Gosub Using
Lcd View_string
Cursor Off
Locate 4 , 1
Lcd " "
End If
Keyval = Getkbd() ' Lese Tastatur aus
If Keyval <> Oldkey Then
Oldkey = Keyval
If Keyval <> 16 Then
Sound Buzzer , 60 , 100
Set Lcd_light
Waittime = 0
End If
Keyval = Lookup(keyval , Keypad) ' und schau in Tabelle nach
Select Case Keyval
Case 255 ' keine Taste gedrückt
' do nothing
Case Esc_key ' ESC bricht ab
Set View
Num_flags = 0
Reset Searchflag
Reset Waitflag
Reset Num_start
Case Dec_key ' Erniedrige Kanal
Decr Viewchannel
If Viewchannel < 1 Then Viewchannel = Max_dmx_data
Case Inc_key ' Erhoehe Kanal
Incr Viewchannel
If Viewchannel > Max_dmx_data Then Viewchannel = 1
Case Channel_key ' Kanaltaste gedrueckt
If Num_start = 0 Then ' zuerst mal Eingabe aktivieren
Locate 4 , 1 ' Suchmeldung ausgeben
Lcd "Kanalnummer eingeben"
Num_row = 1
Num_col = 7
Num_min = 1
Num_max = Max_dmx_data
Num_len = 3
Gosub Numinput
Else ' Suchlauf nach Daten
If Max_dmx_data > 0 Then ' wenn ueberhaupt was da
Tempchannel = Viewchannel ' dann mal merken wo wir waren
Incr Viewchannel ' den naechsten Kanal suchen
If Viewchannel > Max_dmx_data Then Viewchannel = 1
Cursor Off ' Cursor aus
Locate 4 , 1 ' Suchmeldung ausgeben
Lcd "Searching... "
Set Waitflag ' und Flags setzen
Set Searchflag
Reset Num_start
Else
'Beep Fail
Sound Buzzer , 250 , 350
End If
End If
Case Enter_key
If Num_start = 1 Then ' Enter gedrückt
Gosub Numinput
If Num_end = 1 Then
If Num_error = 0 Then
Viewchannel = Num_wert
Else
'Beep_fail
Sound Buzzer , 150 , 350
End If
Num_flags = 0
End If
End If
Case Else ' Zahlentaste gedrueckt
If Num_start = 1 Then Gosub Numinput
End Select
End If
' Hier Ablauf bei Kanalsuchlauf
If Waitflag = 1 Then ' Wenn wir auf ein Ergebnis warten
If Searchflag = 0 Then ' und das Suchen ein Ende hat
If Foundflag = 1 Then ' und was gefunden wurde
' Beep_ok ' dann melden
Sound Buzzer , 100 , 400
Waitms 100
Sound Buzzer , 100 , 400
Else ' ansonsten
' Beep_fail ' jammern
Sound Buzzer , 150 , 350
Viewchannel = Tempchannel ' und zurueck woher wir kamen
End If
Reset Waitflag ' und das Warten beenden
Set View
End If
End If
Elseif Modus = Transmit Then ' Transmitter
Elseif Modus = Menue Then
End If
Loop
'#########################################################################
'### Unterroutinen
'#########################################################################
' Formatierte Zahlenausgabe
Using:
View_string = " " + Str(view_val)
View_string = Right(view_string , 3)
Return
' Zahleneingabe
Numinput:
If Num_start = 0 Then
Set Num_start
Reset View
Num_string = ""
Locate Num_row , Num_col
Lcd String(num_len , 32)
Locate Num_row , Num_col
Cursor On Blink
Else
If Keyval = Enter_key Then
Num_wert = Val(num_string)
If Num_wert < Num_min Then Set Num_error
If Num_wert > Num_max Then Set Num_error
Set Num_end
Set View
Else
If Len(num_string) < Num_len Then
Num_string = Num_string + Str(keyval)
Locate Num_row , Num_col
Lcd Num_string
Else
Sound Buzzer , 150 , 350
End If
End If
End If
Return
'#########################################################################
'### Interruptroutinen
'#########################################################################
' ### Interrupthandling für seriellen Empfang ###
Dmx_receive:
Recval = Udr
If Usr.or = 1 Then ' Overrun Error
Reset Dmx_led
Dmx_count = -2
Elseif Usr.fe = 1 Then ' Break detected durch Framing Error
If Ucr.rxb8 = 0 Then ' und 9.Bit = 0
Max_dmx_data = Dmx_count
Reset Dmx_led
Dmx_count = -1
End If
Elseif Dmx_count = -1 Then ' Wenns los geht
If Recval = Univers Then ' Und der Startcode = Univers also 0
Set Dmx_led ' dann melden
Dmx_count = 0 ' und Zaehler auf null
Else
Reset Dmx_led ' Falsches Universum, LED aus
Dmx_count = -2 ' und alles von vorne
End If
Elseif Dmx_count >= 0 Then ' Empfange Daten
Incr Dmx_count ' erhoehe Kanalzaehler
If Viewchannel = Dmx_count Then ' wenns der erwartete ist
Dmx_data = Recval ' an Variable uebergeben
If Searchflag = 1 Then ' wenn wir am Suchen sind
If Recval > 0 Then ' und der wert > 0 ist
Set Foundflag ' dann melden: gefunden
Reset Searchflag ' und Suche beenden
Else ' wenns dann doch null
Incr Viewchannel ' Kanal erhoehen
If Viewchannel > Max_dmx_data Then Viewchannel = 1 ' aber bis max. MaxDMXData
If Viewchannel = Tempchannel Then ' Wenn wir wieder am Anfang sind
Reset Foundflag ' dann nix gefunden
Reset Searchflag ' und Suche beenden
End If
End If
End If
End If
End If
Return
' ### Interrupt für warteschleife
Timer_int:
Incr Waittime
Return
End 'end program
' Keypad Daten
Keypad:
Data 1 , 4 , 7 , 10
Data 2 , 5 , 8 , 0
Data 3 , 6 , 9 , 11
Data 12 , 13 , 14 , 15
Data 255
mfg.
Lesezeichen