Strona Główna
FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy RegulaminRegulamin  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj






Przyszłość jest w naszych rękach...
...bo przyszłość to robotyka.





Poprzedni temat «» Następny temat
Kurs BASCOM - lekcja3 - zaczynamy programować
Autor Wiadomość
Ikar 



Pomógł: 2 razy
Posty: 63
Otrzymał 38 piw(a)
Skąd: się biorą dzieci ?

I miejsce w konkursie na najlepszy artykuł.

Wysłany: 25 Lip 08 12:29   Kurs BASCOM - lekcja3 - zaczynamy programować


Kurs BASCOM - lekcja1-wstęp
Kurs BASCOM - lekcja2 - pierwsze kroki
Kurs BASCOM - lekcja3 - zaczynamy programować


Witam ponownie czytelników ;)
W tej jaki i w poprzednich częściach będę się starał tłumaczyć wszystko jak najprościej.
Zajmiemy sie konfiguracją portów, blokiem decyzyjnym oraz układami czasowymi.




Konfiguracja portów:
1.Najpierw trzeba podać kompilatorowi jakie porty będą wejściami a jakie wyjściami. Można to zrobić na kilka sposobów:
-można cały port skonfigurować jako wyjście bądź wejście odpowiednią komendą:
Kod:

config portd=input 'cały port d jako wejście
config portd=output 'cały port d jako wyjście

-można też skonfigurować każdy port osobno:
Kod:

config pind.0=input    ' wyprowadzenie PD0 jako wejście
config pind.1=input    ' wyprowadzenie PD1 jako wejście
config pind.2=input    ' wyprowadzenie PD2 jako wejście
config pind.3=output    ' wyprowadzenie PD3 jako wyjście
config pind.4=output    ' wyprowadzenie PD4 jako wyjście
config pind.5=output    ' wyprowadzenie PD5 jako wyjście
config pind.6=output    ' wyprowadzenie PD6 jako wyjście

-jest szybszy zapis stanów danego portu, w systemie dwójkowym:
Kod:

config portd=&B1111111 'cały port d jako wyjścia
config portd=&B0000000 'cały port d jako wejścia

Kod:

config portd=&B0001111 'końcówki PD0 do PD3 jako wyjścia, a od PD4 do PD6 końcówki jako wejścia

Jak widać czym pin ma mniejszą liczbę porządkową znajduje się bliżej końca zapisu konfiguracji.
Używając tego sposobu zapisu nie należy zapomnieć o prefiksie "&B".

Podane wyżej przykłady należą do portu d procesora attinny2313 którego port d ma 7 wyprowadzeń, przy porcie b wyprowadzeń jest 8 więc trzeba dodać jedną zmienną więcej, przykład:
Kod:

config portb=&B01001011

-można też użyć systemu dziesiętnego, którego nie polecam początkującym. Niby ładnie to wygląda w programie ale jest mało przejrzyste.
Kod:

config portd=&B0001111
'można równie dobrze zapisać jako
config portd=7

Czwmu można zobaczyć w niżej załączonej tabeli:



2.Nastepna rzeczą jaką trzeba zrobić to ustalić stan spoczynkowy końcówek, przykład:
Kod:

portd.0=1 'stan spoczynkowy-1
portd.1=1 'stan spoczynkowy-1
portd.2=1 'stan spoczynkowy-1
portd.3=1 'stan spoczynkowy-1
portd.4=1 'stan spoczynkowy-1
portd.5=0 'stan spoczynkowy-0
portd.6=0 'stan spoczynkowy-0

Równie dobrze można zapisać to za pomocą komend set i reset, przykład:
Kod:

set portd.0 'stan spoczynkowy-1
set portd.1 'stan spoczynkowy-1
set portd.2 'stan spoczynkowy-1
set portd.3 'stan spoczynkowy-1
set portd.4 'stan spoczynkowy-1
reset portd.5 'stan spoczynkowy-0
reset portd.6 'stan spoczynkowy-0

Ten niewygodny zapis można skrócić do już znanego nam zapisu dwójkowego, przykłady:
Kod:

portd=&B1111111 'wszędzie stan spoczynkowy-1
portd=&B1111100 'PD6 i PD5 stan spoczynkowy-o na reszcie stan spoczynkowy-1

Tu także nie należy zapomnieć o prefiksie"&B" oraz o 7 bitach dla portu d i 8 bitach dla portu b.
To można skrócić jeszcze bardziej do systemu zapisu dziesiętnego, którego jak pisałem wcześniej nie polecam początkującym, przykład:
Kod:

