Elektroda.pl
Elektroda.pl
X
Relpol
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

optymalizacja kodu z atmega8 na attiny13

wojtektorr 30 Kwi 2012 22:11 1723 8
  • #1 30 Kwi 2012 22:11
    wojtektorr
    Poziom 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?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 8
  • Relpol
  • #2 30 Kwi 2012 22:36
    McMonster
    Poziom 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.

    0
  • Relpol
  • #3 30 Kwi 2012 22:41
    gaskoin
    Poziom 38  

    Służy do tego program avr-size

    0
  • #4 01 Maj 2012 09:18
    wojtektorr
    Poziom 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ś.

    0
  • #5 01 Maj 2012 10:06
    tmf
    Moderator Mikrokontrolery Projektowanie

    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.

    0
  • #6 04 Maj 2012 11:37
    wojtektorr
    Poziom 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

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 09 Maj 2012 17:53
    wojtektorr
    Poziom 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.

    0
  • #8 09 Maj 2012 18:47
    dondu
    Moderator Mikrokontrolery Projektowanie

    wojtektorr napisał:
    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

    0
  Szukaj w 5mln produktów