Popularny post Ikar Napisano Lipiec 24, 2008 Popularny post Udostępnij Napisano Lipiec 24, 2008 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ą: 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: 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: config portd=&B1111111 'cały port d jako wyjścia config portd=&B0000000 'cały port d jako wejścia 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: 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. config portd=&B0001111 'można równie dobrze zapisać jako config portd=15 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: 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: 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: 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: portd=&B1111100 'znaczy tyle samo co portd=124 Czyli pełna konfiguracja portów może przykładowo wyglądać tak: 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. $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ę. $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: $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" Warto zauważyć, że są 2 typy warunków. Proste i rozbudowane. Proste składają się z 1 lini: If pinb.1 = 1 then zmienna = 1 A rozbudowane wyglądają tak: if pinb.1 = 1 then zmienna = 1 kobieta = 3 portb.3 = 2 end if Warunki rozbudowane mogą zawierać dyrektywę else: 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. $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. $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". $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: $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: $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: debounce port, stan na jaki ma reagować, etykieta, sub Standardowy czas opużnienia polecenia debounce wynosi 25ms ale można go zmienić poprzez polecenie: 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 Dla początkujących polecamy zestaw z oferty firmy and-tech.pl http://www.zestawyuruchomieniowe.pl/ 29
wojnar Październik 31, 2008 Udostępnij Październik 31, 2008 W tej części to już wszystko, dziękuje za uwagę Paweł "Ikar" Stankiewicz Będą dalsze części - lekcje?
Geezer Listopad 5, 2008 Udostępnij Listopad 5, 2008 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
misiek1994 Listopad 6, 2008 Udostępnij Listopad 6, 2008 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.
Mateusz Grudzień 8, 2008 Udostępnij Grudzień 8, 2008 No to mam mały problem a mianowicie. Próbując przesłać program do procka wyskakuje mi błąd: Could not identify chip with ID: FFFFFF Potem: Selected chip and target chip not match At90S1200 <> ATinny2313 Procek zimny jak diabli wiec raczej się nie pali. Zasilanie 5V jest podłączone. Jak to naprawić Raczej wszystko dobrze podłączyłem i nawet dioda świeci podczas próby wysłania programu
mskojon Grudzień 9, 2008 Udostępnij Grudzień 9, 2008 Powodów może być mnóstwo, np. źle zrobiony programator, źle podłączone/brak napięcia, źle skonfigurowany Bascom, źle podłączony procek do programatora.
Mateusz Grudzień 9, 2008 Udostępnij Grudzień 9, 2008 Już naprawiłem Źle by procek z programatorem podłączony Ale mam pytanie. Czy jak już napisze program to wystarczy f4 i już będzie procek zaprogramowany?
mskojon Grudzień 9, 2008 Udostępnij Grudzień 9, 2008 Najpierw musisz skompilować program (F7), możesz sobie ustawić, że gdy klikasz F4 automatycznie się programuje (Options->Programmer i zaznacz Auto Flash), oczywiście przed programowaniem musisz skompilować program czyli jeśli zaznaczysz auto flash to klikasz F7 i F4 i procek zaprogramowany.
Mateusz Grudzień 9, 2008 Udostępnij Grudzień 9, 2008 Ok miga mi dioda już . A teraz jeśli chcę wgrać nowy program to muszę jakoś stary usunąć ? Bo wgrałem ten programik: $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 I trochę go zmieniłem na taki: $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 Waitms 400 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 300 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 200 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 100 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 090 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 080 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 070 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 060 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 050 'czekaj 0,5 sekundy toggle portd.0 'zmień stan wyprowadzenia loop 'koniec pętli end I cały czas działa tak jak na tym pierwszym. Czyli miga równo.
Sabre Grudzień 9, 2008 Udostępnij Grudzień 9, 2008 Po zmianie programu musisz każdorazowo go skompilować i wgrać do procesora, czyli znów F7 i F4. 1
Mateusz Grudzień 9, 2008 Udostępnij Grudzień 9, 2008 A co tutaj jest nie tak: $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 Waitms 500 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 400 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 300 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 200 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 100 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 090 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 080 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 070 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 060 'czekaj 0,5 sekundy Toggle Portd.0 'zmień stan wyprowadzenia Waitms 050 'czekaj 0,5 sekundy Toggle Portd.0 End If If Pinb.0 = 0 Then Portd.0 = 1 End If 'koniec if Loop 'koniec pętli End Powinna dioda cały czas się świecić a gdy naciśnie się przycisk powinna zacząć coraz szybciej migać. A cały czas miga (coraz szybciej).
Popularny post Sabre Grudzień 9, 2008 Popularny post Udostępnij Grudzień 9, 2008 Gdy ustawiasz jakiś pin jako wejście (Input) to wyprowadzenie jest wewnętrznie podciągane do plusa przez rezystor. Więc musisz zmienić If Pinb.0 = 1 na If Pinb.0 = 0, zwierając przyciskiem ten pin do masy. 3
Mateusz Grudzień 9, 2008 Udostępnij Grudzień 9, 2008 Hmm nie do końca rozumiem, mógłbyś troszke jaśniej mi to wytłumaczyć . 2. Skopiowałem pierwszy program w tym artykule na procka i jest problem bo dioda cały czas się świeci nie zależnie od tego czy naciskam przycisk czy nie a wydaje mi sie ze wszystko zmontowane mam ok
GruX Grudzień 9, 2008 Udostępnij Grudzień 9, 2008 a diodę masz do Vcc, czy do masy podpiętą z drugiej strony? __________ Komentarz dodany przez: Sabre Zdanie zaczynamy z dużej litery.
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »