Konfiguracja portów w basom - o co chodzi?

Odpowiednia konfiguracja linii portów we/wy mikrokontrolera jest chyba najważniejszą czynnością, jaką trzeba wykonać pisząc program. Oczywiście czasami konfigurując jakiś układ peryferyjny mikrokontrolera, konfiguracja wyprowadzeń odbywa się automatycznie, niemniej jednak nawet w takiej sytuacji powinno się ręcznie wykonać odpowiednie ustawienia linii i/o. Taki program wygląda wówczas znacznie lepiej i nie pozostawia wątpliwości co do właściwej konfiguracji portu.

Linie potów mikrokontrolera możemy skonfigurować jako wejście lub wyjście. Możemy oczywiście konfigurować cały port lub tylko jego pojedyncze linie. Do tego celu Bascom udostępnia nam instrukcję konfiguracyjną :
                                       CONFIG PORTx = tryb
                                       CONFIG PINx.y = tryb
Pierwsza instrukcja pozwala na skonfigurowanie całego portu i wówczas w miejsce litery x wstawiamy literę opisującą nazwę portu (A,B,C,D itd. w zależności od występujących w mikrokontrolerze portów). Jako tryb możemy użyć:
output - wówczas cały port zostanie skonfigurowany jako wyjścia
input - wówczas cały port zostanie skonfigurowany jako wejścia
Przykładowa instrukcja konfiguracyjna będzie wówczas wyglądać jak poniżej:
                                       CONFIG PORTD = Output
                                                          lub
                                       CONFIG PORTD = Input
Zamiast słów kluczowych input,output, można użyć wartości liczbowych, wówczas należy zapisać np:
                                       CONFIG PORTD &B00001111
wówczas:
1 - jako wyjście
0 - jako wejście

Druga instrukcja konfiguracyjna pozwala na skonfigurowanie pojedynczej linii portu. Litera y oznacza numer linii portu, natomiast reszta jest taka sama jak w pierwszym przypadku. Przykładowy zapis wygląda następująco:
                                         CONFIG PIND.4 = Input
Również tutaj można użyć wartości liczbowych zgodnie z wcześniejszymi zasadami np:
                                         CONFIG PIND.4 0
co ustawia nam linię D4 jako wejście.

No i dla przykładu prosty program konfigurujący kilka linii portu D procesora ATmega168 ale najpierw schemat układu, dla którego napisane zostaną poniższe programy.

 
$regfile = "m168def.dat"
$crystal = 8000000
$hwstack = 16
$swstack = 32
$framesize = 32

Config Pind.0 = Input
Config Pind.1 = Input


Config Pind.4 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output


Portd.4 = 1
Portd.5 = 0
Portd.6 = 1
Portd.7 = 0


Do


Loop
End                                                         'end program
Jak widać zgodnie ze schematem linie D0 i D1 skonfigurowane zostały jako wejścia (do obsługi przycisków), a linie D4 do D7 jako wyjścia (do obsługi diod LED). Program ma za zadanie jedynie zaświecić diody podłączone do linii D5 i D7, przyciski nie są tutaj wykorzystywane.
Aby móc korzystać z linii wejściowych, a co za tym idzie z przycisków, trzeba jeszcze do linii D0 i D1 podłączyć wewnętrzne rezystory podciągające te linie do + zasilania. Poniżej mamy przykład pełnej konfiguracji linii jako wejścia z podpięciem rezystorów podciągających.
Config Pind.0 = Input
Config Pind.1 = Input
Portd.0 = 1
Portd.1 = 1
Jak widać aby podłączyć rezystory podciągające wystarczy wpisać wartość 1 do odpowiedniej linii portu instrukcją PORTx.y gdzie:
x - oznacza port np A,B,C,D
y - oznacza numer linii portu
No i teraz prosty program ale tym razem z obsługą dwóch przycisków
$regfile = "m168def.dat"
$crystal = 8000000
$hwstack = 16
$swstack = 32
$framesize = 32

' konfiguracjia linii jako wejścia
Config Pind.0 = Input
Config Pind.1 = Input

' konfiguracja linii jako wyjścia
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output

' podłączenie rezystorów podciągających
Portd.0 = 1
Portd.1 = 1

' na wstępie wszystkie diody wygaszone
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1

Do
      Debounce Pind.0 , 0 , Sw1 , Sub
      Debounce Pind.1 , 0 , Sw2 , Sub
Loop
End                                                         'end program

Sw1:
      Toggle Portd.5
      Toggle Portd.7
Return

Sw2:
      Toggle Portd.6
      Toggle Portd.4
Return
Jak widać jest to banalny program ale wydaje mi się, że dokładnie demonstruje jak posługiwać się wyprowadzeniami procesora. Myślę, że jest on na tyle jasny, że nie ma potrzeby opisywać go linia po linii i każdy początkujący da sobie z nim radę.
I to właściwie wszystko, co podaje literatura i plik pomocy na temat konfiguracji portów w Bascom. Można jeszcze skonfigurować porty korzystając z rejestrów, ale o tym nie będę tutaj pisał. Bascom, natomiast, pozwala jeszcze na skonfigurowanie pojedynczych linii używając instrukcji CONFIG PORT w taki sam sposób jak CONFIG PIN. Spójrzmy poniżej:
                                                      CONFIG PORTD.0 = input
                                                      CONFIG PORTD.4 = output
Taki zapis również dokona poprawnej (tak przynajmniej wygląda) konfiguracji linii portu, mimo, że zgodnie z tym co wcześniej pisałem powinno się użyć instrukcji
                                                      CONFIG PIND.0 Input
                                                      CONFIG PIND.4 = Output
Można więc stosować zamiennie obie metody, jednak warto trzymać się jednej konwencji i nie mieszać ich w jednym programie.
Pozostaje jeszcze kwestia odczytu linii wejściowych. Aby odczytać stan linii skonfigurowanej jako wejście należy użyć rejestru PINx gdzie x oznacza oczywiście port A,B,C itd. Jest to bardzo proste i aby odczytać poziom jaki panuje np. na linii D0 wystarczy zapisać:
                                    zmienna = PIND.0
W ten sposób w zmiennej "zmienna" znajdzie się wartość odpowiadająca stanowi panującemu na linii D0. Jeśli będziemy chcieli użyć przycisku, wówczas do sprawdzenia stanu można użyć np. instrukcji if  then


If Pind.0 = 0 Then
' czynności do wykonania
End If
Lub tak, jak w naszym programie korzystając i funkcji  Debounce. Ważne jest aby pamiętać,że do odczytu użyjemy tutaj PIND.0 a nie PORTD.0.

I na koniec jeszcze warto wspomnieć o aliasach. Chociaż nie służą one do konfiguracji portów to ich stosowanie bardzo ułatwia życie. Dzięki aliasom, zamiast używać nazw w stylu PIND.1, można  w programie użyć np. S2 jeśli linia D1 będzie podłączona tak jak na naszym schemacie do przycisku S2. Dzięki temu od razu wiadomo jaką rolę pełni dana linia i łatwo można zmienić wykorzystywane linie na inne, bez potrzeby wprowadzania zmian w całym kodzie. Jak tworzymy aliasy? Jak to zwykle bywa w Bascomie jest to bardzo proste:
                                                                   nowa-nazwa Alias stara-nazwa
nowa-nazwa to nazwa jaką chcemy się posługiwać
stara-nazwa to zdefiniowana już nazwa np. nazwa rejestru lub bitu w rejestrze
                                                                           S1 Alias PIND.0   
Mam nadzieję, że zbytnio nie zagmatwałem, a na koniec wcześniejszy program po wprowadzeniu powyższych modyfikacji ( konfiguracja i aliasy).

$regfile = "m168def.dat"
$crystal = 8000000
$hwstack = 16
$swstack = 32
$framesize = 32

' konfiguracjia linii jako wejścia
Config Portd.0 = Input
Config Portd.1 = Input

' konfiguracja linii jako wyjścia
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output

' przypisanie aliasów
S1 Alias Pind.0
S2 Alias Pind.1
Led1 Alias Portd.4
Led2 Alias Portd.5
Led3 Alias Portd.6
Led4 Alias Portd.7

' podłączenie rezystorów podciągających
S1 = 1
S2 = 1

' na wstępie wszystkie diody wygaszone
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1

Do
      Debounce S1 , 0 , Sw1 , Sub
      Debounce S2 , 0 , Sw2 , Sub
Loop
End                                                         'end program

Sw1:
      Toggle Led2
      Toggle Led4
Return

Sw2:
      Toggle Led1
      Toggle Led3
Return

I jeszcze fotka układu testowego


Komentarze

  1. A po kiego grzyba w każdym kodzie instrukcja 'End' ?

    OdpowiedzUsuń
    Odpowiedzi
    1. Oczywiście instrukcja End nie jest tutaj potrzebna ale dodaję ją po prostu dla porządku, aby wyraźnie było widać gdzie się kończy program główny ( pętla główna). No ale oczywiście uwaga słuszna, więc jeśli komuś nie chce się wklepywać dodatkowej linii to oczywiście nie ma takiej potrzeby.

      Usuń
  2. super ! takich poradników potrzeba

    OdpowiedzUsuń
  3. popieram przedmówce. czekamy na dalsze odcinki

    OdpowiedzUsuń
  4. Nie bardzo wiem o co w tym chodzi, ale jak widzę jest to kolejne urządzeni na prąd. Ja teraz staram się zmienić swoje dotychczasowe rachunki i przeszłam do https://poprostuenergia.pl/ gdyż właśnie dzięki temu dostawcy moje rachunki będą o wiele niższe.

    OdpowiedzUsuń
  5. 29 year old Business Systems Development Analyst Stacee Noddle, hailing from Saint-Hyacinthe enjoys watching movies like Joe and Cryptography. Took a trip to Wieliczka Salt Mine and drives a Bentley Litre Supercharged Le Mans. dodatkowe zasoby

    OdpowiedzUsuń

Prześlij komentarz

Popularne posty