Mündəricat:

3-cü hissə: GPIO: ARM Assambleyası: Line Follower: TI-RSLK: 6 Addım
3-cü hissə: GPIO: ARM Assambleyası: Line Follower: TI-RSLK: 6 Addım

Video: 3-cü hissə: GPIO: ARM Assambleyası: Line Follower: TI-RSLK: 6 Addım

Video: 3-cü hissə: GPIO: ARM Assambleyası: Line Follower: TI-RSLK: 6 Addım
Video: Zynq Part 2: Zynq Vitis Example with PL Fabric GPIO and BRAM 2024, Iyul
Anonim
Image
Image
Avadanlıq
Avadanlıq

Salam. Bu, ARM montajını (daha yüksək səviyyəli bir dil əvəzinə) istifadə etməyə davam etdiyimiz növbəti hissədir. Bu Təlimat üçün ilham, Texas Instruments Robotics System Learning Kit və ya TI-RSLK Lab 6-dır.

Mikro nəzarətçidən dəstdən, MSP432 LaunchPad inkişaf etdirmə lövhəsindən istifadə edəcəyik, ancaq bəlkə də LaunchPad istifadə etməsəniz və ya TI -ni izləsəniz də bu Təlimat kitabından çıxarmaq üçün faydalı bir şey tapa bilərsiniz. kurikulum.

ARM Assambleyası, inkişaf mühiti və bir layihənin necə ediləcəyi ilə tanış olmaq üçün Təlimatlandırıla başladıq.

Növbəti ARM Assambleyasında Təlimat giriş/çıxış (GPIO) ilə necə qarşılıqlı əlaqə qurmağı təqdim etdi.

Sonra biliklərimizi genişləndirdik və LEDləri və açarları idarə edən funksiyaları təqdim etdik.

İndi bu Təlimatla öyrəndiklərimizi daha əyləncəli, daha faydalı bir şey etmək üçün istifadə edə bilərik: bir xətti aşkar edin.

Bu, daha sonra xətti izləyən bir robot qurduqda bizə kömək edə bilər.

Tədris proqramında proqramlaşdırmanın əksəriyyəti C və ya C ++ dilində aparılır, lakin daha yüksək səviyyəli dillərdən və kitabxanalardan asılı olaraq işə başlamazdan əvvəl montajla tanış olmaq faydalıdır.

Addım 1: Hardware

Avadanlıq
Avadanlıq
Avadanlıq
Avadanlıq
Avadanlıq
Avadanlıq

Mənbələri yenidən nəzərdən keçirmək istəmirəm, çünki artıq mənbələr var, amma lazım olduqda izahat əlavə edəcəyik.

TI-RSLK-nın (robot dəsti) bir hissəsi olduğu üçün bu Təlimat üçün Pololu'dan Yansıtma Sensor Arrrayını istifadə edəcəyik. Kursda və kurikulumun 6 -cı laboratoriyasında istifadə olunan dərsdir.

Əgər bu yoxdursa, varlığı və olmaması üçün yüksək və ya aşağı rəqəmsal bir siqnal çıxaran hər hansı bir İK detektorundan (və ya onların seriyasından) istifadə edə bilərsiniz.

Array sensoru ən yaxşısıdır, çünki xəttin mərkəzində olduğumuzu və ya bir tərəfdə olduğumuzu təyin etməyə kömək edə bilər. Üstəlik, daha sonra görəcəyimiz kimi, robotun xətlə bağlı bucağını müəyyən etməyə kömək edə bilər.

Yansıtma sistemində bir -birinə çox yaxın olan detektorlar var. Bu, əlbəttə ki, xəttin qalınlığından asılı olaraq birdən çox aşkarlama siqnalı almalıyıq.

Əgər belədirsə, onda robot xəttin birbaşa xətti ilə deyilsə, xəttin daha geniş olduğu bir çıxışı qaytarmalıdır (çünki bucaqdayıq).

Yuxarıdakıları daha yaxşı izah etmək üçün Lab 6 sənədinə nəzər salın.

Sensoru MSP432 LaunchPad inkişaf lövhəsinə bağlamaq / bağlamaqda kömək etmək üçün burada bəzi faydalı təlimatlar verilmişdir.

Bu addıma eyni (oxşar?) Pdf təlimatlarını da əlavə etdim.

Pololu sənədlərini diqqətlə oxusanız, "3.3V bypass" ın səbəbini izah edirlər ki, 5V yerinə 3.3V istifadə edirsinizsə, tullanmaq istəyəcəksiniz.

Robotu hələ qurmadığımız üçün, bunun əvəzinə yalnız ARM quruluşu və robotun parçaları (alt sistemləri) ilə necə qarşılıqlı əlaqə qurmağı öyrəndiyimiz üçün yuxarıdakı təlimatlara əməl etmək məcburiyyətində deyilik.

Hələlik, xətt sensoru dizisini birləşdirmək yalnız aşağıya doğru azalır:

  • 3.3V və GND -ni MSP432 lövhəsindən sensorlar massivinə qoşun.
  • bir xətt pinini (mən P5.3 təklif edirəm) MSP432 -dən xətt sensoru massivindəki LED imkan pininə bağlayın. Sensordakı pin 3.3V və GND arasındadır.
  • tək bir portun bütün səkkiz sancağını/bitini (P7.0 -dan P7.7 -ə qədər təklif edirəm) "1" -dən "8" -ə qədər olan sensorlar silsiləsinin səkkiz pininə qoşun. Bunlar hiss etdiklərindən asılı olaraq YÜKSƏK və ya DÜZ gedəcək xətlərdir.

Bu addımın və videoda gördüyünüz kimi sensoru robot şassisinə bağlamadım, çünki proqramlaşdırma, ayıklama, test, öyrənmə asanlığı istədim.

Beləliklə, hər şey bağlı olduqda, proqrama girməyə hazırıq.

Addım 2: Ardıcıllıq xətti

Xətti İzləyir
Xətti İzləyir
Xətti İzləyir
Xətti İzləyir

Yansıtma dizisi sensoru olduqca yaraşıqlıdır, çünki ən azı iki şəkildə kömək edə bilər.

  • Robotun mərkəzdə və ya bir tərəfə sürükləndiyini müəyyənləşdirin.
  • Robot xəttin istiqamətinə uyğunlaşdırılıb, yoxsa bucaqdadır.

Dizinin hər bir detektoru mahiyyətcə YÜKSƏK və YAXŞI bir az məlumat verir.

Fikir, bütün bu bitləri tək bir rəqəmə və ya tək bit nümunəsinə birləşdirmək və qərar vermək üçün bu nümunəni istifadə etməkdir (düzgün hərəkət etmək üçün).

Addım 3: Həqiqətən Başlamazdan əvvəl …

.. ARM montaj proqramlaşdırması haqqında yeni bir şey öyrənməliyik. Və mən başqa bir təlimat demək istəmirəm. Kiçik olmağa meyllidirlər.

İndiyə qədər proqramlarımızda "yığını" istifadə etməmişik.

Fərqli alt proqramlarda qlobal miqyasda əsas CPU qeydlərinin çoxunun istifadəsinə etibar etdik.

Etdiyimiz tək şey, bir funksiya üçün LR (link reyestri) ünvanını saxlamaq və bərpa etmək idi - bir neçə digər funksiyanı çağırdı. (Burada "funksiya" və "alt proqram" ı bir -birinin əvəzinə istifadə edirəm).

Etdiyimiz işlər yaxşı deyil. Başqa funksiyaları içəri qoymaq istəsək nə olar? Bəs birdən çox yuva qurma səviyyəmiz varsa?

Əvvəlki nümunələrdə, LR və ya geri dönüş ünvanı üçün R6 qeydindən istifadə etməyi seçdik. Ancaq daha da dərinləşdirmək istəsək, R6 -nın dəyərini dəyişməyə davam edə bilmərik. Başqa bir reyestr seçməliyik. Və başqa. Və sonra hansı əsas cpu reyestrinin hansı LR -in hansı funksiyanı bərpa edəcəyini izləmək çətin olur.

İndi "yığını" nəzərdən keçirək.

Addım 4: Yığın

Yığını izah edən oxu materialı burada.

Mən bir neçə fikrin daha böyük tərəfdarıyam:

  • yalnız lazım olduğu qədər nəzəriyyə, tez praktikaya keçin
  • ehtiyac duyduğunuz zaman öyrənin, yalnız məqsədsiz məşqlər və ya nümunələrə deyil, bir şey etməyə diqqət yetirin.

Yığın haqqında danışan bir çox ARM və MSP432 sənədləri var, buna görə də bunları təkrar etməyəcəyəm. Buradakı yığının istifadəsini də minimum həddə saxlayacağam - dönüş ünvanını (Link Qeydiyyatı) saxlayıram.

Əslində, yalnız təlimatlara ehtiyacımız var:

PUSH {qeydiyyat siyahısı}

POP {qeydiyyat siyahısı}

Və ya bizim vəziyyətimizdə, xüsusən:

BASIN {LR}

POP {LR}

Beləliklə, bir montaj funksiyası/alt proqramı belə görünür:

funcLabel:.asmfunc

PUSH {LR}; bu, ehtimal ki, girişlə bağlı ilk təlimatlardan biri olmalıdır.; burada daha çox kod yazın..; Blah Blah Blah…; tamam, funksiyanı bitirdik, POP {LR} zəng funksiyasına geri qayıtmağa hazırıq; bu, düzgün geri dönüş ünvanını yenidən zəngə qaytarır; funksiyası. BX LR; qayıt.endasmfunc

Video, bir neçə yuvalı funksiyanın canlı bir nümunəsindən keçir.

Addım 5: Proqram təminatı

