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

LED RGB na attiny13 - nie działa-pomocy

Kostka Tomasz 09 Mar 2010 20:50 2563 4
REKLAMA
  • #1 7807124
    Kostka Tomasz
    Poziom 2  
    Witam
    Wykonalem sobie ukladzik zgodnie z poniższym schematem

    LED RGB na attiny13 - nie działa-pomocy

    po zasileniu ukadu diody zapalają się i świecą na niebiesko cały czas -a miały przechodzić płynnie między barwami rgb.

    Wgralem do attiny następujący firmaware:

    #include <avr/io.h> 
    
    #define PIN_R (1 << PB4) 
    #define PIN_B (1 << PB5) 
    #define PIN_G (1 << PB3) 
    
    
    typedef unsigned char ui08; 
    typedef unsigned int ui16; 
    
    static char state = 0; 
    
    void hsv_inc(ui08 *r, ui08 *g, ui08 *b) 
    { 
    switch(state) 
    { 
    case 0 : { 
    *r = 255; *g = 0; *b += 1; 
    if (*b == 255) { state = 1; } 
    } break; 
    
    case 1 : { 
    *r -= 1; *b = 255; *g = 0; 
    if (*r == 0) { state = 2; } 
    } break; 
    
    case 2 : { 
    *r = 0; *b = 255; *g += 1; 
    if (*g == 255) { state = 3; } 
    } break; 
    
    case 3 : { 
    *r = 0; *b -= 1; *g = 255; 
    if (*b == 0) { state = 4; } 
    } break; 
    
    case 4 : { 
    *r += 1; *b = 0; *g = 255; 
    if (*r == 255) { state = 5; } 
    } break; 
    
    case 5 : { 
    *r = 255; *b = 0; *g -= 1; 
    if (*g == 0) { state = 0; } 
    } break; 
    
    case 6 : {} 
    } 
    } 
    
    void test(ui08 *b) 
    { 
    switch(state) 
    { 
    case 0 : { 
    *b +=1; 
    if (*b == 255) state = 1; 
    } break; 
    
    default: { 
    *b -= 1; 
    if (*b == 1) state = 0; 
    } break; 
    } 
    } 
    
    
    int main() 
    { 
    ui08 r, g, b, i = 0; 
    ui16 r_max = 50, g_max = 0, b_max = 0; 
    ui16 t = 0; 
    
    DDRB = PIN_R | PIN_G | PIN_B; 
    PORTB = PIN_R | PIN_G | PIN_B; 
    
    while(1) { 
    i++; 
    t++; 
    if(t == 1800) { 
    t = 0; 
    hsv_inc(&r, &g, &b); 
    } 
    
    
    
    if (r > (i + r_max)) { 
    PORTB &= ~PIN_R; 
    } else { 
    PORTB |= PIN_R; 
    } 
    
    
    if (g > (i + g_max)) { 
    PORTB &= ~PIN_G; 
    } else { 
    PORTB |= PIN_G; 
    } 
    
    if (b > (i + b_max)) { 
    PORTB &= ~PIN_B; 
    } else { 
    PORTB |= PIN_B; 
    } 
    } 
    
    } 
    


    za pomocą programatora typu Atmel AVRProg ( AVR910) i programu CodeVisionAVR
    wgrałem flash (main.hex - z powyższego kodu). Wszystko wygląda ok soft się zapisał i znajduje się w układzie ale nadal świeci tylko na niebiesko zamiast przechodzić płynnie między barwami rgb.

    Co zrobilem nie tak ?? dlaczego to nie działa ? pomocy


    p.s. to mój pierwszy układzik i doświadczenie z programowaniem attiny więc proszę o wyrozumialość.
  • REKLAMA
  • #2 7807224
    Gandalf_90
    Poziom 12  
    Witam!
    Będąc szczery - nie wiem co to jest za program, bo C to ja nie znam, jednakże układ atTiny13 sprzętowo umożliwia wyciągnięcie tylko dwóch kanałów PWM - bodajże na nóżkach 5 i 6 jak mnie pamięć nie myli (lepiej jeszcze sprawdzić :twisted:)
    Możliwe że ten program zapewnia jeszcze jeden kanał pwm, tyle że programowy, ale lepiej niech się wypowie jakowyś specjalista od C :P

    Zasadniczo, jak dopiero zaczynasz, lepiej spróbuj pobawić z AVRami w jezyku Bascom. Tam sobie zrobisz lampke pwm o wiele prościej, co prawda na dwie diody ale i to dobre na początek...
  • REKLAMA
  • #3 7808015
    tek-no-logical
    Poziom 16  
    Spróbuj zdefiniować zmienną state wewnątrz funkcji:

    
    #include <avr/io.h>
    
    #define PIN_R (1 << PB4)
    #define PIN_B (1 << PB5)
    #define PIN_G (1 << PB3)
    
    
    typedef unsigned char ui08;
    typedef unsigned int ui16;
    
    
    void hsv_inc(ui08 *r, ui08 *g, ui08 *b)
    {
    	static char state = 0;
    	switch(state){
    	case 0 : *r = 255; *g = 0; *b += 1;
    			 if (*b == 255) { state = 1; }
    			 break;
    
    	case 1 : *r -= 1; *b = 255; *g = 0;
    			 if (*r == 0) { state = 2; }
    			 break;
    			 
    	case 2 : *r = 0; *b = 255; *g += 1;
    			 if (*g == 255) { state = 3; }
    			 break;
    
    	case 3 : *r = 0; *b -= 1; *g = 255;
    			 if (*b == 0) { state = 4; }
    			 break;
    
    	case 4 : *r += 1; *b = 0; *g = 255;
    			 if (*r == 255) { state = 5; }
    			 break;
    
    	case 5 : *r = 255; *b = 0; *g -= 1;
    			 if (*g == 0) { state = 0; }
    			 break;
    
    	default :break;
    	} // switch
    } // hsv_inc(ui08 *r, ui08 *g, ui08 *b)
    
    int main()
    {
    	ui08 r, g, b, i = 0;
    	ui16 r_max = 50, g_max = 0, b_max = 0;
    	ui16 t = 0;
    
    	DDRB = PIN_R | PIN_G | PIN_B;
    	PORTB = PIN_R | PIN_G | PIN_B;
    
    	while(1){
    		i++;
    		t++;
    		if(t >= 1800) {	t = 0; hsv_inc(&r, &g, &b);	}
    
    		if (r > (i + r_max)) { PORTB &= ~PIN_R; }
    						else { PORTB |=  PIN_R; }
    
    		if (g > (i + g_max)) { PORTB &= ~PIN_G; }
    						else { PORTB |=  PIN_G; }
    						
    		if (b > (i + b_max)) { PORTB &= ~PIN_B; }
    						else { PORTB |=  PIN_B; }
    	} // while(1)
    
    }
    
  • REKLAMA
  • #4 7808231
    manekinen
    Poziom 29  
    Ten schemat jest jakiś podejrzany... wyjście kanału diody niebieskiej na pinie reset? Przełączasz ten pin jako wyjście I/O? Prawdopodobnie dla tego ciągle świeci na niebiesko a program nie działa z innego powodu.

    Co to za tranzystory?
  • #5 7808680
    Kostka Tomasz
    Poziom 2  
    manekinen napisał:
    Ten schemat jest jakiś podejrzany... wyjście kanału diody niebieskiej na pinie reset? Przełączasz ten pin jako wyjście I/O? Prawdopodobnie dla tego ciągle świeci na niebiesko a program nie działa z innego powodu.

    Co to za tranzystory?


    Wykaz części, symbole zgodne z ofertą tme.pl

    LED1, LED2, LED3 OF-SMD5060RGB
    D1, D2, D3, D4 GL1B
    C1 (330nF) CC0603MRY5V7334
    IC1 (ATTiny13) ATTINY13V-10SU
    IC2 (LP2980) LP2980IM5-5.0
    T1, T2, T3 (bc817) BC817-16
REKLAMA