portd=&B1111100
'znaczy tyle samo co
portd=124


Czyli pełna konfiguracja portów może przykładowo wyglądać tak:
Kod:

config portb=&B11111111
portb=&B00000000
config portd=&B0000000
portd=&B1111111


Pierwszy program:

Napiszemy teraz pierwszy program używając bloku decyzyjnego ale nie tylko.
Do procesora podepniemy diodę led z rezystorem 100Ω, kondensator 100µF oraz dwa tact switche.



Będzie to program zapalający i gaszący diodę led.

Kod:

$regfile = "attiny2313.dat"                 'najpierw określamy typ proca
$crystal = 1000000                          'definiujemy z jakim taktowaniem będzie pracował


config portb=input                          'port b  jako wejścia
       portb=&B00000000                     'wszędzie stan spoczynkowy-0
config portd=output                         'pprt d jako wyjścia
       portd=&B0000000                      'wszędzie stan spoczynkowy-0


 do                                         'pętla nieskończona

   if pinb.0=1 then                         'jeżeli przycisk 1 wciśnięty
   portd.0=1                                'zapal diode
   elseif pinb.1=1 then                     'jeżeli przycisk 2 wciśnięty
   portd.0=0                                'zgaś diodę
   endif                                    'koniec bloku warunkowego

 loop                                       'koniec pętli
 
end                                         'koniec programu


Ten program Używa dwóch przycisków, niech teraz jeden z nich jednocześnie zapala i gasi diodę.

Kod:

$regfile = "attiny2313.dat"                 'najpierw określamy typ proca
$crystal = 1000000                          'definiujemy z jakim taktowaniem będzie pracował


config portb=input                          'port b  jako wejścia
       portb=&B00000000                     'wszędzie stan spoczynkowy-0
config portd=output                         'pprt d jako wyjścia
       portd=&B0000000                      'wszędzie stan spoczynkowy-0

 
 do                                         'pętla nieskończona

   if pinb.0=1 then                         'jeżeli przycisk 1 wciśnięty
   toggle portd.0                           'zmień stan wyprowadzenia
   endif                                    'koniec bloku warunkowego

 loop                                       'koniec pętli
 
end                                         'koniec programu

Polecenie toggle zmienia stan danej końcówki. Czyli jeżeli na pinie jest 1 to zmienia to na 0 i na odwrót.

Jeżeli mamy uwzględnić kilka warunków używamy spójnika and, przykład:
Kod:

$regfile = "attiny2313.dat"                 'najpierw określamy typ proca
$crystal = 1000000                          'definiujemy z jakim taktowaniem będzie pracował


config portb=input                          'port b  jako wejścia
       portb=&B00000000                     'wszędzie stan spoczynkowy-0
config portd=output                         'pprt d jako wyjścia
       portd=&B0000000                      'wszędzie stan spoczynkowy-0

 
 do                                         'pętla nieskończona

   if pinb.0=1 and pind.1=1 then            'jeżeli przycisk 1 i 2 są wciśnięte
   toggle portd.0                           'zmień stan wyprowadzenia
   endif                                    'koniec bloku warunkowego

 loop                                       'koniec pętli
 
end                                         'koniec programu


Jeżeli odczytujemy stan końcówki to wtedy używamy "pin", a kiedy chcemy nadać jakiś stan używamy "port"

daniel93 napisał/a:

Warto zauważyć, że są 2 typy warunków. Proste i rozbudowane.
Proste składają się z 1 lini:
Kod:
If pinb.1 = 1 then zmienna = 1

A rozbudowane wyglądają tak:
Kod:
if pinb.1 = 1 then
  zmienna = 1
  kobieta = 3
  portb.3 = 2
end if

Warunki rozbudowane mogą zawierać dyrektywę else:
Kod:
if pinb.1 = 1 then
  zmienna = 1
  kobieta = 3
  portb.3 = 0
else
  zmienna = 0
  kobieta = 5
  portb.3 = 1
end if


Stwierdziłem że nie będę tu kombinował i zacytuje kolegę, który to całkiem "zgrabnie" ujął.
Dodam tylko tyle, że warunki rozbudowane też mogą być zapisane w jednej linii tylko poszczególne kawałki muszą być oddzielone dwukropkiem. Kompilator traktuje to wtedy jako następną linię. Lecz nie polecam takiego zapisu ponieważ program staje się mało przejrzysty.

Układy czasowe:
Jak można się domyśleć będziemy używać instrukcji : wait, waitms, waitus. Które nie są zbyt dokładne.

Niech ta dioda teraz zgasi się po dwóch sekundach.

Kod:

$regfile = "attiny2313.dat"                 'najpierw określamy typ proca
$crystal = 1000000                          'definiujemy z jakim taktowaniem będzie pracował


config portb=input                          'port b  jako wejścia
       portb=&B00000000                     'wszędzie stan spoczynkowy-0
config portd=output                         'pprt d jako wyjścia
       portd=&B0000000                      'wszędzie stan spoczynkowy-0

 
 do                                         'pętla nieskończona

   if pinb.0=1 then                         'jeżeli przycisk 1 wciśnięty
   portd.0=1                                'zaświeć diodę
   wait 2                                   'czekaj dwie sekundy
   portd.0=0                                'zgaś diodę                           
   endif                                    'koniec bloku warunkowego

 loop                                       'koniec pętli
 
end                                         'koniec programu


A teraz niech po 2 sekundach zgaśnie na 1,5 sekundy i znów się zaświeci na 3 sekundy.

Kod:

$regfile = "attiny2313.dat"                 'najpierw określamy typ proca
$crystal = 1000000                          'definiujemy z jakim taktowaniem będzie pracował


config portb=input                          'port b  jako wejścia
       portb=&B00000000                     'wszędzie stan spoczynkowy-0
config portd=output                         'pprt d jako wyjścia
       portd=&B0000000                      'wszędzie stan spoczynkowy-0

 
 do                                         'pętla nieskończona

   if pinb.0=1 then                         'jeżeli przycisk 1 wciśnięty
   portd.0=1                                'zaświeć diodę
   waitms 2000                              'czekaj dwie sekundy
   portd.0=0                                'zgaś diodę                           
   waitms 1500                              'czekaj 1,5 sekundy
   portd.0=1                                'zaświeć diodę
   waitms 3000                              'czekaj 3 sekundy
   portd.0=0                                'zgaś diodę
   endif                                    'koniec bloku warunkowego

 loop                                       'koniec pętli
 
end                                         'koniec programu


Jak pisałem wcześniej to instrukcje z serii "wait" nie są dokładne i kiedy zapiszemy w programie że, dioda ma świecić przez 3 sekundy to ona wcale nie musi tego robić dokładnie tyle.

Napiszemy teraz prosty programik który z naszej diody zrobi "migacz".

Kod:

$regfile = "attiny2313.dat"                 'najpierw określamy typ proca
$crystal = 1000000                          'definiujemy z jakim taktowaniem będzie pracował


config portb=input                          'port b  jako wejścia
       portb=&B00000000                     'wszędzie stan spoczynkowy-0
config portd=output                         'pprt d jako wyjścia
       portd=&B0000000                      'wszędzie stan spoczynkowy-0

 
 do                                         'pętla nieskończona
 
    waitms 500                              'czekaj 0,5 sekundy
    toggle portd.0                          'zmień stan wyprowadzenia

 loop                                       'koniec pętli

end                                         'koniec programu


Program po prostu co pół sekundy zmienia stan wyprowadzenia do którego podpięta jest nasza diodka.

Przy instrukcjach czasowych warto wspomnieć o "drganiu styków" w switchu.
Można je zniwelować na 3 sposoby:
-sprzętowy:
Między prockiem a przyciskiem dodać w szeregu rezystor oraz równolegle kondensator.
-programowe:
Po instrukcji if użyć komendy waitms lub waitus a dopiero potem podać żądana procedurę, przykład:

Kod:

$regfile = "attiny2313.dat"                 'najpierw określamy typ proca
$crystal = 1000000                          'definiujemy z jakim taktowaniem będzie pracował


config portb=input                          'port b  jako wejścia
       portb=&B00000000                     'wszędzie stan spoczynkowy-0
config portd=output                         'pprt d jako wyjścia
       portd=&B0000000                      'wszędzie stan spoczynkowy-0

 
 do                                         'pętla nieskończona

   if pinb.0=1 then                         'jeżeli przycisk 1 wciśnięty
   waitms 30                                'czekaj
   portd.0=1                                'zaświeć diodę
   wait 2                                   'czekaj dwie sekundy
   portd.0=0                                'zgaś diodę                           
   endif                                    'koniec bloku warunkowego

 loop                                       'koniec pętli
 
end                                         'koniec programu


No i tak doszliśmy do polecenia debounce. Polecenie "samo" niweluje efekt drgania styków, przykład:

Kod:

