M@ciej pisze: W ogóle jestem pozytywnie zaskoczony ilością generowanego kodu. W Bascomie programik (akurat nie ten) zajął mi prawie kilobajt miejsca, a tutaj niecałe 200 bajtów (ilość danych wpisywanych do procka).
W temacie ilości kodu możesz się nie raz przejechać na C. Ja pamiętam dwa elementy na które trzeba uważać, ale może ktoś jeszcze coś dorzuci.
- Biblioteka matematyczna i wykorzystanie zmiennych typu float. Jedna taka zmienna i do flesza ładuje się wersja okrojona (około 1kB kodu gratis). Jeśli potrzebujesz funkcji matematycznych typu sinus, potęga czy pierwiastek, dostajesz pełną wersję biblioteki matematycznej (2kB). W ten sposób błędne ustawienie makefile powoduje że do klasycznego '2313 nie zmieścisz testowego programu migającego LEDem.
- Zbędne funkcje (tutaj walczyłem z Eclipse, WinAVR ma inna domyśle ustawienia). O ile skompilowanie wszystkich funkcji z każdej użytej biblioteki (nawet gdy wrzuciłeś w kod kilka bibliotek na zapas) ma sens, to wrzucenie ich wszystkich do flesza stosuje się tylko gdy tworzysz coś na kształt biosu czy systemu operacyjnego (co domyślnie tworzy eclipse). Dopisanie kilku dodatkowych instrukcji do makefile powoduje, że do flesza trafią tylko funkcje z których korzystasz, a biblioteka-kombajn do obsługi 10 różnych wyświetlaczy graficznych zamiast zajmować 10kB, wypluje z siebie tylko kod dla twojego LCD i cały program schudnie nawet o połowę.
M@ciej pisze: A z problemem instrukcji warunkowych poradziłem sobie w ten sposób, że potworzyłem zagnieżdżone warunki i nie było kłopotów z operatorami.
To jest zły nawyk, choć podejście przydaje się przy debugowaniu i operacjach na peryferiach gdzie trzeba zachować kolejność operacji/odczytów.
Jeśli zastosujesz zagnieżdżenie kilku IFów jeden w drugim, kompilator może pominąć zbędne IFy (takie w których wynik zawsze będzie TRUE albo FLASE) ale reszta zostanie wykonana dokładnie krok po kroku bez optymalizacji pomiędzy poszczególnymi IFami. Gdy upchniesz wszystko w jeden większy warunek, kompilator ma większe pole do optymalizacji co zazwyczaj jest elementem pożądanym.
Odwrotnie sprawa miała się w przypadku Bscoma (przynajmniej ~10 lat temu gdy jeszcze z niego korzystałem). Tutaj wyrażenia matematyczne i logiczne powinny być możliwie proste i krótkie, gdyż kompilator nie chciał przyjąć i przetrawić dłuższych. Ale taka jest natura języka Basic.
M@ciej pisze: Powinienem wiedzieć, że w instrukcjach warunkowych trzeba stosować przyrównanie a nie przypisanie.
Znowu nie ogarniam co autor miał na myśli.
W kodzie z pierwszego postu, wszędzie w instrukcjach warunkowych masz użyte porównania, nie przypisania. O co więc chodzi?
Oddzielną kwestią jest fakt, że masz rację. Wpisanie = zamiast == wewnątrz warunku powoduje że program za nic nie chce działać zgodnie z założeniami. No a znalezienie tego błędu wymaga uważnego prześledzenia całego kodu.
Wojtek pisze:M@ciej pisze:Wow, nawet nie wiedziałem, że są sprzętowe układy eliminujące drgania styków (debounce). Jednak kondek 100nF równolegle do switcha to najprostsze rozwiązanie (nie zawsze najlepsze).
Masz o tym napisane w nocie którą wcześniej podlinkowałem, wprawdzie tam jest to opisane na przykładzie pinu reset ale zjawisko jest takie samo, więc dobrze przy stosowaniu kondensatora dołożyć w szereg niewielki rezystor.
Z kondensatorem się zgadzam. Sam zazwyczaj nie stosuję kondensatorów na płytkach stykowych z powodu lenistwa (wstyd się przyznać, dokładam go dopiero jak coś nie działa), jednak przy rysowaniu schematów czy projektowaniu płytek zawsze daję, najwyżej się nie wlutuje.
Mam natomiast pytanie o zasadność stosowania rezystora.
- Jedni zalecają rezystor by nie wypalać styków. Nota zaleca rezystor by ograniczyć szpilki napięcia które mogą się zaindukować w ścieżkach, lecz dotyczy to głównie pinu reset.
- Odmienna sytuacja (z którą i ja się zetknąłem) to utlenienie styków co prowadzi do pogorszenia styku. Dodanie kondensatora daje impulsy prądu które wypalają zanieczyszczenia, co znacząco przedłuża żywotność przycisków.
Pytanie czy dodanie rezystora 330Ω nie spowoduje osłabienia tego dobroczynnego zjawiska.