Мазмуну:

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

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

Video: AVR Assembler үйрөткүчү 9: 7 кадамдар
Video: Румба - A4988 Шаговый двигатель 2024, Июль
Anonim
AVR Assembler үйрөткүчү 9
AVR Assembler үйрөткүчү 9

Tutorial 9га кош келиңиз.

Бүгүн биз ATmega328P жана AVR ассамблеясынын тил кодун колдонуп, 7 сегменттүү дисплейди жана 4 орундуу дисплейди кантип башкарууну көрсөтөбүз. Муну аткарууда биз стекти кантип колдонуу керектигин байлап алышыбыз керек болгон реестрлердин санын азайтууга туура келет. Биз клавиатураны (аз өтүүчү чыпкаларды) кошуп, клавиатурабыздагы ызы-чууну азайтууга аракет кылабыз. Биз бир нече транзистордон күчөткүчтү түзөбүз, ошондо биздин INT0 үзгүлтүк которгучу баскычтын астыңкы катарындагы төмөнкү чыңалуу баскычтары үчүн жакшы иштейт. Жана биз башыбызды дубалга урабыз, нерсе туура иштеши үчүн туура резисторлорду алууга аракет кылабыз.

Биз 7 -сабактан клавиатурабызды колдонобуз

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

  1. 7 сегменттүү дисплей

    www.sparkfun.com/products/8546

  2. 4 орундуу дисплей

    www.sparkfun.com/products/11407

  3. Баскыч

    www.sparkfun.com/products/97

  4. Дисплейдин маалымат баракчалары, аларды жогоруда байланыштырылган тиешелүү баракчаларынан жүктөп алса болот.
  5. 68 pf керамикалык конденсатор, 104 жуп конденсатор, бир топ резистор, эки 2N3904 NPN транзистору.

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

1-кадам: 7-сегменттик дисплейдин зымдары

7-сегменттик дисплейдин зымдары
7-сегменттик дисплейдин зымдары
7-сегменттик дисплейдин зымдары
7-сегменттик дисплейдин зымдары
7-сегменттик дисплейдин зымдары
7-сегменттик дисплейдин зымдары

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

Биз сегменттерди микроконтроллерибиздин казыктарына төмөнкүчө карта кылабыз:

(dp, g, f, e, d, c, b, a) = (PD7, PD6, PB5, PB4, PB3, PB2, PB1, PB0)

мында сегменттердин тамгалары сүрөттө жалпы 5Vге тиешелүү пинута жана дисплейдин ылдыйкы оң жагындагы ондук чекитти (dp) кошкондо LED сегменттеринин ар бири көрсөтүлгөн. Мунун себеби, биз бүтүндөй санды бир регистрге киргизип, сегменттерди жарык кылуу үчүн В жана D портторуна каттай алабыз. Көрүнүп тургандай, биттер 0дон 7ге чейин ырааттуу номерленген, ошондуктан алар жеке биттерди орнотпостон жана тазалабастан туура казыктарга карта коюшат.

Кийинки кадамда тиркелген коддон көрүнүп тургандай, биз дисплей тартибибизди макрого жылдырдык жана кийинки Окутууда келечекте колдонуу үчүн SDA жана SCL казыктарын бошоттук.

Дисплейдин жалпы аноду менен 5В темир жолунун ортосуна каршылык коюу керектигин кошумчалашым керек. Мен адаттагыдай эле 330 Ом каршылыгын тандадым, бирок эгер кааласаңыз, дисплейден максималдуу жарыкты алуу үчүн керектүү минималдуу каршылыкты эсептей аласыз. Муну кантип жасоо керек:

Алгач маалымат барагын караңыз жана биринчи бетте ал дисплейдин ар кандай касиеттерин бергенин байкаңыз. Маанилүү чоңдуктар "Алга Ток" (I_f = 20mA) жана "Алга Чыңалуу" (V_f = 2.2V). Булар дисплейдеги чыңалуунун төмөндөшүн каалайт, эгерде агым алдыга карай барабар болсо. Бул дисплей куурулбай туруп ала турган эң чоң ток. Демек, бул сегменттерден чыга турган максималдуу жарыктык.

Келгиле, Омдун мыйзамын жана Kirchoff циклинин эрежесин колдонуп, максималдуу жарыктыкка жетүү үчүн дисплей менен катар минималдуу каршылык көрсөтүшүбүз керектигин билели. Кирхофтун эрежеси боюнча, чынжырдагы жабык контурдун айланасындагы чыңалуу суммасы нөлгө барабар жана Ом мыйзамы мындай дейт: каршылыктын резисторунун чыңалуусунун төмөндөшү: V = I R, мында I - резистор аркылуу агып жаткан ток.

Ошентип, V булак чыңалуусу берилген жана биздин айлананы айланып чыкканда бизде:

V - V_f - I R = 0

(V - V_f)/I = R. Демек, максималдуу жарыктыкты алуу үчүн керек болгон каршылык (жана, сыягы, сегменттерди кууруу) болмок:

R = (V - V_f)/I_f = (5.0V - 2.2V) /0.02A = 140 ом

Ошентип, эгер сиз кааласаңыз, тынчсызданып 150 омду бактылуу колдонсоңуз болот. Бирок, менин оюмча, 140 ом бул менин каалоом үчүн өтө жаркырайт, ошондуктан мен 330 ом колдоном (бул менин жеке Голдилокс светодиоддук каршылыгым)

2 -кадам: Ассамблея коду жана видео

Мен монтаждоо кодун жана дисплейи бар клавиатуранын ишин көрсөткөн видеону тиркеп койдум. Көрүнүп тургандай, биз кайра терүү баскычын "r", флеш ачкыч "F", жылдызча "А" жана хэш белгисин "H" ге картага түшүрдүк. Булар ар кандай операцияларга карта коюлушу мүмкүн, backspace, enter жана what-not, эгер сиз LCD баскычтарында же 4 орундуу дисплейде сандарды терүү үчүн баскычтопту колдонууну улантууну кааласаңыз. Мен бул жолу кодду саптан өтпөйм, анткени ал мурунку окуу куралдарында кылганга абдан окшош. Айырмачылыктар, негизинен, биз үзгүлтүккө учуроо жана таблицаларды кантип жасоону билебиз. Сиз жөн эле коддон өтүп, биз кошкон жаңы нерселерди жана биз өзгөрткөн нерселерди карап, ошол жерден түшүнүшүбүз керек. Кийинки үйрөткүчтө AVR микроконтроллерлерине ассамблея тилин коддоонун жаңы аспектилерин киргизгенде, сап-сап талдоого кайтып барабыз.

Эми 4 орундуу дисплейди карап көрөлү.

3-кадам: 4 орундуу дисплейдин зымдары

4 орундуу дисплейди туташтыруу
4 орундуу дисплейди туташтыруу
4 орундуу дисплейди туташтыруу
4 орундуу дисплейди туташтыруу

Маалыматтар барагына ылайык, 4 орундуу дисплейде 60 мА Форварддык Ток жана алдыга чыңалуусу 2,2 вольт бар. Ошентип, мурдагыдай эле эсептөө боюнча, эгер кааласам, 47 омдук резисторду колдоно алмакмын. Тескерисинче, мен… hrm колдоноюн деп жатам … көрөйүн … 330 ohms жөнүндө.

4 цифралуу дисплейдин зымдуу таралышы, аноддордун ар бири үчүн 4 аноддун бар экендигинде, ал эми башка пиндерде ар биринде кайсы сегмент пайда болорун көзөмөлдөө. Сиз 4 цифраны бир убакта көрсөтө аласыз, анткени алар мультиплекстүү. Башкача айтканда, биз сөөктөр үчүн кылгандай, биз жөн гана аноддордун ар бири аркылуу кубаттуулукту айлантып турабыз жана ал биринин артынан бири жаркылдайт. Бул муну ушунчалык тез жасайт, ошондуктан биздин көзүбүз ирмелгенди көрбөйт жана төрт цифранын баары күйүк окшойт. Ошентсе да, биз коддоонун жолу - бул төрт цифраны коюу, аноддорду айлантуу, тескерисинче, коюу, жылдыруу, коюу, жылдыруу ж.б..

Азырынча, сегменттердин бардыгы иштээрин текшерип көрөлү.

330 омдук резисторду дискиңиздеги оң рельс менен дисплейдеги биринчи аноддун ортосуна коюңуз. Маалыматтар барагы бизге төөнөгүчтөрдүн сол жактагы төмөнкүдөн баштап сааттын жебесине каршы 1ден 16га чейин номерленгенин (дисплейди кадимкидей карап турганда.. астындагы ондук чекиттери менен) жана аноддордун пин номерлери 6 экенин көрсөтөт., 8, 9 жана 12.

Ошентип, биз 6 -пинди 5Vга туташтырабыз, андан кийин GND темир жолунан терс коргошун алып, аны башка казыктардын бардыгына кыстарабыз жана бардык сегменттер ага туура келген цифрада күйүп турганын көрөбүз (бул чындыгында экинчи сан) оң). Бардык 7 сегментти жана ондук чекитти күйгүзүү үчүн текшериңиз.

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

Адаттан тыш нерсе барбы?

Көрсө, маалымат барагындагы пинту туура эмес экен. Себеби, бул 12-пиндүү, 4-орундуу дисплейдин маалымат баракчасы жана пинту. Башкача айтканда чекит же жогорку ондук чекити жок бири. Мен заказ кылганда алган дисплей 16 пиндүү, 4 орундуу дисплей. Чынында, менде сегмент аноддору 1, 2, 6 жана 8. төшөктөрдө турат. Колон анод 4 -пин (катод 12 -пин) жана жогорку дп анод 10 -пин (катод 9 -пин)

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

Сегменттик картаны коддоону каалаганыбыз, биз жогорудагы бир орундуу 7 сегменттүү дисплейде болгондой эле-биз коддогу нерсени алмаштыруунун кажети жок, зымдарды кантип туташтырганыбызды өзгөртөбүз. тактада. Микроконтроллердеги туура порт пинди 4 орундуу дисплейдеги тиешелүү пинге туташтырыңыз, мисалы, PB0 дагы эле a сегментине тиешелүү пинге кетет, PB1 B сегментине ж.б.

Жалгыз айырмачылык, азыр аноддорго 4 кошумча казык керек, анткени биз мындан ары 5В рельске бара албайбыз. Бизге микроконтроллер ширени кайсы цифрадан алаарын чечиши керек.

Ошентип, биз 4 орундуу аноддорду көзөмөлдөө үчүн PC1, PC2, PC3 жана PD4 колдонобуз.

Сиз ошондой эле алдыга жылып, зымдарды туташтырсаңыз болот. (аноддук зымдардагы 330 омдук резисторлорду унутпаңыз!)

4-кадам: 4 орундуу дисплейди коддоо

4 орундуу дисплейди коддоо
4 орундуу дисплейди коддоо

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

Колдонуучунун клавиатура баскычтарын басуусун жана сандар ар бир баскычты басканда экранда ырааттуу түрдө көрүнүшүн каалайбыз. Ошентип, эгер мен 1ди, андан кийин 2ди бассам, ал дисплейде 12 катары көрүнөт. Мен дагы ошол маанини, 12, ички колдонуу үчүн сактагым келет, бирок биз ага бир аздан кийин жетебиз. Азырынча мен жаңы баскычты жазгым келет, ал сиздин баскычтарыңызды басып, аларды көрсөтөт. Бирок, бизде болгону 4 цифра болгондуктан, мен бул төрт санды терүүгө гана мүмкүндүк берерине ынангым келет.

Дагы бир маселе, 4 орундуу мультиплекстүү дисплейдин иштөө ыкмасы аноддорду циклде айландыруу болуп саналат, андыктан ар бир цифра секундада гана күйүп турат, ал кийинки, андан кийинкисин көрсөтөт жана акыры кайра биринчи орунга келет. муну коддоонун жолу керек.

Биз дагы кийинки цифраны тергенибизде "курсорду" боштукка жылдырышын каалайбыз. Ошентип, эгер мен 1234 тергим келсе, мен 1 тергенден кийин, курсор жылат, ошондуктан мен жазган кийинки сан кийинки 7 сегменттүү дисплейде пайда болот жана башкалар. Мунун баары болуп жатканда, мен дагы эле тергенимди көргүм келет, андыктан ал дагы эле цифраларды айланып өтүп, аларды көрсөтүшү керек.

Бийик буйрук окшойт?

Иштер чындыгында андан да жаман. Биз көрсөтө турган 4 цифранын учурдагы маанилерин сактоо үчүн колдоно турган дагы 4 жалпы реестрге муктажбыз (эгер биз алар аркылуу циклди өткөрө турган болсок, аларды бир жерде сакташыбыз керек) жана мында көйгөй бизде бар жинди сыяктуу жалпы максаттагы реестрлерди колдонуп келе жатабыз жана эгерде биз байкабасак, анда бизде калдык калбайт. Демек, бул маселени эртерээк чечүү жана стекти колдонуу менен реестрлерди кантип бошотуу керектигин көрсөтүү жакшы идея.

Келгиле, бир аз нерселерди жөнөкөйлөтүүдөн баштайлы, стекти колдонуп, кээ бир регистрлерди бошотобуз, анан биз 4 цифралуу дисплейде сандарыбызды окуу жана көрсөтүү тапшырмасын аткарууга аракет кылабыз.

5 -кадам: Попту басыңыз

Push 'n Pop
Push 'n Pop

Биздин карамагыбызда бар болгон бир нече "Жалпы Максаттуу Реестр" бар жана алар колдонулгандан кийин жок болот. Ошентип, аларды портторго жана SRAM менен окуу үчүн жана жазуу үчүн убактылуу сактоочу жай катары колдонулуучу жуп өзгөрмөлөр үчүн гана колдонуу жакшы программалоо практикасы, же сиз бардык жерде чакан программаларда керек болот. аларга ат кой. Ошентип, мен эмне кылдым, азыр биз Stackти колдонууну үйрөнүп жатабыз, бул коддон өтүү жана бир гана подрограммада же үзгүлтүккө учуроодо колдонулган жана коддун башка эч жеринде колдонулбаган аталган жалпы регистрлерди табуу. аларды биздин темп реестрлерибиздин бири жана стекке түртүү жана чыгаруу. Чынында, эгер сиз кичинекей микроконтроллерлер үчүн жазылган кодду карасаңыз же бардык чиптер кичирээк убакытка кайрылып келсеңиз, анда бардыгы үчүн колдонулушу керек болгон бир нече жалпы максаттагы регистрлерди көрөсүз. жөн гана бааны ошол жерде сактаңыз жана аны жалгыз калтырыңыз, анткени сизге башка нерселер үчүн бул реестр керек болот. Ошентип, сиз коддун бардык жеринде pushin жана poppin көрөсүз. Балким, мен AX жана BX деген жалпы максаттагы регистрлерибизди өткөн күндөргө урмат -сый менен урматтоо катары атамакмын.

Мисал муну түшүнүктүүрөөк кылууга жардам берет.

Байкасаңыз, биздин санариптен санарипке которуунун толук үзгүлтүккө учурашы ADC_int, биз жалпы максаттагы реестрди колдонобуз, ал биз buttonH деп атаганбыз, аны ADCHтин маанисин жүктөп, аны аналогдук издөө таблицасы менен баскычты басуу үчүн алмаштыруу үчүн салыштырганбыз. Биз бул buttonH регистрин ADC_int кичи программасынын ичинде жана башка эч жерде колдонобуз. Ошентип, анын ордуна биз убактылуу өзгөрмө катары колдонгон temp2 өзгөрмөсүн колдонобуз, аны биз каалаган чакан программанын ичинде колдоно алабыз жана анын мааниси ал программанын сыртында эч нерсеге таасир этпейт (б.а. биз аны ADC_intте берген маани эч жерде колдонулбайт башка).

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

Таза жыйынтык - биз убактылуу колдонуу үчүн temp жана temp2ди "карызга" алып, анан биз бүткөндө аларды мурунку баалуулуктарына калыбына келтирдик.

Бул өзгөртүүнү киргизгенден кийин ADC_int үзгүлтүккө учуроо тартиби:

ADC_int:

басуу темп; темпти үнөмдөңүз, анткени биз аны бул жерде өзгөртөбүз temp2; temp2 lds temp2, ADCH сактоо; жүктөө баскычын ldi ZH, жогорку (2*сандар) ldi ZL, төмөн (2*сандар) cpi temp2, 0 breq кайтаруу; эгер ызы -чуу триггерлери өзгөрбөсө 7segnumber setkey: lpm temp, Z+; столдон жүктөө жана посттун өсүшү clc cp temp2, temp; баскычты салыштыруу brlo PC+4; эгер ADCH төмөн болсо, кайра аракет кылыңыз lpm 7segnumber, Z; антпесе keyvalue таблицасы inc цифрасын жүктөө; цифралык санды көбөйтүү rjmp кайтаруу; жана кайтаруу adiw ZH: ZL, 1; increment Z rjmp setkey; жана артка кайтуу: pop temp2; калыбына келтирүү temp2 pop temp; temp reti калыбына келтирүү

Стектин иштөө ыкмасы биринчи күйгүзүүнүн акыркы жолу экенине көңүл буруңуз. Кагаздар үймөгү сыяктуу. Көрөсүз, биздин биринчи эки сапта биз темптин маанисин стекке коебуз, андан кийин temp2ди стекке коёбуз, андан кийин аларды башка нерселер үчүн подрограммада колдонобуз жана акыры аларды мурунку баалуулуктарына кайра калыбына келтиребиз. адегенде темп2 өчүрүлөт (ал акыркы басылгандыктан стектин башында турат жана биз биринчи болуп кайра түшөбүз), андан кийин темп.

Андыктан мындан ары биз дайыма бул ыкманы колдонобуз. Биз реалдуу түрдө реестрди температуранын өзгөрмөсүнөн башка нерсеге дайындайбыз, качан гана биз ага бардык жерде керек болобуз. Мисалы, "толуп кетүү" деп аталган реестр биз программанын бир нече жеринде колдонобуз, ошондуктан биз ага ат бергибиз келет. Албетте, биз муну темп жана темп2 менен кылгандай колдоно алмакпыз, анткени биз бүткөндөн кийин анын баалуулугун калыбына келтиребиз. Бирок бул нерселерди ашыкча спагетизация кылат. Алар бир себептен улам аталган жана бизде бул жумуш үчүн темп жана темп2 белгиленген.

6-кадам: Төмөн өтмө чыпкалар жана чыңалуу күчөткүчү

Төмөн өтмө чыпкалар жана чыңалуу күчөткүчү
Төмөн өтмө чыпкалар жана чыңалуу күчөткүчү
Төмөн өтмө чыпкалар жана чыңалуу күчөткүчү
Төмөн өтмө чыпкалар жана чыңалуу күчөткүчү

Ызы-чууну бир аз тазалоо жана клавиатурабыздын жакшыраак иштеши үчүн, биз аз өтмө чыпкаларды кошууну каалайбыз. Булар жогорку жыштыктагы чууну чыпкалап, төмөнкү жыштыктагы сигналдын өтүшүнө мүмкүнчүлүк берет. Негизинен, муну жасоо жолу - аналогдук киришибиз менен жерибиздин ортосуна 68 pf конденсаторду кошуу, ошондой эле биздин PD4 (INT0) үзгүлтүк менен жердин ортосундагы 0.1 микрофарад (б.а. 104) конденсатор. Эгер сиз алар менен ойносоңуз, баскычтоптун баскычтарын басуу менен, алар эмне кылып жатканын көрө аласыз.

Андан кийин биз чыңалуу күчөткүчүн жасагыбыз келет. Көрсө, клавиатурадагы баскычтардын астынкы катарында (ошондой эле кайра терүү баскычы) INT0 үзүлүшүн өчүрүү үчүн өтө төмөн чыңалуу чыгып жатат. Аналогдук порт бул ачкычтардын төмөнкү чыңалуусун окуу үчүн жетишерлик сезимтал, бирок биздин үзүлүү пинибиз ал баскычтарды басканда үзгүлтүккө учурай турган деңгээлге жетпейт. Ошентип, биз жакшы чыңалуунун көтөрүлүүчү чети PD4кө тиет, бирок ошол эле төмөнкү чыңалуу ADC0го тийет деп ишенгибиз келет. Бул абдан бийик буйрук, анткени эки сигнал тең биздин клавиатуранын бир эле зымынан келип жатат. Муну жасоонун көптөгөн татаал жолдору бар, бирок биз бул окуу куралынан кийин клавиатураны колдонбойбуз, андыктан иштей турган ыкманы чогуу колдонуп көрөлү (эптеп).

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

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

Эгерде мен бул кадамга тиркелген диаграмманы карасаңыз, анда чыңалуу күчөткүчүнүн кантип иштээрин көрөсүз. Биз кээ бир резисторлорду жана эки транзисторду колдонобуз. Транзисторлордун иштөө ыкмасы (маалымат баракчаларын караңыз!) Транзистордун базалык пинине (ортоңку пин) киргизүү керек болгон минималдуу чыңалуу бар, ал аны каныктырат жана коллектор пини менен эмитенттин ортосунда токтун өтүшүнө мүмкүндүк берет. кадоо. Биз колдонгон 2N3904 транзисторунда чыңалуу 0,65В. Эми биз бул чыңалууну клавиатурадан чыгарабыз жана биз бул өндүрүштү өзгөрткүбүз келбейт, андыктан биз клавиатура менен биринчи транзистордун базасына чоң резистор койобуз (мен 1Mohm колдондум). Мен муну диаграммада R_1 деп белгилеп койгом. Андан кийин, биз чыңалуу бөлүштүргүчтү орнотууну каалайбыз, андыктан транзистордун базасы "дээрлик" 0.65 вольтто болот жана кичинекей кичине гана аны үстүнөн түртүп, каныктырат. Биз кичинекей баскычты баскычты баскандан кийин баскычтоптун чыгышынан келип чыгат. Ариптактадагы төмөнкү баскычтар кичинекей чыңалууну өчүрүп жаткандыктан, биз жетиштүү болушу үчүн каныккандыкка абдан жакын болушубуз керек. Чыңалуу бөлүштүргүчтөрү диаграммада R_a жана R_b деп белгиленген. Мен R_a = 1Mohm жана R_b = 560Kohm колдондум, бирок аны орнотууга туура келиши үчүн бул сандар менен ойноого туура келери анык. Сизге жакын жерде башыңызды кагып турган дубал жана колуңузда эки же үч стакан скотч болушу керек болушу мүмкүн (мен Лафроайг сунуштайт элем - кымбат, бирок эгер сиз түтүндү жакшы көрсөңүз арзыйт. Эгерде чын эле жинди болуп кетсе, анда кумураны алыңыз BV жана түнөп калуу)

Эми транзисторлор бизди INT0 ачкычына кантип жакшы көтөрүлө тургандыгын карап көрөлү жана биздин баскычты үзгүлтүккө учуратууну карап көрөлү. Адегенде мен баскычты баспай койгондо эмне болорун карап көрөлү. Бул учурда биринчи транзистор (диаграммада T1 деп белгиленген) өчүк. Ошентип, коллектор менен эмитир пиндеринин ортосунда эч кандай агым болбойт. Ошентип, башка транзистордун базасы (T2 деп аталат) бийикке тартылат жана ошону менен анын казыктарынын ортосунда токтун өтүшүнө мүмкүндүк берет. Бул T2 эмитенти төмөн тартылат дегенди билдирет, анткени ал жерге туташкан коллекторго туташкан. Ошентип, биздин INT0 баскычын басуучу пинге (PD4) кеткен продукт төмөн болот жана эч кандай үзгүлтүк болбойт.