$regfile = "attiny2313.dat"                 'najpierw określamy typ proca
$crystal = 1000000                          'definiujemy z jakim taktowaniem będzie pracował


config portb=input                          'port b  jako wejścia
       portb=&B00000000                     'wszędzie stan spoczynkowy-0
config portd=output                         'pprt d jako wyjścia
       portd=&B0000000                      'wszędzie stan spoczynkowy-0

 
 do                                         'pętla nieskończona

   debounce pinb.0, 1, wlacz, sub           

 loop                                       'koniec petli

wlacz:                                      'etykieta
toggle portd.0                              'zmień stan wyprowadzenia
return                                      'powrót

end                                         'koniec programu


"ciąg" polecenia debounce wygląda tak:
Kod:
debounce port, stan na jaki ma reagować, etykieta, sub


Standardowy czas opużnienia polecenia debounce wynosi 25ms ale można go zmienić poprzez polecenie:
Kod:

config debounce=i w tym miejscu wpisujemy liczbę opóźnienia w milisekundach




Kilka rad:
Przy pisaniu programu stosujcie jak najobszerniejsze komentarze.
Kupcie płytkę stykową bo ten układzik będzie się zmieniał jeszcze nie raz i niema sensu tego lutować, a płytka stykowa wierzcie mi przyda się wam jeszcze.
Podczas ładowania programu na proca nie zapomnijcie o podpięciu zasilania (jeżeli programator tego wymaga, a wymagają prawie wszystkie)
Procesor zasilamy stabilizowanym napięciem 5v.


Po tej lekcji powinniście umieć napisać program do prostych robotów. Do na przykład takiego który ma zaprogramowana trasę. omijającego przeszkody, line followera itp.

W tej części to już wszystko, dziękuje za uwagę ;)

Paweł "Ikar" Stankiewicz
_________________
Gość jeżeli pomogłem kliknij pomógł lub postaw browarka ;)
Kontakt gg: 9044954

Postaw piwo autorowi tego posta
 
 
Więcej szczegółów
Wystawiono 10 piw(a):
dziadek46, marek91, _cyna_PL, Master, samuraj22, Kanday, Thomasz, kaczor23, damoon, rafiki7
wojnar 



Posty: 3
Skąd: Trzyniec, CZ
Wysłany: 31 Paź 08 08:58   Re: Kurs BASCOM - lekcja3 - zaczynamy programować

Ikar napisał/a:
W tej części to już wszystko, dziękuje za uwagę ;)

Paweł "Ikar" Stankiewicz

Będą dalsze części - lekcje?
Postaw piwo autorowi tego posta
 
 
 
Geezer 


Posty: 7
Skąd: k. Rzeszowa
Wysłany: 05 Lis 08 11:02   Re: Kurs BASCOM - lekcja3 - zaczynamy programować

Ikar napisał/a:
Do procesora podepniemy diodę led z rezystorem 100Ω, kondensator 100µF oraz dwa tact switche.


1. Jaki ma być ten kondensator bo są różne. Ceramiczny, elektrolityczny czy jaki?
może być np ten?
kondensator biopilarny elektrolityczny


a ten tact switch to domyślam się że wystarczy zwykły przełącznik np ten tak?
TACT SWITH

Z góry dziękuje
pzdr
_________________
Jeden za wszystkich, wszyscy za jednego!!!
Postaw piwo autorowi tego posta
 
 
 
misiek1994 



Pomógł: 2 razy
Posty: 172
Otrzymał 13 piw(a)
Skąd: z Sędziszowa
Ostrzeżeń:
 1/3/4
Wysłany: 06 Lis 08 10:15   Re: Kurs BASCOM - lekcja3 - zaczynamy programować

Geezer napisał/a:
Ikar napisał/a:
Do procesora podepniemy diodę led z rezystorem 100Ω, kondensator 100µF oraz dwa tact switche.


1. Jaki ma być ten kondensator bo są różne. Ceramiczny, elektrolityczny czy jaki?
może być np ten?
kondensator biopilarny elektrolityczny


a ten tact switch to domyślam się że wystarczy zwykły przełącznik np ten tak?
TACT SWITH

Z góry dziękuje
pzdr


Weź sie nie ośmieszaj. Ceramiczny o pojemności 100uF?? Chodzi o elektrolita.
Postaw piwo autorowi tego posta
 
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  


website uptime

Powered by phpBB modified by Przemo © 2003 phpBB Group
kredyt przez internet

Love and Light Dominik Peh kosmetyki nero BearShare taniec nowoczesny Warszawa taniec z gwiazdami Porównywarka cen elektroniki