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.

Atmega 169 - Problem z konfiguracją PWM

vovuvo 17 Sty 2016 15:16 681 8
  • #1 17 Sty 2016 15:16
    vovuvo
    Poziom 8  

    Witam

    Chciałbym napisać program, który będzie obsługiwał 12 diodek ze zmianą jasności świecenia każdej z nich. Chciałbym jednak najpierw zacząć od obsługi pojedynczej diody, żeby zając się potem częścią stricte programistyczną.

    Żadna z nich nie jest wyprowadzona do nóżki OC0A , OC1A, OC1B.

    Zdecydowałem się na tryb CTC, użyłem licznika drugiego.

    Poniższy program ma regulować jasność świecenia świecenia jednej diody od 0 do 255 i z powrotem w dół. Diodka odpala, ale jej jasność się nie zmienia.

    Co tu może być źle ? Nieprawidłowa konfiguracja rejestrów? Nie ten licznik? Nie wiem czy zmienna cnt inkrementuje się, jest jakaś możliwość podejrzenia tej zmiennej ? Korzystam z Atmel Studio 6.

    Oto kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    datasheet:

    http://www.atmel.com/images/doc2514.pdf[/code]

    0 8
  • Pomocny post
    #2 17 Sty 2016 15:22
    BlueDraco
    Specjalista - Mikrokontrolery

    Dlaczego nie wziąłeś mikrokontrolera z odpowiednią liczbą wyjść PWM albo zewnętrznego układu sterownika LED PWM?

    Jeśli już musisz tak plątać - u Atmela znajdziesz starą, dobrą notę aplikacyjną nt. programowego PWM - szukaj.

    0
  • Pomocny post
    #4 17 Sty 2016 15:28
    excray
    Poziom 39  

    Jeszcze uwaga co do jednej linijki w przerwaniu. Powinno być w niej:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 17 Sty 2016 23:08
    vovuvo
    Poziom 8  

    Działa, dziękuję

    Mam jednak następny problem:

    pod adresem PC6 mam przycisk (numeracja od 0 do 7)

    czyli DDRC=0xBF; ustawia pin 7 jako wejście

    while(PINC & 0x80){
    gdy przycisk wciśnięty -wykonuj program
    }

    gdy wstawię:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    to program działa niezależnie od tego czy przycisk jest wciśnięty czy nie. Co robię źlę?

    0
  • #7 17 Sty 2016 23:27
    vovuvo
    Poziom 8  

    Wciśnięcie powoduje zwarcie do masy.

    Kolejne pytanie:

    Utworzyłem sobie 12 zmiennych typu volatile uint8_t

    Chce teraz stworzyć tablice 12 elementową, do której przypisze te zmienne i będę je sobie wybierał pętlą w programie. Niestety przy takiej inicjalizacji;

    volatile uint8_t tablica[11]={pwm1,pwm2,pwm3,pwm4,pwm5,pwm6,pwm7,pwm8,pwm9,pwm10,pwm11,pwm12};

    Program wyświetla błąd, że element inicjalizujący nie jest stałą.
    wyrażenie tablica[0]=pwm1 również nie działa.

    Jest jakiś sposób żeby to obejść? przypuszczam, że chodzi o typ volatile...

    0
  • #8 17 Sty 2016 23:36
    dondu
    Moderator Mikrokontrolery Projektowanie

    Ponieważ nie włączyłeś wewnętrznego rezystora pull-up to rozumiem, że dodałeś zewnętrzny?
    Gdy przycisk zwiera do masy to znaczy, że gdy jest wciśnięty na pinie jest 0 logiczne, w związku z czym stan ten wykrywa się tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Poza tym jeśli PC6 to:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    ale najlepiej używaj przesunięć bitowych:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    a program będzie czytelny i się nie pomylisz.

    while musi mieć więc postać:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Co do tablic, dodatkowe zmienne nie są Ci potrzebne. Zmienną będzie np. tablica[4].

    0
  • #9 18 Sty 2016 08:42
    BlueDraco
    Specjalista - Mikrokontrolery

    Utwórz tablicę 12 wypełnień, a nie 12 zmiennych i 11-elementową tablicę niewiadomo czego, jak to obecnie próbujesz zrobić.

    Przeczytaj notę aplikacyjną Atmela o programowym PWM - masz tam gotowy kod.

    0