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

Wykorzystanie 3 liczników do generowania 6 sygnałów PWM na Mega328P

mumin_80 27 Paź 2011 10:31 1595 19
  • #1 10070492
    mumin_80
    Poziom 12  
    Witam
    Chciałbym skorzystać z trzech dostępnych w Atmedze328P liczników do generowania 6 niezależnych sygnałów PWM do sterowania diodami LED.
    Napisałem program ale w symulatorze nie działa on zgodnie z oczekiwaniami i co gorszę działa niezgodnie z notą katalogową atmegi.
    Czy jest błąd w moim kodzie czy jest błąd w nocie katalogowej ? Może jest jeszcze jakiś bug w symulatorze, używam AVR Studio 4.18.

    Kod przedstawiam poniżej:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Opis moich problemów:
    - licznik 0 działa bez zarzutu :), liczy do max 255 i przy odpowiedniej wartości rejestru porownań ustawia wyjścia
    - licznik 1 liczy do wartości 255 a następnie zamiast się zerować liczy w dół, wyjścia ustawia
    - licznik 2 zlicza do wartości 255 ale nie ustawia odpowiednich sygnałów na wyjścia przy odpowiedniej wartości rejestru porowań, ustawia tylko flagę przerwania

    Czy może o czym zapomniałem ?

    Chyba, ze całość jest "nieodpowiednia" i macie inny pomysł na sterowania 6-cioma diodami LED?

    Dzięki za uwagi
    mumin_80
  • #2 10070662
    Konto nie istnieje
    Poziom 1  
  • #3 10070705
    mumin_80
    Poziom 12  
    Zgadza się, tak powinno być:
    OCR1A=128;
    OCR1B=3;
    TCCR1A=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);
    TCCR1B=(1<<CS10)|(1<<WGM12);
    i tak testowałem, sorry za pomyłkę w kodzie.

    Niestety to nie pomaga.
    Podczas symulacji rejestry są ustawiane zgodnie z kodem.

    Stawiam na bug w symulatorze ale czy to możliwe ?
  • Pomocny post
    #4 10070786
    Konto nie istnieje
    Poziom 1  
  • #5 10070811
    mumin_80
    Poziom 12  
    Nie wiem czemu ustawiasz WGM11 i WGM13.
    Według noty powinno być ustawione tylko WGM10 i WGM12 do ustawienia licznika 8 bitowego, MOD 5.

    Wykorzystanie 3 liczników do generowania 6 sygnałów PWM na Mega328P

    mumin_80
  • #6 10070905
    dondu
    Moderator na urlopie...
    1. Zacznij od wklejenia programu zgodnie z zasadami panującymu na forum:


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



    2. Przestań wróżyć by na 9 stopniu schodów piekielnych nie stać:

    mumin_80 napisał:
    ... i co gorszę działa niezgodnie z notą katalogową atmegi.
    ... czy jest błąd w nocie katalogowej ?

    Może jest jeszcze jakiś bug w symulatorze, używam AVR Studio 4.18.
    ...
    Stawiam na bug w symulatorze ale czy to możliwe ?



    3. Opisz dokładnie co oznacza:

    mumin_80 napisał:
    Napisałem program ale w symulatorze nie działa on zgodnie z oczekiwaniami ...



    4. Z jaką prędkością działa uC - 11.059.200Hz ?
  • Pomocny post
    #7 10070916
    Konto nie istnieje
    Poziom 1  
  • #8 10070927
    mumin_80
    Poziom 12  
    voytaschec
    Jak uruchamiam pojedynczo liczniki to jest ten sam efekt.
    dondu
    uC działa na 11059200.

    mumin_80
  • #10 10070985
    mumin_80
    Poziom 12  
    Dondu
    Większość twoich pytań to stwierdzenia więc nie mam co na nie odpowiadać.
    Kwestia problemu jest opisana w pierwszym poście:

    Opis moich problemów:
    - licznik 0 działa bez zarzutu :), liczy do max 255 i przy odpowiedniej wartości rejestru porównań ustawia wyjścia
    - licznik 1 liczy do wartości 255 a następnie zamiast się zerować liczy w dół, wyjścia ustawia
    - licznik 2 zlicza do wartości 255 ale nie ustawia odpowiednich sygnałów na wyjścia przy odpowiedniej wartości rejestru porówań, ustawia tylko flagę przerwania

    Program, który przedstawiłem w pierwszym poście ( z drobną poprawką uwzględnioną poniżej w wątku ) jest symulowany w programie AVR Studio.
    Według programu np. licznik 1 powinien liczyć do 255 a następnie się zerować i podczas gdy wartość rejestrów OCR1A i ORC1B jest równa wartości licznika to powinien ustawiać stan niski na odpowiednie wyjścia OC1B i OC1A. Po przepełnieniu licznika wyjścia powinny być w stanie wysokim. Prościej nie umiem.

    Z kolei licznik 2 liczy poprawnie tj do 255 a następnie się zeruje ale nie ustawia stanu niskiego jak OCR2A i OCR2B jest równy wartości licznika.

    mumin_80
  • #11 10071013
    dondu
    Moderator na urlopie...
    mumin_80 napisał:
    Większość twoich pytań to stwierdzenia więc nie mam co na nie odpowiadać.

    Jeżeli już to 50%, a skoro nie ma co na nie odpowiadać, to skąd te następne 8 linijek Twojego posta? I gdzie te wszystkie informacje były zawarte w pierwszym poście?
    Czy nie można było tego napisać zaraz po moim pytaniu?

    Wklej w całości program, który odpowiada temu, co właśnie opisałeś.
  • Pomocny post
    #12 10071016
    _Robak_
    Poziom 33  
    Proszę poprawić pierwsze posty i kod wkleić w znacznikach
    A co do tematu to w AVR 4 studio jest błąd w symulacji PWMów.
  • #13 10071045
    mumin_80
    Poziom 12  
    _Robak_
    Dzięki za info o problemach z symulacją PWN w AVR.

    Kod:

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


    mumin_80
  • #14 10071074
    dondu
    Moderator na urlopie...
    No to po kolei:
    mumin_80 napisał:
    Opis moich problemów:
    - licznik 1 liczy do wartości 255 a następnie zamiast się zerować liczy w dół, wyjścia ustawia

    Czyli jaki tryb chcesz ustawić?

    Pytam ponieważ masz ustawiony: PWM, Phase Correct, 8-bit i dlatego się nie zeruje tylko liczy w dół:

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


    oraz
    Cytat:
    Clear OC1A/OC1B on Compare Match when upcounting.
    Set OC1A/OC1B on Compare Match when downcounting.


    No chyba, że źle patrzę w datasheet.


    EDIT:
    A co ustawiasz bitem WGM20 w rejestrze TCCR1B ?????
    Tam nie ma takiego bitu.
  • #15 10071141
    mumin_80
    Poziom 12  
    chce ustawić tryb 5:
    WGM12 na 1, i WGM10 na 1.
    Poprawiłem kod który zacytowałem bo był w nim błąd ale niestety to nie pomogło.
    Teraz mam:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Licznik nadal liczy do 255 a następnie w dół.

    mumin_80
  • #17 10071187
    mumin_80
    Poziom 12  
    Sprawdzam wartość rejestru TCNT1.
    Być może jest bug.

    mumin_80
  • #18 10071199
    dondu
    Moderator na urlopie...
    mumin_80 napisał:
    Być może jest bug.

    A Ty znowu swoje, a już okazało się, że jeden błąd w programie miałeś.
    Więc zanim stwierdzimy kategorycznie, że to bug, może najpierw poprawimy program?

    Jak według Ciebie powinien liczyć licznik przy takich ustawieniach jak masz?
    Czy 255 to inna granica TOP niż się spodziewasz?
  • #19 10071210
    mumin_80
    Poziom 12  
    Chcąc skorzystać z mod 5 chcę żeby po osiągnięciu wartości 255 licznik się wyzerował i zaczął liczyć od zera tak jak przy innych licznikach.
    W poście powyżej jest tabelka z noty technicznej, jest w niej napisane że wartość top to 0xFF i tego oczekuje ale dlaczego po osiągnięciu tej wartości i przy podanej konfiguracji licznik liczy w dół ?

    mumin_80
REKLAMA