ach, auf Basis von meinem dort geposteten Code?
Poste mal Deinen Sender Code, dann kann man evtl. helfen.
Druckbare Version
ach, auf Basis von meinem dort geposteten Code?
Poste mal Deinen Sender Code, dann kann man evtl. helfen.
Hallo Vitis,
der Sender läuft wieder einwandfrei, der Knackpunkt war, daß ich die Senderoutine nicht in einem Interrupt untergebracht hatte. Dadurch haben meine neuen Gimmecks im Sender (I2C-Display, Inkrementalgeber usw.) mit ihren Interrupts das Protokoll zerschossen.
Anbei die eigentliche Senderoutine. Sie ist für einen 8 MHz-Quarz ausgelegt...
GünterCode:Ontimer0:
Timer0 = 70
Dmxout = 1
Trigger = 0
$asm
.def Tmp1 = R17 'Marker
.def Tmp2 = R18
ldi Tmp1, $5
Make_loop1:
dec Tmp1
brne Make_loop1
nop
nop
$end Asm
For Kanal = 0 To 512 '8 'Anzahl der Kanäle
Temp = Puffer(kanal) '20
$asm
.def Temp1 = R17
.def Temp2 = R18
.def Txbyte = R19
Putchar:
LDS Txbyte, {Temp} '2
LDI Temp1 , 9 '1
COM Txbyte '1
SEC '1
Putchar0:
BRCC Putchar1 '1 oder 2
nop '1
CBI Portd,Pd7 '2
RJMP putchar2 '2
Putchar1:
SBI Portd,Pd7 '2
NOP '1
nop '1
Putchar2:
LDI Temp2 , $7 '1
Sd_loop0:
DEC Temp2 '1
BRNE Sd_loop0
nop
LSR Txbyte '1
DEC Temp1 '1
BRNE putchar0 '1 oder 2
$end Asm
nop
nop
nop
Dmxout = 1 '2 genauso schnell wie SBI PORTD,PD7 in Assembler
$asm
.def Tmp1 = R17
.def Tmp2 = R18
ldi Tmp1, $1 '1
Make_loop0: '2 Stoppbits
dec Tmp1 '1
brne Make_loop0 '1 oder 2
$end Asm
Next Kanal
Trigger = 1 '10
$asm
.def Tmp1 = R17
.def Tmp2 = R18
ldi Tmp1, $7
Make_loop3: 'zusätzlich für Kanal 512
dec Tmp1
brne Make_loop3
$end Asm
Dmxout = 0
Waitus 88
Dmxout = 1
Return
Hi folks,
falls ihr noch Interesse an einer Variante habt, schaut mal hier im Forum unter https://www.roboternetz.de/phpBB2/ze...ight=dmxtester. Da hab ich mal meinen Code für einen DMX-Tester gepostet. Vielleicht bringt der ja noch ein paar Anregungen.
Hallo NG,
fertig!
http://www.gerold-online.de/cms/index.php?id=157
Günter
ich finde DMX eine sehr interessante Methode um gerade auch im Hausbereich eine angenehme Lichtstimmung zu schaffen, vor Allem die sound to Light Möglichkeiten.
Zu diesem Zweck habe ich mir den hier vorgestellen Code angeschaut und gleich ein paar Fragen dazu:
1.)
Tccr2 = &B00000010
Was passiert hier? Wird der Timerprescale auf 2 gestellt also 8000000/2 ?
Timsk.toie2 = 1
Wird damit der Timer2 als Timer aktiviert?
2.)
Ontimer2:
Tick = Tick + 1
Timer2 = 50
If Tick >= Range Then Tick = 0
If Tick < Buffer(adresse) Then
Kanal1 = 1
Else
Kanal1 = 0
End If
Return
Soweit ich heraus gefunden habe dient diese Interrupt Routine zur Kontrolle, ob sich in der eingestellten DMX Adresse (255) auch gesendete Daten befinden, oder???
Vielen Dank im Voraus =D>
Grüße
hdtvfreak
Hallo hdtvfreak,
mit den beiden Codeteilen wird eine PWM für Kanal1 erzeugt.
Das kann auch weggelassen werden und durch was eigenes ersetzt werden...
Günter
Ok, du erzeugst quasi mit dem Timer ein PWM Signal. Sollte dann vom Prinzip her in etwa äquivalent zu folgendem sein: (Bascom Syntax)Zitat:
Zitat von guenter1604
Config Timer1 = Pwm , Pwm = 8 , Compare C Pwm = Clear Down , Prescale = 64
Habe ich das richtig verstanden?
Jaein,
wenn man die PWM "händisch" erzeugt kann man viele Kanäle unterschiedlich dimmbar machen. Da der ATMega aber nur 3 Timer hat, gehen so maximal 3 Kanäle...
In dem Code erzeugt der Timer nur Interrupts. Diese werden mit Tick gezählt. Solange der Wert von Tick kleiner ist wie der gewünschte Wert des DMX-Kanals buffer(adresse) liegt Kanal1 auf high.
Ist Tick größer als buffer(adresse), liegt Kanal1 auf low. Wird Range erreicht, startet Tick von vorne.
Sollten mehrere Kanäle gedimmt werden:
If Tick < Buffer(adresse1) Then
Kanal1 = 1
Else
Kanal1 = 0
End If
If Tick < Buffer(adresse2) Then
Kanal2 = 1
Else
Kanal2 = 0
End If
usw.
Günter
Ok ich glaube ich hab es soweit verstanden.
Wenn ich jetzt beispielsweise im Buffer(adresse) der Wert 50 stehen, so ist das "An/Aus" Verhältnis 50% zu 50 %, da Range ja auf 100 eingestellt wurde.
Also insgesamt eine Art Software PWM?
Grüße
hdtvfreak
Ja,
nur würd ich Range auf 255 stellen, da ein DMX-Kanal ja werte von 0 bis 255 haben kann. Somit wären 127 etwa 50%
Günter