Programowanie
Dziś, po wakacyjnej przewie wracamy do poznawania naszego kompilatora C dla procesorów AVR. Do tej pory przeszliśmy przez zasady tworzenia prostych plików makefile oraz konfiguracji Programmers Notepada do wygodnej pracy. Do symulacji programów wykorzystaliśmy AYRStudio w wersji 4.11 (minimalnie 4.10). Przedstawiona została podstawowa składnia do wykorzystania dyrektywy #define, skrótowo omówiliśmy przeprowadzanie obliczeń, stosowanie zmiennych globalnych oraz pisanie do portów, włącznie z dostępem do poszczególnych bitów. Wreszcie w części ostatniej pojawił się opis najważniejszych plików nagłówkowych, przerwania, tworzenie funkcji, instrukcja if oraz sposób wykorzystania pamięci progra-
Po raz ostatni sięgniemy do prostego programu obsługi wyświetlacza multipleksowa-nego. Na tej podstawie chcę przedstawić Ci działanie dostępnych w C instrukcji pętli, wykorzystanie zmiennych lokalnych, propozycję obsługi przycisków oraz wykorzystanie przerwania wyświetlacza do dokładniejszego i jednocześnie mniej pamięciochłonnego generowania opóźnień niż wykorzystanie funkcji zawartych w pliku <avr\delay.h>.
Tym razem zmieniając nieco ideę, przedstawiam pełny kod źródłowy, a następnie wyjaśniam jego działanie. Na listingu 15 znajdziesz kod razem z dodatkowymi przypisami. Strategiczne miejsca oznaczyłem cyframi, do których będę się odwoływał w czasie opisu. Jak zwykle szare tlo towarzyszy częściom programu, które nie zmieniły się od ostatniej wersji. Ze względu na oszczędność miejsca wykropkow'ałem jedynie dane inicjujące tablicę wzorów cytr.
Zadaniem nowego programu jest zliczanie w górę lub w dół - w zależność od naciśniętego przycisku. Inaczej niż miało to miejsce do tej pory, wynik jest wyświetlany w postaci dziesiętnej. Odpowiada za to funkcja Wyświetl-DEC. Dodatkowo przytrzymanie dar :go przycisku rozpoczyna szybkie zlic- nie. Zanim przystąpisz do czytania inform ji na temat dokładnego działania poszczególnych części, proponuję zapoznanie się z ramkami ABC... C o pętlach, zmiennych lokalnych, słowach kluczowych static i volatile oraz o czytaniu z portów'. Byłem zmuszony umieścić wspomniane ramki na kolejnych stronach, mam nadzieję, że nie utrudni to czytania.
Omawianie programu rozpoczniemy od tytułowej funkcji. Ze względu na ilość obliczeń, a więc i zajętość pamięci, dobrym sposobem przetworzenia liczby zapisanej w kodzie dwójkowym na kolejne cyfry liczby dziesiętnej jest wydobywanie po kolei każdej ostatniej ęyfry za pomocą reszty z dzielenia przez 10. Po wydobyciu każdej kolejnej cyiry liczba jest przesuwana o jedną pozycję w prawo. Uzyskujemy więc cyfry w kolejności od ostatniej do pierwszej. Poglądowo przedstawia to rysunek 24. Na listingu 15 właściwe przetwarzanie zostało umieszczone w pętli oznaczonej numerkiem 0. Pętla została zbudowana w' taki sposób, aby przerwanie następowało w chwili, gdy zmienna przyjmie wartość 0. Dlaczego została wybrana taka wartość, o tym dalej. Jednak sprawia to, że zmienna n przyjmuje wartości 4, 3, 2, 1. Natomiast dopuszczalne indeksy tablicy wyświetlacza mieszczą się w zakresie 0-3. Oczywiste jest, że możemy dokonać odpowiedniej zamiany przez odjęcie 1. Czy nie zwiększy to rozmiaru kodu? Co ciekawe:
38 Wrzesień2005 Elektronika dla Wszystkich