Programowanie
Programowanie
Tabela 1 Typy proste zmiennych dostępne w C
Narwa |
Typ |
Zakres |
Rozmiar (ba|>y> |
-128.127 | |||
nmignalcłiar U, ■ |
zzz |
0.255. strat lub luf bil' |
2/ą* |
całkowity |
-32708. .32767 |
aiww | |
IIMMRU.il IlUie il» |
ZZL |
; | |
mir Iimij umtsiudlni |
całkowity |
0..2-64.I |
Listing 9 Ulepszenie programu z listingu 8.
// Wygaszenie wyświetlaczy
COMPORT [[§ l«COMl | 1«C0M2 | 1«C0M3 | l«COM4; // Wystawienie odpowiedniej danej LEDPORT = g_DaneWyswietlacza[g_AktWyswietlacz];
// Włączenie odpowiedniego wyświetlacza COMPORT m g_DaneCom[g_AktWyswietlacz];
ustawienia. Jest to oczywiste marnotrawstwo. Powinna istnieć przecież możliwość odczytywania tego typu danych bezpośrednio z pamięci programu.
Oba zarzuty są jak najbardziej słuszne. Od umieszczenia odpowiedniej tablicy w pamięci danych oraz wykorzystania przerwań dzieli nas już tylko krok. Teraz jednak chcę zwrócić Twoją uwagę na inny drobiazg: Zastanówmy się, co się dzieje z portem, który wykorzystujemy do sterowania anodami wyświetlaczy. Zawsze zapisujemy tam na sztywno wybraną przez nas wartość. Chwilowo możemy nie zauważać problemu, jaki nam to sprawi, jednak gdy zechcemy wykorzystać do czegoś pozostałe wyprowadzenia tego portu, może okazać się to niemożliwe, a już na pewno niewygodne. Musimy więc poprawić kod tak, żeby zmieniane były tylko wybrane wyprowadzenia, resztę pozostawiając bez zmian.
Odpowiednią poprawkę pokazuje listing 9. W jego zrozumieniu może pomóc ramka „Co z bitami?”.
W tym przypadku jednak kompilator nie będzie generował instrukcji ustawiających poszczególne bity. Zwartość portu będzie wczytana do rejestru, wykonana zostanie odpowiednia funkcja logiczna, a następnie dana zostanie przesłana do rejestru wyjściowego. Daje to 3 instrukcje. Gdybyśmy chcieli zrobić to samo za pomocą ustawiania / zerowania poszczególnych bitów, konieczne byłoby zastosowanie 4 instrukcji. Dodatkowo pojawiałyby się niewielkie opóźnienia między przełączaniem poszczególnych bitów. Dla nas w tej chwili nie miałoby to znaczenia - ale kompilator o tym nie wie i musi założyć, że jeśli napisaliśmy funkcję tak jak na listingu 9, to chcemy, aby wszystkie wyprowadzenia zmieniły swój stan w tym samym momencie. Nieczęsto, ale czasami może okazać się to bardzo ważne.
Dziś udało nam się napisać kilka programów. Starałem się pokazać Ci, jak elegancko rozpocząć nowy plik /. kodem źródłowym. Zobaczyłeś, jak radzić sobie z przypisywaniem dogodnych nazw do wyprowadzeń. Poznałeś wstępnie ideę przeprowadzania obliczeń w C. Dowiedziałeś się, trochę o zmiennych, bez których nie obejdzie się rzeczywisty program. Dowiedziałeś się, jak zerować i ustawiać poszczególne bity. Przy okazji udało nam się stworzyć program, który' naprawdę obsługuje wyświetlacz multipleksowaiiy. Fakt, że ma on jeszcze kilka niedociągnięć i że brakuje mu kilku
ABC... C Co z bitami?
W C brak jest instrukcji Operujących bezpośrednio na bitach*. Jednak możemy operować na nich, stosując prostą sztuczkę. Była o tym mowa wcześniej. Załóżmy, że chcemy operować na 6 wyprowadzeniu portu D:
Aby je ustawić:
PORTD 1= 1«6;
Wyzerować:
PORTD &= ~(1«6);
Okazuje się, że GCC doskonałe wie o co chodzi. Mimo tego, że wydaje się, że na przykład przedstawione ustawienie wyprowadzenia portu wywoła cały ciąg operacji, w asemblerze jest generowany tylko następujący kod:
sbi PORTD, 6
Czyli najprościej, jak się dało!
’ Nie jest lo do koóca prawdą, istnieje specjalny typ zmiennej - lak zwane pole bitowe. Wiele prostych kompilatorów jednak nie obsługuje takiej opcji. Standard także niejasno tłumaczy ich działanie, co może powodować trudności z przenośnością kodu;
kroczków do praktyczności... postaramy się rozwiązać już za miesiąc.
Jeśli chcesz spróbować swoich aktualnych sil, zobacz, czy uda Ci się już dziś stworzyć tablicę zawierającą wszystkie znaki kodu szesnastkowego (0-F). Czy uda Ci się za jej pomocą wpisywać wartości do tablicy wyświetlacza?
Radosław Koppel
01-912 Warszawa, ul. Wolumen 53
teł.: 835 55 22
tel.: 669 99 19
pawilon 44 RCS ELEKTRONIK rezystory, kondensatory, elementy SMD
pawilon 50 ZBYROMEX części RTV, głośniki, transformatory, akcesoria GSWI
potencjometry, silniki, paski napędowe
Elektronika dla Wszystkich Czerwiec 2005 47