Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka

adambyw 17 Paź 2014 16:56 9141 21
  • PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka

    Dostałem do naprawy ledowe światełko Stage Lighting SPD018. W wyniku obdukcji pacjenta okazało się że procesor P89V51R82FN nie daje oznak życia. Klient chciał żeby jak by się dało reagował na dźwięk lub na DMX z obsługą 3 kanałów.
    Część DIY dotyczy właściwie samego oprogramowania.

    Jako że P89V51R82FN ma prawie taki sam pinout jak Atmega8515 został nią zastąpiony.
    Schemat ideowy został zrysowany z natury:

    PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka



    Edytuj
    Jedyną zmianą jaką wykonałem jest wyjęcie C4 i R7 i pozostawienie pinu reset w powietrzu.
    Oprogramowanie oparłem na bazie na projekcie opisanym na stronie www.hoelscher-hi.de/hendrik/ Wykorzystałem z niego bibliotekę do obsługi DMX. Modyfikacji wymagało przyporządkowanie pinów oraz obsługa dipswitchy do wyboru kanałów DMX, oraz ostatni do przełączania trybu DMX/Sound.
    Program pisany w Atmel Studio, programowany na płytce stykowej przez USBasp.

    Obsługa dźwięku bazuje na przerwaniu INT1 wyzwalany zboczem opadającym. Włącza się go poprzez ustawienie 10 dipswitcha. Automatycznie wyłącza to obsługę DMX. Kolory wyzwalane dźwiękiem zdefiniowane zostały w tabeli.

    Listingi programu:
    Program główny:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Biblioteka DMX z detekcją pinswitchy:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Pliki nagłówkowe:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Jedyną rzeczą której się obawiam to brak opóźnienia po przerwaniu INT1 które przy hałasie może doprowadzać do ciągłej, mało estetycznej zmiany kolorów. Wyjdzie w praniu.

    To właściwie mój pierwszy projekt na mikroprocesorze, więc proszę o wyrozumiałość i zapraszam do konstruktywnej dyskusji. Na tym etapie PAR pracuje, jedzie na weekend na testy.

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    Nie udzielam porad na PW.
    Specjalizuje się w: nagłośnienia, nagrania, serwis, instalacje, dso.
    adambyw napisał 5396 postów o ocenie 273, pomógł 836 razy. Jest z nami od 2004 roku.
  • #2
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #3
    adambyw
    Moderator Akustyka
    Dziękuję. Brak podglądu i debugowania mocno dał mi się we znaki. Wcześniej pisałem w C++ czy php, to w każdym momencie mogłem sobie sprawdzić czy coś działa czy nie. Tu dopiero po godzinie myślenia czemu procesor zachowuje się inaczej w urządzeniu a inaczej w płytce stykowej doszedłem do tego że procesor nie wstaje przez nogę reset. A ciężko mi było dojść bo jakimś cudem szła regularnie zmiana kolorów co około 0,5s,i wydawało mi się że to problem z softem.

    Par nie mój, jak kumpel da filmik to zaprezentuję. Chyba że się wróci do poprawki. Zresztą nie bardzo jest co pokazywać.

    Pod DMX świeci jak mu zaprogramują. Takie PWM działa całkiem skutecznie, minimalnie świeci przy wartości 1 i co najważniejsze nie jest widoczny efekt mrugania, co zauważyłem w moich eurolite, przy 255 jest cały czas sygnał na wyjściu. Nie zmierzyłem czasu jednego okresu wypełnienia, nie wpadłem na to. Procesor jest taktowany zegarem 8MHz, to ten czas będzie stosunkowo krótki. W sumie płyta jest przygotowana pod 16MHz, ale jakoś nie chciałem podnieść rękawicy.

    Zmiana kolorów dźwiękiem pozostawia trochę pola do popisu. Po pierwsze cały czas powtarza się ta sama sekwencja. Próbowałem zaimplementować funkcję rand(), ale jakoś bez możliwości debugowania ciężko mi było sobie z nią poradzić i odpuściłem. Klient nie naciskał.

    Miałem pomysł na strobo z regulowaną jasnością danych kolorów, sterowany 4 kanałem, ale klient stwierdził że nie używa inie planuje, a pomiesza mu adresowanie. W sumie wystarczy dodać kolejny licznik i kolejne PWM w pętli głównej tylko z dłuższym czasem. Może kiedyś ;)

    Nie mniej idąc na fali w najbliższym czasie pojawi się sterowanie dymiarki przez DMX z Atmega8A albo jakimś mniejszym, ale już z opracowaniem hardware.
    Czekam na dalsze sugestie, biorę swoje lamerstwo w tej dziedzinie na klatę.
  • #4
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #5
    adambyw
    Moderator Akustyka
    Tak właściwie to tylko oprogramowałem zastany układ, z muzyką nie testowałem, tylko na pstryknięcie palcami. Jak działo wcześniej nie było mi dane sprawdzić. Chyba jedyną rzeczą jaką mogę wprowadzić to ograniczyć szybkość przełączania. Jeżeli ograniczyć do powiedzmy 0,35s co odpowiada tempu ok 170bpm powinno ograniczyć bardzo szybkie przełączanie. Ale powiem coś koło połowy tygodnia, jak się zobaczę ze zleceniodawcą.
  • #6
    adambyw
    Moderator Akustyka
    Par wrócił ponownie na warsztat do poprawek. Największa bolączka to niestety efekt stroboskopu przy sterowaniu dźwiękiem.
    Poprawione / dodane zostało:

    - PWM,
    - sterowanie dźwiękiem,
    - zmiana kolorów timerem,
    - dodany kolor biały,
    - ograniczenie powtarzalności sekwencji.

    PWM
    Przy poprzednich próbach nie zwróciłem uwagi na wyjście przy poziomie 255. Efekt był taki że nie było ciągłego sygnału na wyjściu tylko była pojedyncza szpilka przerwy na każdy cykl. Trzeba było skrócić cykl o jedno zapętlenie. Teraz przy 0 jest ciągłe zero a przy 255 ciągłe 5V na wyjściu procesora.
    Jako że PWM jest zrobione w pętli głównej jego długość cały czas pływa. Tego już nie będę zmieniał, bo widoczne jest tylko przy najniższych nastawach DMX (1-5) jako delikatne mruganie, a tych wartości praktycznie nie będzie się używać.
    Pojedynczy impuls ma długość 4,5µs. Poniższy oscylogram pokazuje impuls dla wartości DMX=1.
    PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka

    Cały cykl ma w okolicy 1,2ms. Poniżej oscylogram dla DMX=128 i 254.
    PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka
    Trochę wolne to pwm, ale zastosowanie sprzętowego wiązało by się z przeróbką elektryczną płyty bo pinout się nie zgadza, a nie chciałem aż tak ingerować w sprzęt, no i musiał bym się go najpierw nauczyć ;) W sumie jeszcze mogę zmienić taktowanie z 8 na 16MHz, bo kwarc na płycie jest. Nie pomyślałem a już mam poskręcane.
    Trzeba tylko zmienić fusebity, F_CPU i F_OSC. reszta właściwie powinna chodzić.

    Zmiana kolorów dźwiękiem
    Jak się okazało w praktyce, sterowanie dźwiękiem działa dobrze przy dobrze dopasowanej głośności dźwięku. W tedy sygnał na pin przerwania wygląda tak:
    PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka
    Ale niestety przy głośnym jest już mniej ciekawie bo dostajemy:
    PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka
    Rozwiązania tego problemu są dwa.
    - Wstawić potencjometr do regulacji czułości - klient nie chciał
    - Wstawić minimalny czas świecenie

    Zastosowałem dodatkowy timer, którego czas opóźnienia reguluje się pierwszymi 8 dipswitchami. Dip 10 ma być w górze a 9 na dole.
    Tym sposobem można uzyskać czasy od ok 25ms do kilku sekund.

    Teraz wygląda to mniej więcej tak:

    Link


    Zmiana kolorów timerem
    Wprowadziłem też nowy tryb, zmiany kolorów timerem. Działa to na tym samym timerze co wyżej jest tak samo sterowany. Włącza się go podnosząc ostatnie dwa dipswitche

    Na filmiku jest celowo dość krótki czas.

    Link


    Ograniczenie powtarzalności sekwencji
    Trochę słabo wyglądała sekwencja 12 powtarzających się kolorów. Jakość funkcja random nie chciała za bardzo współpracować ze mną. Wieszała procesor, dawała dziwne wyniki i wprowadzała duże wahania w okresie PWM.
    Powiększyłem tablicę kolorów do 13, teraz kolor zwiększa się nie o 1 a o 7 w górę a przy przepełnieniu zmniejsza o 12, co mocno zmniejsza powtarzalność danej sekwencji kolorów.

    Klient sprawdził na warsztacie mówił że jest dobrze.

    Nowy kod
    Program główny:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Biblioteka DMX
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Trzeci plik to nagłówek, bez zmian.
  • #7
    LOCODELAFONOLA
    Poziom 9  
    hi przyjaciel, oczywiście przykro, wulgaryzmy google tłumacz, dobry ciekawy projekt, chciałbym, aby przynieść wam po najpierw sugerujemy dodać bibliotekę do TX-out napędu DIP10 dźwięku, http: // www ..... .hoelscher-hi.de / Hendrik / światło / Zasoby / http://www.hoelscher-hi.de/hendrik/light/ressources/AN013.pdf txd.zip i to nawet jest funkcjonalnie podobny do oryginalnego ..aporto biblioteka w C, który przynosi Strobe i przyciemnić mistrza., aby można było się z partii, jeśli służyć., także bibliotekę wskaźników., bardzo przydatne w przypadku DMX. Mam nadzieję, że swoje komentarze., a mam nadzieję, że był pomocny i nadal Twój zespół. i reformy kopalni
    Code:
     #include <avr/interrupt.h>
    
    #include <avr/io.h>
    #include <stdio.h>

    #define F_CPU 12000000

    #define LED_R_PIN_OUT DDRD |= (1<<PD5);
    #define LED_G_PIN_OUT DDRD |= (1<<PD4);
    #define LED_B_PIN_OUT DDRD |= (1<<PD3);

    #define LED_R_ON      PORTD |= (1<<PD4);
    #define LED_R_OFF      PORTD &= ~(1<<PD4);
    #define LED_B_ON      PORTD |= (1<<PD5);
    #define LED_B_OFF      PORTD &= ~(1<<PD5);
    #define LED_G_ON      PORTD |= (1<<PD3);
    #define LED_G_OFF      PORTD &= ~(1<<PD3);


    #define DMX_BAUD 250000
    #define DMX_LOST_TIMEOUT 8000

    volatile unsigned int dmx_lost = DMX_LOST_TIMEOUT;

    volatile unsigned int dmx_adresse = 0;
    volatile unsigned char dmx_buffer[6];

    volatile unsigned char led_kanal[3];

    //############################################################################
    //DMX Senderoutine
    ISR (USART_RX_vect)
    //############################################################################
    {
       static unsigned int dmx_channel_rx_count = 0;
       static unsigned char dmx_valid = 0;
       unsigned char tmp = 0;
       
       tmp =  UDR;
       
       if(UCSRA&(1<<FE))
       {
          if(dmx_channel_rx_count > 1)
          {
             dmx_lost = 0;
          }
          dmx_channel_rx_count = 0;   
          dmx_buffer[0] = tmp;
          if(dmx_buffer[0] == 0)
          {
             dmx_valid = 1;
             dmx_channel_rx_count++;
          }
          else
          {
             dmx_valid = 0;
          }
          return;
       }
       
       if(dmx_valid)
       {
          if(dmx_channel_rx_count == dmx_adresse) dmx_buffer[1] = tmp;
          if(dmx_channel_rx_count == dmx_adresse+1) dmx_buffer[2] = tmp;
          if(dmx_channel_rx_count == dmx_adresse+2) dmx_buffer[3] = tmp;
          if(dmx_channel_rx_count == dmx_adresse+3) dmx_buffer[4] = tmp;
          if(dmx_channel_rx_count == dmx_adresse+4) dmx_buffer[5] = tmp;
          
          if(dmx_channel_rx_count < 514)
          {
             dmx_channel_rx_count++;
          }
          return;
       }
    }

    //############################################################################
    //Hier wird die Zeit gezählt (Tick 1ms)
    ISR (TIMER0_COMPA_vect)
    //############################################################################
    {
       static unsigned char pwm_counter = 0;

       pwm_counter++;
       if(pwm_counter == 255)
       {
          pwm_counter = 0;
       }
       
       if(pwm_counter >= led_kanal[0])
       {
          LED_R_OFF;
       }
       else
       {
          LED_R_ON;
       }
       if(pwm_counter >= led_kanal[1])
       {
          LED_G_OFF;
       }
       else
       {
          LED_G_ON;
       }
       if(pwm_counter >= led_kanal[2])
       {
          LED_B_OFF;
       }
       else
       {
          LED_B_ON;
       }
       
       if(dmx_lost<DMX_LOST_TIMEOUT)
       {
          dmx_lost++;
       }
    }

    //############################################################################
    //Hauptprogramm
    int main (void)
    //############################################################################

       unsigned int dmx_adresse_tmp;
       unsigned long strobe_counter = 0;
       unsigned char tmp1,tmp2,tmp3;

       //Init usart DMX-BUS
       UBRRH   = (unsigned char)(F_CPU / (DMX_BAUD * 16L) - 1)>>8;
       UBRRL   = (unsigned char)(F_CPU / (DMX_BAUD * 16L) - 1);
       UCSRB|=(1 << RXEN | 1<< RXCIE);
       UCSRC|=(1<<USBS); //USBS0 2 Stop bits   
       
       //Timer0 Timecounter für DMX Ausfall und PWM
       TCCR0A |= (1<<WGM01);
       TCCR0B |= (1<<CS00);
       TIMSK |= (1<<OCIE0A);
       OCR0A = F_CPU/1024/100 - 1; //Tick 1ms
       
       PORTB |= 0xFF;
       PORTD |= (1<<PD6);
       
       DDRD |=(1<<PD2);
       PORTD &=~(1<<PD2);
       
       LED_R_PIN_OUT;
       LED_G_PIN_OUT;
       LED_B_PIN_OUT;
       
       LED_R_ON;
       for(unsigned long tmp = 0;tmp<500000;tmp++)asm("nop");
       LED_R_OFF;
       LED_G_ON;
       for(unsigned long tmp = 0;tmp<500000;tmp++)asm("nop");
       LED_G_OFF;
       LED_B_ON;
       for(unsigned long tmp = 0;tmp<500000;tmp++)asm("nop");
       LED_B_OFF;
       
       sei();//Globale Interrupts Enable
       
       //Endlosschleife
       while(1)
       {
          dmx_adresse_tmp = 0;
          
          if(!(PIND&(1<<PD6))) dmx_adresse_tmp |= 0x01;
                
          if(!(PINB&(1<<PB0))) dmx_adresse_tmp |= 0x02;
           if(!(PINB&(1<<PB1))) dmx_adresse_tmp |= 0x04;
          if(!(PINB&(1<<PB2))) dmx_adresse_tmp |= 0x08;
          if(!(PINB&(1<<PB3))) dmx_adresse_tmp |= 0x10;
          if(!(PINB&(1<<PB4))) dmx_adresse_tmp |= 0x20;
          if(!(PINB&(1<<PB5))) dmx_adresse_tmp |= 0x40;
          if(!(PINB&(1<<PB6))) dmx_adresse_tmp |= 0x80;
          if(!(PINB&(1<<PB7))) dmx_adresse_tmp |= 0x0100;
          
          if(dmx_adresse != dmx_adresse_tmp) dmx_adresse =  dmx_adresse_tmp;
          
          if(dmx_lost==DMX_LOST_TIMEOUT)
          {
             dmx_buffer[1] = 0;
             dmx_buffer[2] = 0;
             dmx_buffer[3] = 0;
             dmx_buffer[4] = 0;
          }
          
          tmp1 = dmx_buffer[1]*dmx_buffer[4]/255;
          tmp2 = dmx_buffer[2]*dmx_buffer[4]/255;
          tmp3 = dmx_buffer[3]*dmx_buffer[4]/255;
          
          
          if(dmx_buffer[5]<10)
          {
             led_kanal[0] = tmp1;
             led_kanal[1] = tmp2;
             led_kanal[2] = tmp3;
          }
          else
          {
             strobe_counter++;
             if(strobe_counter > (256 - dmx_buffer[5]))
             {
                led_kanal[0] = tmp1;
                led_kanal[1] = tmp2;
                led_kanal[2] = tmp3;
             }
             else
             {
                led_kanal[0] = 0;
                led_kanal[1] = 0;
                led_kanal[2] = 0;
             }
             
             if(strobe_counter > (2 * (256 - dmx_buffer[5])))
             {
                strobe_counter = 0;
                led_kanal[0] = 0;
                led_kanal[1] = 0;
                led_kanal[2] = 0;
             }
          }
       }
    }

    /**** A P P L I C A T I O N N O T E ************************************
    *
    * Title : Error Indication Library
    * Version : v1.0
    * Last updated : 09.09.07
    * Target : Transceiver Rev.3.01 [ATmega8515]
    * Clock : 8MHz, 16MHz
    *
    * written by
    ***************************************************************************
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version2 of
    the License, or (at your option) any later version.

    ;***************************************************************************/

    #include "lib_indicator.h"

    #define NO_DMX_PAT (0b10000010)
    #define NOT_HOT_PAT (0b10101010)
    #define COLD_PAT (0b11111111)

    uint8_t Blink;

    // ******************** initialize indicator *****************************
    void init_ind(void)
    {
    DDRD |= (1<<PD7); //LED1
    PORTD |= (1<<PD7);
    DDRE |= (1<<PE0); //LED2
    PORTE |= (1<<PE0);
    Blink= 0xFF;
    IndFlags= 0;
    }


    // ******************** LED indicator *****************************
    void indicate(void)
    {
    if (IndFlags &(1<<DATA_REFRESHED))
    {
    IndFlags &= ~(1<<DATA_REFRESHED);
    PORTE ^= (1<<PE0); //change green LED state
    }
    else PORTE &= ~(1<<PE0); //enable LED if nothing's changed

    if (Blink &(1<<0))
    {
    PORTD &= ~(1<<PD7); //enable red LED if 1st bit is set
    PORTA |= (1<<PA7); //same pattern at remote control
    }
    else
    {
    PORTD |= (1<<PD7);
    PORTA &= ~(1<<PA7);
    }

    Blink= (Blink>>1); //shift pattern
    if (Blink == 1)
    {
    IndFlags &= ~(1<<DMX_ERR);
    if (!(IndFlags &(1<<VALID_DMX)))
    {
    Blink= NO_DMX_PAT;
    IndFlags |=(1<<DMX_ERR);
    }
    else if (IndFlags &(1<<COLD)) Blink= COLD_PAT;
    else if (!(IndFlags &(1<<HOT))) Blink= NOT_HOT_PAT;
    else
    {
    Blink= 0b10000000;
    }
    IndFlags &= ~(1<<VALID_DMX); //clear IndFlags
    }
    }
    [code] #include <avr/io.h>
    #include <stdint.h>

    volatile uint8_t IndFlags;

    enum {VALID_DMX, DMX_ERR, DATA_REFRESHED, COLD, HOT};

    extern void indicate(void);
    extern void init_ind(void);
    PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka
  • #8
    adambyw
    Moderator Akustyka
    Bazowałem na projekcie http://www.hoelscher-hi.de o czym pisałem w pierwszym poście głównie jeżeli chodzi o transmisję DMX. Ale chciałem zmierzyć się z projektem sam, dla tego resztę pisałem samodzielnie, choć momentami wygląda to bardzo podobnie.
    Obsługa dźwięku jest zaimplementowana.
  • #9
    LOCODELAFONOLA
    Poziom 9  
    dzięki przyjaciel adambyw., aby pokonać bariery językowe dla mnie., bardzo złe Google Translator., sprawdzić, czy mnie rozumiesz. Chodzi mi o to, że celem lub napęd DIP10 działa mikrofon i biblioteka trasmision Teksas., więc umieścić pierwszy mistrz (Transmisja) Teksas., a inne drugi. Trzeci., niewolnika itd, więc umieścić je w atmosferze .. ale wszystkie są zsynchronizowane w kolorze., np wszystkich niebieski lub czerwony lub dowolny kolor wybrany przez pierwsze., nie zrobi konsolę DMX brakuje., a zmiany będą generować mikrofonu (audioritmico). i inni Alos przekazywane przez Teksas., a jeśli biblioteki korzystać Http://www.hoelscher-hi.de znajomego, ale nie realizowane + TX mikrofon jest na podziękowania
  • #10
    23021998
    Poziom 8  
    Witam kolegów. Mam takie nietypowe pytanie gdyż robię belkę LED DMX i chciałbym użyć ten sterowniki i nie wiem jak i co mam wgrać do procesora.
  • #11
    LOCODELAFONOLA
    Poziom 9  
    drogi przyjacielu adambyw ., Próbowałem skompilować bibliotekę w .i atmelstudio uważam, że się kilka błędów., oglądając filmy., jej wyniki domyślić biblioteki brak definicji lub inne zdanie., że nie kompilacji., tutaj lista błąd PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka Dziękuję za odpowiedź. Juan Mendoza Argentyna
  • #12
    adambyw
    Moderator Akustyka
    Musisz mieć w jednym projekcie tylko 3 pliki których źródła umieściłem. Wydaje mi się że masz za dużo plików w projekcie atmel studio.
    Dodatkowo program musi być kompilowany na konkretny procesor, chodzi o różny pinout. Ja pisałem na Atmega8515, a jak próbowałem uruchamiać program na Atmega8pu to trzeba było przerabiać program ze względu na inny pinout, inne porty i inne uchwyty do przerwań.
  • #13
    LOCODELAFONOLA
    Poziom 9  
    Witaj przyjaciela adamview . Dokonał skompilować i przetestować jego aktywny program w atmega8515-16pu . , Działa idealnie. Ja bardzo szczęśliwy . , ¿ ¿ Można dodać kanał stroboskopowy i główny dimer do CH0 . CH1 i CH2 ???? . , I inente . , Nie consegui dodatek nie rozumiem, jak . Dzięki juan mendoza argentina
  • #14
    adambyw
    Moderator Akustyka
    Nie tłumacz translatorem, zostaw wiadomość po angielsku.

    W pliku nagłówkowym jest definicja:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    a w bibliotece zawsze jest sprawdzany rozmiar:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Czyli bardzo łatwo zmienić rozmiar czytanych kanałów. W tym wypadku czyta 8 kanałów. Nawet za dużo, wystarczy 5

    Dimmer globalny będzie łatwo zrobić. Załóżmy że będzie na Ch3 (licząc od 0).
    DmxRxField[3] = global dimmer channel. W pętli głównej trzeba zmienić 3 warunki:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    tak żeby wartość była pomniejszona o mnożnik z DmxRxField[3]
    Kod: cpp
    Zaloguj się, aby zobaczyć kod



    Strobo będzie troszkę bardziej skomplikowane. Trzeba będzie dorobić kolejny warunek - czasowy. Można to zrobić na timerze lub w pętli. Lepiej będzie na timerze bo nie będzie pływał czas strobo, a tego nie zaprogramuję bez sprzętu.

    Z grubsza widzę to tak jak niżej. Nie jestem pewien czy coś nie poplątałem w warunkach bo pisałem z głowy ale nie mam już sprzętu żeby sprawdzić.

    Ch1 - Red
    Ch2 - Green
    Ch3 - Blue
    Ch4 - Main dimmer
    Ch5 - Strobo, 0=off, 1 najdłuższy czas, 255 najkrótszy czas

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Patrząc po innych rozwiązaniach wydaje się sensownym zwiększenie zakresu wyłączenia strobo 0 do 10 żeby uniknąć przypadkowego mrugania przy sterownikach z suwakami, gdzie mały ruch suwakiem zmienia wartość. Przy sterownikach komputerowych nie powinno być problemu.
    Warunek
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    ma na celu wydłużenie minimalnego czasu stroboskopu. Ten parametr trzeba dobrać testując. Będzie on zależał od częstotliwości oscylatora. Ja w tej naprawie zostawiłem zegar na 8MHz, ale dobrze by zwiększyć zegar na 16MHz. Zwiększy to szybkość PWM - będzie mniej mrugać przy małych wartościach DMX zwłaszcza po wydłużeniu listy czynności pętli głównej.
  • #15
    LOCODELAFONOLA
    Poziom 9  
    thank you very much friend. , adambyw . , for sharing your wisdom and time. ,
    adambyw napisał:
    Nie tłumacz translatorem, zostaw wiadomość po angielsku.

    W pliku nagłówkowym jest definicja:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    a w bibliotece zawsze jest sprawdzany rozmiar:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Czyli bardzo łatwo zmienić rozmiar czytanych kanałów. W tym wypadku czyta 8 kanałów. Nawet za dużo, wystarczy 5

    Dimmer globalny będzie łatwo zrobić. Załóżmy że będzie na Ch3 (licząc od 0).
    DmxRxField[3] = global dimmer channel. W pętli głównej trzeba zmienić 3 warunki:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    tak żeby wartość była pomniejszona o mnożnik z DmxRxField[3]
    Kod: cpp
    Zaloguj się, aby zobaczyć kod



    Strobo będzie troszkę bardziej skomplikowane. Trzeba będzie dorobić kolejny warunek - czasowy. Można to zrobić na timerze lub w pętli. Lepiej będzie na timerze bo nie będzie pływał czas strobo, a tego nie zaprogramuję bez sprzętu.

    Z grubsza widzę to tak jak niżej. Nie jestem pewien czy coś nie poplątałem w warunkach bo pisałem z głowy ale nie mam już sprzętu żeby sprawdzić.

    Ch1 - Red
    Ch2 - Green
    Ch3 - Blue
    Ch4 - Main dimmer
    Ch5 - Strobo, 0=off, 1 najdłuższy czas, 255 najkrótszy czas

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Patrząc po innych rozwiązaniach wydaje się sensownym zwiększenie zakresu wyłączenia strobo 0 do 10 żeby uniknąć przypadkowego mrugania przy sterownikach z suwakami, gdzie mały ruch suwakiem zmienia wartość. Przy sterownikach komputerowych nie powinno być problemu.
    Warunek
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    ma na celu wydłużenie minimalnego czasu stroboskopu. Ten parametr trzeba dobrać testując. Będzie on zależał od częstotliwości oscylatora. Ja w tej naprawie zostawiłem zegar na 8MHz, ale dobrze by zwiększyć zegar na 16MHz. Zwiększy to szybkość PWM - będzie mniej mrugać przy małych wartościach DMX zwłaszcza po wydłużeniu listy czynności pętli głównej.
    the google translation yet for very bad . , I understood little . , sorry try compilation . , errors genre. , in atmelstudio 4.13 ., thousand pardons . , for not understanding his explanation juan san rafael mendoza argentina
  • #17
    LOCODELAFONOLA
    Poziom 9  
    thank you very much friend adambyw
    adambyw napisał:
    What do you need to explain?

    I wrote code without compiler. There is error, should be:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Change ; to , and try to compile.
    corrected some errors. , did not understand your clarification (bad translation yet ) ., achievement not set . , software timer strobe ., any advice on how to achieve it there I show marked compiler errors maybe it would be better to create function as
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    adding alli . , or create new function as
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    in that place set new parameters . You counseling ., thank you very much . , for their time and wisdom juan san rafael mendoza argentina
  • #18
    adambyw
    Moderator Akustyka
    Try this code. Compiled in Atmel Studio 6.2:
    Main program:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Header: lib_dmx_in.h
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    And library
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    The premise is simple. To make strobo we need second timer. I make this in counter named strobo_timer. The size of the counter depends on the 5th DMX channel. There is inversion, bigger DMX value mean shorter strobo flash time.
    Variable strobo allow or disallw turn led ON. If value is FALSE (0) Leds can be ON depends of color channel and main dimmer channel. You can control strobo brightnes.
    Look on code:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    DmxRxField[0] its red channel value, DmxRxField[3] its dimmer value. Operation (DmxRxField[0]*DmxRxField[3])/255 give value 0 to 255 depend of both channels. Red and dimmer. When (DmxRxField[0]*DmxRxField[3])/255>PWM_timer) give true leds are off, when false goes ON.
    "| strobo" when strobo variable is TRUE leds always will be OFF. In strobo_timer counter measure time, one cycle TRUE, one cycle False.
    PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka

    I hope that right now its clear, and this code will work. Unfortunatly i haven't this processor to test it.
  • #19
    LOCODELAFONOLA
    Poziom 9  
    before anything else. , big thanks to you . , sir adamview . He is the only person on the Internet. ,which put knowledge on the subject I found thousands of codes . , but none explains. , how it works you deserve my great respect. Thanks
    Kod: c
    Zaloguj się, aby zobaczyć kod
    in this compilation me nothing works ., add the individual channels to strobe ; as in example
    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod
    so works the channels 1,2 and 3 . , long time the strobe 240 . , short time 255 ., I see no value assigned DmxRxField[3] ., maybe that's why not work
  • #21
    adambyw
    Moderator Akustyka
    OK, i have tested this code on uP today on prototype board. There was lot of mistakes, i chave correct them. But idea is still the same.
    There is working code, tested on Atmega8a, 8MHz internal.

    Changes only init (diffrends ports, and RX interrupt handle) and main loop.
    I dont use get_dips() function, becouse i havent dips, and use constant start adress.
    I move strobo loop from main to leds PWM loop. Becouse in main loop was too slow.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    And small movie. Using only 2 leds (ch2 i ch3). Controlled by freestyler.

    Link

    Right now you can use strobe with whichever color and with main dimmer control.

    Working Atmel Studio project below.