|
|
mikrokontrolery.net |
|||||||||||||||||||||||||||||||||||||||||||||||||
|
Część 1 - Sterowanie diodami LED W przykładzie tym poznamy sposób sterowania diodami LED. Zalecam użycie mikrokontrolera AT89S8252, lub innego w obudowie 40-końcówkowej. W tej sytuacji dostępnych jest 32 linie I/O, co pozwoli nam na swobodne poznawanie mikrokontrolera, bez martwienia się o brakujące porty. Aby przeprowadzić ćwiczenie należy do portu P0 naszego mikrokontrolera podłączyć 8 diod LED w sposób pokazany na rysunku. Aby włączyć dowolną diodę LED należy na odpowiednim wyprowadzeniu portu ustawić stan niski. Przykład 1.1.ASM
Przykład 1.1.C
Przykład 1.1.BAS
Omówienie: W przykładzie 1.1 włączenie diody LED D1 następuje przez ustawienie na wyprowadzeniu P0.0 stanu niskiego. - W języku asemblera jest to zrealizowane przez użycie instrukcji
"CLR P0.0". Instrukcja CLR (ang. Clear) służy wyłącznie do zerowania
wskaĄnika przeniesienia lub dowolnego bitu adresowanego bezpośrednio,
tzn. bitu w obszarze pamięci RAM adresowanym bitowo lub przestrzeni rejestrów
SFR dostępnych bitowo (o adresie podzielnym przez 8). W każdym z języków do zrealizowania danego celu (ustawienie wyprowadzenia P0.0 w stan niski) użyto jednej instrukcji tego języka. Zobaczymy teraz na ile instrukcji tłumaczone jest to polecenie i jak dużo miejsca w pamięci zajmuje każdy program. Pliki wynikowe programu (*.HEX) zostały zdiasemblowane przy użyciu programu D51.
Przykład 1.1.C.D51
Przykład 1.1.BAS.D51
Prrogram napisany w asemblerze po zdiasemblowaniu składa
się z dokładnie tych samych instrukcji, jakie zostały użyte w kodzie Ąródłowym.
służą do wyzerowania wewnętrznej pamięci RAM mikrokontrolera, której zawartość po włączeniu zasilania może być nieokreślona. Kolejna instrukcja "MOV P2,#0FFh" powoduje ustawienie wszystkich wyprowadzeń portu P2 w stan wysoki. Listing programu inicjującego mikrokontroler znajduje się w katalogiu kompilatora i bardziej dociekliwi czytelnicy tego kursu mogą się z nim zapoznać. Następnie występuje instrukcja "LJMP X0012". I tutaj znowu powoduje ona przejście do następnej z kolei instrukcji, więc jest niepotrzebna. Petla nieskończona jest zrealizowana przy użyciu dwubajtowej instrukcji "SJMP X0014", czyli najodpowiedniejszej do tego celu.
Jak widać z powyższego porównania, najwięcej niepotrzebnych instrukcji generuje Bascom. W C jest o wiele lepiej niż w Bascomie, ale i tak dużo gorzej niż w asemblerze. Tylko ten jeden przykład jest w stanie uzmysłowić nam, jaka jest zaleta programowania w asemblerze - całkowita kontrola rozmiaru kodu wynikowego. Ponieważ w pakiecie RIDE 51 występuje bardzo pożyteczna moim zdaniem opcja kompilowania programu poprzez program asemblera ( i generowania jednocześnie pliku *.SRC do każdego pliku *.C) w następnych przykładach wykorzystamy tą funkcję zamiast diasemblowania pliku *HEX (chyba, że zajdzie taka potrzeba). Przykład 1.2
Przykład 1.2.C Przykład 1.2.BAS
Ze względu na to, że przykład 1.2 nie różni się pod względem
kodu wynikowego od przykładu 1.1 nie przeprowadzono diasemblacji i analizy
kodu wynikowego. Przykałd 1.2 miał na celu przedstawienie wygodniejszego
posługiwania się pinami. Polecam ten sposób odwoływania się do pinów ze
względu na łatwiejsze wprowadzanie zmian do programu. Wyobraˇmy sobie
sytację, gdy w programie liczącym kilkadziesiąt, lub nawet kilkaset instrukcji
odwoływaliśmy się do pinów bezpośrednio przez ich nazwę i nagle musimy
zmienić pin pełniący daną funkcję. Zamiast męczyć sie z tymi kilkuset
instrukcjami i przeoczyć połowę z nich lub popełnić wiele innych błedów,
zmianiamy tylko deklarację aliasu. Jest to rozwiązanie duzo prostsze,
a pozatym daje ono bardziej czytelne programy. Bardziej wymowne jest stosowanie
nazw typu: "LED1" czy "KLAWISZ1" zamiast P0.0 itp. Przykład 1.3 Ten przykład prezentuje metodę ustawiania stanu niskiego
na wyprowadzeniu za pomocą instrukcji iloczynu logicznego ANL.
Jak widać, wynikiem funkcji AND jest logiczna jedynka tylko wtedy, gdy obydwa parametry funkcji są logicznymi jedynkami. W pozostałych przypadkach wynikiem jest "0". Możemy to wykorzystać do włączenia diody, a nawet kilku diod za pomocą jednej instrukcji asemblera. Przykład 1.3.ASM
Przykład 1.3.C
Ponieważ iloczyn logiczny jest wykonywany na całym porcie,
a nie na pojedynczym bicie, możemy to wykorzystać do zmiany stanu kilku
bitów portu jednocześnie. W ten sposób zaoszczędzimy miejsce w pamięci
programu, bo zamiast użycia np. czterech dwubajtowych instrukcji "CLR
bit" użyjemy jedną trzybajtową "ANL drect, #data", co przedstawia
przykład 1.4. Przykład 1.4
Przykład 1.4.C
Przykład 1.4.BAS
|
Ostatnio na forum: |
||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
(c) 2004-2008 Radosław Kwiecień |