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

Atmega16 C - Regulacja mocy wiania, problem z instrukcją switch i PWM

Jeżyk-1 03 Kwi 2013 10:03 1317 10
  • #1 12147952
    Jeżyk-1
    Poziom 25  
    Witam. Próbuję zrobić regulację mocy wiania za pomocą atmegi16 i timera0 - fast PWM. Koncesje mam taką że w pętli głównej jest prosty warunek który będzie włączał ustawienia timera0 w trybie fast PWM lub CTC. Dalej mam switcha z menu głównym i pod switchem jako pod menu.

    kod w skrócie wygląda tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    On jest dopiero w fazie tworzenia więc jeszcze sporo tu brakuje. Lecz nie mogę poradzić sobie z regulacją mocy. Po wprowadzeniu warunku :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    I dodaniu linii kodu do switch :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    zachowuje się jak by całkiem wyszedł z tego menu i mogę tylko poruszać się po głównym menu.
    Ktoś może doradzić jak się z tym uporać ?
  • #2 12148090
    jumpee
    Poziom 13  
    kolega nie jestem szpecem w C ale na pierwszy rzut oka po co po else stosujesz kolejny warunek if ??
  • #3 12148098
    Jeżyk-1
    Poziom 25  
    Mówisz o : if(grzanie_chlodzenie==2)
    Ponieważ to jest drugi warunek a trzecim jest 0 który nie robi nic.
  • #4 12148156
    BlueDraco
    Specjalista - Mikrokontrolery
    Masz więcej problemów z if - then - else, bo wcięcia nie są informacją dla kompilatora. Rada dla początkujących - zawsze używaj nawiasów {} przy każdym bloku if i else - inaczej się pogubisz, czego przykład mamy powyżej.

    Dołóż te nawiasy, przeformatuj kod, sprawdź, a jeśli nadal nie działa - pokaż.

    Masz również błędnie rozpisane switch. Jeśli w każdym case robisz to samo (locate(0,0)) - to wyrzuć to przed switch.
  • #5 12148225
    Jeżyk-1
    Poziom 25  
    Ale przecież w tym warunku i w else if tez są nawiasy {}
  • #6 12148301
    jumpee
    Poziom 13  
    to ok ale już to jest dla mnie mocno nieczytelne :
    if(przycisk_wcisniety==UP){
    moc_w++;
    if(moc_w>255)moc_w=1;
    }
    if(przycisk_wcisniety==DOWN){
    moc_w--;
    if(moc_w<1)moc_w=255;
    }

    i myślę że tu tkwi problem, zamiast stosować kolejne if w pierwszym wyrażeniu zastosuj dwa warunki przycisk_wcisniety==UP i moc_w>255
  • #7 12148397
    Jeżyk-1
    Poziom 25  
    To funkcja działa. Wcześniej sprawdzałem sama zmiana wartości i działa. W połączeniu z warunkiem grzanie_chlodzenie nie działa.
    Gdy na końcu nie ma przypisania grzanie_chlodzenie=1; to samo menu działa. nadam te przypisanie i nie działa już.
  • #8 12148429
    BlueDraco
    Specjalista - Mikrokontrolery
    Zrób poprawki, o których pisałem, zrób poprawne wcięCia pokazujące strukturę kodu, a potem go pokaż.
  • #9 12148481
    Jeżyk-1
    Poziom 25  
    Zanim mi odp. to zrobiłem coś takiego

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    I działa tak jak ma :)
    Tylko nie zmniejszają się obroty do 0 Na najniższej wartości kręci się powoli a chciałbym by w ogóle się nie kręcił. Co mógłbym w takim przypadku zrobić?
  • #10 12148675
    BlueDraco
    Specjalista - Mikrokontrolery
    Zapewne mógłbyś zmniejszyć obroty do zera... ;) Skoro nie chcesz pokazać schematu i kodu, to zatrudnij wróżkę.
  • #11 12148698
    Jeżyk-1
    Poziom 25  
    Już chyba doszedłem do tego.
    Mam wentylator 4pinowy i pinem PWN regulowałem obroty. Lecz nawet jak zwarłem ten pin na stałe do masy to nadal kręcił się tak jak przy regulacji przez mikro-kontroler.
    Wiec z tego wynika że to nie moja wina, tylko konstrukcja samego wentylatora nie pozwala na zjechanie z obrotami do zera?
    Jeżeli tak to zastosuje dodatkowo jakiś mały przekaźnik by odłączał go całkiem przy 0 wartości :)
REKLAMA