-
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 ;)