Hallo Gemeinde,
ich bin neu hier und noch nicht ganz so fit in AVR ASM (ich kann noch
nicht Digital denken :-))
Ich habe den LED DMX Transceiver von hoelscher-hi.de nachgebaut.
Besten Dank an Herrn Hoelscher für die Super Webside und den QuellCodes.
Ich möchte den 10.DMX Kanal zu einen Gesamtdimmer (für alle 8 Kanäle)
umprogrammieren und den 9 Output weglassen.
Weglassen kein Problem...bloß wie wird programmiert das die 8 Kanäle
nicht über den eingestellten Wert des Gesamtdimmers gehen?
Könnt ihr mir bitte einen Tip geben wie man sowas umsetzt oder wo ich
den Wert des Gesamtdimmers r22 einbauen muss.
hier paar Codeschnipsel:
Timer0 Overflow Interrupt :
lds tempL, PWM_FIELD
cp tempL, PwmCnt
ror status
rjmp pwm_exit
pwm_exit:
out portA,status ;output
mov tempL, PwmCnt ;set next compare time
lsr tempL
lsr tempL
lsr tempL
ldi status, 250
sub status, tempL
out TCNT0, status
inc PwmCnt
tst PwmCnt
brne pwm_no_reload
lds tempL,(DMX_FIELD+1) ;refresh channels
sts PWM_FIELD, tempL
lds r22,(DMX_FIELD+9)
Besten Dank für eure Hilfe.
Gruß Peter
Kommt erstmal drauf an, was du willst:
* Die ersten 8 Dimmer sind einzeln regelbar, aber wenn der Wert von
Kanal 10 (warum nicht Kanal 9, damit verschwendest du keinen Kanal ?)
überschritten wird, werden die Werte der 8 Dimmer gecappt.
*Die Werte der 8 Dimmer werden mit Dimmer 10 multipliziert, damit wirkt
Kanal 10 wie ein Summenregler, das Verhältnis der 8 Dimmer untereinander
bleibt aber gleich.
Lösung 1 ist per Subtraktion machbar:
Ein gesundes und erfolreiches neues Jahr wünsche ich allen hier im
Forum.
Besten Dank Matthias für die rasche Antwort.
Die DMX Kanal zuordnung ist mir erstmal Wurst es geht erstmal nur darum
zu Verstehen wie es funzt.
Das ganze soll ne Ansteuerung für einen RGB LED Fluter werden wo ich
über 3 DMX Kanäle die Farbe einstelle und der 4. DMX Kanal ist dann die
Helligkeit der eingestellten Farbe. Analog den Eurolite LED Rampen
Habe dein Vorschalg auch gleich mal ausprobiert.
pwm1: lds tempL, PWM_FIELD
sub Dim_ges, tempL
brcc pwm2
mov tempL, Dim_ges
pwm2: cp tempL, PwmCnt
ror status
lds tempL, (PWM_FIELD+1)
cp tempL, PwmCnt
ror status
lds tempL, (DMX_FIELD+1) ;refresh channels
sts PWM_FIELD, tempL
lds Dim_ges, (DMX_FIELD+9)
sts (PWM_FIELD+8), Dim_ges
Aber die Variante ist so toll.
Mit der zweiten komme ich noch nicht klar.
Im Tutorial steht:
mul r16, r17 ; multipliziert r16 mit r17. Beide Registerinhalte
; werden als vorzeichenlose Zahlen aufgefasst.
; Das Ergebnis der Multiplikation ist in den Registern
; ro und r1 zu finden.
also werte ich nur r1 aus für meien Vergleichswert nor?
lds tempL, PWM_FIELD
mul Dim_ges, tempL
cp r1, PwmCnt
ror status
habe ich das so richtig verstanden?
Ich habe auch vom Steffen H. ein Projekt gefunden was danke ich meinen
Vorstellungen erfüllt. Aber hat die Farben fest vorgegeben.
Beitrag "[ASM] DMX512 oder SPI zu RGB Led Controller use HSV Farbraum"
aber bin dabei gescheidert es zu meinen ATMega 8515 umzuschreiben weil
ich nicht weiß was GPIOR0 für ein Register beim ATTINY ist.
Gruß Peter
Peter Schulz schrieb:> Das ganze soll ne Ansteuerung für einen RGB LED Fluter werden wo ich> über 3 DMX Kanäle die Farbe einstelle und der 4. DMX Kanal ist dann die> Helligkeit der eingestellten Farbe.
Du willst also die Multiplizier Variante, damit das Verhältnis von R, G
und B konstant bleibt.
Peter Schulz schrieb:> also werte ich nur r1 aus für meien Vergleichswert nor?>>> lds tempL, PWM_FIELD> mul Dim_ges, tempL> cp r1, PwmCnt> ror status
Ok, der 8515 unterstützt MUL, da musste ich erstmal nachschauen. Du
brauchst hier gar nicht mehr zu vergleichen, denn du willst ja nicht
cappen, sondern lediglich R,G und B mit dem Master multiplizieren. Also
> lds tempL, PWM_FIELD ;> mul Dim_ges, tempL
ist ok. Dann kommt nur noch:
mov PWM_FIELD,r1
Allerdings setzt das voraus, das PWM_FIELD der jeweilige Kanal ist. Um
gleich mehrere Kanäle in einem Rutsch zu berechnen, kannst du schreiben:
Wenn du die Operation direkt nach einem erfolgreichen DMX Paketempfang
machst, sollte das so klappen, ohne das der PWM Timer davon beeinflusst
wird. Y sollte natürlich nicht durch anderen Kram belegt sein. Das
gleiche geht auch mit X, falls der frei sein sollte. Falls nicht, machst
du vor der Operation noch:
push YL
push YH
und danach
pop YH
pop YL
Kartoffelbauer schrieb:> GPIO = General Purpose Input/Output> was bleibt dann übrig ?> R0 !>> Frohes neues
Ganz so simpel ist das nicht. GPIOR0 ist ein neues Register für
schnellen Zugriff, das es auf älteren AVRs noch nicht gibt. Du kannst
stattdessen eines der üblichen Register ab r16 und höher nehmen.
Servus Leute,
ich hab noch ein Problem.
Ich will den "manuel Chaser Mode" auf 12 Kanäle erweitern.
Original ist er auf 9CH. Wie bekomme ich noch 3CH hinzu?
Was ich rausbekommen habe ist, dass im manuel Chaser Mode immer Werte
ins DMX_Field geschrieben werden und diese dann durch eine PWM Ausgabe
ausgegeben werden --> also so als steuert man das Teil mit DMX bloß das
dies intern abläuft.
Die LEDs die leuchten sollen wird in PAT 0 - 7 angeben und die werden
vermutlich ins Z-Register eingelesen und das X-Register ist dann der
Zeiger aufs DMX_Field so habe ichs es verstanden.
Bloß wo muss man angeben, dass DMX_Field 10-12 (das hab ich noch
hinzugefügt) auch mit Daten gefüttert wird?
Kann mir jemand helfen?
Interressant wäre auch noch, wie er weiß zu welchen "PAT" er gehen muss.
Eingestellt wird es mit den DIP Schaltern (kein DIP Schalter auf on -->
PAT0; DIP Schalter 1,2,3 auf on --> PAT 7)
Gruß Peter
Peter Schulz schrieb:> Interressant wäre auch noch, wie er weiß zu welchen "PAT" er gehen muss.> Eingestellt wird es mit den DIP Schaltern (kein DIP Schalter auf on -->> PAT0; DIP Schalter 1,2,3 auf on --> PAT 7)
Das passiert in den letzten paar Zeilen:
Peter Schulz schrieb:> Ich habe auch vom Steffen H. ein Projekt gefunden was danke ich meinen> Vorstellungen erfüllt. Aber hat die Farben fest vorgegeben.
Die Farben sind nicht fest vorgegeben. Man erreicht in der
3-Kanal-Variante alle Farben. In der 2-Kanal-Variante sind es noch ca
240 + weiß. Allerdings kann man da die Helligkeit sehr einfach regeln.
Welchen 8515 nimmst du denn? Den AT90S8515 oder den ATMEGA8515 ? Dann
kann ich dir die Firmware umschreiben.
Peter Schulz schrieb:> ich hab noch ein Problem.> Ich will den "manuel Chaser Mode" auf 12 Kanäle erweitern.
Soll das heißen, du willst jetzt 12 DMX Kanäle für deine LED-PWM haben?
Also 4 RGB-LED damit steuern? Plus einen Master-Kanal über die 4
RGB-Kanäle?
Gruß Steffen H.
Peter Schulz schrieb:> aber bin dabei gescheidert es zu meinen ATMega 8515 umzuschreiben weil> ich nicht weiß was GPIOR0 für ein Register beim ATTINY ist.
Zum Testen ganz einfach:
Benenne einfach das GPIOR0 in EEDR um. Das geht bei dem AT90S8515 und
beim ATmega8515.
@ Matthias
Besten Dank für die Erklärung.
Wenn ich aus der 10 z.b. eine 11 mache liest er dann ja 11 BITS ein
oder?
Da sollten ja mehr Kanäle ansprechbar sein?
Warum es immer 1BIT mehr ist als Kanäle versteh ich sowieso nicht.
dann muss ich bestimmt noch den Behl:
st X, tempH
abändern in
st X+, tempH
damit er weitere DMX_Fields schreibt oder vestehe ich das so richtig?
@ Steffen H.
Steffen H. schrieb:> Welchen 8515 nimmst du denn? Den AT90S8515 oder den ATMEGA8515 ? Dann> kann ich dir die Firmware umschreiben.
Es ist ein ATMega 8515.
Steffen H. schrieb:> Soll das heißen, du willst jetzt 12 DMX Kanäle für deine LED-PWM haben?> Also 4 RGB-LED damit steuern? Plus einen Master-Kanal über die 4> RGB-Kanäle?
Jo richtig. Klingst aber so als wäre es schwer umsetzbar?
Das ganze soll eine Ansteuerung für einen RGB Fluter werden mit 324 LEDs
und das so, dass 4 Zeilen (je 36 Rot Grün Blaue LEDs) angesteuert werden
--> deswegen die 12 Kanäle 4 Zeilen je RGB.
10 LEDs steuer ich schon an über DMX, in meinen Testaufbau einzeln und
über alle 10 --> Dank Matthias einen Gesamtdimmer.
Weil Herr Hoelscher dort noch einen Coolen Stand Alone Modus eingebaut
hat der ohne DMX-Ansteuerung alleine sein Ding macht fande ich dieses
Teil einfach genial.
Es fehlen mir halt nur noch 3 Kanäle für den Stand Alone Modus.
Steffen H. schrieb:> Zum Testen ganz einfach:> Benenne einfach das GPIOR0 in EEDR um. Das geht bei dem AT90S8515 und> beim ATmega8515.
Wenn so einfach ist brauchst die Firmware nicht umschreiben.
Das werde ich mal testen
Besten Dank
Peter Schulz schrieb:> Wenn so einfach ist brauchst die Firmware nicht umschreiben.
Ich hab es trotzdem mal gemacht, da es doch noch ein wenig anderes zu
ändern gab.
Peter Schulz schrieb:> Steffen H. schrieb:>> Soll das heißen, du willst jetzt 12 DMX Kanäle für deine LED-PWM haben?>> Also 4 RGB-LED damit steuern? Plus einen Master-Kanal über die 4>> RGB-Kanäle?>> Jo richtig. Klingst aber so als wäre es schwer umsetzbar?
Ist es auch, denn bei LED's sollte die PWM Frequenz schon hoch sein,
damit man kein flackern sieht. Bei Glühlampen reichen da 50-100Hz.
Leider ist ein AVR mit der HSV->RGB Umrechnung schon ganz schön
ausgelastet. Man müsste es mal ausprobieren, aber ich denke für 4-RGB
Kanäle schafft er das nicht mehr. Außerdem kommt da ja noch die 12bit
Software-PWM für 12-Kanäle mit zu. Man könnte allerdings je RGB Kanal
einen tiny2313 nehmen. Das sollte sogar günstiger sein, als ein
mega8514.
Die Methode von Matthias es über eine PDM zu machen finde ich nicht
schlecht. Allerdings sind die Helligkeitswerte der LED auch nicht
unserem Auge damit angepasst. Bei 50% leuchtet die LED scheinbar schon
mit 70-80% ihrer Helligkeit.
Gruß Steffen
Sorry Steffen aber irgentwie wills ni.
Habe einen neuen ATmega8515 genommen und die Fuses auf externen OC
gestellt
(CKSEL=1111 SUT=11)
und noch Port Zuweisung angepasst
------ LED PORT ZUWEISUNG ----------------------
.equ RGB_LED_PORT = PORTA
.equ RED = 2 ; LED_ROT
.equ GREEN = 1 ; LED_GRUEN
.equ BLUE = 0 ; LED_BLAU
;------------------------------------------------
.equ DMX_SIG_LED_PORT = PORTD
.equ DMX_SIGNAL_LED = 7
;------------------------------------------------
.equ FKT_PORT = PORTE
.equ FUNKTION = 1
;------------------------------------------------
Im Debuger des AVR Studios hängt des Programm sehr lange in dieser
Funktion:
loop_clr_ram:
st x+,NULL
dec r16
brne loop_clr_ram
Ist das normal?
Peter S. schrieb:> Sorry Steffen aber irgentwie wills ni.
Ah, okay. Da war der Stackpointer noch nicht richtig initialisiert.
Außerdem waren die Interrupt-Vektoren noch vom tiny2313.
Hab alles berichtigt. Kann es allerdings leider nicht testen. Sollte
jetzt aber funktionieren.
Steffen
Peter S. schrieb:> Wenn ich aus der 10 z.b. eine 11 mache liest er dann ja 11 BITS ein> oder?> Da sollten ja mehr Kanäle ansprechbar sein?> Warum es immer 1BIT mehr ist als Kanäle versteh ich sowieso nicht.
Nein, das sind keine Bits, sondern die Länge des Pattern. Jedes Pattern
ist 10 bytes lang, und um aus der Stellung der Dipschalter die
Startadresse des Pattern zu bekommen, muss man mit der Länge des Pattern
multiplizieren:
Anfangsadresse = (Dipschalter*10) + Offset des Pattern im Flash. Der
Offset ist die Adresse, an der die Patterntabellen anfangen.
In Pseudoassembler sieht das so aus:
Lade Z mit dem Offset der Pattern im Flash
Lese DIP Switch und mach daraus eine Zahl zwischen 0 und 7, dann
multipliziere mit der Länge eines Patterns (ist dann 0 bis 70)
Addiere das Ergebnis zu Z
Z enthält jetzt die Anfangsadresse des gewünschten Pattern. Das gezeigte
Verfahren wird z.B. auch oft benutzt, um auf Fonttabellen im Flash
zuzugreifen. Jeder Buchstaben belegt z.B. 8 Bytes. Dann wird der
Asciiwert des gewünschten Buchstaben mit 8 mal genommen und ist dann der
Zeiger auf das Buchstabenmuster.
Danke Steffen
Aber es geht trotzdem noch ni. Es reagiert nicht auf DMX Daten und die
LEDs flackern nur komisch rum.
Hoffe ich mache dir nicht all zu viel Arbeit?
Um es einfacher zu machen bestell ich mir einen Tiny der kostet 1,30€
und spiel deine alte Firmware ein.
@ Matthias
Ah jetzt verstehe ich. Jetzt könnte ich ja 15 Pattern programmieren,
weil DIPSchalter 4 noch frei ist --> cool.
Muss ich halt bloß die Adressen erweitern und wenn mehr Daten rein
sollen die nächste Adresse nicht bei 10 (+0xA) sondern z.B. bei 15
(+0xF) beginnen lassen und dabei den Multiplukator auf 15 setzten.
Ich glaube ich habs verstanden.
Bloß wo werden die 10 BITS bei Adresse PAT0 eingelesen? Passiert das
hier:
1
ldi ZH, high(PAT0*2) ;get next step
2
lds tempH, StepCnt
3
mov ZL, tempH
4
lsl ZL
5
inc tempH
6
sts StepCnt, tempH
7
lpm tempH, Z+
8
sts NewStepL, tempH
9
lpm tempH, Z
10
sts NewStepH, tempH
Und die Daten des jeweiligen .dw (Doppelwort?) stehen dann 0-7 NewStepL
und 8-10 NewStepH richtig?
Peter S. schrieb:> Und die Daten des jeweiligen .dw (Doppelwort?) stehen dann 0-7 NewStepL> und 8-10 NewStepH richtig?
Jo, das sieht danach aus. Immer wenn ein 'lpm xxx,Z' Befehl im Spiel
ist, werden Daten aus dem Flash von Speicheradresse (Z) gelesen.
Da Daten im Flash immer 16-bitweise adressiert werden, ist da auch immer
noch ein 'Adresse mal 2' dabei. Also z.B.
ldi ZL,low(Speicher << 1) ; das schieben um 1 bit nach links
ldi ZH,high(Speicher << 1) ; ist eine Multiplikation mit 2
low() und high() sind praktische Makros für das high- und lowbyte einer
16 bit Adresse.