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

Atmega8 pwm, sterowanie diodą RGB

robertt_2008 17 Sty 2012 12:40 2472 4
REKLAMA
  • #1 10409207
    robertt_2008
    Poziom 10  
    Witam speców.:P
    Chciałem sterować diodą RGB za pomocą Atmegi8.
    Część programu ściągnąłem z jakiejś strony a część napisałem sam.
    Jednak moje umiejętności C++ nie pozwalają mi napisać do końca tego programu, ponieważ nie wiem jak sterować 3-cią nóżką diody.
    Chyba trzeba wykorzystać OCR2 ale nie wiem jak to napisać w C++.
    Proszę o pomoc.
    Oto mój program :

      #include <avr/io.h>             
        #include <avr/interrupt.h>     
        #include <stdlib.h>
        #include <util/delay.h>
        #define F_CPU 1000000L
    	
        volatile uint16_t pwmA;
        volatile uint16_t pwmB;
    	void A(void);
    	void A1(void);
    	void B(void);
    	void B1(void);
    	int a,b;
    	
        void PWM_Init (void)
        {
        TCCR1B|=(1<<WGM12)|(1<<CS10);        
        TCCR1A|=(1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);       
        TIMSK |= (1 << TOIE1); 
         sei();
        OCR1A = 0; 
        OCR1B = 0; 
         }
    
        SIGNAL (SIG_OVERFLOW1)
        {
         OCR1A=pwmA;
         OCR1B=pwmB;
        }
        void main(void)
        {
    	 
            DDRB=0xff;
    	DDRC=0X00;
    	PORTC=0Xff;
    		
            PWM_Init();
            pwmA=a;
            pwmB=b; 
    
    	while(1)
    	{
    	
    	if(!(PINC & 0X01)) A();
    	if(!(PINC & 0X02)) A1();
    	if(!(PINC & 0X04))  B();
    	if(!(PINC & 0X08))  B1();
    
    	}
           } 
    
    	void A(void)
    	{
    	_delay_ms(5);
    	a=a+5;
    	if(a<=255) main();
    	else if (a>255) a=255;
    	
    	}
    	
    	void A1(void)
    	{
    	_delay_ms(5);
    	a=a-5;
    	if(a>=0) main();
    	else if (a<0) a=0;
    	}
    	
    	void B(void)
    	{
    	
    	_delay_ms(5);
    	b=b+5;
    	if(b<=255) main();
    	else if (b>255) b=255;
    	
    	}
    	void B1(void)
    	{
    	
    	_delay_ms(5);
    	b=b-5;
    	if(b>=0) main();
    	else if (b<0) b=0;
    	}
    [code]
  • REKLAMA
  • #2 10409297
    tmf
    VIP Zasłużony dla elektroda
    Po pierwsze piszesz w C a nie C++. Po drugie, poczytaj o timerach, trybie PWM i funkcji pinów OCR i wszystko stanie się jasne.
  • REKLAMA
  • #3 10409318
    gaskoin
    Poziom 38  
    I nie wywołuj nigdzie maina. Jak zaczynałem programowanie to okazał się to "świetny" pomysł na "resetowanie" programu. Ale odkłada on sobie tego maina na stos wywołań i pewnym momencie stos ten może się skończyć wysypując program :) wtedy niestety już tylko ręczny reset pomaga.

    Jak już musisz (w co wątpię) resetować program, to użyj do tego watchdoga.
  • REKLAMA
  • #4 10409380
    robertt_2008
    Poziom 10  
    O. to teraz już wiem dlaczego mi się czasem zacina ten program . Dzięki kolegom za pomoc. Dopiero raczkuję w tym języku więc proszę o wyrozumiałość:)

    Dodano po 9 [minuty]:

    A jednak to nie przez maina mi się program czasem zacina gdy przyciskam switche. :(
  • #5 10427799
    xyz541
    Poziom 10  
    Witam Kolegów.Mam zamiar zrobić układ sterowania wentylatorem w zasilaczu. Sterowanie ma być z użyciem atm8 i PWM, i czujnikami ds1820 umieszczonymi na radiatorze.
    Pytanie jest, czy można wykorzystać wartość odczytanej temperatury jako sygnał do sterowania PWM. Np zmiana temp, powodowała by zmianę wypełnienia PWM
    jestem początkującym amatorem i będę wdzięczny za informację
REKLAMA