Мазмұны:

AVR Assembler оқулығы 7: 12 қадамдар
AVR Assembler оқулығы 7: 12 қадамдар

Бейне: AVR Assembler оқулығы 7: 12 қадамдар

Бейне: AVR Assembler оқулығы 7: 12 қадамдар
Бейне: MKS SGEN L V1.0 - A4988 Stepper Drivers 2024, Шілде
Anonim
AVR құрастырушы оқулығы 7
AVR құрастырушы оқулығы 7

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. 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 -қадам: Пернетақтаны қосыңыз

Пернетақтаны қосыңыз
Пернетақтаны қосыңыз
Пернетақтаны қосыңыз
Пернетақтаны қосыңыз

Енді сым схемасын орындаңыз және пернетақтаны тақтаға қосыңыз.

Бұл қалай жұмыс істейді, біз сол жаққа 5В қосамыз, ал оң жағы GND -ге өтеді. Диаграммадағы оң жақтағы бірінші түйін біздің Atmega328p микроконтроллеріндегі аналогтық түйреуіштердің біріншісіне кіреді. Түймелер болмаған кезде сигнал 0В болады, ал әр түймешікті басқан кезде аналогтық портқа кіріс 0В пен 5В аралығында болады, ол қандай перне басылғанына байланысты әр түрлі мөлшерде болады. Біз резистор мәндерін әр жолда басқалардан өзгеше қарсылық болуы үшін таңдадық. Микроконтроллердегі аналогтық порт аналогты сигналды қабылдайды және оны 0В пен 5В аралығында 1024 түрлі арнаға бөледі. Бұл әр арнаның ені 5В/1024 = 0,005 В/арна = 5 мВ/арна болатынын білдіреді. Осылайша, аналогтық порт кіріс кернеуін 5 мВ -тан жоғары айырмашылығы бар кезде ажырата алады. Біздің жағдайда біз резистордың мәндерін таңдадық, осылайша кез келген екі түйме кернеу сигналын жібереді, сондықтан микроконтроллер қай перненің басылғанын оңай шеше алады. Мәселе мынада, бүкіл жүйе өте шулы, сондықтан біз әр түймені басу үшін кернеулер диапазонын таңдауымыз керек, бірақ біз оған сәл кейінірек кіреміз.

Назар аударыңыз, біз контроллерге тек бір кіріс жолын қолдана отырып, 14 түймелі пернетақтаны басқара аламыз. Бұл аналогты кірістердің пайдалы аспектілерінің бірі.

Енді біздің пернетақтаны басқарудағы бірінші әрекетіміз - пернені басу, себебі үзіліс болады, үзіліс ішкі бағдарламасы аналогты кіру портын оқиды және қай перне басылғанын шешеді, содан кейін ол нөмірді біздің регистр анализаторының кіші бағдарламасына шығарады. 5 оқулықта орнатылған 8 жарықдиодты екілік сандардағы негізгі мән.

5 -қадам: Анализаторға пернетақтаны қосыңыз

Анализаторға пернетақтаны қосыңыз
Анализаторға пернетақтаны қосыңыз
Анализаторға пернетақтаны қосыңыз
Анализаторға пернетақтаны қосыңыз

Суреттер анализатор дисплейінде шығуды көру үшін пернетақтаны микроконтроллерге қалай қосқымыз келетінін көрсетеді. Негізінде біз шығуды ATC -де ADC0 деп аталатын 0 портына PIN -кодқа қосамыз.

Дегенмен, қосымша бірнеше нәрсе бар. Біз сондай -ақ түймені PD2 -ге қосамыз. Яғни 5В рельсінен түймені және түйменің екінші жағынан PD2 -ге сымды алыңыз, және, ақырында, біз 5В рельсінен AREF түйреуішін ажыратып, орнына оны ажыратып тастағымыз келеді. Біз қаласақ, 0,1 микрофарадты ажырататын конденсаторды енгізе аламыз. Бұл керамикалық конденсатор, оған 104 жазылған. Алғашқы екі цифр-бұл сан және соңғы цифр-10-ның қуаты, біз оны пикофарадтарда жауап алу үшін көбейтеміз (пико 10^-12 дегенді білдіреді), сондықтан 104 дегеніміз 10х10^4 пикофарадты білдіреді, бұл бірдей. 100 нанофарад (нано 10^-9 білдіреді), бұл 0,1 микрофарадпен бірдей (микро 10^-6). Қалай болғанда да, мұның бәрі AREF түйреуішін тұрақтандырады, егер біз оны сілтеме түйреуіш ретінде қолдана алсақ.

Біз сондай -ақ PD2 мен жер арасындағы 1 Мм резисторды қалаймыз. Біз PD2 -ді 0В шығыс түйреуіші ретінде орнатамыз және біз бұл істікшенің оң шетін қосамыз. Біз түймені босатқан кезде жиектің бірден жоғалуын қалаймыз, сондықтан біз «төмен түсетін» резисторды саламыз.

Түймені қалауымыздың себебі-біз аналогты-цифрлық түрлендіргішті чипте INT0 түйреуішінен ажыратқымыз келеді, бұл PD2. Ақыр соңында, біз ADC -ті іске қосуды, сонымен қатар кірісті бөлек түйме жоқ түрлендіруді қамтамасыз етуді қалаймыз, бірақ уақыттың жұмысына байланысты біз ADC -ті іске қосу үшін бөлек түймені бастаймыз және біз үтіктегеннен кейін. қателер жойылды және бәрі дұрыс жұмыс істейтініне сенімдіміз, содан кейін біз оқығымыз келетін түймені басудан туындаған шу мен уақыт мәселелерін шешеміз.

Әзірше, біз жұмыс істеу тәсілі - біз кілтті басып тұрамыз, содан кейін ADC іске қосу үшін түймені басамыз, содан кейін жібереміз және біз басқан түйменің екілік мәні анализаторда пайда болады деп үміттенеміз.

Сонымен, біз мұны жүзеге асыратын кодты жазайық.

6 -қадам: Қандай қосқыштарды орнату керек?

Қандай қосқыштарды орнату керек?
Қандай қосқыштарды орнату керек?

Алдымен контроллер енгізуді пернетақтадан оқи алатын және оны басылған батырманың сәйкес сандық мәніне айналдыратын кодты қалай енгізу керектігін ойлап көрейік. бұл Atmega328p -ге салынған. Біз сілтеме кернеуі ретінде AREF қолданамыз және біздің пернетақта шығысы PortC0 немесе PC0 қосылады. Аналогты-цифрлық түрлендіргіш 0 үшін бұл түйін ADC0 деп те аталады. ATmega328P үшін үзіліс туралы 12.4-тарауды, сонымен қатар аналогты-цифрлық түрлендіргіштің 24-тарауын оқу жақсы болар еді. Микроконтроллерді аналогтық кіріс сигналымен не істеу керектігін және біздің бағдарламамен қалай қарым -қатынас жасау керектігін білетін етіп орнату үшін алдымен біз әр түрлі ADC -нің кейбірін орнатуымыз керек. байланысты регистрлік биттер. Бұл негізінен алғашқы компьютерлердегі ескі қосқыштарға тең. Сіз қосқышты қосасыз немесе сөндіресіз, немесе одан әрі артқа қарай бір розетка мен екіншісінің арасына кабельдерді қосасыз, осылайша жолдағы айырға жеткен электрондар бір қақпаны жабық, екіншісі оны лабиринттегі басқа жолмен төмендетуге мәжбүр етеді. схема және осылайша басқа логикалық тапсырманы орындайды. Ассемблер тілінде кодтау кезінде біз микроконтроллердің бұл функцияларына жақын қол жеткізе аламыз, бұл бірінші кезекте оны жасаудың тартымды нәрселерінің бірі. Бұл «қолмен» көбірек, ал «сахна артында» әлдеқайда аз. Сондықтан, бұл регистрлерді қою жұмысы деп ойламаңыз. Бұл ассамблея тілін қызықты етеді! Біз чиптің ішкі жұмысымен және логикасымен жеке қарым -қатынаста боламыз және оны дәл біз қалағандай жасауға мәжбүрлейміз - артық және кем емес. Бекітілген сағаттық цикл жоқ, сондықтан біз орнатуымыз керек қосқыштардың тізімін ұсынамыз:

  1. Қуатты азайту ADC битін, PRRC, ол PRR регистрінің 0 разряды болып табылады, себебі егер ол қосылған болса, ол ADC өшіреді. Қуатты азайту тізілімі - бұл қажет емес кезде қуатты пайдаланатын әр түрлі заттарды өшіру әдісі. Біз ADC қолданатындықтан, оның осылайша өшірілмегеніне көз жеткізгіміз келеді. (46 -беттегі PRADC қараңыз)
  2. ADC0 болу үшін аналогтық кіріс арнасын ADC мультиплексорлық таңдау (ADMUX) регистрінде MUX3… 0 өшіру арқылы таңдаңыз (24-4 кестені қараңыз 249) бұл әдепкі бойынша өшірілген, сондықтан мұны істеудің қажеті жоқ. Дегенмен, мен оны қосамын, өйткені егер сіз ADC0 -дан басқа портты қолдансаңыз, бұл қосқыштарды сәйкесінше ауыстыру қажет болады. MUX3, MUX2, MUX1, MUX0 әр түрлі комбинациялары кез келген аналогтық порттарды сіздің кіріс ретінде пайдалануға мүмкіндік береді, сонымен қатар сіз әр түрлі аналогтық сигналдарды бірден қарағыңыз келсе, оларды бірден өзгерте аласыз.
  3. ADMUX регистріндегі REFS0 және REFS1 биттерін өшіріңіз, осылайша біз AREF -ті ішкі сілтеме емес, сілтеме кернеуі ретінде қолданамыз (248 -бетті қараңыз).
  4. ADMUX жүйесінде ADLAR битін қосыңыз, осылайша нәтиже «солға реттеледі», біз бұл таңдауды келесі қадамда талқылаймыз.
  5. PC0 -ге цифрлық кірісті өшіру үшін ADC0D битін Digital Input Disable Register (DIDR0) қойыңыз. Біз бұл портты аналогты енгізу үшін қолданамыз, сондықтан ол үшін сандық кірісті де өшіре аламыз.
  6. IS0 мен ISC1 сандарын INT0 істігіне (PD2) кернеу сигналының көтерілу жиегінде іске қосқымыз келетінін көрсету үшін A (EICRA) сыртқы үзілісті бақылау регистріне орнатыңыз, 71 -бетті қараңыз.
  7. Бұл түйреуіште үзілістерді пайдаланбайтындығымызды көрсету үшін INT0 және INT1 биттерін сыртқы үзіліс маскасының тізілімінде (EIMSK) тазалаңыз. Егер біз осы түйреуішке үзілістерді қосатын болсақ, бізге 0x0002 адресі бойынша үзіліс өңдеуші қажет болар еді, бірақ оның орнына біз осы түйреуіште сигнал ADC түрлендіруді іске қосатын етіп орнатамыз, оның аяқталуы ADC түрлендіруінің толық үзілісімен орындалады. мекен -жайы 0x002A. 72 бетті қараңыз.
  8. ADC қосу үшін ADC бақылауында және күй регистрінде A (ADCSRA) ADC Enable (ADEN) битін (бит 7) орнатыңыз. 249 бетті қараңыз.
  9. Біз аналогты сигналды оқығымыз келген сайын ADC бастапқы конверсиялық битін (ADSC) орнату арқылы бір конверсияны бастай аламыз, алайда, егер біреу түймені басса, біз оны автоматты түрде оқығанды жөн көреміз, осының орнына біз ADC қосамыз. Автотриггер ADCSRA регистрінде қосу (ADATE) биті, осылайша іске қосу автоматты түрде орындалады.
  10. Біз ADPS2..0 битін (AD Prescalar биттерін) 111 -ге қойдық, осылайша ADC сағаты процессордың сағаты 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. Үзілістерді қосу үшін SREG -де I битін орнатыңыз.

1 -жаттығу: Жоғарыда келтірілген параметрлердің әрқайсысы үшін деректер кестесіндегі сәйкес бөлімдерді оқығаныңызға көз жеткізіңіз, сонда сіз не болып жатқанын және егер біз оларды басқа параметрлерге ауыстырсақ не болатынын түсінеміз.

7 -қадам: Үзіліс өңдегішін жазыңыз

Соңғы қадамда біз оны PD2 -де анықталатын көтерілу жиегі PC0 -де цифрлық түрлендіруге аналогты қосатындай етіп орнатқанымызды көрдік, және бұл түрлендіру аяқталғаннан кейін ол ADC Conversion Complete үзілісін шығарады. Енді біз осы үзіліспен бірдеңе жасағымыз келеді. Егер сіз 65-беттегі 12-6-кестені зерттесеңіз, ықтимал үзілістердің тізімін көресіз. Біз бұған дейінгі оқулықтарда 0x0000 адресінде RESET үзілісін және 0x0020 адресінде Таймер/Counter0 Overflow үзілісін көрдік. Енді біз кестеде 0x002A адресінде орналасқан ADC үзілісін қарастырғымыз келеді. Сонымен, біздің құрастыру тілінің кодының басында бізге келесі жол қажет болады:

.org 0x002Arjmp ADC_int

ол ADC конверсиясын аяқтаған сайын ADC_int деп аталатын үзіліс өңдеушісіне өтеді. Сонымен, үзіліс өңдегішін қалай жазуымыз керек?

ADC = Vin x 1024 / Vref

Келіңіздер, егер мен пернетақтадағы «қайта теру» түймесін бассам не болатынын көрейік. Бұл жағдайда PC0 кернеуі белгілі бір мәнге өзгереді, мысалы, 1,52В, ал Vref 5В болғанда бізде болады:

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» сәйкес келетініне көз жеткізе алатындығымызды тексеру үшін светодиодты анализаторға жібереміз. біз әр түрлі түймелерді басқанда ADCH -те не пайда болатынын көруіміз керек. Келіңіздер, ADCH мазмұнын анализатор дисплейіне жіберетін қарапайым үзіліс өңдегішін жазайық. Міне бізге қажет:

ADC_int: lds анализаторы, ADCH; ADIF мәнін біздің анализаторларға жүктейді EIFR, 0; Сыртқы үзіліс жалаушасын тазалаңыз, ол қайтадан өтуге дайын болады

Әзірге сіз 5 -оқулықтағы біздің анализатордан кодты көшіріп, осы үзіліс пен ауысу параметрлерін қосып, оны іске қоса аласыз. 2 -жаттығу: кодты жазып, оны іске қосыңыз. Анализатор дисплейінде ADCH көрсетілуін алатындығыңызды қараңыз. Бір пернені бірнеше рет басуға тырысыңыз. Сіз ADCH -де әрқашан бірдей мәнді аласыз ба?

8 -қадам: пернелер тіркесімі мәндерін салыстырыңыз

Пернелер тіркесімі мәндерін салыстырыңыз
Пернелер тіркесімі мәндерін салыстырыңыз

Бізге қазір қажет нәрсе - ADCH мәндерін басылған пернеге сәйкес келетін сандарға түрлендіру. Біз мұны әр пернені басу үшін ADCH мазмұнын жазып, содан кейін оны суреттегідей ондық санға айналдыру арқылы жасаймыз. Үзіліспен жұмыс істеу тәртібінде біз әр пернені басуға сәйкес келетін мәндердің бүкіл диапазонын қарастырамыз, осылайша ADC берілген диапазондағы кез келген нәрсені салыстырады.

3-жаттығу: Бұл картаны жасаңыз, содан кейін ADC үзіліс тәртібін қайта жазыңыз.

Міне менікі үшін алдым (сіздікі басқаша болуы мүмкін). Мен оны әр пернені басу үшін мәндер ауқымымен орнатқанымды байқаңыз.

ADC_int:; Сыртқы үзіліс өңдегіші анализаторы; H, ADCH жаңа нөмірлерге дайындалу; ADCH жаңартылады, ADCH clccpi батырмасы H, 240brlo PC+3 оқылғанда; егер ADCH үлкен болса, онда бұл 1ldi анализаторы, 1; сондықтан 1rjmp қайтарымы бар анализаторды жүктеңіз; және clccpi түймесін қайтаруH, 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 түймесіH, 127brlo PC+3ldi анализаторы, 255; біз флэшті барлық onrjmp қайтару clccpi түймесі H, 115brlo PC+3ldi анализаторы, 7rjmp clccpi түймесі H, 94brlo PC+3ldi анализаторы, 8rjmp қайтару clccpi түймесі H, 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 түймесіH, 5brlo PC+3ldi анализаторы, 0b11000011; қайта теру - жоғарғы 2 төменгі 2rjmp қайтару лди анализаторы, 0b11011011; әйтпесе қате пайда болды return: reti

9 -қадам: 1 -нұсқаға арналған код пен бейне

Мен кодты пернетақта драйверінің бірінші нұсқасына тіркедім. Бұл жағдайда ADC пернетақтадан кірісті оқуы үшін пернені басу керек, содан кейін түймені басу керек. Бізде түйме жоқ, керісінше түрлендіру туралы сигнал перненің басуынан келеді. 3 -жаттығу: Осы кодты жинап, жүктеп, көріңіз. Түрлі түрлендіру шектерін перне кернеуінің кернеуіне сәйкес өзгерту қажет болуы мүмкін, себебі олар менікінен өзгеше болуы мүмкін. Егер сіз ADC0 үшін де, сыртқы үзіліс түйреуіші үшін де түйменің орнына пернетақтадан кірісті қолдануға тырыссаңыз не болады? Мен сондай -ақ біздің пернетақта драйверінің осы бірінші нұсқасының жұмысының бейнесін қоса беремін. менің кодымда стек көрсеткішін инициализациялайтын бөлім бар. Біз айнымалылармен айналысу кезінде стектан шығарып, шығарғымыз келетін әр түрлі регистрлер бар, бірақ біз сақтап, кейін қалпына келтіргіміз келетін регистрлер бар. Мысалы, SREG - бұл үзіліс кезінде сақталмайтын регистр, сондықтан бір нәрсенің ортасында үзіліс болса, операциялар нәтижесінде орнатылатын және тазартылатын әр түрлі жалаушаларды өзгертуге болады. Егер сіз үзіліс өңдегішінің басында SREG -ді стекке итеріп, содан кейін оны үзу өңдегішінің соңында қайтадан шығарсаңыз жақсы. Мен оны қалай инициализацияланғанын көрсету үшін және кейін бізге қалай қажет болатынын болжау үшін оны кодқа қойдым, бірақ біздің кодтағы үзілістер кезінде SREG -мен не болатыны маңызды емес болғандықтан, мен бұл стекті қолданған жоқпын. Мен инициализация кезінде регистрлерде әр түрлі биттерді орнату үшін shift операциясын қолдандым. Мысалы, жолда:

ldi темп, (1 <> STS EICRA, температура

Жоғарыдағы кодтың бірінші жолындағы «<<» пәрмені - ауысым операциясы. Ол 0b00000001 болатын екілік нөмірді алады және оны ISC01 санының мөлшеріне қалдырады. Бұл ISIC01 деп аталатын биттің EICRA регистріндегі орны. ISC01 1 бит болғандықтан, 1 саны 0b00000010 болу үшін сол жақ 1 позицияға жылжиды. Сол сияқты екіншісі, ISC00, EICRA -ның 0 биті, сондықтан 1 санының ығысуы солға нөлдік позиция. Егер сіз бірінші оқулықта жүктелген және содан бері evrr қолданатын m328Pdef.inc файлына басқа көзқараспен қарасаңыз, бұл «.equ» операторларының ұзын тізімі екенін көресіз. Сіз ISC01 1 -ге тең екенін білесіз. Ассемблер ешнәрсені құрастыруды бастамас бұрын оның әрбір данасын 1 -ге ауыстырады. Бұл бізге кодты оқуға және жазуға көмектесетін регистрлік биттердің атаулары. Енді жоғарыдағы екі ауысымдық операциялар арасындағы тік сызық логикалық «немесе» операция болып табылады. Міне теңдеу:

0b00000010 | 0b00000001 = 0b00000011

және бұл біз температураға жүктейтін нәрсе («ldi» арқылы). Адамдар бұл әдісті мәндерді регистрге жүктеу үшін қолданудың себебі - бұл санның орнына бит атауын қолдануға мүмкіндік береді және бұл кодты оқуды жеңілдетеді, сонымен қатар біз қолданған тағы екі әдіс бар. Біз «ori» және «andi» нұсқауларын қолданамыз. Бұл бізге регистрдегі басқа биттердің ешқайсысын өзгертпестен, сәйкесінше SET және CLEAR биттерін орнатуға мүмкіндік береді. Мысалы, мен қолданған кезде

температура, (1

бұл нөлдік битке 1 қоятын және қалғандарын өзгеріссіз қалдыратын 0b00000001 температурасы. Біз жазған кезде де

andi temp, 0b11111110

бұл нөлдік температураны 0 -ге өзгертеді және қалғандарын өзгеріссіз қалдырады.

4 -жаттығу: Сіз кодты өтіп, әр жолды түсінгеніңізге көз жеткізуіңіз керек. Сізге жақсы әдістерді табу және жақсы бағдарлама жазу қызықты болуы мүмкін. Заттарды кодтаудың жүз әдісі бар, мен сенімдімін, сіз менікінен әлдеқайда жақсы жолды таба аласыз. Сіз сондай -ақ (жұмақтан сақтасын!) Қателер мен олқылықтарды таба аласыз. Бұл жағдайда мен олар туралы естігім келеді, сондықтан оларды түзетуге болады.

Жарайды, енді бұл артық түймені жоюға болатынын көрейік …

10 -қадам: 2 -нұсқаға арналған код

Түймеден құтылудың ең қарапайым әдісі - оны мүлдем алып тастау, PB2 енгізуді ұмытып, ADC -ті «Еркін жұмыс режиміне» ауыстыру.

Басқаша айтқанда, ADCSRB регистрін өзгертіңіз, осылайша ADTS2, ADTS1 және ADTS0 нөлге тең болады.

Содан кейін ADCSRA -да ADSC битін 1 -ге орнатыңыз, ол бірінші түрлендіруді бастайды.

Енді оны микроконтроллерге жүктеңіз, сіз түймені басқанда және түймені басқанда ғана дұрыс нөмір дисплейде шығатынын көресіз. Себебі ADC ADC0 портын үздіксіз іріктеп алады және мәнді көрсетеді. Саусағыңызды түймені алып тастаған кезде, «түйменің секіруі» бірнеше кездейсоқ мәндердің тез пайда болуына әкеледі, содан кейін ол 0В кірісіне қайта оралады. Біздің кодта бұл 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 -тен бір ғана түрлендіруді шақырамыз.

5 -жаттығу: Бұл нұсқаны іске қосыңыз және не болатынын көріңіз.

12 -қадам: Жұмыс нұсқасының коды мен бейнесі

Біз соңғы нұсқада көргеніміздей, түймені үзу өте жақсы жұмыс істемейді, себебі үзіліс PD2 түйреуішінің көтерілу жиегінде іске қосылады, содан кейін үзу өңдегіші ADC түрлендіруді шақырады. Алайда, ADC тұрақталмай тұрып кернеудің көрсеткішін алады, сондықтан ол бос сөздерді оқиды.

Бізге қажет нәрсе PD2 -дегі үзіліс пен PC0 -де ADC оқуы арасындағы кідірісті енгізу. Біз мұны таймерді/есептегішті, есептегіштің толып кетуін және кешіктіруді қосу арқылы жасаймыз. Бақытымызға орай, біз мұны 3 -оқулықтан білеміз! Сондықтан біз тиісті кодты сол жерден көшіріп, қоямыз.

Мен алынған кодты және оны жұмыс кезінде көрсететін бейнені бердім.

Сіз оқулар күткендей дәл емес екенін байқайсыз. Бұл көптеген дереккөздерге байланысты болуы мүмкін:

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

Сонымен, біз пернетақтаның жұмысына қол жеткізе алсақ та, оны енді анализатор дисплейіне шығарудың орнына басқа жолмен пернелерді басу арқылы қосымшаларда қолдануға болады, бірақ бұл өте дәл емес және өте тітіркендіргіш. Сондықтан менің ойымша, пернетақталарды сыммен байланыстырудың ең жақсы әдісі - бұл пернетақтаның әр шығысын басқа портқа жабыстыру және кернеуді көретін порттар қай перне басылатынын анықтау. Бұл оңай, өте жылдам және өте дәл.

Шын мәнінде, бізде клавиатураны басқарғысы келетін екі ғана себеп бар:

  1. Ол біздің микроконтроллердегі 8 емес, тек 2 түйреуішті пайдаланады.
  2. Микроконтроллерде ADC-тің әр түрлі аспектілерін көрсетудің тамаша жобасы, ол стандартты нәрселерден өзгеше, температура көрсеткіштері, потенциометрлерді бұру және т. тек CPU-гобблинг режимінің ақысыз жұмысының орнына.

Қалай болғанда да, сізге арналған жаттығулардың соңғы жұбы:

6-жаттығу: Қарау кестесін қолдану үшін ADC түрлендіруінің толық үзіліс өңдегішін қайта жазыңыз. Яғни Осылайша, ол аналогтық мәнді кестенің бірінші элементімен тексереді және егер ол үлкен болса, ол үзілістен қайтады, егер олай болмаса, онда ол кестенің келесі элементіне Z -ды қосады және қайтадан тестке тарайды. Бұл кодты қысқартады және үзіліс тәртібін тазартады және оны әдемі етеді. (Мен келесі қадам ретінде мүмкін болатын шешімді беремін) 7 -жаттығу: Пернетақтаны микроконтроллердегі 8 түйреуішке жалғаңыз және оған қарапайым драйверді жазып, оның қаншалықты жақсы екенін біліңіз. Біздің әдісті жақсартудың бірнеше жолдары туралы ойлана аласыз ба?

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

Келесі кездескенше!

Ұсынылған: