Mündəricat:

AVR Assembler Dərsliyi 6: 3 Addımlar
AVR Assembler Dərsliyi 6: 3 Addımlar

Video: AVR Assembler Dərsliyi 6: 3 Addımlar

Video: AVR Assembler Dərsliyi 6: 3 Addımlar
Video: LDmicro 1: Введение (программирование релейной логики ПЛК микроконтроллера с помощью LDmicro) 2024, Noyabr
Anonim
AVR Assembler Dərsliyi 6
AVR Assembler Dərsliyi 6

Tutorial 6 -a xoş gəldiniz!

Bugünkü təlimat, bir atmega328p ilə digərini birləşdirən iki portdan istifadə edərək məlumat ötürmək üçün sadə bir üsul hazırlayacağımız qısa bir dərs olacaq. Daha sonra Tutorial 4 -dən zar silindrini və Tutorial 5 -dən Qeyd Analizatorunu götürəcəyik, onları bir -birinə bağlayacağıq və rulondan alınan zarların nəticəsini analizatora çatdırmaq üçün metodumuzdan istifadə edəcəyik. Daha sonra Tutorial 5 -də analizator üçün qurduğumuz LED -lərdən istifadə edərək rulonu ikili olaraq çap edəcəyik. Bu işlə məşğul olduqdan sonra növbəti dərsdə ümumi layihəmizin növbəti hissəsini qura biləcəyik.

Bu dərslikdə sizə lazım olacaq:

  1. Prototip lövhəniz
  2. Tutorial 4 -dən zar silindriniz
  3. Tutorial 5 -dən Qeyd Analizatorunuz
  4. İki birləşdirici tel
  5. Tam Məlumat Vərəqinin surəti (2014 -cü il versiyası):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. Təlimat dəsti kitabçasının surəti (2014 -cü il versiyası):

    www.atmel.com/images/atmel-0856-avr-instruc…

AVR montajçı dərslərimin tam kolleksiyasına bir link:

Addım 1: İki Mikrodenetleyicinin Bir -biri ilə Danışmasını Necə Əldə Edə bilərik?

İki Mikrodenetleyicinin Bir -biri ilə Danışmasını Necə Əldə Edə bilərik?
İki Mikrodenetleyicinin Bir -biri ilə Danışmasını Necə Əldə Edə bilərik?

Layihəmizi genişləndirməyə başladığımız üçün tək məhsulumuz daha kiçik hissələr toplusundan ibarətdir ki, tək bir Atmega328P -nin təmin edə biləcəyindən daha çox sancağa ehtiyacımız olacaq. Bu səbəbdən ümumi bir layihənin hər bir hissəsini ayrı bir mikro nəzarətçi üzərində edəcəyik və sonra məlumatları aralarında paylaşmalarını istəyəcəyik. Həll etməli olduğumuz problem, nəzarətçilərin bir -biri ilə danışması və aralarında məlumat ötürməsi üçün sadə bir üsulla necə qarşılaşa bilərik? Bu nəzarətçilərlə bağlı bir şey, hər birinin saniyədə 16 milyon təlimat yerinə yetirməsidir. Bu çox dəqiq bir vaxtdadır və buna görə də məlumat ötürmək üçün bu vaxtdan istifadə edə bilərik. Verilənləri təşkil etmək üçün milisaniyəlik gecikmələrdən istifadə etsək, CPU dəqiq bir milisaniyədə 16.000 təlimat icra etdiyi üçün bu qədər dəqiq olmaq məcburiyyətində deyilik. Başqa sözlə, bir milisaniyə CPU üçün bir əbədiyyətdir. Beləliklə, zar rulonları ilə sınayaq. Zar silindrinin nəticəsini zar silindrindən analizator çipinə ötürmək istəyirəm. Tutaq ki, sən yolun qarşısındaydın və mən sənə bir cüt zar yuvarlamağımın nəticəsini bildirmək istədim. Edə biləcəyim bir şey, əgər hər ikimizin saatı olsaydı, bir fənəri yandıra bilərdim, sonra mənim məlumatımı almağa hazır olduğunuzda fənərinizi yandırırsınız və ikimiz də saatlarımızı işə salırıq. Sonra zar yuvarlandıqda fənərimi dəqiq milisaniyədə saxlayıram və sonra söndürürəm. 12 -ni yuvarlasaydım, işığımı 12 milisaniyəyə qədər yandırardım. İndi yuxarıdakı problem ondadır ki, sizin və mənim üçün 5 milisaniyədən 12 -yə qədər ayırmaq üçün lazımi qədər dəqiq vaxt ayıra bilməyimizin heç bir yolu yoxdur. milisaniyə. Bəs bu barədə: Tutaq ki, zardakı hər nömrə üçün işığımı bir il ərzində saxlayacağımıza qərar verdik. Sonra bir 12 yuvarlasam, 12 il sizə işıq saçardım və düşünürəm ki, rəqəmi düzgün hesablamaqda səhv etməyiniz ehtimalı yoxdur? Fasilə verib beysbol oynaya bilərsən, hətta 6 ay boyunca Vegas -da bok oynaya bilərsən, belə ki, ilin bir vaxtında küçənin o tərəfinə baxanda işığın yanmadığını görmək üçün sayını qaçırmayacaqsan. Yaxşı, mikro nəzarətçilər üçün etdiyimiz budur! CPU üçün bir millisaniyə bir il kimidir. Siqnalı 12 milisaniyə yandırsam, digər mikrokontrolörün arada nə və nə baş verməsə də onu 10 və ya 11 üçün qarışdırması ehtimalı demək olar ki yoxdur. Mikrodenetleyiciler üçün bir milisaniyə bir əbədiyyətdir, buna görə də burada edəcəyik. Əvvəlcə ünsiyyət limanımız olmaq üçün nəzarətçi üzərində iki port seçəcəyik. Məlumat Almaq üçün PD6 -dan istifadə edəcəyəm (istəsək Rx deyə bilərik) və məlumatların ötürülməsi üçün PD7 -ni seçərəm (istəsək Tx deyə bilərik). Analizator çipi vaxtaşırı olaraq Rx pinini yoxlayacaq və bir siqnal görsə "ünsiyyət alt proqramına" düşəcək və sonra qəbul etməyə hazır olduğunu bildirərək zar silindrinə geri dönmə siqnalı ötürəcək. Həm vaxta başlayacaqlar, həm də zar silindiri zardakı hər bir rəqəmə bir millisaniyə üçün bir siqnal (yəni 5V) ötürəcək. Beləliklə, rulon ikiqat altı və ya 12 olsaydı, zər silindiri PD7 -ni 12 millisaniyə üçün 5V -a təyin edər və sonra onu 0V -ə qaytarar. Analizator, hər dəfə saymaqla, hər milisaniyədə PD6 pinini yoxlayacaq və 0V -ə geri qayıtdıqda, nəticədə çıxan rəqəmi analizatorun ekranına çıxararaq, LED -lərdə ikili ikiqat göstərəcək. Gəlin bunu həyata keçirə biləcəyimizi görək.

Addım 2: Rabitə Alt Proqramları

Etməli olduğumuz ilk şey iki nəzarətçini birləşdirməkdir. Beləliklə, birində PD6-dan bir tel götürün, digər tərəfdən PD7-yə bağlayın və əksinə. Sonra PD7 -ni hər ikisində Çıxışa və hər ikisində PD6 -nı GİRİŞ -ə qoyaraq onları işə salın. Nəhayət hamısını 0V -ə qoyun. Xüsusilə, hər bir mikrodenetleyicinin kodunun Başlat və ya Sıfırla bölməsinə aşağıdakıları əlavə edin:

sbi DDRD, 7; PD7 çıxışa təyin edildi

cbi PortD, 7; PD7 əvvəlcə 0V cbi DDRD, 6; PD6 giriş cbi PortD, 6; PD6 başlanğıcda 0V clr cəmi; ilk olaraq zarların ümumi sayı 0

İndi zar silindrli çipdə əlaqə alt proqramını quraq. Əvvəlcə "cəmi" adlanan yeni bir dəyişən təyin edin ki, bu da zar cütü üzərində yuvarlanan ümumi sayını saxlayacaq və sıfıra sıfırlayacaq.

Sonra analizatorla ünsiyyət qurmaq üçün bir alt proqram yazın:

ünsiyyət:

cbi PortD, 7 sbi PortD, 7; Hazır siqnal gözləyin: sbic PinD, 6; PinD oxuyun və 0V rjmp gözləmə gecikməsi 8 olarsa atlayın; sinxronizasiya üçün gecikmə (bunu təcrübədə tapdı) göndər: dec total gecikmə 2; hər ölmə üçün gecikmə cpi cəmi, 0; 0 burada "cəmi" sayı gecikmələr göndərildi deməkdir breq PC+2 rjmp cbi göndər PortD, 7; PD7 -dən 0V -ə qədər; sıfır sıfırını sıfırla sıfırlayın

Analizatorda ünsiyyət alt proqramına əsas rutindən bir zəng əlavə edirik:

clr analizatoru; yeni nömrəyə hazırlaşın

sbic PinD, 6; ünsiyyət qurmaq üçün 5V siqnal üçün PD6 -nı yoxlayın; 5V mov analizatoru ilə əlaqə qurmağa gedirsə, cəmi; analizatora çıxış rcall analizatoru

və sonra əlaqə alt proqramını aşağıdakı kimi yazın:

ünsiyyət:

clr total; cəmi 0 gecikmə 10 -a sıfırlayın; sıçramalardan xilas olmaq üçün gecikmə sbi PortD, 7; hazır qəbulu siqnal etmək üçün PB7 -ni 5V -ə təyin edin: gecikmə 2; cəmi daxil olmaqla növbəti nömrəni gözləyin; artan ümumi sbic PinD, 6; PD6 0V -ə qayıdırsa, rjmp qəbulunu bitirdik; əks halda daha çox məlumat üçün geri dönün cbi PortD, 7; tamamlandıqda PD7 sıfırlayın

Buyurun! İndi hər bir mikrokontrolör, zar rulosunun nəticəsini bildirmək və sonra analizatorda göstərmək üçün qurulmuşdur.

Bir qeydin məzmununu yalnız bir zar rulosu əvəzinə nəzarətçilər arasında köçürməli olduğumuz zaman daha təsirli bir ünsiyyət üsulu tətbiq edəcəyik. Bu vəziyyətdə yenə də onları birləşdirən yalnız iki teldən istifadə edəcəyik, ancaq "ötürməyə başla" demək üçün 1, 1 -dən istifadə edəcəyik; 0, 1 "1" demək; 1, 0 "0" demək; və nəhayət 0, 0 "son ötürmə" deməkdir.

Məşq 1: Daha yaxşı bir üsul tətbiq edə biləcəyinizə və zar rulosunu 8 bitlik ikili ədəd olaraq köçürmək üçün istifadə edə biləcəyinizə baxın.

İşlədiyimi göstərən bir video əlavə edəcəyəm.

Addım 3: Nəticə

Nəticə
Nəticə

İstinad üçün tam kodu əlavə etdim. İstədiyim qədər təmiz və səliqəli deyil, amma gələcək dərslərdə genişləndirdiyimiz kimi təmizləyəcəyəm.

Bundan sonra hamısını bura yazmaqdansa kod olan faylları əlavə edəcəyəm. Yalnız müzakirə etmək istədiyimiz bölmələri yazacağıq.

Bu, analizator mikro nəzarətçimizə zar silindrli mikro nəzarətçimizdən zar yuvarlamağımızın nəticəsini yalnız iki limanı istifadə edərkən izah etmək üçün sadə bir üsulla gəldiyimiz qısa bir dərs idi.

Məşq 2: Zar silindrinin ötürməyə hazır olduğunu və analizatorun qəbul etməyə hazır olduğunu göstərmək üçün hazır bir siqnal istifadə etmək əvəzinə, "Pin dəyişdirmə kəsilməsi" adlı bir "xarici kəsmə" istifadə edin. Atmega328p üzərindəki sancaqlar bu şəkildə istifadə edilə bilər, buna görə pinout diaqramında yanında PCINT23 -dən PCINT0 var. Bunu, taymer daşması ilə etdiyimiz kimi oxşar bir şəkildə bir fasilə olaraq həyata keçirə bilərsiniz. Bu halda, kəsmə "işləyicisi" zar silindiri ilə əlaqə quran alt proqram olacaq. Bu yolla əslində əsasdan əlaqə alt proqramına zəng etməyinizə ehtiyac yoxdur: bu pindəki vəziyyət dəyişikliyindən hər hansı bir fasilə olduqda ora gedəcək.

Məşq 3: Bir mikrokontrolör arasındakı məlumatları digərlərinin toplusuna ötürməyin və ötürməyin daha yaxşı bir yolu, mikro nəzarətçinin özündə quraşdırılmış 2 telli serial interfeysdən istifadə etməkdir. Məlumat cədvəlinin 22 -ci hissəsini oxumağa çalışın və bunun necə həyata keçiriləcəyini anlaya biləcəyinizə baxın.

Gələcəkdə daha çox nəzarətçi əlavə etdikdə bu daha mürəkkəb üsullardan istifadə edəcəyik.

Analizatorumuzla etdiyimiz işlərin hamısı zar rulosunun cəmini götürmək və sonra LED -lərdən istifadə edərək ikili olaraq çap etməkdir. Fakt budur ki, indi analizatorumuz zar rulosunun nə olduğunu "bilir" və buna görə də istifadə edə bilər.

Növbəti dərsdə "analizatorumuzun" məqsədini dəyişdirəcəyik, daha bir neçə dövrə elementi təqdim edəcəyik və zar rulonunu daha maraqlı bir şəkildə istifadə edəcəyik.

Növbəti dəfə qədər…

Tövsiyə: