kurs programowania w języku ms basic, Programowanie mikrokontrolerów



Z powodu dużego zapotrzebowania na kurs programowania w języku ms basic postanowiłem napisać ciąg artykułów uczących podstaw programowania w tym właśnie języku. Artów będzie 3 lub 4 w zależności od tego jak podzielę materiał i jakim wolnym czasem będę dysponował.
Kurs będzie dotyczył rodziny µC AVR.

Jak wiadomo nie licząc robotów beam to robotyka by nie istniała bez programowania. Wiec każdy robotyk musi umieć programować chociaż w najprostszym języku jakim jest ten właśnie opisywany przeze mnie.

Tak więc „Alea iacta est”(kości zostały rzucone).



Zacznę od potrzebnego sprzętu:
Programator:
Na sam początek powinniśmy się zaopatrzyć w programator (my będziemy używać programatora isp).
Najprostszy to cztery oporniki wtyk lpt i kawałek kabelka:

Ale warto jest zabezpieczyć port lpt przed zepsuciem i zbudować bądź kupić stk200 :

Są też programatory na port rs232 (com):

Jeśli nie masz w komputerze portu lpt ani com co teraz jest coraz szerzej spotykanym zjawiskiem (niestety te dwa ważne porty dla elektronika powoli odchodzą w zapomnienie) Są też programatory pod usb. Na przykład usbasp którego można zobaczyć na tej stronie.

Ale jeśli nie czujesz się na siłach aby coś takiego zbudować kup sobie programator, taki jak stk200 można w znanym serwisie aukcyjnym kupić już za 15 zł.
To są tylko niektóre z programatorów, jest jeszcze ich wiele. Te które wymieniłem wydaja mi się najlepsze ale mogę się mylić ponieważ nie za wszystkich korzystałem-oparłem się na opinii użytkowników.

Procesor:
Ja proponuje na sam początek attinny2313. Czemu? Ponieważ jest wystarczający na rozpoczęcie przygody z mikrokontrolerami, jeżeli twój pierwszy program nie zmieści się w jego pamięci to mówię Ci mistrzu. Nie potrzebuje kwarcu- może pracować na wewnętrznym oscylatorze. Moim zdaniem na kilka pierwszych programów jest aż za dobry.

W związku z pojawiającymi się wątpliwościami (wcześniej wydawało mi się to oczywiste) dodaje, że wyprowadzenia procesora podłączamy do tak samo nazywających się wyprowadzeń programatora.

Kompilator:
Kompilatorem języka ms basic którego będziemy używać będzie BASCOM-AVR.
Można go pobrać z tej strony

Obsługa programu:
Po zainstalowaniu i uruchomieniu programu pokarze nam sie okno główne:
1.Pasek menu
2.Pasek narzedzi
3.Lista zdefiniowanych etylkiet
4.Lista zdefiniowanych procdur
5.”Nawigacja”mikroklocka
6.Pasek stanu
7.Obszar edytora kodu



Funkcje ikon paska narzędzi:
- nowy program
- owórz
- zapisz
- zapisz w nowym pliku
- drukuj
- podgląd wydruku
- wytnij
- kopiuj
- wklej
- wstaw wcięcie zaznaczonego fragmentu tekstu
- usuń wcięcie zaznaczonego fragmentu tekstu
- wyszukaj tekst
- sprawdź poprawność programu
- kompiluj
- raport z kompilacji
- symulator
- uruchom programator
- emulator terminala
- zeruj układ
- pomoc
- exit

W tej części skonfigurujemy nasz kompilator, poznamy jego dodatkowe narzędzia oraz dyrektywy.
Będę się starał jak najbardziej "łopatologicznie" wszystko tłumaczyć.



Zaczynamy.
Konfiguracja:
Aby wejść w okno opcji należy kliknąć ikonę

0x01 graphic


na pasku narzędzi.
W tym oknie klikamy zakładkę „Programer” (1)



W linii Programer(2) wybieramy programator jaki będziemy używać. W zależności od tego co wybierzemy pojawia nam sie poniżej różne zakładki (ja wymienię 3 najczęstsze).
Na powyższym obrazku widać „Parallel”(3)
W linii „LPT-address” (4)wybieramy adres naszego portu lpt, a w linii „Port dalay”(5) wpisujemy liczbę odpowiadającą za opóźnienie portu co jest konieczne w przypadku szybkich procesorów. Wartość tą dobiera się doświadczalnie.



Tutaj widać zakładkę „Serial”(6).W linii „COM-port”(7) wybieramy nr. Portu do jakiego jest podłączony nasz programator , a w linii „STK500”(8) wpisujemy ścieżkę do programu obsługójącego ten programator.



Zakładka „Other”(9). W linii „Program”(10) wpisuje się ścieżkę do programu obsługójącego ten twój programator W linii „Parameter”(11) wpisujemy dodatkowe parametry dla programu, a zaznaczając „Use HEX file”(12) dajemy sygnał bascomowi, że ma do programu obsługującego programator wysłać pliki HEX.

Narzędzia BASCOM-a:

-Lcd desinger(Ctrl+L):



Część bascoma w której można zdefiniować 8 dowolnych, niestandardowych znaków, mogą to być np: polskie znaki takie jak: ąćęłńóśźż; lub jak widać na obrazku-cokolwiek 0x01 graphic
Pole do projektowania znaczków ma 40 kostek tak jak jedno pole w wyświetlaczu alfanumerycznym Aby dodać do programu swój symbol należy kliknąć przycisk ok.

-LIB Menager(Ctrl+I):



Część bascoma do zarządzania i tworzenia nowych bibliotek. Narzędzie dla dużo bardziej zawansowanych (asembler).

-Terminal emulator(Ctrl+T):



Służy do otwierania programów korzystających z portu rs232(com).

-Graphic converter:



Przekompilowuje pliki .bmp do plików .bgf tym samym zmieniając je na czarno-białe. Maksymalna rozdzielczość obrazka to 240*240. Obraz można potem wyświetlić na lcd graficznym.

Dyrektywy procesora:
---

Kod:

#if


-w wolnym tłumaczeniu-jeżeli, przykład:

Kod:

Const Xd = 1
#if Xd
Lcd ":)"


---

Kod:

#else


-bądź, jeżeli warunki podane w #if nie zostaną spełnione zostanie wykonana instrukcja z dyrektywy #else, przykład:

Kod:

Const Xd = 1
#if Xd
Lcd ":)"
#else
Lcd ":("


---

Kod:

#endif


-dyrektywa kończąca dyrektywe warunkową którą jest #if to działa jak zamkniecie polecenia np. html-u (tam kończy sie dane zadanie ta sama komendą którą sie zaczynał tylko ze sleszem- to tak do porównania), przykład:

Kod:

Const Xd = 1
#if Xd
Lcd ":)"
#else
Lcd ":("
#endif



Dyrektywy kompilatora:
Z tych dyrektyw będzią nas interesowac tylko dwie:
---

Kod:

$regfile


-służy do określenia procesora na jakim bedzie działać program, przykład:

Kod:

$regfile = "2313def.dat"
'program jest pisany na procesor attinny2313


---

Kod:

$crystal


-służy do określania taktowania z jakim będzie pracować procesor, przykład:

Kod:

$crystal = 4000000
'procesor będzie pracował z kwarcem bądź na wewnętrznym oscylatorze 4Mhz



Elemęty języka Bascom Basic:
---

Kod:

ALIAS


-służy do zmiany nazwy zmiennej, jeżeli wiemy że do danego pinu będzie podpięty czujnik możemy zmienic nazwe aly nam się łatwiej pisało program oraz ab był bardziej przejrzysty, przykład

Kod:

sensor1 alias portb.0


---

Kod:

BITWAIT


-zawiera w sobie dodatkowa nieskończoną pętle i czeka na jakieś "wydarzenie"
---

Kod:

CONFIG


-konfiguruje się ta dyrektywa jakieś urządzenie (np:lcd) bądź pin, port procesora
---

Kod:

DO...LOOP


-pętla nieskończona
---

Kod:

DISPLAY


-włącza bądź wylloncza ekran lcd (displey on/off)
---

Kod:

END


-kończy program
---

Kod:

GOSUB


-wykonuje skok do podprogramu, przykład:

Kod:

if pind.0=0 then
gosub jedz

end if

jedz:
portb.4=1
portb.3=0
return


---

Kod:

IF...THEN...ELSE...END IF


- blok decyzyjny, przykład:

Kod:

if pind.0=0 then
portb.6=0
else
portb.6=1
end if

'jeżeli na pinie portu d pojawi się zaro wtedy wprowadź noge 6 portu b w stan wysoki
'bądź jeżeli na pinie portu d pojawi się jeden wtedy wprowadź noge 6 portu b w stan spoczynku
'koniec "ciagu warunków"


---

Kod:

LCD


-polecenie wyświetlające na lcd dany tekst
---

Kod:

REM


-instrukcja dająca sygnał kompilatorowi że dalszy tekst to komentarz można ją zastąpić '
---

Kod:

RESET


-ustawia bit w stan 0, przykład:

Kod:

reset portd.4
co równie dobrze można zapisać jak:
portd.4=0


---

Kod:

RETURN


-wykonuje powrót do np: podprogramu
---

Kod:

SET


-ustawia bit w stan 1, przykład:

Kod:

set portd.4
co równie dobrze można zapisać jak:
portd.4=1


---

Kod:

SHIFT


-przesuwa bity w prawo bądź w lewo (shift left/right)

Kod:

SHIFTLCD


-przesuwa zawartość LCD w prawo lub w lewo (shiftlcd left/right)
---

Kod:

SOUND


-służy do generowania dźwięków, przykład:

Kod:

Sound portd.4 , 100, 10
'sound pin , liczba impulksów, czas


---

Kod:

WAIT


-przerwanie programu na określony czas (w sekundach)

Kod:

wait 2 'czekaj dwie sekundy


---

Kod:

WAITMS


-przerwanie programu na określony czas (w milisekundach)

Kod:

waitms 2000 'czekaj dwie sekundy


---

Kod:

WAITUS


-przerwanie programu na określony czas (w mikrosekundach)

Kod:

waitus 2000000 'czekaj dwie sekundy


Z tym, że żadne polecenie z serii wait nie może posiadać więcej jednostek niż 65535, więc ostatni przykład jest błędny-podałem go tak aby początkujący nie musieli szukać ile to jest mikrosekunda.

Wymieniłem chyba te najczęściej używane dyrektywy po reszte odsyłam was do helpa bascom którego można pobrać z tej stronki.

W następnej części nauczymy się praktycznego zastosowania podanych dyrektyw oraz konfigurować porty.
Witam ponownie czytelników 0x01 graphic

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=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:

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ę 0x01 graphic



Wyszukiwarka

Podobne podstrony:
Programowanie mikrokontrolerow 8051 w jezyku C
Marcin Wiazania Programowanie mikrokontrolerow AVR w jezyku Bascom
Programowanie mikrokontrolerow 8051 w jezyku C
Programowanie w języku Visual Basic dla arkusza kalkulacyjnego Excel
ZL5PRG Programator mikrokontrol Nieznany
Kurs Programowania W QT by moux
kurs program
Asembler Kurs Programowania Dla Srednio Zaawansowanych S Kruk www !OSIOLEK!com
AVR i ARM7 Programowanie mikrokontrolerow dla kazdego avrar7
Podstawy Programowania Mikrokontrolera 8051
Galka Galka Podstawy Programowania Mikrokontrolera 8051
Podstawy programowania mikrokontrolera 8051
kurs programowania w javascript ZJP2R6YAGSKPQWSNDDGALSPMIOVH2OVSNHC2HKY
Podstawy programowania mikrokontrolerów AVR8 w środowisku AVR Studio 4
Podstawy programowania mikrokontrolera 8051(300dpi)
programowanie mikrokontrolerów

więcej podobnych podstron