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

Atmega8 pwm, sterowanie diodą RGB

robertt_2008 17 Sty 2012 12:40 2259 4
  • #1 17 Sty 2012 12:40
    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 :

    Code:
      #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]

    0 4
  • #2 17 Sty 2012 13:05
    tmf
    Moderator Mikrokontrolery Projektowanie

    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.

    0
  • #3 17 Sty 2012 13:14
    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.

    0
  • #4 17 Sty 2012 13:42
    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. :(

    0
  • #5 21 Sty 2012 14:34
    xyz541
    Poziom 9  

    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ę

    0
  Szukaj w 5mln produktów