Эми мен ачкычты бассам эмне болот? Т1 базасы 0.65Vдан жогору болот (төмөнкү баскычтарда ал эптеп жогору көтөрүлөт!), Андан кийин токтун T2 базасын төмөн чыңалууга алып келүүсүнө уруксат берилет жана бул T2ди өчүрөт. Бирок биз көрүп турабыз, T2 өчүрүлгөндө, өндүрүш жогору тартылат, демек биз INT0 пинибизге 5В сигналын алабыз жана ал үзгүлтүккө учуратат.

Бул жерде таза жыйынтык кандай болгонуна көңүл буруңуз. Эгерде биз 1 ачкычты бассак, анда биз ADV0ге чыгууну олуттуу түрдө өзгөртпөстөн PD4ке 5V барабыз, андан да маанилүүсү, эгер биз жылдызча, 0, Hash же Redial бассак дагы, биз 5V сигналын алабыз INT0 жана үзгүлтүккө учуратат! Бул абдан маанилүү, анткени эгерде биз жөн гана тергичтен INT0 пинге чыксак, анда бул ачкычтар дээрлик эч кандай чыңалуу жаратпайт жана алар бул үзгүлтүк пинин иштетүү үчүн жетишсиз болот. Биздин чыңалуу күчөткүч бул маселени чечти.

7-кадам: 4 орундуу дисплей коду жана видео

Мунун баары үйрөткүч 9 үчүн! Мен кодду жана операцияны көрсөткөн видеону тиркеп койдум.

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

Эми биз байланышты кайра карап чыгабыз жана 7 сегментибизди жана 4 орундуу дисплейлерибизди, анализаторубуздагыдай эле, чүкөлөрүбүздүн роликтерин окуп чыгууга даярдайбыз. Бул жолу биз бузулган Морзе кодунун ыкмасын эмес, эки зымдуу интерфейсти колдонобуз.

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

Араңардан амбициясы барлар үчүн. Мына ушул "проект", эгер сиз ушул окуу куралдарынын бардыгын ушул убакка чейин басып өткөн болсоңуз, анда бул жерде жасай турган билимге ээ экениңизди текшере аласыз:

Долбоор: Калькулятор жаса! 4 орундуу дисплейибизди жана клавиатурабызды колдонуңуз жана "кирүү" баскычы сыяктуу иштей турган тышкы баскычты басыңыз. Жылдызчаны "убакыттарга", кайра терүүнү "плюска" жана флэшти "минуска" бөлүп, бардык инженерлерде болгон эски HP "тескери лак" эсептегичтерине окшош эсептегич тартибин жазыңыз. кайра Башкача айтканда алардын иштөө ыкмасы - сиз номерди киргизип, "кирүү" баскычын басыңыз. Бул ошол санды стекке түртөт, андан кийин сиз экинчи номерди киргизесиз жана "enter" басасыз, ал экинчи санды стекке түртөт. Акыры сиз X, /, + же - сыяктуу операциялардын бирин басасыз, ал ошол операцияны стектин үстүндөгү эки санга колдонот, натыйжаны көрсөтөт жана жыйынтыгын стекке түртөт, эгер сиз аны кайра колдонсоңуз болот сыяктуу Мисалы, 2+3 кошуу үчүн сиз: 2, "enter", 3, "enter", "+" жана дисплей анда 5 деп жазылат. Сиз стекти, дисплейди, баскычтопту кантип колдонууну билесиз. фон кодунун көбү мурунтан эле жазылган. Жөн гана кирүү баскычын жана эсептегичке керектүү чакан программаларды кошуңуз. Бул сиз ойлогондон бир аз татаалыраак, бирок кызыктуу жана жасоого жөндөмдүү.

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

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