"MSP432_Chapter…" etiketli fayl MSP432 -nin limanları haqqında çoxlu yaxşı məlumatlara malikdir və həmin sənəddən aşağıdakı limanları, qeydləri, ünvanları və s. Əldə edirik. Bununla birlikdə, Port 5 və yuxarı üçün göstərilən ətraflı ünvanları görmədim. (yalnız "alternativ funksiyalar"). Amma yenə də faydalıdır.

İki Limandan istifadə edəcəyik. P5, P7, P1 və P2.

P5.3 (tək bit) çıxışı sensordakı IR LED-ini idarə etmək olacaq. Sensor massivinə gedən digər MSP432 bağlantıları ilə eyni başlıqdakı açıq bir pin olduğu üçün P5.3 istifadə edirik.

P7.0 - P7.7 sensordan məlumat toplayan səkkiz giriş olacaq; nə "görür".

P1.0 tək qırmızı LED -dir və bunu bizə məlumatların bəzi göstəricilərini vermək üçün istifadə edə bilərik.

P2.0, P2.1, P2.2 RGB LED -dir və biz də fərqli rəng imkanları ilə sensor məlumatlarını göstərmək üçün istifadə edə bilərik.

Bütün bunlarla əlaqədar əvvəlki Təlimatlardan keçmisinizsə, proqramı necə quracağınızı artıq bilirsiniz.

Limanlar və bitlər üçün bəyannamə bölməsinə sahib olun.

"Əsas" bölməsinə sahib olacaqsınız.

P7 -dən məlumatları davamlı olaraq oxuduğumuz, bu məlumatlara qərar verdiyimiz və buna uyğun olaraq iki LED -i yandırdığımız bir döngə olmalıdır.

Yenə Liman Qeydiyyatı ünvanları:

  • GPIO P1: 0x4000 4C00 + 0 (cüt ünvanlar)
  • GPIO P2: 0x4000 4C00 + 1 (tək ünvanlar)
  • GPIO P3: 0x4000 4C00 + 20 (cüt ünvanlar)
  • GPIO P4: 0x4000 4C00 + 21 (tək ünvanlar)
  • GPIO P5: 0x4000 4C00 + 40 (cüt ünvanlar)
  • GPIO P6: 0x4000 4C00 + 41 (tək ünvanlar)
  • GPIO P7: 0x4000 4C00 + 60 (hətta ünvanlar)
  • GPIO P8: 0x4000 4C00 + 61 (tək ünvanlar)
  • GPIO P9: 0x4000 4C00 + 80 (cüt ünvanlar)
  • GPIO P10: 0x4000 4C00 + 81 (tək ünvanlar)

Qalın olan şey, bu Təlimat üçün istifadə edəcəyimiz şeydir.

IR Detektorlarını oxumaq üçün proqram addımları

Proqramı C ilə yazmaq üçün aşağıdakılar psuedo kodudur, amma yenə də faydalıdır və proqramın montaj versiyasında onu yaxından təqib edəcəyik.

əsas proqram0) // portları işə salın (1) {1) P5.3 -ü yüksək (IR LED -i yandırın) 2) P7.0 -ı bir çıxış halına gətirin və onu yüksək səviyyəyə qoyun (kondansatörü doldurun) 3) 10 bizi gözləyin, Clock_Delay1us (10); 4) P7.0 -ı giriş halına gətirin 5) Bu döngəni 10 000 dəfə işləyin a) P7.0 -ı oxuyun (P7.0 -dakı gərginliyi ikiliyə çevirir) b) İkili ikili P1.0 -a çıxarın (ikili rəqəmi real vaxtda görməyə imkan verir)) 6) P5.3 -ü aşağı (IR LEDini söndürün, enerjiyə qənaət edin) 7) 10 ms gözləyin, Clock_Delay1ms (10); } // təkrar et (while () -a qayıt)

Addım 6: Məcəlləni təkmilləşdirək

Pololu IR LED serialının məqsədi və ya istifadəsi bir xətti aşkar etmək və robotun (gələcəyin) birbaşa xəttin mərkəzində və ya bir tərəfdə olub olmadığını bilməkdir. Ayrıca, xəttin müəyyən bir qalınlığı olduğu üçün, əgər sensorlar silsiləsi xəttə birbaşa dik olarsa, N saylı sensorlar digərlərindən fərqli oxunuşa malik olacaq, halbuki İQ LED massivi bir bucaqdadırsa (dik deyil), onda N+1 və ya N+2 IR LED/detektor cütləri indi fərqli bir oxu verməlidir.

Beləliklə, xəttin varlığını göstərən neçə sensordan asılı olaraq, mərkəzdə olduğumuzu və bucaqlı olduğumuzu bilməliyik.

Bu son sınaq üçün, görək ki, qırmızı LED və RGB LED -lərini alaraq sensor dizisinin bizə dedikləri haqqında daha çox məlumat verə bilərik.

Video bütün detalları əhatə edir. Son kod da əlavə olunur.

Bu, GPIO ilə əlaqəli ARM Assambleyasının seriyasını tamamlayır. Daha sonra daha çox ARM Assambleyası ilə geri dönəcəyimizi ümid edirik.

Çox sağ ol.

Tövsiyə: