eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika › Fast PWM - trójkąt zamiast sinusa na wyjściu
Ilość wypowiedzi w tym wątku: 16

  • 11. Data: 2013-02-18 21:55:57
    Temat: Re: Fast PWM - trójkąt zamiast sinusa na wyjściu
    Od: Atlantis <m...@w...pl>

    W dniu 2013-02-18 21:15, Jakub Rakus pisze:

    > Skoro wypełniasz tablice stałymi wartościami to po co do tego zaprzęgać
    > biednego avr i męczyć go liczeniem funkcji sinus? Policz sobie to w
    > jakimś arkuszu i wrzuć samą tablice gotowych wartości - będziesz miał
    > znacznie krótszy kod.

    Ostatecznie tak właśnie zrobiłem, dzięki temu mogłem dać tablicę jako
    volatile const unsigned char. :)

    Jednak przy pierwszej próbie łatwiej było dać tą linijkę kodu
    wypełniającego tabelę. Oczywiście zlecenie przeliczania wartości Atmedze
    miało tę zaletę, że hex zajmował mniej, ale mam jeszcze na tyle wolnego
    flasha, że nie muszę liczyć bajtów. ;)


  • 12. Data: 2013-02-19 00:56:17
    Temat: Re: Fast PWM - trójkąt zamiast sinusa na wyjściu
    Od: Michoo <m...@v...pl>

    On 18.02.2013 21:55, Atlantis wrote:
    > W dniu 2013-02-18 21:15, Jakub Rakus pisze:
    >
    >> Skoro wypełniasz tablice stałymi wartościami to po co do tego zaprzęgać
    >> biednego avr i męczyć go liczeniem funkcji sinus? Policz sobie to w
    >> jakimś arkuszu i wrzuć samą tablice gotowych wartości - będziesz miał
    >> znacznie krótszy kod.
    >
    > Ostatecznie tak właśnie zrobiłem, dzięki temu mogłem dać tablicę jako
    > volatile const unsigned char. :)
    Dlaczego?

    volatile i const w jednym miejscu znaczy zazwyczaj "kompilatorze, zepsuj
    mi tu optymalizacje".

    Póki masz miejsce we flash to takie rzeczy powinieneś pakować w progmem.

    >
    > Jednak przy pierwszej próbie łatwiej było dać tą linijkę kodu
    > wypełniającego tabelę. Oczywiście zlecenie przeliczania wartości Atmedze
    > miało tę zaletę, że hex zajmował mniej,

    Myślę, ze raczej wynikało to z błędu w kodzie - z tego co widzę sinus
    miał stały argument, więc całe to "liczenie" sprowadziło się do
    podstawienia wartości 131. Liczenie sinusa to nie takie hop-siup bo
    powoduje wciągnięcie całej biblioteki zmiennoprzecinkowej - dodatkowe 4kB.

    > ale mam jeszcze na tyle wolnego
    > flasha, że nie muszę liczyć bajtów. ;)

    Masz eeprom na pokładzie - jak zacznie brakować to użyj go.

    --
    Pozdrawiam
    Michoo


  • 13. Data: 2013-02-20 18:20:51
    Temat: Re: Fast PWM - trójkąt zamiast sinusa na wyjściu
    Od: Atlantis <m...@w...pl>

    W dniu 2013-02-19 00:56, Michoo pisze:

    > Dlaczego?
    >
    > volatile i const w jednym miejscu znaczy zazwyczaj "kompilatorze, zepsuj
    > mi tu optymalizacje".

    Kierowałem się analogią do wyczytanej kiedyś zasady, że wszystkie
    zmienne globalne używane w przerwaniach powinny mieć "volatile" przy
    definicji. "Const" z kolei dałem na wszelki wypadek, aby zabezpieczyć
    się przed możliwością zmiany zawartości tabeli po jej wypełnieniu.
    Rozumiem, że w przypadku stałej "volatile" nie jest wskazane?


    > Póki masz miejsce we flash to takie rzeczy powinieneś pakować w progmem.

    Jak rozumiem masz na myśli użycie avr/pgmspace.h i zdefiniowanie tablicy
    przez:

    prog_char sinus_buffer[] = {wartość 1, wartość 2, .., wartość n};

    oraz odczyt przez:

    pgm_read_byte(&sinus_buffer[sinus_ind])

    ?

    Rozumiem, że przy definicji takiej tabeli nie muszę stosować "volatile",
    nawet jeśli będę się do niej odwoływał w przerwaniu?

    Tak z ciekawości: jak zachowa się program przy próbie zapisania czegoś
    do takiej tabeli, przechowywanej w pamięci programu?


  • 14. Data: 2013-02-20 18:32:35
    Temat: Re: Fast PWM - trójkąt zamiast sinusa na wyjściu
    Od: Atlantis <m...@w...pl>

    I jeszcze jedno: czy odczytywanie wartości z tabeli przechowywanej w
    pamięci flash bardzo spowolni wykonywanie programu? Pytam, ponieważ
    odwołuję się do niej w przerwaniu, a jak wiadomo ono powinno się
    wykonywać jak najszybciej...


  • 15. Data: 2013-03-11 16:43:23
    Temat: Re: Fast PWM - trójkąt zamiast sinusa na wyjściu
    Od: Michal Schulz <m...@t...de>

    Am 20.02.13 18:20, schrieb Atlantis:

    >> volatile i const w jednym miejscu znaczy zazwyczaj "kompilatorze, zepsuj
    >> mi tu optymalizacje".
    >
    > Kierowałem się analogią do wyczytanej kiedyś zasady, że wszystkie
    > zmienne globalne używane w przerwaniach powinny mieć "volatile" przy
    > definicji.

    Marna to zasada bo zbytnio uogolnia.

    >> Póki masz miejsce we flash to takie rzeczy powinieneś pakować w progmem.
    >
    > Jak rozumiem masz na myśli użycie avr/pgmspace.h i zdefiniowanie tablicy
    > przez:
    >
    > prog_char sinus_buffer[] = {wartość 1, wartość 2, .., wartość n};
    >
    > oraz odczyt przez:
    >
    > pgm_read_byte(&sinus_buffer[sinus_ind])

    Dokladnie o to chodzilo. Trzymanie tablicy ze stalymi w RAM to
    marnotrastwo pamieci ktorej Atmel ma dosc malo. Tak samo jak trzymanie
    tam np. wszelkich lancuchow tekstowych.

    > Rozumiem, że przy definicji takiej tabeli nie muszę stosować "volatile",
    > nawet jeśli będę się do niej odwoływał w przerwaniu?

    Ale po co tam mialo by byc volatile? to slowo informuje kompilator, ze
    zawartosc pamieci moze ulec zmianie w sposob dla kompilatora malo
    przewidywalny, innymi slowy kompilatorowi nie wolno optymalizowac
    dostepu do zmiennej.


  • 16. Data: 2013-03-11 16:49:11
    Temat: Re: Fast PWM - trójkąt zamiast sinusa na wyjściu
    Od: Michal Schulz <m...@t...de>

    Am 20.02.13 18:32, schrieb Atlantis:
    > I jeszcze jedno: czy odczytywanie wartości z tabeli przechowywanej w
    > pamięci flash bardzo spowolni wykonywanie programu? Pytam, ponieważ
    > odwołuję się do niej w przerwaniu, a jak wiadomo ono powinno się
    > wykonywać jak najszybciej...

    trzy cykle CPU zamiast dwoch. Tyle co nic.

    ps: nie napisales jakiego typu jest zmienna sinus_ind w twoim kodzie,
    zakladam ze 16-bitowa (typ int). Poniewaz twoja tablica sinusa ma 256
    bajtow mozesz uzyc 8-bitowego typu i napisac "brzydki" kod:

    unsigned char sinus_ind;

    ISR (TIMER0_OVF_vect)
    {
    OCR1A = pgm_read_byte(&sinus_buffer[sinus_ind++])

    TCNT0 = 182;
    }

    zmienna sinus_ind "przepelni sie" sama, po wartosci 255 kolejna
    inkrementacja ustawi zmienna na 0. "if ... else ..." mozesz sobie odpuscic.

    Tak tak, to jest brzydki styl ;)

strony : 1 . [ 2 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: