logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka

adambyw 17 Paź 2014 16:56 10809 21
REKLAMA
  • 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: text
    Zaloguj się, aby zobaczyć kod

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


    Pliki nagłówkowe:
    Kod: text
    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
    O autorze
    adambyw
    Moderator Akustyka
    Offline 
    Nie udzielam porad na PW.
    Specjalizuje się w: nagrania, serwis, instalacje, dso.
    adambyw napisał 6696 postów o ocenie 829, pomógł 1120 razy. Jest z nami od 2004 roku.
  • REKLAMA
  • #2 14055435
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 14055885
    adambyw
    Moderator Akustyka
    Posty: 6696
    Pomógł: 1120
    Ocena: 829
    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 14055925
    Konto nie istnieje
    Konto nie istnieje  
  • #5 14056107
    adambyw
    Moderator Akustyka
    Posty: 6696
    Pomógł: 1120
    Ocena: 829
    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 14081338
    adambyw
    Moderator Akustyka
    Posty: 6696
    Pomógł: 1120
    Ocena: 829
    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:




    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.




    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: text
    Zaloguj się, aby zobaczyć kod

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

    Trzeci plik to nagłówek, bez zmian.
  • REKLAMA
  • #7 14143568
    LOCODELAFONOLA
    Poziom 11  
    Posty: 14
    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
     #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 14148766
    adambyw
    Moderator Akustyka
    Posty: 6696
    Pomógł: 1120
    Ocena: 829
    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.
  • REKLAMA
  • #9 14150586
    LOCODELAFONOLA
    Poziom 11  
    Posty: 14
    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 14156957
    23021998
    Poziom 10  
    Posty: 30
    Ocena: 10
    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 14159758
    LOCODELAFONOLA
    Poziom 11  
    Posty: 14
    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 14372124
    adambyw
    Moderator Akustyka
    Posty: 6696
    Pomógł: 1120
    Ocena: 829
    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 14644007
    LOCODELAFONOLA
    Poziom 11  
    Posty: 14
    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
    Załączniki:
    • audiomain.rar (28.12 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #14 14644298
    adambyw
    Moderator Akustyka
    Posty: 6696
    Pomógł: 1120
    Ocena: 829
    Nie tłumacz translatorem, zostaw wiadomość po angielsku.

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

    a w bibliotece zawsze jest sprawdzany rozmiar:
    Kod: text
    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: text
    Zaloguj się, aby zobaczyć kod

    tak żeby wartość była pomniejszona o mnożnik z DmxRxField[3]
    Kod: text
    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: text
    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: text
    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 14645975
    LOCODELAFONOLA
    Poziom 11  
    Posty: 14
    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: text
    Zaloguj się, aby zobaczyć kod

    a w bibliotece zawsze jest sprawdzany rozmiar:
    Kod: text
    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: text
    Zaloguj się, aby zobaczyć kod

    tak żeby wartość była pomniejszona o mnożnik z DmxRxField[3]
    Kod: text
    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: text
    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: text
    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
    Załączniki:
    • PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka capture_04252015_170258.jpg (97.3 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • audiomain.rar (29.38 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #16 14646068
    adambyw
    Moderator Akustyka
    Posty: 6696
    Pomógł: 1120
    Ocena: 829
    What do you need to explain?

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

    Change ; to , and try to compile.
  • #17 14648749
    LOCODELAFONOLA
    Poziom 11  
    Posty: 14
    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: text
    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: C#
    Zaloguj się, aby zobaczyć kod
    adding alli . , or create new function as
    Kod: C#
    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
    Załączniki:
    • PAR LED64 Stage Lighting SPD018 Naprawa/przeróbka capture_04262015_150116.jpg (93.65 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #18 14651623
    adambyw
    Moderator Akustyka
    Posty: 6696
    Pomógł: 1120
    Ocena: 829
    Try this code. Compiled in Atmel Studio 6.2:
    Main program:
    Kod: text
    Zaloguj się, aby zobaczyć kod

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

    And library
    Kod: text
    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: text
    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 14663772
    LOCODELAFONOLA
    Poziom 11  
    Posty: 14
    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 / C++
    Zaloguj się, aby zobaczyć kod
    in this compilation me nothing works ., add the individual channels to strobe ; as in example
    Kod: text
    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
    Załączniki:
    • audiomain.rar (30.67 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #20 14664793
    adambyw
    Moderator Akustyka
    Posty: 6696
    Pomógł: 1120
    Ocena: 829
    DmxRxField[3] its main dimmer DMX channel. Its independent from strobo. Strobo is assigned in DmxRxField[4].

    In your code you unnecessarily doubled condition about turn on and off leds.
  • #21 14725280
    adambyw
    Moderator Akustyka
    Posty: 6696
    Pomógł: 1120
    Ocena: 829
    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: text
    Zaloguj się, aby zobaczyć kod


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



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

    Working Atmel Studio project below.
    Załączniki:
    • DMX2_strobo.rar (36.66 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #22 14798308
    LOCODELAFONOLA
    Poziom 11  
    Posty: 14
    many thanks . , for help . , I bring project in AVR Studio 4.13 . , working perfectly in 8515-16 atmega pu. , added performance indicators
    Załączniki:
    • DMX_audiritmico_con_wach_y_indicadores_acotaciones_espa__ol.rar (172.54 KB) Musisz być zalogowany, aby pobrać ten załącznik.

Podsumowanie tematu

✨ Dyskusja dotyczy naprawy i przeróbki oświetlenia LED Stage Lighting SPD018, w którym uszkodzony okazał się procesor P89V51R82FN. Użytkownik zastąpił go mikrokontrolerem Atmega8515, dostosowując schemat ideowy i oprogramowanie do obsługi DMX oraz dźwięku. W trakcie prac wprowadzono modyfikacje, takie jak PWM, zmiana kolorów timerem oraz dodanie koloru białego. Użytkownicy dzielili się doświadczeniami związanymi z programowaniem, testowaniem oraz problemami z efektem stroboskopu przy sterowaniu dźwiękiem. Wspomniano również o konieczności dostosowania kodu do różnych pinoutów procesorów oraz o implementacji funkcji stroboskopu i dimmera.
Wygenerowane przez model językowy.
REKLAMA