Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

optymalizacja kodu z atmega8 na attiny13

wojtektorr 30 Apr 2012 22:11 1963 8
Relpol
  • #1
    wojtektorr
    Level 14  
    Witam serdecznie, jestem początkującym jeśli chodzi o programowanie w c na avr. Celem mojego zadania jest zaprojektowanie termostatu z użyciem czujnika temperatury dwóch diod sygnalizujacych, przycisku do programowania termostatu oraz przekaźnika jako elementu wykonawczego. Poniższy kod napisałem na atmega8 jednak można byłoby zastosować uboższego avr (attiny13). Problem mój polega na objętości kodu, czy da się poniższy kod zmieścić w attinie13?
    Code: c
    Log in, to see the code
  • Relpol
  • #2
    McMonster
    Level 32  
    Zakładając, że wziąłeś już pod uwagę wszystkie inne różnice w peryferiach tych dwóch układów wykorzystywanych w programie (timery, liczba pinów itp.) i że używasz WinAVR, to po każdej kompilacji powinieneś dostawać informację o zajętości pamięci układu.
  • #3
    gaskoin
    Level 38  
    Służy do tego program avr-size
  • #4
    wojtektorr
    Level 14  
    Jeśli chodzi o wymagania co do attiny13 to je spełnia jeden timer wystarczy pinów też ma wystarczająco jedyne ograniczenie to ilość pamięci programu ma tylko 1 KB, a powyższy kod zajmuje ok 2 KB. Jestem początkującym dlatego z pewnością są w kodzie rozkazy które można zapisać krócej zwięźlej i dlatego pytam czy można go tak zmodyfikować żeby o połowę go zmniejszyć. A jeśli nie o połowę o ile sie tylko da, poprostu zoptymalizować ten kod. Jeszcze sprawdzę ten program który poleciłeś.
  • #5
    tmf
    Moderator of Microcontroller designs
    Możliwości optymalizacji jest wiele, niektóre z nich:
    1. Wywal rejestr|=cośtam i zmień na rejestr=cośtam. Oszczędzasz na każdym takim odwołaniu 2 instrukcje. Funkcjonalnie to nie jest to samo, ale ty inicjalizujesz peryferia i ich stan poprzedni cię nie interesuje.
    2. Nie wszystkie zmienne muszą być volatile.
    3. Wielokrotne if'y w time_key można zastąpić switch/case z zakresami (rozszerzenie gcc) lub po prostu tablicą.
    4. Użyta biblioteka 1-wire - pewnie też ją można nieźle uprościć. Niby wykrywasz wszystkie czujniki ale pomiar jest tylko z pierwszego. Więc jaki to ma sens? Lepiej założyć, że czujnik jest jeden, olać całe search ROM, match ROM itd. Dać skipROM i czytać pierwszy. To gdzieś o ponad połowę skróci obsługę OW.
    5. Być może sekundy i cnt można zdefiniować jako register - to znacznie skróci ISR i kod w paru innych miejscach. Być może to samo można zrobić z paroma innymi zmiennymi.
    6. Czy naprawdę nie da się wybrać takiego zegara, aby licznik nie mógł wprost liczyć sekund?

    Takich optymalizacji jest więcej, najlepiej przejrzyj wygenerowany kod assemblerowy po kompilacji (plik lss) i oglądając go zastanów się co jeszcze można uprościć.
    Kolejna rzecz, ale to już bardziej skomplikowane - to zmiana skryptów startowych kodu C i tablicy wektorów przerwań. Kod można umieścić wcześniej, w miejsce niewykorzystanych wektorów przerwań. Nie musisz też inicjalizować sekcji bss itd (nostartupfiles). Warto też pomyśleć nad opcjami linkera - noinline, mcall-prologues itd. Funkcja main nigdy się nie kończy, może więc mieć atrybut OS_main. Itd.
  • #6
    wojtektorr
    Level 14  
    Optymalizujac main.c zdałem sobie sprawę że za nie zmieszcze tego programu na attiny13 dopóki nie okroję pliku onewire.c do obsługi czujnika. Mam z tym problem bo nie wiem co można usunąć co zostawić. Używam w sumie jedynie trzech funkcji w programie głównym: search_sensors(); DS18X20_start_meas(); i DS18X20_read_meas(); proszę o pomoc, poniżej kod onewire.c
    Code: c
    Log in, to see the code
  • #7
    wojtektorr
    Level 14  
    Dałem sobie spokój z ds18b20 i zrobiłem odczyt temperatury przy użyciu przetwornika ADC i układu TC1047, kod odrazu o połowę lżejszy. Teraz mam pytanie odnośnie źródła napięcia odniesienia. Czy do pomiaru temperatury tym sposobem wewnętrzne źródło napięcia odniesienia jest lepszym wyborem czy napięcie Vcc jako napięcie odniesienia? Które dokładniejsze? Chodzi mi tu o dokładność do ok 0,5 stopnia.
  • #8
    dondu
    Moderator on vacation ...
    wojtektorr wrote:
    Teraz mam pytanie odnośnie źródła napięcia odniesienia. Czy do pomiaru temperatury tym sposobem wewnętrzne źródło napięcia odniesienia jest lepszym wyborem czy napięcie Vcc jako napięcie odniesienia? Które dokładniejsze? Chodzi mi tu o dokładność do ok 0,5 stopnia.

    Sprawdź w datasheet lub poczytaj tutaj: ADC - Dokładność vs podłączanie