Мазмуну:

AVR Assembler үйрөткүчү 7: 12 кадамдары
AVR Assembler үйрөткүчү 7: 12 кадамдары

Video: AVR Assembler үйрөткүчү 7: 12 кадамдары

Video: AVR Assembler үйрөткүчү 7: 12 кадамдары
Video: MKS SGEN L V1.0 - A4988 Stepper Drivers 2024, Ноябрь
Anonim
AVR Assembler үйрөткүчү 7
AVR Assembler үйрөткүчү 7

Tutorial 7ге кош келиңиз!

Бүгүн биз адегенде клавиатураны кантип тазалоо керектигин, анан аналогдук кирүү портторун клавиатура менен кантип байланышуу керектигин көрсөтөбүз. Биз ар бир баскыч аналогдук кирүүгө уникалдуу чыңалууну жөнөтө турган баскычты өткөрөбүз, ал бизге кайсы баскыч басылганын чыңалуу менен айырмалоого мүмкүндүк берет. Андан кийин биз баарыбыз керек болуп жаткандыгын көрсөтүү үчүн реестр анализаторубузга басылган санды чыгарабыз. ATmega328pдеги аналогдук санариптик конвертерди (ADC) колдонууда бир катар тузактар бар. жолдо нерселерди бир нече этап менен алып, алардан кантип сактануу керек экенин билип алыңыз. Эмне үчүн аналогду санарипке айлантууну колдонуу микроконтроллерде азыраак портту колдонсо да, клавиатураны башкаруунун эң жакшы жолу эмес экенин көрөбүз.

  1. баскычтоп. Сиз бирин сатып алсаңыз болот же сиз менин кылганымды кылып, бирин тазалай аласыз.
  2. Аял клавишасы үчүн 2 аял башы (эгер сиз аны тазалап жатсаңыз)
  3. туташтыруучу зымдар
  4. нан
  5. 4 1 Кох резисторлору
  6. 1 15 Кох каршылыгы
  7. 1 3.3 Кох каршылыгы
  8. 1 180 Ом каршылыгы
  9. 1680 ом каршылыгы
  10. санарип мультиметр
  11. Сиздин анализаторуңуз Tutorial 5тен

Эгерде сизде мурунтан эле баскыч бар болсо жана аны тазалоонун кажети жок болсо, сиз биринчи бир нече кадамды өткөрүп жиберишиңиз мүмкүн.

Бул жерде менин AVR ассемблер окуу куралдарымдын толук коллекциясына шилтеме бар:

1 -кадам: Баскычтопту тазалаңыз 1

Баскычтопту өчүрүү 1
Баскычтопту өчүрүү 1
Баскычтопту өчүрүү 1
Баскычтопту өчүрүү 1
Баскычтопту өчүрүү 1
Баскычтопту өчүрүү 1
Баскычтопту өчүрүү 1
Баскычтопту өчүрүү 1

Илгери, чоң ата, чоң энең кичинекей кезинде эле, адамдар бири -бири менен баарлашуу үчүн дубалдарына узун кабелдери туташтырылган кызыктай түзүлүштөрдү колдонушчу. Алар "телефондор" деп аталышкан жана адатта, кимдир бирөө сизге чалганда кыжырды келтирүүчү үн чыгаруучу арзан пластикалык нерселер болгон (азыркы "Джастин Бибер" рингтондору бирдей тажатма эмес). Кандай болбосун, бул түзмөктөрдө клавиатуралар бар болчу, алар абдан зымдуу, ошондуктан тазалоо оңой жана аларда башка 2 баскычтар бар ("кайра терүү" жана "жарк"), сиз кайра сатып алууну кааласаңыз болот. "жебе баскычтары", "меню баскычтары" же башка нерсе. Ошентип, биз эски телефондон клавиатураны тазалоодон баштайбыз. Адегенде телефонду алыңыз (мен сүрөттөрдө көрсөтүлгөндөй GE бирин колдонуп жатам) жана зымдарды ачуу үчүн бөлүп алыңыз. Анан чүкөнү алып, клавиатураны кармап турган кичинекей пластикалык баскычтарды чечип, баскычты алып салыңыз.

2 -кадам: Баскычтопту тазалаңыз 2

Баскычтопту тазалоо 2
Баскычтопту тазалоо 2
Баскычтопту тазалоо 2
Баскычтопту тазалоо 2
Баскычтопту тазалоо 2
Баскычтопту тазалоо 2

Эми ПВХ арааны алыңыз жана пластикти ачкыч тешиктеринин тегерегинен кесип, анан тереңдигин алуу үчүн четинен кесип, жука баскычтопту калтырыңыз.

Кийинки баскычты акыркы кадамда чокуларын кырккандан кийин калган кичинекей казыктарды колдонуп коюңуз жана ширетүүчү темирди колдонуп, ысык темирди ар бир казыктын тешигине сайыңыз. клавиатуранын түбү жаңы "баскычтарды" түзөт, алар клавиатураны мурдагыдай эле кармап турат.

Мен үч спикерди, балким, өчүргүчтөр жана тактада жок нерселерди тазалоону жакшы көрөм. Бирок, бул жолу мен өчүргүчтөрдү жана башка нерселерди таппайм, анткени бизде башка максаттар бар. Ошондой эле, анда TA31002 линиялык IC бар, ал телефон шыңгырайт. Маалыматтар баракчасы оңой табылып, жүктөлүп алынып, пинту жана функцияларды берет. Ошентип, мен аны азыр тактага калтырып, кийинчерээк аны менен ойнойм. Мен аны осциллографка илип, андан кандай сонун сигналдарды чыгара алаарымды көргүм келет. Балким, андан эшиктин коңгуроосун жасайттырсыз. Ким билет.

Кандай болбосун, сиз телефонду бузуп, бөлүктөрүн тазалап бүткөндөн кийин, биз клавиатураны жасап бүтүрөбүз.

3 -кадам: Баскычтопту тазалаңыз 3

Баскычтопту өчүрүү 3
Баскычтопту өчүрүү 3
Баскычтопту өчүрүү 3
Баскычтопту өчүрүү 3
Баскычтопту өчүрүү 3
Баскычтопту өчүрүү 3

Тазалоочу таякчаны колдонуп, клавиатуранын ылдый жагындагы лента кабелин алып салыңыз, чынжырдын тешиктери ачык экенине ынангыла, андан кийин тешиктер турган тактага эки аялдын башын тиркеңиз. Сиз, балким, баштарыңызды 4 пинтүү баштар кылып түшүрүшүңүз керек болот.

Эми баштар тиркелгенден кийин, аны нанга такап, мультиметрди алып, мультиметрди туш келди казыктарга илип, каршылыкты өлчөө менен ачкычтарды текшере аласыз. Бул ачкычтарды картага түшүрүүгө мүмкүндүк берет. Баскычтардын чыгууга кантип туташып турганын көрүү кыйын, бирок эгер сиз мультиметрди колдонсоңуз, аны каалаган эки казыкка туташтырып, андан кийин ачык схеманын ордуна экранда санды көргөнгө чейин баскычтарды басыңыз.. Бул ошол ачкычтын түйүнү болот.

Мындай жол менен казыктардын бардык ачкычтарын картага салыңыз.

4 -кадам: Баскычтопту зымга сайыңыз

Баскычтопту зымга сайыңыз
Баскычтопту зымга сайыңыз
Баскычтопту зымга сайыңыз
Баскычтопту зымга сайыңыз

Эми туташуу схемасын ээрчип, клавиатураны нан тактаңызга туташтырыңыз.

Бул кандайча иштейт, биз 5Vны сол колубузга коёбуз, оң жагы GNDге өтөт. Диаграмманын оң жагындагы биринчи пин биздин Atmega328p микроконтроллериндеги аналогдук казыктарыбыздын биринчисине кирет. Баскычтар жок болгондо, сигнал 0В болот, жана ар бир баскыч басылганда, аналогдук портко кирүү кайсы баскычтын басылганына жараша ар кандай өлчөмдө 0В менен 5В ортосунда болот. Биз резистордун баалуулуктарын ар бир жолдо башкалардан айырмаланып турган каршылыкты камтышы үчүн тандап алдык. Микроконтроллердеги аналогдук порт аналогдук сигналды алат жана 0V менен 5V ортосунда 1024 ар кандай каналга бөлөт. Бул ар бир каналдын туурасы 5V/1024 = 0,005 В/канал = 5 мВ/каналга ээ экенин билдирет. Ошентип, аналогдук порт 5 мВтан ашык айырмаланып турганда, кирүү чыңалуусун айырмалай алат. Биздин учурда, биз резистордун маанилерин тандап алдык, ошондуктан каалаган эки баскыч чыңалуу сигналын жөнөтөт, андыктан микроконтроллер кайсы баскыч басылганын оңой чечиши керек. Чоң көйгөй - бул бүт система абдан ызы -чуу, ошондуктан биз ар бир баскычты басуу үчүн карта үчүн бир катар чыңалууларды тандашыбыз керек болот - бирок биз ага бир аздан кийин киребиз.

Байкаңыз, биз контроллерге бир гана киргизүү линиясын колдонуп, 14 баскычтуу баскычтопту башкара алабыз. Бул аналогдук киргизүүлөрдүн пайдалуу жактарынын бири.

Эми клавиатураны башкарууга болгон биринчи аракетибиз баскычтын басылышына себеп болот, үзгүлтүккө учуроочу программа аналогдук кирүү портун окуйт жана кайсы баскыч басылганын чечет, андан кийин ал санды биздин регистр анализаторунун подрограммасына чыгарат. 5 -үйрөткүчтө орнотулган 8 светодиодубуздагы бинардык ачкыч.

5 -кадам: Анализаторуңузга клавиатураны өткөрүңүз

Анализаторуңузга клавиатураны өткөрүңүз
Анализаторуңузга клавиатураны өткөрүңүз
Анализаторуңузга клавиатураны өткөрүңүз
Анализаторуңузга клавиатураны өткөрүңүз

Сүрөттөр биз анализатордун дисплейиндеги өндүрүштү көрүү үчүн клавиатураны микроконтроллерге кантип зым кылгыбыз келгенин көрсөтөт. Негизи, биз клавиатурадан чыгууну PortC pin 0го өткөрөбүз, ал ATmega328Pде ADC0 деп да аталат.

Бирок, дагы бир нече кошумча нерселер бар. Биз ошондой эле PD2ге баскычты өткөрөбүз. Башкача айтканда 5V темир жолунан бир баскычка жана баскычтын башка тарабынан PD2ге зым алыңыз, жана акырында, биз 5V рельстен AREF пинин ажыратып, анын ордуна аны ажыратып койгубуз келет. Биз кааласак, 0.1 микрофарад ажыратуучу конденсаторду киргизе алабыз. Бул керамикалык конденсатор, анын үстүнө 104 жазылган. Биринчи эки цифра-бул сан жана акыркы цифра-10дун күчү, биз аны пикофарадда жооп алуу үчүн көбөйтөбүз (пико 10^-12 дегенди билдирет), демек 104, 10 х 10^4 пикофарадды билдирет, бул бирдей 100 нанофарад (нано 10^-9 дегенди билдирет), бул 0.1 микрофарад менен бирдей (микро 10^-6). Кандай болбосун, мунун баары AREF пинин стабилдештирүү, биз аны таяныч пин катары колдоно алабыз.

Биз ошондой эле PD2 менен жердин ортосунда 1 Mohm каршылыгын каалайбыз. Биз PD2ди 0Vге чыгуу пини катары коёбуз жана биз ошол пиндин оң жагында иштейбиз. Биз баскычты коё бергенде, четибиз дароо жоголушун каалайбыз, ошондуктан бул "түшүрүү" каршылыгын киргизебиз.

Биз баскычты каалаганыбыздын себеби, биз аналогдук-санариптик конвертерибизди чипте INT0 пинден чыгарууну каалайбыз, анткени бул дагы PD2. Акыр -аягы, биз баскычты ADCди иштетүүнү, ошондой эле киргизүүнү өзүнчө баскычсыз которууну камсыз кылууну каалайбыз, бирок убакыттын иштөө ыкмасынан улам биз ADCди иштетүү үчүн өзүнчө баскычка ээ болуудан баштайбыз. мүчүлүштүктөр чыгып, баары туура иштеп жатканына ишенебиз, анда биз окугубуз келген баскычты басуудан келип чыккан ызы -чуу жана убакыт маселелерин чечебиз.

Ошентип, азырынча анын иштөө ыкмасы - биз ачкычты кармап турабыз, андан кийин ADCти иштетүү үчүн баскычты басыңыз, анан кое бериңиз жана биз баскан баскычтын бинардык мааниси анализатордо көрүнөт деп үмүттөнөбүз.

Ошентип, келгиле, муну аткара турган код жазалы.

6 -кадам: Кайсы которуштургучтарды орнотушубуз керек?

Кайсы которуштургучтарды орнотушубуз керек?
Кайсы которуштургучтарды орнотушубуз керек?

Келгиле, адегенде биз бул кодду кантип киргизээрибизди ойлонуп көрөлү, андыктан контроллер баскычтын киришин окуп, басылган баскычка туура келген сандык мааниге айландыра алат. бул Atmega328pге курулган. Биз AREFти шилтеме чыңалуубуз катары колдонобуз жана баскычтоптун чыгышы PortC0 же PC0 менен туташат. Белгилей кетчү нерсе, бул пин аналогдук-санариптик конвертер 0 үчүн ADC0 деп аталат. ATmega328P үчүн үзгүлтүктөр боюнча 12.4-бөлүмдү жана аналогдук-санариптик которгучтун 24-бөлүмүн окуганыбыз жакшы болмок. Микроконтроллерди аналогдук сигнал менен эмне кылуу керектигин жана биздин программа менен кантип иштөө керек экенин билүү үчүн орнотуу үчүн, биз адегенде ар кандай ADCлерди орнотушубуз керек. тиешелүү регистр биттери. Булар негизинен биринчи компьютерлердеги эски которгучтарга барабар. Сиз же которгучту КҮЙГҮЗҮП же ӨЧҮРҮҢҮЗ, же андан ары артка карай бир розетка менен экинчисинин ортосуна кабелдерди туташтырасыз, ошондо жолдогу айрыга жеткен электрондор бир дарбазаны жабык, экинчиси аны башка жолго түшүүгө мажбур кылат. схема жана башка логикалык тапшырманы аткарат. Ассамблея тилинде кодировкалоодо биз микроконтроллердин бул функцияларына жакын киребиз, бул эң биринчи кезекте муну жасоонун жагымдуу нерселеринин бири. Бул көбүрөөк "колдо" жана азыраак "көшөгөнүн артында" болуп жатат. Андыктан бул регистрлерди коюуну түйшүктүү иш катары ойлобоңуз. Бул ассамблея тилин кызыктуу кылган нерсе! Биз чиптин ички иштеши жана логикасы менен жеке мамилеге ээ болуп, аны өзүбүз каалагандай кылып жасайбыз - ашык жана кем эмес. Эч кандай текке кетирилген саат циклдери жок. Демек, биз орнотушубуз керек болгон өчүргүчтөрдүн тизмеси:

  1. Power Reduction ADC битин, PRRCти өчүрүңүз, ал PRR реестринин 0 битин түзөт, анткени бул бит болсо, ADCди өчүрөт. Электр энергиясын кыскартуу реестри, негизинен, сизге керек болбогондо кубатты колдонуучу ар кандай нерселерди өчүрүү ыкмасы. Биз ADCди колдонуп жаткандыктан, биз бул жол менен өчүрүлбөгөнүн текшергибиз келет. (46 -беттеги PRADCти караңыз)
  2. ADC0 болуу үчүн аналогдук кирүү каналын тандаңыз ADC Multiplexer Selection (ADMUX) реестринен MUX3… 0 өчүрүү менен (24-4-таблицаны караңыз) булар демейки боюнча өчүрүлгөн, андыктан муну кылуунун кажети жок. Бирок, мен аны кошуп жатам, анткени эгер сиз качандыр бир убакта ADC0дон башка портту колдонсоңуз, анда бул которуштургучтарды ошого жараша которушуңуз керек болот. MUX3, MUX2, MUX1, MUX0 ар кандай айкалыштары сизге аналогдук порттордун каалаганын кириш катары колдонууга мүмкүндүк берет жана сиз бир эле учурда ар кандай аналогдук сигналдардын топтомун карагыңыз келсе, буларды дароо өзгөртө аласыз.
  3. ADMUX реестриндеги REFS0 жана REFS1 биттерин өчүрүңүз, биз AREFти ички шилтеме эмес, биздин чыңалуу чыңалуубуз катары колдонобуз (248 -бетти караңыз).
  4. ADMUXтан ADLAR битин күйгүзүңүз, натыйжа "солго туураланды", биз бул тандоону кийинки кадамда талкуулайбыз.
  5. Санариптик кирүүнү өчүрүү үчүн ADC0D битти Санариптик киргизүүнү өчүрүү реестрине (DIDR0) коюп, PC0го санариптик кирүүнү өчүрүү үчүн. Биз ал портту аналогдук киргизүү үчүн колдонуп жатабыз, андыктан санариптик киргизүүнү да өчүрө алабыз.
  6. IS0 жана ISC1ди тышкы үзгүлтүккө учуратууну башкаруу реестрине (EICRA) орнотуңуз, биз чыңалуу сигналынын INT0 пинине (PD2) көтөрүлө турган четинде иштетүүнү каалайбыз, 71 -бетти караңыз.
  7. Тышкы үзгүлтүккө учуроочу маска реестриндеги (EIMSK) INT0 жана INT1 биттерин тазалаңыз, бул пинге үзгүлтүктөрдү колдонбогондугубузду көрсөтөт. Эгерде биз бул пиндеги үзгүлтүктөрдү иштете турган болсок, анда 0x0002 дареги боюнча үзгүлтүккө учуроочу иштетүүчүгө муктаж болобуз, бирок анын ордуна биз бул пиндеги сигнал ADC конверсиясын иштетет, аны аяктоо ADC конверсиясы тарабынан аткарылат. дареги 0x002A. 72 -бетти караңыз.
  8. ADC иштетүү үчүн ADC көзөмөлдөө жана статус регистринде А (ADCSRA) ADC Enable (ADEN) битин (бит 7) орнотуңуз. 249 -бетти караңыз.
  9. Биз аналогдук сигналды окугубуз келген сайын ADC баштоо конверсиясын (ADSC) орнотуу менен бир конверсияны баштай алмакпыз, бирок азырынча кимдир бирөө баскычты басканда аны автоматтык түрдө окууну каалайбыз, андыктан анын ордуна биз ADCди иштетебиз. Autotrigger иштетүү автоматтык түрдө жасалышы үчүн ADCSRA реестриндеги Enable (ADATE) бит.
  10. Биз ошондой эле ADPS2..0 битти (AD Prescalar биттерин) 111ге койдук, ошондо ADC сааты CPU эсеби 128ге бөлүнөт.
  11. Биз AD2 иштетүүчү булагын PD2 деп тандайбыз, аны INT0 деп да аташат (Тышкы үзгүлтүккө суроо 0). Биз муну ADCSRB реестриндеги ар кандай биттерди алмаштыруу менен жасайбыз (251-беттеги 24-6-таблицаны караңыз). Биз ADTS0 өчүрүлүшүн, ADTS1 күйгүзүлүшүн жана ADTS2 өчүрүлүшүн каалаарыбызды столдон көрүп турабыз, ошондо ADC ошол пинди иштетет. Эскертүү, эгерде биз аналогдук портту үзгүлтүксүз тандап алгыбыз келсе, аналогдук сигналды окуп жаткандай (үн тандоо же башка нерсе сыяктуу), биз муну Эркин чуркоо режимине коймокпуз. Биз PD2де иштетүүнү орнотуу ыкмасын колдонобуз, аналогдук PC0 аналогдук портунун ADC окуусун үзгүлтүккө учуратпастан.
  12. ADCSRA реестриндеги ADC Interrupt Enable (ADIE) битин иштетүү, аналогдук санарипке которуу аяктаганда ал үзгүлтүктү пайда кылат, биз аны үзгүлтүк иштетүүчүгө жазып,.org 0x002Aга кое алабыз.
  13. Үзгүлтүктөрдү иштетүү үчүн I битти SREGге коюңуз.

Exercise 1: Жогорудагы орнотуулардын ар биринин маалымат барагындагы тиешелүү бөлүмдөрдү окугандыгыңызды текшериңиз, ошондо сиз эмне болуп жатканын жана аларды башка жөндөөлөргө алмаштырсак эмне болорун түшүнөсүз.

7 -кадам: Үзгүлтүк иштетүүчүгө жазыңыз

Акыркы кадамда биз аны PD2де аныкталган көтөрүлүүчү жээк PC0до санариптик конверсияга аналогду иштете турган кылып орнотконубузду көрдүк жана бул конверсия аяктаганда ADC Conversion Complete үзгүлтүккө учурайт. Эми биз бул үзгүлтүк менен бир нерсе кылгыбыз келет. Эгерде сиз 65-беттеги 12-6-таблицаны карасаңыз, мүмкүн болгон үзгүлтүктөрдүн тизмесин көрөсүз. Биз мурунтан эле үйрөткүчтөрдө RESET 0x0000 дареги боюнча жана Таймер/Counter0 Overflow 0x0020 дарегинде үзгүлтүккө учураганын көргөнбүз. Эми биз 0x002A дареги боюнча таблицада көрүп жаткан ADC үзгүлтүгүн карап көргүбүз келет. Ошентип, биздин чогултуу тилинин кодунун башында бизге мындай сап керек болот:

.org 0x002Arjmp ADC_int

ADC конверсиясын бүтүргөндө ADC_int деп аталган үзгүлтүк иштетүүчүбүзгө өтөт. ADCтин иштөө жолу төмөнкү эсепти аткаруу менен:

ADC = Vin x 1024 / Vref

Келгиле, эгерде мен тергичтин "кайра терүү" баскычын бассам эмне болорун карап көрөлү. Мындай учурда PC0догу чыңалуу кандайдыр бир мааниге өзгөрөт, айталы, 1.52V, жана Vref 5Vда болгондуктан, бизде болот:

ADC = (1.52V) x 1024 / 5V = 311.296

Ошентип, ал 311 катары көрүнөт. Эгерде биз муну кайра чыңалууга которгубуз келсе, анда биз жөн гана эсептөөнү артка кайтармакпыз. Биз муну кылуунун кажети жок, анткени биз чыныгы чыңалууга кызыкпайбыз, анткени аларды айырмалай алабыз. Которуу аяктагандан кийин, натыйжа ADCH жана ADCL регистрлерине жайгаштырылган 10 биттик номерде сакталат жана биз аны "солго тууралоого" алып келдик, бул 10 бит ADCHдин 7 битинен башталып, ADCL бит 6 (бул эки регистрде бардыгы болуп 16 бит бар жана биз алардын 10ун гана колдонобуз, башкача айтканда 1024 канал). Эгерде биз ADMUX реестриндеги ADLAR битин тазалоо аркылуу кааласак, анда "оңго" тууралоо жүргүзүлүшү мүмкүн. Солго тууралоону тандаганыбыздын себеби, биздин сигналдар канал номеринин акыркы эки цифрасы тиешелүү эмес жана Балким, бул жөн эле ызы -чуу, ошондуктан биз баскычтардын баскычтарын 8 жогорку цифрадан гана айырмалайбыз, башкача айтканда, кайсы баскыч басылганын түшүнүү үчүн ADCHди карап көрүшүбүз керек болот. каттоодон өтүңүз, ошол номерди клавиатура маанисине айлантыңыз, анан "9" деп басуу менен "00001001" ге туура келген LEDлердин жанышын текшере ала тургандай кылып, биздин анализатордун диоддоруна жөнөтөбүз. биз ар кандай баскычтарды басканда ADCHде эмнени көрөрүн көрүшүбүз керек. Келгиле, жөн эле анализатордун дисплейине ADCH мазмунун жөнөтүүчү жөнөкөй үзгүлтүк иштетүүчү жазалы. Бул жерде бизге керектүү нерсе:

ADC_int: lds анализатору, ADCH; ADCHтин маанисин биздин анализаторлорго жүктөңүз EIFR, 0; кайра кетүүгө даяр болушу үчүн тышкы үзгүлтүк желегин тазалаңыз

Азырынча, 5 -окуу куралындагы анализаторубуздан кодду көчүрүп, бул үзгүлтүктү жана алмаштыруу жөндөөлөрүн кошуп, иштете алгыдай болушуңуз керек. Exercise 2: Кодду жазыңыз жана иштетиңиз. Анализатордун дисплейинде ADCH дисплейин алаарыңызды көрүңүз. Ошол эле баскычты бир нече жолу басууга аракет кылыңыз. Сиз ар дайым ADCHде бирдей мааниге ээ болосузбу?

8 -кадам: Keypress баалуулуктарын картага түшүрүү

Баскычтардын маанилерин картага түшүрүү
Баскычтардын маанилерин картага түшүрүү

Биз азыр эмне кылышыбыз керек, ADCHдеги баалуулуктарды басылган баскычка туура келген сандарга айландыруу. Биз муну ADCHтин мазмунун ар бир басуу үчүн жазып, анан аны сүрөттөгүдөй ондук санга айландыруу менен жасайбыз. Биздин үзгүлтүккө учуроо тутумубузда, биз ар бир баскычка туура келген баалуулуктардын бүткүл диапазонун карайбыз, ошондо ADC ошол диапазондогу нерсени каалаган баскычка картага түшүрөт.

Exercise 3: Бул картаны жасаңыз, анан ADC үзгүлтүккө учуроо тартибин кайра жазыңыз.

Бул жерде меники үчүн алган нерсем (сиздики башкача болот). Мен аны ар бир басуу үчүн бир катар баалуулуктар менен орнотконумду байкаңыз.

ADC_int:; Тышкы үзгүлтүк handlerclr анализатору; жаңы номерлерге даярдануу buttonH, ADCH; ADCH clccpi buttonH, 240brlo PC+3 окулганда ADC жаңыртылат; эгер ADCH чоңураак болсо, анда ал 1ldi анализатору, 1; анализаторду 1ржмп кайтаруу менен жүктөө; жана clccpi buttonH, 230 кайтаруу; эгер ADCH чоңураак болсо, анда 2brlo PC+3ldi анализатору, 2rjmp clccpi баскычыH, 217brlo PC+3ldi анализатору, 3rjmp clccpi кайтаруу баскычыH, 203brlo PC+3ldi анализатору, 4rjmp кайтаруу clccpi баскычыH, 187brlo PC+3ldi анализатору, 5rjmp clccpi кайтаруу 155brlo PC+3ldi анализатору, 6rjmp clccpi buttonH, 127brlo PC+3ldi анализатор, 255; Биз жарыкты бардык onrjmp return clccpi buttonH, 115brlo PC+3ldi анализатору, 7rjmp clccpi buttonH, 94brlo PC+3ldi анализатору, 8rjmp return clccpi buttonH, 62brlo PC+3ldi анализатору, 9rjmp clccpi баскычы H, 37brlo PC+3ldi анализатору, 0b11110000; жылдызча жогорку жарым onrjmp кайтаруу clccpi баскычыH, 28brlo PC+3ldi анализатору, 0rjmp clccpi кайтаруу баскычыH, 17brlo PC+3ldi анализатору, 0b00001111; хэш белгиси астыңкы жарым onrjmp кайтаруу clccpi buttonH, 5brlo PC+3ldi анализатор, 0b11000011; кайра терүү жогорку 2 асты 2rjmp кайтуу ldi анализатору, 0b11011011; болбосо ката кайтып келди: reti

9 -кадам: 1 -версия үчүн код жана видео

Мен коддун драйверинин бул биринчи версиясына тиркелдим. Бул жерде сиз баскычты басып, андан кийин баскычты басышыңыз керек, бул ADCдин клавиатурадан киргизүүнү окуусуна себеп болот. Биз каалаган нерсеге эч кандай баскыч жок, тескерисинче, конверсияны жасоо үчүн белги баскычтын өзүнөн келет. Ар кандай конверсиянын босоголорун баскыч чыңалууңузга туура келиши үчүн өзгөртүүгө туура келиши мүмкүн, анткени алар меникинен айырмаланышы мүмкүн. Эгерде сиз баскыч аркылуу эмес, ADC0 үчүн да, тышкы үзгүлтүк пин үчүн да клавиатурадан киргизүүнү колдонууга аракет кылсаңыз эмне болот? менин кодумда Stack Pointerди баштоочу бөлүм бар. Ар кандай реестрлер бар, биз өзгөрмөлөрдү иштетип жатканда стектен түртүп чыгарып салууну каалайбыз, бирок эмнеси жок, жана биз кийинчерээк сактоону жана калыбына келтирүүнү каалаган регистрлер бар. Мисалы, SREG - бул үзгүлтүктөр боюнча сакталбаган реестр, андыктан операциялардын натыйжасында коюлган жана тазаланган ар кандай желектер бир нерсенин ортосунда үзгүлтүккө учураса өзгөртүлүшү мүмкүн. Ошентип, эгер сиз үзгүлтүккө учураткычтын башында SREGди стекке түртүп койсоңуз, анан аны үзгүлтүк иштетүүчүнүн аягында кайра өчүрүп салсаңыз жакшы болот. Мен аны инициализациялоону көрсөтүү үчүн жана кийинчерээк ага кантип муктаж болоорубузду алдын ала билүү үчүн кодго жайгаштырдым, бирок биздин коддо үзгүлтүккө учуроодо SREG менен эмне болору кызыктырбагандыктан, мен бул үчүн стекти колдонгон жокмун. инициализациялоодо мен регистрлерге ар кандай биттерди орнотуу үчүн нөөмөт операциясын колдонгонум. Мисалы, сапта:

лди темп, (1 <> STS EICRA, темп

Жогорудагы коддун биринчи сабындагы "<<" буйругу жылыш операциясы. Ал негизинен 0b00000001 болгон бинардык 1 санын алат жана аны ISC01 санынын суммасына калтырат. Бул ISIC01 деп аталган биттин EICRA реестриндеги орду. ISC01 1 бит болгондуктан, 1 саны 0b00000010 болуу үчүн сол 1 позицияга жылат. Ошо сыяктуу эле, экинчиси, ISC00, EICRAнын 0 бити, ошондуктан 1 санынын жылышы солго нөлдүк позиция. Эгерде сиз биринчи окуу куралыңызда жүктөлгөн m328Pdef.inc файлын дагы бир жолу карап көрсөңүз жана анда бери эле evrr колдонуп келсеңиз, анда ал ".equ" сөздөрүнүн узун тизмеси экенин көрөсүз. Сиз ISC01дин 1ге барабар экенин көрө аласыз. Ассамблея эч нерсени чогулта электе эле анын ар бир нускасын 1 менен алмаштырат. Алар адамдарга кодду окууга жана жазууга жардам берүү үчүн регистр биттеринин аттары. Эми, жогорудагы эки сменалык операциянын ортосундагы тик сызык логикалык "же" операция. Бул жерде теңдеме:

0b00000010 | 0b00000001 = 0b00000011

жана биз темпке ("ldi" колдонуп) жүктөп жатабыз. Адамдар бул ыкманы баалуулуктарды реестрге жүктөө үчүн колдонушунун себеби, бул бир эле сандын ордуна биттин атын колдонууга мүмкүндүк берет жана бул кодду окууну бир топ жеңилдетет. Биз "ori" жана "andi" көрсөтмөлөрүн колдонобуз. Булар бизге реестрдеги башка биттерди өзгөртпөстөн, SET жана CLEAR биттерин берет. Мисалы, мен колдонгондо

ori temp, (1

бул "же" темп 0b00000001 менен нөлгө битти коюп, калганын өзгөртпөй калтырат. Биз жазганда да

Анди темп, 0b11111110

бул нөл температураны 0гө өзгөртөт жана калганын өзгөрүүсүз калтырат.

Exercise 4: Сиз коддон өтүп, ар бир сапты түшүнүшүңүз керек. Сизге жакшы нерселерди жасоо жана жакшы программа жазуу кызыктуу болушу мүмкүн. Баарын коддоонун жүз жолу бар, мен ишенем, сиз меникинен алда канча жакшы жолду таба аласыз. Ошондой эле каталарды жана кемчиликтерди (асман сактасын!) Таба аласыз. Андай болсо, мен алар жөнүндө уккум келет, ошондо алар оңдолот.

Макул, эми бул ашыкча баскычтан арыла аларыбызды карап көрөлү …

10 -кадам: 2 -версиянын коду

Баскычтан кутулуунун эң жөнөкөй жолу - аны таптакыр алып салуу, PB2ге киргизүүнү унутуу жана ADCди "Free Running Mode" режимине которуу.

Башка сөз менен айтканда, ADCSRB реестрин ADTS2, ADTS1 жана ADTS0 нөлгө барабар кылып өзгөртүңүз.

Андан кийин ADCSRAдагы ADSC битин 1ге коюңуз, ал биринчи конверсияны баштайт.

Эми аны микроконтроллериңизге жүктөңүз жана сиз баскычты басып жатканда жана баскычты басканда гана туура номер дисплейде пайда болорун көрөсүз. Бул ADC тынымсыз ADC0 портунан үлгү алууда жана маанини көрсөтүүдө. Сөөмөйүңүздү баскычтан алып салганыңызда, "баскычтын секириши" бир нече туш келди маанилердин тез арада пайда болушуна алып келет жана кайра 0V кирүүсүнө кайтып келет. Биздин коддо бул 0В 0b11011011 катары көрүнүп турат (анткени "0" клавишасы 0b00000000 дисплей маанисин колдонуп жатат)

Бул эки себептен улам биз каалаган чечим эмес. Биринчиден, биз баскычты кармап тургубуз келбейт. Биз аны бир жолу басып, номерди көрсөтүүнү каалайбыз (же кийинки окуу куралында кандайдыр бир жаңы коддо колдонулат). Экинчиден, биз дайыма ADC0 үлгүсүн алгыбыз келбейт. Биз аны бир окууну талап кылабыз, аны айландырабыз, анан жаңы баскыч жаңы конверсияны козгогонго чейин укташын каалайбыз. Бекер иштетүү режими эң жакшы, эгерде сиз микроконтроллердин аналогдук киргизүүнү дайыма окуп туруусун кааласаңыз - реалдуу убакыт температурасын же башка нерсени көрсөтүүнү кааласаңыз.

Ошентип, дагы бир чечимди издеп көрөлү …

11 -кадам: Кнопкадан кантип кутулабыз? 3 -версия

Кнопкадан кантип кутулабыз? 3 -версия
Кнопкадан кантип кутулабыз? 3 -версия

Биз улантуунун көптөгөн жолдору бар. Адегенде биз баскычтан кутулуу үчүн жабдыктарды кошсок болот. Мисалы, биз транзисторду баскычтын чыгыш линиясына схемага киргизип көрүшүбүз мүмкүн, андыктан ал токтон кичине агып кетет жана PD2 үзүү пинине 5В импульс жөнөтөт.

Бирок, бул, жок дегенде, өтө ызы -чуу болмок жана эң жаманы, баскычты так басуу үчүн жетиштүү убакыт бербейт, анткени баскычтоптун чыңалуусу ADC окуусун басып калганга чейин стабилдешүүгө убактысы болбойт.

Ошентип, биз программалык чечимди ойлоп табууну туура көрдүк. Биз эмне кылгыбыз келет, PD2 пинге үзгүлтүк кошуу жана клавиатура пининин бир окулушун чакырган ал үчүн үзгүлтүк иштетүүчү жазуу. Башкача айтканда, биз ADCден автотриггердин үзүлүшүнөн кутулабыз жана анын ичинде ADCди чакырган тышкы үзүүнү кошобуз. Ошентип, ADCди окуу үчүн сигнал PD2 сигналы пайда болгондон кийин келет жана бул нерсе PC0 пини окулуп, конверсияланганга чейин так чыңалууга турукташууга жетиштүү убакыт бериши мүмкүн. Бизде дагы эле ADC аяктоо үзгүлтүгү болот, ал жыйынтыгын анализатордун дисплейине чыгарат.

Мааниси барбы? Мейли, жасайбыз…

Тиркелген жаңы кодду карап көрүңүз.

Сиз төмөнкү өзгөрүүлөрдү көрөсүз:

  1. INT0 тышкы үзгүлтүккө учуроо үчүн.org 0x0002 дарегине rjmp коштук
  2. Биз INT0 пинге үзгүлтүккө учуратууну каалаш үчүн EIMSK реестрин өзгөрттүк
  3. Автотриггерингди өчүрүү үчүн ADCSRA реестриндеги ADATE пинин алмаштырдык
  4. Биз ADCSRB жөндөөлөрүнөн арылдык, анткени алар ADATE өчүрүлгөндө мааниси жок
  5. Биз мындан ары тышкы триггер желегин баштапкы абалга келтирүүнүн кажети жок, анткени INT0 үзгүлтүккө учуроо тартиби аяктаганда муну автоматтык түрдө жасайт - мурда бизде үзгүлтүккө учуроо режими жок болчу, биз жөн гана ошол пиндеги ADC сигналын өчүрүп койдук. ал желекти кол менен тазалаңыз.

Эми үзгүлтүк иштетүүчүдө биз ADCден бир гана конверсияны чакырабыз.

Exercise 5: Бул версияны иштетип, эмне болорун көрүңүз.

12 -кадам: Жумушчу версия үчүн код жана видео

Акыркы версияда көргөнүбүздөй, үзгүлтүк баскычы анча жакшы иштебейт, анткени үзүлүү PD2 төөнөө үчүн өйдө жакта иштейт, андан кийин үзгүлтүк иштетүүчү ADC конверсиясын чакырат. Бирок, ADC анда стабилдештириле электе чыңалуу көрсөткүчүн алат, андыктан ал болбогон нерсени окуйт.

Бизге керек болгон нерсе PD2деги үзгүлтүк менен PC0деги ADC окуу ортосундагы кечигүүнү киргизүү. Биз муну таймерди/эсептегичти, эсептегичтин толуп кетүүсүн жана кечигүү тартибин кошуу менен жасайбыз. Бактыга жараша, биз муну кантип үйрөткүч 3төн билебиз! Ошентип, биз жөн гана ал жерден тиешелүү кодду көчүрүп, чаптайбыз.

Мен алынган кодду жана аны иштеп жаткан видеону бердим.

Сиз окуулар күтүлгөндөй так эмес экенин байкайсыз. Бул бир нече булактардан улам болушу мүмкүн:

  1. биз баскычтоптун чыңалуусунан PD2ди иштетүү үчүн таптап жатабыз, бул PC0до окууга таасир этет.
  2. биз эң жакшы окуу үчүн триггерден кийин канча убакытка кечиктирүүнү билбейбиз.
  3. ADC конверсиясын бүтүрүү үчүн бир нече цикл талап кылынат, демек биз баскычтопту тез эле күйгүзө албайбыз.
  4. балким, клавиатуранын өзүндө ызы -чуу бар.
  5. жана башкалар…

Ошентип, биз баскычтопту иштете алдык жана азыр аны анализатордун дисплейине чыгаруунун ордуна башка жолдор менен баскычтарды басуу менен колдонмолордо колдонсок болот, бирок бул өтө так эмес жана абдан кыжырды келтирет. Ошондуктан мен ойлойм, клавиатураны зым менен жабуунун эң жакшы жолу - бул баскычтоптун ар бир чыгарылышын башка портко жабыштыруу жана кайсы порттун кайсы чыңалууну көрөрүн чечүү. Бул оңой, абдан тез жана абдан так.

Чынында, клавиатураны биз жасаган жол менен башкаргысы келгендин эки гана себеби бар:

  1. Бул биздин микроконтроллердеги 8 пиндин ордуна 2 гана төөнөгүчтү колдонот.
  2. Микроконтроллердеги ADCдин ар кандай аспектилерин көрсөтүү үчүн сонун долбоор, ал жерден стандарттык нерселерден айырмаланат, температура көрсөткүчтөрү, потенциометрлерди айландыруу ж.б.у.с. жөн эле бекер иштеп жаткан CPU-gobbling режими эмес.

Кандай болбосун, бул жерде сиз үчүн акыркы эки көнүгүү:

Exercise 6: Издөө Таблицасын колдонуу үчүн ADC конверсиясынын толук үзгүлтүк иштетүүчүсүн кайра жазыңыз. Башкача айтканда Ошентип, ал таблицанын биринчи пункту менен аналогдук баалуулукту текшерет жана ал чоңураак болсо, үзгүлтүккө кайтат, эгер андай болбосо, анда ал Z столдун кийинки пунктуна көбөйтөт жана кайра тестке кайтып келет. Бул кодду кыскартып, үзгүлтүккө учуроо тартибин тазалап, аны жакшыраак кылат. (Мен кийинки кадам катары мүмкүн болгон чечимди берем) Exercise 7: Микроконтроллердеги клавиатураңызды 8 казыкка илип, ал үчүн жөнөкөй драйверди жазыңыз жана анын канчалык жакшы экенин сезиңиз. Сиз биздин методдун жакшыраак иштешинин бир нече жолдорун ойлоно аласызбы?

Мунун баары бул окуу куралы үчүн. Мен көрсөткүчтөр менен акыркы версиясын тиркеп койдум. Биз акыркы максатыбызга жакындаган сайын, 9 -сабакта дагы бир жолу баскычтопту колдонобуз жана аны менен жети сегменттүү дисплейлерди кантип башкарууну көрсөтөбүз (жана телефондун клавиатурасындагы кошумча баскычтарды колдонгон кызыктуу нерсени курабыз), анан биз Анын ордуна баскычтарды басуу менен нерселерди башкарууга өтүңүз (анткени бул ыкма бул окуу куралдары менен куруп жаткан акыркы продуктка көбүрөөк туура келет) жана биз жөн гана баскычтопту текчеге алабыз.

Кийинки жолу көрүшкөнчө!

Сунушталууда: