DIY-RGB-Controller mit IR-Fernbedienung und DMX - modular erweiterbar

  • das ist in dem Sinn Geschmackssache ;)


    die Warte-Routine wird nur da verwendet, wo die LEDs beim Speichern blinken, und die Status-LED im "Sleep"-Modus immer wieder kurz aufblitzt, das war mir wohl zu langsam, habe das also da geändert...


    ich weiß, das ist unsauber programmiert, dass die Routine immer noch "wait_200ms" heisst, obwohl sie nun kürzer läuft, aber da war ich einfach zu faul, das überall umzubenennen... :P - das ist auch nirgends verwendet, wo es zeitkritisch ist, nur für dieses Blinken/Blitzen...


    Es gibt aber natürlich einen einfachen Workaround: Ein Register zum Zählen abstellen und nur jeden 2^8=256 Takt die Routine wirklich durchlaufen.


    ja, im Prinzip so - einfach in der bereits vorhandenen Timer0-ISR ein Byte runterzählen und dann ein Flag setzen für das durchlaufen der Taster-Routine, Byte neu laden mit nem Wert, so dass die Geschwindigkeit für Dich passt...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • so, hab nochmal einen controller mit 2313 gebaut...der sohnemann will auch einen "infinity" haben.
    was mir dabei einfiel, wenn noch platz im attiny ist...
    wäre es möglich eine von der umgebungshelligkeit abhängige dimmung z.b. auf programmplatz 7 zu legen?
    könnte man die helligkeitswerte direkt über den infrarotempfänger ermitteln, oder bräuchte man einen extra sensor?
    hintergrund ist der, wenn es am tage hell ist sollte auch die helligkeit der led´s erhöht sein.
    abends hingegen wenn es dunkelt, sollte es dunkler sein...weil dann krachen die led´s in voller helligkeit ganz schön rein.
    jaaaaaaaaa, ich weiss man kann das ja alles von hand regeln - aber für manche sachen wäre "vollautomatik" ne feine sache.


    nur mal als idee.
    das kann bislang kein chinacontroller :)


    vlg
    hermann

  • Der IR-Empfänger ist dazu da, die digital codierten FB-Kommandos zu empfangen und zu decodieren, ein Einlesen analoger Helligkeitswerte ist daher unmöglich.
    Auch besitzt der ATTiny 2313 / 4313 keinen A/D-Wandler, so dass es schwierig bis unmöglich wird, die von Dir gewünschte Helligkeitsregelung mit geringem Aufwand zu implementieren.
    Am Speicherplatz liegt's nicht, denn es gibt ja schließlich den 4313 mit 4k Programmspeicher.


    BTW, ab und zu mal die Shifttaste benutzen, schon wird Dein Text besser lesbar ... :thumbup:

  • Hallo (nochmal), :)


    ich bin gerade dabei die Software um einen unabhängigen PWM-Kanal zu erweitern. Dieser soll über eine eigene Helligkeit verfügen, also unabhängig vom Master-Dimmer sein.


    Was habe ich bisher gemacht:


    Settings.inc:
    Tasten für Helligkeit rauf & runter hinzugefügt


    Key_Command:
    Die gleiche Abfrage wie für den Master-Dimmer kopiert und umbenannt, damit das ganze für den zweiten Dimmer auch klappt. Das _Dimmer_out Label auch kopiert und umbenannt.


    Definitions.inc:
    Einen Port und Pin definiert für den PWM Ausgang definiert. (Die RGB Leds hängen an PortD und der neue PWM Port liegt auf PortB, nur zur Info).
    Am Ende (unter Lightning_Speed) folgendes eingefügt:

    Code
    1. Dimmer_indirekt: .byte 1 ; Dimmer indirkete Beleuchtung



    So jetzt zu meinen Problemen:


    Wie muss ich die Data.inc abändern? Reicht es aus für die Daten im EEPROM einfach den Wert für den neuen Dimmer unten in der Tabelle einzufügen, in etwa so?

    Code
    1. .db 31, 0 ; Dimmer-indirket ; Dummy


    Ich komme momentan auch nicht so wirklich dahinter, wie die Dimmerkorrektur funktioniert bzw. wie ich meinen "neuen" Dimmer da rein bekomme. Die Dimmerkorrektur ist ja eigentlich so gemacht, dass eben die Werte in der Tabelle gesetzt werden, wenn man die Helligkeit und "1" erhöht und die Helligkeit nicht immer nur +1 gerechnet wird.


    Ich habe bisher noch nicht entdeckt wie bzw. wo die Helligkeit verrechnet wird und wie ich dann das ganze in der SW_PWM.inc einarbeiten muss.



    Also insgesamt bin ich da noch nicht wirklich weit gekommen, aber evtl. kann mir hier ja jemand helfen!
    Danke euch.

  • Ja, genau, wenn weitere Parameter dazu kommen (also auch für andere Programme etc., dann sowohl bei den Definitions wie bei Data.inc eintragen - das wird einfach hin- und her kopiert, muss also die selbe Anzahl Bytes an den selben Positionen sein.


    Die Dimmerkorrektur ist eine Funktion, die schaut einfach in ner Tabelle nach, Du übergibst einen Wert von 0-31 (in temp1), rufst die Funktion auf, und dann kommt der tatsächliche Wert raus (wieder in temp1).


    Da wird aber noch nix gedimmt, das macht die Funktion _Dimmer, die verrechnet den Eingangs-Wert (die von den Programmen erzeugten Farben) mit der Dimm-Stufe.


    Wenn ich das richtig sehe, willst Du nur einen weiteren Kanal, den Du völlig unabhängig von den anderen Programmen rauf- und runter dimmen kannst...?


    da brauchst Du die eigentliche Dimmer-Funktion (das verrechnen der Werte) dann gar nicht, einfach so:


    - in der Key_Command den Wert aus Dimmer_indirekt holen (gleich in temp1), je nach Tastendruck rauf oder runter (Bereich von 0-31 eingrenzen), dann wieder zurück speichern in Dimmer_indirekt (damit der Wert auch bleibt)
    - aktueller Wert ist dann eh' schon in temp1, also rufst Du die Dimmerkorrektur auf, die macht Dir aus dem Wert 0-31 einen Wert 0-255 (wieder in temp1)
    - diesen speicherst Du in den PWM-Buffer, an die Position PWM_Buffer+3 (die 3 Byte davor sind ja für den RGB-Ausgang)
    - in der SW_PWM.inc fügst Du noch einen Block ein für den 4. Kanal - einfacher wäre es, wenn der auch an PortD hängt, wenn er unbedingt an B sein muss, dann schau' Dir mal an, wie das gemacht ist, genauso für Port B machen


    nicht vergessen:


    - Du musst den Pin in der Configuration.inc auch auf Ausgang schalten, diese Angaben in Definitons.inc sind nur "Merkhilfen" (also dass man dann z.B. "PWM_Port" schreiben kann statt "PortD" etc.), da wird nichts irgendwie tatsächlich gemacht
    - im PWM-Buffer ein weiteres Byte reservieren, also dann

    Code
    1. PWM_Buffer: .byte 4 ; RAM-Puffer für PWM-Ausgabedaten

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Hallo Pesi,


    danke für deine schnelle Antwort.
    Habe mich heute Abend mal dran gesetzt. Muss vllt. noch dazu sagen, dass ich mich zur Zeit noch in Assembler einarbeite, komme eher aus dem C Lager, aber bei mir hat dein Plan (vorerst) gefruchtet, mich mal mit Assembler zu befassen. ;)


    Mit der Configuration.inc war mir klar. Habe auf dem Controller z.B. noch andere Ausgänge die Halogen-Spots (ja Schande über mich) ein- und ausschalten per FB. Der zusätzliche PWM-Kanal soll nun eine Warmweiße indirkete Beleuchtung steuern.


    In der Data.inc habe ich noch eine weitere Variable gesetzt, wieso kommt gleich:

    Code
    1. .db 30, 0 ; Dimmer-indirket ; Dimmer-indirket_korr


    Das ganze wird dann erstmalig in der Configuration.inc korrigiert:


    Code
    1. ; ================================================================================================
    2. ; Konfiguration aus EEPROM holen & indirekten Dimmer erstmalig korrigieren
    3. ; ------------------------------------------------------------------------------------------------
    4. rcall _Load_Config
    5. lds temp1, Dimmer_indirekt ; Dimmer_indirekt holen
    6. rcall _Dimmerkorrektur ; und von 0-31 auf 0-255 mit Kurve umrechnen
    7. sts Dimmer_indirekt_korr, temp1 ; und speichern


    Das erschein mir notwendig, da ich die Dimmerkorrektur nur aufrufe wenn auch eine entsprechende Taste, für heller oder dunkler, gedrückt wurde.



    Code
    1. _dimmer_out_ind:
    2. sts Dimmer_indirekt,temp1 ; indirekten Dimmer speichern
    3. rcall _Dimmerkorrektur ; und von 0-31 auf 0-255 mit Kurve umrechnen
    4. sts Dimmer_indirekt_korr,temp1 ; korriegierten Wert speichern
    5. rjmp _key_command_ende ; und Ende


    In der Hauptdatei habe ich im Label "RGB_Output" nichts geändert, sondern das Label "RGB_Copy_Loop" geändert.



    Um es dann doch für den Anfang etwas einfacherer zu gestalten, habe ich RGB und den neuen PWM Kanal auf einen Port gelegt, d.hh. in der SW_PWM.inc einfach copy&paste einen Kanal hinzu gefügt und angepasst.


    Momentan kann ich allerdings noch nicht die Helligkeit ändern. Schalte ich den Strom an ist der PWM Kanal auf voller Helligkeit. Dimmen klappt leider nicht.


    Werde mich morgen mal erneut dran setzen und wollte einen kleinen Zwischenstand hier lassen. Vielleicht fällt dir ja irgendwas auf die Schnelle auf.

  • Hallo zusammen,


    hab es nun zum laufen gebracht. Anscheinend gab es ein Problem mit folgender Zeile:


    Code
    1. tst temp1 ; Minimalwert schon erreicht...?


    Das dimmen müsste funktioniert haben, da allerdings als Startwert bereits der Maximalwert eingestellt war und ich nicht runter dimmen konnte, hatte ich den Eindruck es würde nicht funktionieren. Mit geändertem Startwert klappte dann das hoch- nicht aber das runterdimmen.
    Also wurde obenstehendes durch folgendes ersetzt:


    Code
    1. cpi temp1, 1 ; Minimalwert schon erreicht...?
    2. brsh _set_bright_down_ind ; nein, verringern


    Dauert jetzt zwar einen halben Takt länger aber das sollte zu verkraften sein.


    Des Weiteren habe ich die SW_PWM.inc nochmal überarbeitet, so dass jetzt die RGB Leds und der weitere PWM Kanal auf verschiedenen Ports laufen können.


    Nochmal vielen Dank an Pesi für den tollen Controller.


    Grüße

  • Hallo,
    mittlerweile bin ich auf ein Problem beim Anschluss von DMX gestoßen.
    Und zwar, so funktioniert alles, stecke ich erst den Strom ein, später das dmx Kabel, ist alles gut. Liegt aber ein dmx Signal an, und ich schalte erst dann den Strom ein funktioniert nichts mehr richtig, alles blinkt, oder macht sonstigen Unsinn. Wieder alles aus gemacht, dmx raus, Strom dran, dann funktionierte die Lampe so, aber beim Anschluss von dmx reagierte nichts, teilweise waren dann auch nur die roten an, ohne Reaktion auf Änderungen vom dmx. Daraufhin flashe ich den Tiny neu und alles geht wieder.
    Hat jemand eine Idee wo das Problem ist, in anderen Schaltungen sind vor dem dmx Eingang 10 Ohm wiederstände, das einfügen hiervon hat das Problem nicht behoben.
    Gruß Andreas

  • Huch, schon lange nicht mehr hier rein geschaut...


    Flixus: Könntest Du Deine SW-Version mit dem extra Kanal auch noch hier rein stellen..? - das wäre super! :thumbup:


    Andreas: Hm, das ist komisch! - kann ich mir jetzt auf die Schnelle nicht vorstellen, woran das liegen könnte...


    zur Eingrenzung: spinnt das Teil denn dann komplett, also gehen auch die Standalone-Programme nicht mehr, wenn Du erst DMX und dann den Strom dran machst, oder funktioniert nur der DMX-Empfang nicht richtig...?


    also kannst Du mal ein Standalone-Programm einstellen (und speichern, damit das beim nächsten Einschalten kommt), und dann noch mal so, erst DMX an, dann Strom...? - läuft das Programm dann einfach, oder spinnt er da auch rum..?


    welche SW-Version hast Du denn...? - in der ganz alten mit dem Display war noch ein Fehler in der DMX-Empfangsroutine, der ist glaubich immer noch nicht behoben :whistling: , da die dann weiter nicht mehr so interessant war (das Display ist ja unnötig, war nur zum testen dran...)

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Aufgrund mangelnder Zeit melde ich mich auch erst jetzt wieder.


    Software benutze ich die vom 12.11.2012, ohne Display.
    Ist Dmx eingesteckt funktionieren auch die stand Alone Programme nicht, z.B. blinkt alles sehr schnell rot, man kann nichts umstellen oder ändern, dann Strom ausschalten, dmx aus, Strom wieder ein, anschließend dmx an und es funktioniert.
    Allerdings kommt es auch mal vor das die Software dabei einen Schaden bekommt, wenn dmx eingeschaltet war, sodas die festen Farben endlos durchzuschalten sind und es auch ganz andere, viel mehr Farben sind.
    Nach dem ausschalten warte ich ebenfalls immer eine gewisse zeit, zu schnelles wiedereinschalten ist nicht gut.
    Ich habe das Gefühl es liegt an dem anliegenden dmx Signal beim einschalten, wenn man aufpasst und immer erst den Strom einsteckt gab es noch keine probleme, ist aber komisch.
    Gruß

  • Sorry, jetzt hat's bei mir auch etwas länger gedauert...


    leider kann ich das Problem hier nicht nachvollziehen, also ich meine damit nicht, dass ich Dir nicht glauben würde, sondern es tritt bei mir nicht auf...


    da kann ich schlecht was debuggen, wenn der Fehler bei mir nicht passiert, weil ich ja nicht sehe, woran es liegen könnte...


    das Einzige, was mir jetzt noch einfällt: wie sieht es denn bei Dir mit den Fusebits aus...? - ich habe die immer so eingestellt, dass der µC maximal lange wartet (Startup-Time 16K CK + 65 ms) bis er tatsächlich losläuft.


    Könnte mir schon vorstellen, wenn die Startup-Time kürzer eingestellt ist, und der µC dann schon mit "wackeligem" Takt losläuft und dann noch zusätzlich Signale anliegen (das DMX eben), dass er dann durcheinander kommt und rumspinnt...


    sonst würde mir jetzt nix mehr einfallen, in der SW habe ich jedenfalls nix gefunden, was dieses Verhalten erklären könnte...


    wenn zufällig jemand mitliest, der das Teil ebenfalls mit DMX betreibt: Ist das bei anderen auch so, also hat sonst noch jemand dieses Problem mit seltsamen Verhalten, wenn erst DMX und dann Strom angelegt wird...?

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Hallo Pesi


    Ich habe die gleichen Bugs was ich auch schonmal im anderen Thread geschrieben habe.


    Vielleicht etwas anders beschrieben...


    Ich habe auch das Problem, das die Schaltungen das ein und ausgeschalte von Dau's an der Sicherung nicht mögen, mit wirklich seltsamen Erscheinungen. 8|
    Ausserdem habe ich 2 Platinen hier, die den Fehler des Flackerns dauerhaft haben, die ich Dir gerne zusende.


    Was sich zumal auch zeigt ist die Tatsache, das der Controller bei mir nicht damit klar kommt wenn man schon DMX am laufen hat, bevor die Platine mit Strom versorgt wurde. ||
    Das habe ich mit mehreren DMX-sendern getestet. Monacor DMX-510, DMX-PlayerM von DMX4all, und 2 DMX-Pulte. Ich würde Dir auch ne funktionierende Platine zur Verfügung stellen, wenns hilft, damit Du das Ganze direkt nachvollziehen kannst. :rolleyes:


    Flo

  • Hallo zusammen,


    ich plane (als µC-Anfänger!), den Controller mit einem ATtiny4313 umzusetzen.
    Es gab ja mal die Idee, die Software um die NEC Funktionalität zu erweitern. Gibt's dazu schon was neues?
    Wenn man sich evtl an der IRMP etwas anlehnt??


    Hätte den netten Vorteil, dass die gängigen China-Remotes verwendet werden könnten :)


    Viele Grüße!!

  • Hm, das ist C, damit kenne ich mich nicht aus, auch k.A., wie ich das mit meinem asm-Programm zusammen bringe...


    aber kannst Du gerne probieren, Quelltext ist ja drin, letztlich nur die RC5-Routine durch eine ersetzen, die NEC empfängt...


    Ich hab' da leider keine Zeit dazu, seit ich wieder fest angestellter Held der Arbeiterklasse bin, komm ich zu gar nix mehr...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Danke für die Antwort.
    Ja ich lese mich mal etwas ein.


    in aber noch nicht so optimistisch, da ich werder asm noch C programmieren kann.
    Das Programm auf andere RC5 Befehle anpassen bzw evtl die festeingestellten Farbe zu erweitern, bekomm ich hin, denk ich; komplette routinen austauschen muss ich mir mal anschauen!..

  • Hallo zusammen,


    Pesi, ich hab jetzt mal ein bisschen mit ASM rumgespielt und deinen Controller um einige Programme erweitert. Ich habe das Display reingepackt, und das Programm soweit angegepasst, dass es für den NEC Empfang (insb die China Remotes) vorbereitet ist.


    Bevor ich die Version aber mit euch teilen kann, fehlt noch das i-Tüpfelchen....
    Jetzt bin ich gerade in den letzten Zügen, das NEC Protokoll zu integrieren. Leider sind Vorlagen dafür in AMS sehr sehr rar. Bin dann in einem russichen Forum fündig geworden und habe den Code, soweit angepasst, dass er in den Controller reinpasst.
    Die Grundfunktionalität der NEC Routine läuft über den Timer1 und INT0 (der IR Empfänger ist für den Zweck zumindest Testweise an PD2), der die NEC Intervalle anhand steigender und fallender Flanken erkennt und gegenüber Timer1 vergleicht.
    Hier ist allerdings auch schon der Hund begraben. Diese Timerfunktionalität scheint nicht so ganz funtionieren wie sie soll, so dass kein korrektes NEC format ankommt... Ich komme mit meinen Anfänger ASM Kenntnissen aber einfach nicht weiter...
    Daher die Frage an euch, ob jemand auf die schnelle einen groben Schnitzer sieht und woran es hängen könnte??


    Hier die relevanten Code Teile...


    In der "Haupt"-asm.Datei wird INT0 und Timer1 konfiguriert.



    Die Interrupts sind wie folgt definiert:

  • und hier dann der Teil des NEC receivers (nicht wundern, die Kommentare
    sind per google translate aus dem kyrillischen übersetzt....)