Hallo,
ik ben al een tijdje bezig met een DMX reciever te programmeren echt lukt het me niet om het signaal goed uit te pluizen, ik blijf namelijk hangen bij de startBYTE (adres 0)
ik gebruik de ingebouwde UART van de atmega88 en heb een externe 20mhz keramische resonator.
hoe kan ik er voor zorgen dat hij de startbyte niet leest maar adres 1
hieronder het programma waar ik mee bezig ben:
$regfile = "m88def.dat"
$crystal = 20000000
$baud = 250000
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Lcdbus = 4
Config Lcd = 16 * 2
Config Pinc.4 = Output
Config Pinc.5 = Output
Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Timer2 = Timer , Prescale = 1024 'Timer voor de uart
Dim Recval As Byte ' DMX data
Dim Status As Byte ' Statusbyte
Dim Modus As Byte ' 0 = Ontvanger, 1 = Zender
Dim Aktmodus As Byte ' Actieve mode
Dim Dmx_data As Byte ' DMX Data van het gekozen kanaal 0-255
Dim Proval As Integer ' DMX Data in procent 0-100
Dim Tempchannel As Integer ' Het ingegeven Kanaal
Dim Viewchannel As Integer ' Het weergeven Kanaal
Dim Univers As Byte ' Universumsnummer
Dim Max_dmx_data As Integer ' Maximaal uitgestuurde kanalen
Dim Dmx_count As Integer ' Start counter DMX
Dim X As Integer ' Help variable
Dim Temp As Integer ' Help variable
Dim View_val As Integer ' Weergave variable
Dim Waittime As Integer ' Wachttijd
Dim View_string As String * 6 ' String met waarden
Receive Alias 1 ' Ontvanger modus
Menu Alias 255 ' Menu modus
Foundflag Alias Status.0 ' Gevonden waarde
Searchflag Alias Status.1 ' Gezochte waarde
Waitflag Alias Status.2
View Alias Status.3
Yes Alias 1
No Alias 0
Pressed Alias 1
Dmx_error_led Alias Portc.4
Dmx_led Alias Portc.5
Menuknop Alias Portd.2
Plusknop Alias Portd.3
Minknop Alias Portd.4
Cls
Cursor Off Noblink
Modus = Receive
View = Yes
Aktmodus = 0
Tempchannel = 0
Viewchannel = 5
Univers = 0
Max_dmx_data = 0
Set Ucr.2 ' 9de Bit als 1e Stopbit
Restart:
On Timer2 Timer_int
On Urxc Dmx_receive ' Interruptroutine voor de ontvanger
Enable Timer2 ' Interrupt voor de timer starten
Enable Urxc
Enable Interrupts
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - '
' '
' Hoofdprogramma '
' '
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - '
Do
If Modus <> Aktmodus Then ' Modus gechaned
Cls ' LCD leegmaken
If Modus = Receive Then ' Receiver mode
Set Ucr.4 ' Switch to Receiving
Lcd "Adr:"
Locate 2 , 1
Lcd "Val: P: %"
End If
Aktmodus = Modus
End If
If View = Yes Then ' LCD inschakelen
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
End If
Loop
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - '
' '
' Subroutinen '
' '
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - '
' Displaynummer goed zetten
Using:
View_string = " " + Str(view_val)
View_string = Right(view_string , 3)
Return
Menu:
Cls
Locate 1 , 1 : Lcd "Safety adr: " ; Viewchannel
Do
Loop Until Menuknop = Pressed
Cursor On Blink
Return
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - '
' '
' Interruptroutinen '
' '
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - '
Dmx_receive: 'Seriele data ontvangen
Recval = Udr
If Usr.3 = 1 Then ' Overrun Fout
Dmx_count = -2
Elseif Usr.4 = 1 Then ' 88us Break gedetecteerd door een Framing error
If Ucr.1 = 0 Then ' en 9e Bit = 0
Max_dmx_data = Dmx_count - 1
Dmx_count = 0
End If
Elseif Dmx_count = -1 Then
If Recval = Univers Then ' Startcode = Univers (0)
Dmx_count = 0 ' Teller op 0
Else
Toggle Dmx_error_led ' Fout gedeelte van bittrein error led aan
Dmx_count = -2 ' Overnieuw proberen
End If
Elseif Dmx_count >= 0 Then ' Data ontvangen
Toggle Dmx_led
Incr Dmx_count ' Adres teller
If Viewchannel = Dmx_count Then ' Adres gevonden dan
Dmx_data = Recval ' Data opslaan
If Searchflag = 1 Then ' when we are Searching
If Recval > 0 Then ' en waarde = > 0
Set Foundflag ' dan gevonden melden
Reset Searchflag ' en stop zoeken
Else ' als en nog niets binnen is
Incr Viewchannel ' een adres verder
If Viewchannel > Max_dmx_data Then Viewchannel = 1 ' totdat maximale adres is gebruikt
If Viewchannel = Tempchannel Then ' begin dan opnieuw
Reset Foundflag ' melding niets gevonden
Reset Searchflag ' en stop zoeken
End If
End If
End If
End If
End If
Return
Timer_int: 'interrupt voor wachtroutine
Incr Waittime
Return
End 'einde programma
zou iemand kunnen helpen ?
mvg Stef