Programowanie
wyjj/yjjjuwuifla jj/uaaau/uw
ts(„HeTlo v
Rys. 37 Zmiany w pliku makefiłe
tern szeregowym. Zróbmy to teraz. Zgodnie z tym, czego nauczyliśmy się do tej pory, funkcje związane z transmisją danych umieścimy w oddzielnym module. Utwórz pliki rs.c oraz rs.h. Pamiętaj, aby do pliku makefiłe dodać nowy plik kodu źródłowego. Przypominam o tym na rysunku 38. Kod, jaki należy wpisać w plik rs.c, znajduje się na listingu 53. Nie ma w nim nic niezwykłego - w praktyce przykłady takie można znaleźć w dokumentacji technicznej procesorów AVR.
Listing 54 pokazuje kod, który powinien znaleźć się w pliku nagłówkowym. Deklarujemy tutaj funkcje, które zdefiniowane zostały w pliku źródłowym. Od tej chwili będziemy mogli swobodnie używać ich wszędzie tam gdzie dołączymy plik rs.h.
Dodatkowo w naszym nagłówku definu-jemy dwa makra pomocne przy obliczaniu danej wpisywanej do rejestru UBRR, która wyznacza prędktość transmisji. Makro pomocnicze RS_MAKE_UBRR jest przeniesieniem na C opisanego w dokumentacji sposobu obliczania potrzebnej wartości. Stała F CPU deklarowana jest z poziomu pliku makefiłe.
Dziś zajmiemy się czymś, od czego zaczyna się większość książek o C dla „dużych komputerów”. Dlaczego dopiero teraz? Wspominałem już o tym i napiszę raz jeszcze: mikrokontrolery rządzą się innymi prawami niż stacje robocze. Tam gdzie w stacji roboczej występuje BIOS oraz System Operacyjny, sprawiające razem, że wypisanie informacji na ekranie jest najprostszą możliwą rzeczą tam w mikrokontrolerze... nie ma nic. Musieliśmy po kolei nauczyć się podstawowych operacji na rejestrach, dopiero później wspinać się coraz wyżej. Szczęśliwie rejestry mamy już za sobą. Dziś na celu mamy dotarcie do funkcji primf oraz jej bliskich znajomych. Dowiemy się, jak realizowane są operacje strumieniowe - tak naturalne w dużych maszynach. Nie bez znaczenia jest fakt powstania nowej płytki. Funkcja printf, bardzo uniwersalna i o wielkich możliwościach, zajmuje stosunkowo dużo pamięci programu.
Stwórzmy folder na nowy program. Skopiuj do niego plik makefiłe. Możesz wziąć go z poprzednich programów albo też bezpośrednio z folderu C:' Wi,nA VR\sample. W Program-mers Notepadzie tworzymy nowy projekt. Możesz nazwać go na przykład hettoworld.
Listing 53-plik rs. #i nclude <avr
// Oczekiwanie aż bufor nadajnik whi1e(l (1«udreo & ucsroa)) {(
return 0;
// oczekiwanie na pojawienie s whiłeC!(l«Rxco 9t ucsroa)) {}
f This will define a symbol, F_CPU,
t ayMBUSifially to create a 32-bit walue i =_cpu -ooooooiD
# Outplit format. Ccan be srec, ihex, binary) FORMAT - ihex
filo mmc Cw-ii-hnin- extension).
RGET ^FelloworlcO
UsT^t- smirje flles here. (C dependencies ar
Do projektu dodajemy plik makefiłe i zaczynamy jego edycję. Niezbędne zmiany zaznaczone są na rysunku 37.
Teraz zgodnie z wprowadzonymi zmianami tworzymy główny plik programu o nazwie main.c. Dodajemy go do projektu w oknie Programmers Notcpada. W pliku tym wpisujemy kod z listingu 52. Skompilowanie programu przyniesie dwie niespodzianki:
1. Program zajmuje zaskakująco dużo miejsca w pamięci (u mnie ponad lkB!).
2. Program w zasadzie nic nie robi, a raczej: nie daje żadnych zewnętrznych oznak działania.
Pierwszy problem zaskoczył mnie kiedyś, prawdopodobnie tak samo jak mógł zaskoczyć teraz większość Czytelników. Jego rozwiązanie wymaga nieco „gimnastyki”. Ze względu na objętość materiału poczekamy z tym do części 8. Teraz przyjrzyjmy się problemowi z nicnierobieniem naszego programu.
Pytanie podstawowe brzmi: gdzie procesor ma wysłać podany mu napis „Hello world! "? W typowym programie komputerowym będzie to zwykle konsola... Nasza płytka posiada wyświetlacz LCD, jednak kompilator nic o tym nie wie. Posiada także port szeregowy. Wiele kompilatorów właśnie port szeregowy uznałoby za domyślne wyjście dla naszego napisu. W AYR-GCC zostało to rozwiązane inaczej. Domyślnym miejscem, gdzie dane będą wysyłane, będzie pierwsze otwarte urządzenie. Zanim przejdziesz dalej, zajrzyj do ramki „ABC... C - Jak działają strumienie”.
W ramach kursu nie mieliśmy jeszcze okazji zająć się por-
e automatically generated.)
Zwracam Twoją uwagę na fakt, jak ważne jest otoczenie nawiasami obliczeń makra RSMAKEJJBRR. Wstaw w wyobraźni zawarty w nim tekst — tak jak robi to preprocesor - w miejscu wystąpienia jego wywołania. Zauważ, co stałoby się, gdyby nawiasów nie było. Szczególnie widoczne jest to w miejscu, gdzie obliczoną wartość przesuwamy.
Elektronika dla Wszystkich Luty2006 39