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

[ATtiny13][C]Kompilacja - fragmentami ok, w całości już niekoniecznie

jakosek 07 Lip 2011 16:08 1179 7
  • #1 9692708
    jakosek
    Poziom 13  
    Próbuję napisać prosty programik który mierząc napięcie z czujnika wysteruje wskaźnik z samochodowego licznika. Do tego wykorzystuję ADC i 2xPWM czyli ATtiny13 jest idealny do tego celu. Jednak przy kompilacji całego programu wychodzi mi 400% danych i 400% pamięci. Kiedy próbuję kompilować kod fragmentami (oddzielnie odczyt ADC i oddzielnie funkcję obliczającą wypełnienie) to program zajmuje ok 10% a RAM 25%.

    Podpowiedzcie czy wszystko jest zgodnie z zasadami sztuki - to moje pierwsze starcie z programowaniem i fragmenty kodu są zaczerpnięte z internetu i dostosowane do moich potrzeb zgodnie z datasheetem ATtiny.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 9692758
    gaskoin
    Poziom 38  
    Nie ma się co dziwić, kompilator dołącza bibliotekę do obsługi liczb zmiennoprzecinkowych która ma z 2-3 kb
  • #3 9692764
    jakosek
    Poziom 13  
    jeżeli wykomentuję odczyt ADC i podstawię vmap jakąś stałą to nawet ze zmiennoprzecinkowymi kompiluje się i zajmuje 10%.
    
    //vmap = ReadADC();
    vmap = 400;
    


    Taka zmiana powoduje że funkcja śmiga i liczy co trzeba a przecież używa zmiennoprzecinkowych?
  • #4 9692787
    gaskoin
    Poziom 38  
    Nie prawda, wtedy ta wartość jest znana na etapie kompilacji i kompilator sam oblicza wartości i je wstawia, nie musi zostawiać tego dla procesora. Samo istnienie liczb zmiennoprzecinkowych to jedno, obliczenia na nich to drugie :)
  • #5 9692802
    jakosek
    Poziom 13  
    to może jakaś propozycja obliczenia tego na sposób strawny dla mojego procesorka?
  • #6 9692813
    tmf
    VIP Zasłużony dla elektroda
    Jest jeszcze gorzej, bo autor pewnie nie dołączył libm i zmaiast 2-3kB komipator generuje jeszcze ze 2x tyle. Co nie zmienia faktu, że obliczenia zmiennopozycyjne na ATTiny13 nie pójdą. Na pocieszenie dodam, że w prezentowanym programie takie obliczenia absolutnie nie są potrzebne.
  • #7 9692941
    szelus
    Poziom 34  
    Stablicuj wartości. Tzn. najpierw ogranicz zakres vmap (przeskalowując odczyt ADC) do liczby położeń wskazówki, które chcesz wspierać, np. 100.
    Następnie zrób sobie arkusz w Excell-u i oblicz wartości pwm1 i pwm2 dla wszystkich wartości vmap. Otrzymane tablice wpisz do flash-a i indeksuj wyliczonym vmap.
  • #8 9693018
    jakosek
    Poziom 13  
    Z pomocą kolegi tak właśnie wygląda teraz program, ja jeszcze do tablic swoją wiedzą nie siegam.
    Arkusz w excelu to już miałem zanim zacząłem pisać program - stąd ten wzór w pierwszym poście.

    Teraz już tylko programowanie i podłaczenie wszystkiego, ale to już mam jakąś koncepcję, tylko mi komp z LPT padł i nie mam jak zaprogramować ;)

    Wszystkim udzielającym sie - dziękuję za wskazówki, temat zamykam.
REKLAMA