Բովանդակություն:

Վերանայել Z80 համակարգիչը. 6 քայլ
Վերանայել Z80 համակարգիչը. 6 քայլ

Video: Վերանայել Z80 համակարգիչը. 6 քայլ

Video: Վերանայել Z80 համակարգիչը. 6 քայլ
Video: MKS Monster8 - TMC2208 UART 2024, Նոյեմբեր
Anonim
Վերանայել Z80 համակարգիչը
Վերանայել Z80 համակարգիչը
Վերանայել Z80 համակարգիչը
Վերանայել Z80 համակարգիչը

Նախկինում ես գրել եմ ուղեցույց այն մասին, թե ինչպես կարելի է կառուցել Z80- ի վրա հիմնված համակարգիչ, և ես նախագծել եմ միացումը հնարավորինս պարզեցված, որպեսզի այն հնարավորինս հեշտ կառուցվի: Ես նույնպես մի փոքրիկ ծրագիր գրեցի ՝ օգտագործելով պարզության նույն գաղափարը: Այս դիզայնը բավականին լավ աշխատեց, բայց ես լիովին գոհ չէի դրանից: Ես սկսեցի վերաշարադրել դրա համար մի ծրագիր, որը թույլ տվեց ծրագրավորվել դրա ընթացքում: Սա թույլ էր տալիս ինձ փորձարկել ծածկագրի կտորներ ՝ առանց այն EEPROM- ին նվիրելու, ինչը, իր հերթին, կպահանջեր ինձանից ծրագրավորել EEPROM- ը: Սա ինձ համար զվարճալի գաղափար չէր թվում: Հետո սկսեցի մտածել հիշողության տարածությունների մասին: Եթե ես ցանկանայի միացնել ապարատային մի կտոր (հիմնականում IO), ապա կոդի մի կտոր կարող է գերազանցել համակարգին հասանելի հիշողության տարածքի չափը: Հիշեք, որ դիզայնը օգտագործում էր միայն հասցեի ավտոբուսի ստորին բայթը, այնուհետև բարձր բայտի ստորին բիթը օգտագործվում էր ROM և RAM տարածքների միջև ընտրություն կատարելու համար: Սա նշանակում էր, որ ես ունեի ընդամենը 253 բայթ տարածք օգտագործելու համար: Դուք կարող եք հարցնել, թե ինչու 253 -ի փոխարեն 253 -ը: Դա պայմանավորված է նրանով, որ իմ նոր ծածկագիրը գրված ծրագրի վերջում ներարկում է երեք բայթ տվյալներ (սա կներկայացվի ավելի ուշ, քանի որ այն փոփոխել եմ ՝ նոր դիզայնի վրա աշխատելու համար):

n

Վերադարձա հին սխեմաներով ՝ տեսնելու, թե ուրիշ ինչ է կատարվում: Ես գտա մի փոքր թերություն հիշողության ընտրության սխեմայի հետ, որը կփակեմ այնտեղ հասնելուց հետո: Պարզեցված տարբերակ. Գրելու բոլոր հարցումները իրականում կանցնեին, չնայած այն միշտ տեղադրվում էր RAM- ում: Հավանաբար, սա անհանգստանալու արժանի բան չէր, բայց ես ուզում էի դա ճիշտ անել այս անգամ: Եվ դրանով ես սկսեցի նկարել նոր սխեմատիկ: Այս էջին կցված երկու լուսանկարները իրական միացումից առաջ և հետո են: Ես այնքան մաքրեցի սպագետտիի լարերը, ծիծաղելի չէ:

n

Եթե դուք հետևեք իմ սկզբնական ներկայացմանը և մտադիր եք հետևել այս մեկին, ապա դուք ատելու եք ինձ: Եթե դուք սկսում եք նոր կյանքով, ապա հաջողակ եք: Պարզապես բռնեք ցուցակի մասերը (կամ դրանց համարժեքը) և հետևեք դրան:

Պարագաներ:

LM7805 - 5 վոլտ կարգավորիչ Z80 - պրոցեսոր; համակարգի ուղեղները AT28C64B - EEPROM: «Մշտական» տվյալների պահեստավորում, որն օգտագործվում է համակարգչի որոնվածի համար IDT6116SA - SRAM; օգտագործվում է օգտագործողի ծածկագիրը և (կամ) տվյալների ընդհանուր պահպանման համար N555 - Համակարգի ժամացույց 74HC374 - Octal D -Latch with /OE; օգտագործվում է որպես մուտքի չիպ 74LS273 - Octal D -Latch with /MR; ելքային չիպ TLC59211 - LED վարորդի չիպ (օգտագործվում է այնպես, որ 74LS273- ը կարող է LED- ներ վարել, քանի որ միայնակ ի վիճակի չէ ընթացիկ ելքի համար) MC14572 - Սա «Line Driver» չիպ է, բայց ես այն գտա իդեալական Հիշողության կառավարման տրամաբանության համար: Այն ունի 4 փոխարկիչ, և NAND և NOR դարպաս, որը կառուցված է 74LS32 - Quad OR gateCD4001 - Quad NOR gateCD4040 - 12 Stage Ripple Counter; Նկարված, բայց չիրագործված ժամացույցի բաժանարար (համակարգը ավելի դանդաղ արագությամբ գործարկելու համար) 2 10K Օմ ռեզիստորներ - մեկը օգտագործվում է 555 ժմչփ միացումում, այնպես որ օգտագործեք այն արժեքը, որը կցանկանայիք դրա համար 4 1K Օմ դիմադրիչներ - մեկը օգտագործվում է 555 ժամաչափի միացում, այնպես որ օգտագործեք այն, ինչ ցանկանում եք դրա համար: Մեկը օգտագործվում է LED- ների վարման համար, այնպես որ դրանք նույնպես փոխեք, եթե ցանկանում եք 8x330 Ohm Resistor Bus8x10K Ohm Resistor Bus11 LEDs - երեքը օգտագործվում են համակարգի կարգավիճակի համար, իսկ մյուս ութը `ելքեր: 8 -ի համար ես օգտագործել եմ գրաֆիկական էկրան (HDSP -4836) 4 կոնդենսատոր - երկուսն են LM7805; 0.22uF և 0.1uF: Մեկը 555 ժամաչափի համար է, այնպես որ օգտագործեք այն, ինչ ճիշտ եք համարում: Վերջինը միացման միացման համար է. 100uF2 N. O. Սեղմման կոճակներ - մեկը օգտագործվում է մուտքագրման համար, մյուսը ՝ վերականգնման համար 8 SPST DIP անջատիչ - Տվյալների մուտքագրում; Ես օգտագործել եմ Piano Key styleWire- ը: Շատ և շատ մետաղալարեր

n

ՈEՇԱԴՐՈԹՅՈՆ. MC14572 անցքային տարբերակն արդեն հնացած է, բայց SMD- ի տարբերակը դեռ ակտիվ է (նույնիսկ «ոչ նոր դիզայնի համար» կարգավիճակի համար), ուստի գուցե անհրաժեշտ լինի գնել տպատախտակ `այն թույլ տալու համար: MC14572- ի փոխարեն կարող է օգտագործվել երկրորդ 74LS32- ը (նշեք նախորդ պատկերակի «հիշողության ընտրության սխեմա»)

Քայլ 1. Փոփոխությունների + սխեմաների արագ ակնարկ

Փոփոխությունների + սխեմաների արագ ակնարկ
Փոփոխությունների + սխեմաների արագ ակնարկ

Ինչպես կարդալ սխեմաները. Չիպի մեջ մատնված սլաքը մուտքագրում է. Մուտք>-Չիպից դեպի մյուս կողմ ուղղված սլաքը ելք է. Ելք <-Ավտոբուսները սլաքի փոխարեն օգտագործում են տող: Ավտոբուս |-

n

Չիպերի մեծ մասը գծված է իրենց ճշգրիտ քորոցներով: Փոքր թաթախը գծված է այս չիպերի վրա: Չիպերի մեծ մասում կան նաև փին համարներ և պիտակներ: Նրանք կարող են մի փոքր դժվար կարդալ: Մատիտս ձանձրանում էր:

n

Շղթայական միացումների առումով նոր դիզայնի դասավորությունը հիմնականում անփոփոխ է բնօրինակից: Հասցեի բարձր բայթ հասցեի ստորին հատվածը կապեցի հիշողությունների հետ, այնուհետև օգտագործեցի վերևի խայթոցի ցածր բիթը (A12) RAM/ROM ընտրության համար: Սա նշանակում էր, որ ROM- ի տարածքը գնացել է 0000-00FF- ից մինչև 0000-0FFF: Ram տարածությունը 0100-01FF- ից դարձավ 1000-1FFF: Ես նաև փոխեցի Հիշողության կառավարման տրամաբանությունը ավելի լավ դիզայնի համար և ավելացրեցի երկու նոր կարգավիճակի LED (և որոշ սոսնձման տրամաբանություն): Ես նաև գծել եմ (բայց չեմ լարել) ժամացույցի բաժանարար միացում: Այն պետք է կատարեր երկու գործառույթ. Ակնհայտ գործառույթը ժամացույցի հաճախականությունը բաժանելն է: Մյուս գործառույթը PWM- ի (Pulse Width Modulation) նպատակների համար է, քանի որ 555 -ը 50% աշխատանքային ցիկլերով ալիքներ չի առաջացնում: Դա իսկապես նշանակություն չունի այս շղթայում, բայց եթե դուք ցանկանայիք օգտագործել ժամացույցը մի քանի LED- ներ վարելու համար, անպայման կնկատեք հետևանքները (LED- ներից մեկը (մյուսները) ավելի մռայլ կլինեն, քան մյուսը): Շղթայի ամբողջ մնացած մասը ըստ էության անփոփոխ է:

Քայլ 2: Պրոցեսոր, Հիշողության և Հիշողության վերահսկում

CPU, Հիշողության և հիշողության վերահսկում
CPU, Հիշողության և հիշողության վերահսկում
CPU, Հիշողության և հիշողության վերահսկում
CPU, Հիշողության և հիշողության վերահսկում
CPU, Հիշողության և հիշողության վերահսկում
CPU, Հիշողության և հիշողության վերահսկում
CPU, Հիշողության և հիշողության վերահսկում
CPU, Հիշողության և հիշողության վերահսկում

Սա այն հատվածն է, որտեղ իմ նախորդ տարբերակի ընթերցողները ատում են ինձ: Սկզբնական կառուցվածքում ես մի տեսակ մասեր նետեցի տախտակի վրա մի վայրում, որտեղ նրանք կարծես մի փոքր խնդիր էին դնում լարերի հետ կապված: Արդյունքը կարծես ինչ -որ մեկը սպագետտիի ափսե էր գցել դրա վրա և նման էր «լարերի»: Ես ուզում էի այն մի փոքր մաքրել, ուստի ես սկսեցի ամեն ինչ պատռել ՝ բացի պրոցեսորը, RAM- ը և ROM- ը: Ես քաշեցի գրեթե ամբողջ մուտքային սխեման, ելքային սխեման և սոսնձի տրամաբանությունը: Դա ինձ գրեթե ցավ պատճառեց, բայց դա անհրաժեշտ էր: Տվյալների բոլոր կապերը թողեցի անձեռնմխելի և հասցեի ավտոբուսի ստորին բայթը: Հետո հասցեի ավտոբուսի (A8-A11) հաջորդ չորս բիթերը միացրեցի ROM չիպին: Այս անգամ ես հոգ տանել, որ պտտվեմ չիպի շուրջը, որպեսզի ավելի հեշտ լինի վերապատրաստվելը: Նաև հասցեի միացումները նետեցի դեպի RAM չիպը:

n

Այդ ամենն այլևս, ես ստիպված էի այժմ հիշողության կառավարման տրամաբանությունը լարել: Սկզբնական սխեմատիկայում ես միացրել էի պրոցեսորի /MREQ գիծը անմիջապես /CE հիշողության երկու չիպերին, այնուհետև /WR- ը միացրել էի RAM- ին /WE- ին: Հետո ես ունեի CPU's /RD և /MREQ տրամաբանորեն OR'd միասին, ինչպես նաև A9: Ըստ էության, այն ստեղծվել է այնպես, որ հիշողության բոլոր հարցումները ակտիվացնեն ինչպես RAM- ը, այնպես էլ ROM- ը, բայց A9- ն օգտագործվում էր չիպերի /OE- ից ընտրված ընտրելու համար: Սա լավ էր և ամեն ինչ, քանի որ չիպերը անգործուն կմնային մինչև հիշողության հարցում կատարելը, և միայն մեկ /OE- ն ակտիվ կլիներ ընթերցման հարցման ժամանակ: Սա կանխեց խաչմերուկը, բայց մտավ անհարմար երանգ: Քանի որ A9- ը օգտագործվում էր միայն որոշելու համար, թե որ չիպն է տվյալներ թողարկում, և քանի որ պրոցեսորը անմիջականորեն մուտք էր գործում RAM /WE պին, գրելու ցանկացած և բոլոր հարցումները կանցնեն: ROM- ի համար դա լավ չէր, քանի որ դրա գրելու ռեժիմը արգելափակվում է ՝ ուղղակիորեն /WE- ն կապելով 5 Վ լարման հետ: RAM- ը, այնուամենայնիվ, կգրվի անկախ A9- ից: Սա նշանակում էր, որ ROM- ի տիեզերական վայրում գրելու փորձը կգրեր RAM- ի նույն տեղում:

n

Դրա լուծումներից մեկը կլինի վերահսկման տրամաբանությունը վերաշարադրել այնպես, որ պրոցեսորը անմիջականորեն մուտք ունենա չիպերի /OE և /WE կապում և այնուհետև MREQ և A12 օգտագործմամբ ընտրի, թե որ չիպերը /CE- ն են շարժվում: Ես գնացի այս գաղափարով, բայց չորս NOR դարպաս և սկզբնական դիզայնի նման ինվերտոր օգտագործելու փոխարեն ես գտա անհարմար փոքրիկ չիպ, որը կատարյալ էր առաջադրանքի համար: Ես ստիպված էի ստեղծել մի շրջան, որն օգտագործում էր միայն չիպի մեջ առկա տրամաբանական դարպասները, բայց դա բավական հեշտ էր: A12- ը ուղղակիորեն սնվում է NAND դարպասի և NOR դարպասի մեջ: /MREQ- ը սնվում է NOR դարպասով, իսկ նրա հաճոյախոսությունը `NAND դարպասով: NAND դարակը օգտագործվում է RAM /CE- ի համար քշելու համար, իսկ NOR- ի ելքը շրջվում է և օգտագործվում է ROM /CE- ն վարելու համար: Սա ստիպում է այնպես, որ /MREQ- ը պետք է ցածր լինի նախքան որևէ չիպ ընտրելը, այնուհետև A12- ն ընտրում է, թե որն է ընտրված: Այս կարգավորմամբ, այժմ ROM- ին գրելու ցանկացած հարց ոչինչ չի անի: Այն նաև խնայում է էներգիան, քանի որ երկուսի փոխարեն ակտիվ է միայն մեկ չիպ: Ինչ վերաբերում է բուն տրամաբանական չիպին, ապա մենք դեռ ունենք երկու չօգտագործված ինվերտոր ներսում: Մեկը կօգտագործվի ավելի ուշ, բայց մենք կհասնենք այնտեղ, երբ հասնենք այնտեղ:

Քայլ 3: Համակարգի կարգավիճակի լուսադիոդներ

Համակարգի կարգավիճակի LED- ներ
Համակարգի կարգավիճակի LED- ներ
Համակարգի կարգավիճակի LED- ներ
Համակարգի կարգավիճակի LED- ներ

Նախքան այս նախագիծը սկսելը, ես փորձում էի շփվել որոշակի IC- ի հետ, բայց դրա հետ կապված խնդիրներ ունեի: Չգիտելով, թե ինչ է կատարվում, ես օգտագործեցի վահանակի ամրացման լուսադիոդ ՝ շուրջը զննելու համար (այն հավաքույթներից մեկը, որի ներսում տեղադրված է դիմադրություն): Սա անելը ինձ տվեց մի կարոտի գաղափար, որն օգտագործվում է մինչ օրս. Կարգավիճակի LED- ները նշում էին, թե արդյոք հիշողությունը կարդացվում է կամ գրվում է այնտեղ: Այն պետք է օգտագործվեր արդեն իսկ ունեցած մուտքային LED- ի հետ համատեղ: Մուտքային LED- ն միացված էր /WAIT ազդանշանի գեներատորին ՝ մեզ ցույց տալու համար, որ համակարգը, դե, սպասում է մուտքի (ես կհասնեմ այնտեղ, մի անհանգստացեք): Ես մտածեցի LED- ն ավելացնել IO- ի նշումը նշելու համար, բայց մտածեցի, որ ելքային LED- ները փոխվելը արդեն դրա հիանալի ցուցանիշն է: Մտածելով դրա մասին ՝ դեռ կարող եմ դեռ ավելացնել: Այնուամենայնիվ, օգտակար եմ համարում իմանալ ՝ հիշողությունը կարդացվո՞ւմ է, թե՞ գրվում: Դե, այն ամեն դեպքում օգտակար է ծրագրերի վրիպազերծման համար: Իրականում ես դա շատ օգտագործեցի, որպես այդպիսին, երբ փորձում էի գործի դնել իմ ծրագիրը. Ենթադրվում է, որ դա դեռ չի անի »:

n

Այս LED- ները վերահսկելու համար ես օգտագործեցի quad NOR դարպասը: Ես օգտագործեցի բոլոր դարպասները: Միայն երկուսն են օգտագործվել կարգավիճակի ազդանշաններ ստեղծելու համար, սակայն չիպը չունի LED- ներն իրականում վարելու էներգիայի հնարավորություններ: Նրանք ունակ են այդքան էներգիա խլել, այնպես որ ես մյուս երկու NOR դարպասները օգտագործեցի որպես ինվերտորներ և միացրեցի LED- ները որպես այդպիսին: Քանի որ մեկ LED- ն օգտագործվում է կարդալու համար, իսկ մյուսը ՝ գրելու համար, և կարդալու և գրելու խնդրանքը միաժամանակ չի առաջանա, ես կարողացա խուսափել երկու LED- ների համար օգտագործելով միայն մեկ դիմադրություն: Ինչ վերաբերում է ազդանշաններին, որոնք ինձ անհրաժեշտ էին վերծանել, դա նույնպես բավական հեշտ էր: Ես ուզում էի, որ հիշողության ընթերցման բոլոր խնդրանքները նշվեին, այնպես որ առաջին NOR դարպասի մուտքերում կար /MREQ և /RD: Գրելու կարգավիճակը մի փոքր ավելի բարդ էր, բայց նույնքան հեշտ: Ես դեռ օգտագործում էի /MREQ- ն որպես մեկ մուտք, բայց /WR- ի, որպես մյուսի օգտագործումը կառաջացներ մի փոքր նրբերանգ, որից ես ուզում էի խուսափել: Այն ցույց կտար գրելու ԲՈԼՈՐ հարցումները: Ես ուզում էի միայն նրանք, ովքեր իրականում անցել էին: Այսպիսով, ինչպե՞ս կանեի դա: Դե, հիշեք, թե ինչպես եմ ես համակարգը կարգավորել, որպեսզի միայն RAM- ը գրվի: Ես օգտագործեցի RAM /CE- ն որպես NOR դարպասի մյուս մուտք: Սա նշանակում է, որ LED- ը լուսավորվելու է միայն այն ժամանակ, երբ RAM- ն ընտրված է և գրելու հարցում է արվում: LED գույնի առումով ես ընթերցման ցուցիչ ընտրեցի նարնջագույնը (բայց ես գտա միայն դեղինը), իսկ կարմիրը ՝ որպես գրելու ցուցիչ:

Քայլ 4: Մուտք և ելք

Մուտք և ելք
Մուտք և ելք
Մուտք և ելք
Մուտք և ելք
Մուտք և ելք
Մուտք և ելք

Նախորդ քայլին, հավանաբար, նկատել եք, որ մնացած բաղադրիչներից մի քանիսն արդեն ավելացրել եմ տախտակին: Ես վերապահում էի տարածքը, որպեսզի պատահաբար լարեր չտեղադրեի այնտեղ, որտեղ կցանկանայի բաղադրիչ (այսպիսով ես ստիպված կլինեի գտնել նոր բաղադրիչ նշված բաղադրիչի համար): Դուք երևի նկատել եք, որ ես թողեցի մուտքի անջատիչները տեղում և միացրի էլեկտրահաղորդման գծին: Ես որոշեցի, որ սկզբնական վայրը կատարյալ վայր է և որոշեցի, որ ելքային LED- ները տեղադրվեն մոտակայքում (վերևում): Սանդղակի ցուցադրումից աջ ՝ մուտքի սողնակն է: Դրանից վերև ելքային սողնակն է, իսկ ձախից ՝ LED վարորդը: Ես սկսեցի էկրանը միացնել վարորդին, քանի որ դա ամենահեշտն էր անել: Հետո անջատիչները միացրեցի մուտքային սողնակի մուտքային կողմին: Հաջորդը ես միացրեցի ելքային կողպեքի ելքային կողմը LED վարորդին: Սա կարող է թվալ անհարմար պատվեր `դրանք լարով ձեռք բերելու համար, բայց դա պատճառ էր: Ելքային փականի մուտքը պետք է միացված լիներ տվյալների ավտոբուսին, ինչպես նաև մուտքային փականի ելքը: Գաղափարն այն էր, որ մուտքային սողնակի ելքերը միացնեն ելքային սողնակի մուտքերին, ինչը և արեցի: Հետո ինձ մնում էր միայն այդ խառնաշփոթը միացնել տվյալների ավտոբուսին: Կարևոր չէր, թե այդ կապերը ֆիզիկապես ուր են գնում, քանի որ դրանք բոլորը էլեկտրականորեն կապված կլինեն: Համակարգիչն այժմ գրեթե ավարտված է:

Քայլ 5: Վերականգնել և ավարտել մուտքն ու ելքը

Ներեցեք, այս քայլի լուսանկարներ չկան: Նկարների համար անցեք նախորդ քայլին:

n

Հավանաբար նկատել եք նախորդ քայլի վերջին լուսանկարում, որ ես կանաչ կոճակ և մեկ այլ տրամաբանական չիպ եմ տեղադրել: Չիպը OR դարպասն է: Երկու դարպաս օգտագործվում է /WAIT ազդանշան ստեղծելու համար: Դե, մեկը ազդանշան է առաջացնում պրոցեսորից OR-ing /IORQ և /RD- ով: Ելքը սնվում է երկրորդ դարպասի մեջ, որտեղ այն կրկին ստանում է OR'd կոճակը: Կոճակը բերում է դարպասի մուտքը բարձր, դրանով իսկ ելքը բարձրացնում: Այս ելքը սնվում է պրոցեսորներին /ՍՊԱՍԵԼ քորոցին: Չնայած սեղմված չէ, ռեզիստորը ցածր է պահում մուտքը: Սկզբում ես օգտագործեցի 10K դիմադրություն, բայց LS32- ն իրականում լարվածություն էր դնում մուտքի վրա: Ռեզիստորը բավականաչափ ցածր չընկավ, և ես ստիպված էի այն փոխարինել 1K- ով: Ամեն դեպքում, գաղափարն այն է, որ երբ IO- ի ընթերցման հայտ է ներկայացվում, առաջին և երկրորդ OR դարպասները ասում են պրոցեսորին սպասել: Երբ մուտքագրման անջատիչները դնում եք ձեր ուզածին, սեղմում եք կոճակը և այն դուրս է բերում պրոցեսորը սպասման վիճակից: Կանաչ «մուտքային» LED- ն, ինչպես ես այն կոչեցի ավելի վաղ, միացված է այնպես, որ երբ /WAIT փինն իջնի, այն լուսավորվի:

n

Բայց մենք դեռ ավարտված չենք: Մուտքի մատով խափանման միջոցի համար անհրաժեշտ է ազդանշան, որը կտեղեկացնի տվյալների մուտքագրման վավերականության մասին և պետք է փոխանցվի պրոցեսորին: Այս ժամացույցի քորոցը ակտիվ է բարձր: Նախկինում մենք պարզապես միացրեցինք այն կոճակին: Սա դեռ վավեր տարբերակ է, բայց այս անգամ ես ընտրեցի այն տեղադրել նույն ելքի վրա, ինչպես երկրորդ OR դարպասը: Այս IC- ն ունի նաև /OE պին, որը պետք է քշել: Եթե այն բարձր պահվեր, այն երբեք տվյալներ չէր տեղադրի ավտոբուսի մեջ: Lowածր պահելու դեպքում դա միշտ ավտոբուս է վարելու: Սա շտկելու համար ես պարզապես օգտագործեցի երրորդ OR դարպասը: Մուտքներն են /IORQ և /RD, իսկ ելքը գնում է անմիջապես դեպի փական /OE:

n

Ելքային սողնակին անհրաժեշտ է նաև ժամացույցի քորոցը քշելու համար: Կրկին ակտիվ է բարձր: Իմ սխեմատիկ նկարում ես նկարեցի չորրորդ OR դարպասը, որն ուղղակիորեն քշում էր քորոցը ՝ օգտագործելով /IORQ և /WR: Սա նշանակում էր, որ ժամացույցի պտույտը կպահպանվի բարձր մինչև գրելու հարցում կատարելը, այնուհետև այն կիջնի ցածր, ապա նորից բարձր: Սա, հավանաբար, լավ կլիներ, քանի որ տվյալների ավտոբուսը դեռ կունենար դրա վրա վավեր տվյալներ գրելու փորձից անմիջապես հետո, բայց ինժեներական տեսանկյունից դա աղբի նախագիծ էր: Այս սխալը ես չնկատեցի մինչև վերջին լուսանկարներն անելուց հետո, բայց ես պատռեցի այդ կապը, այնուհետև OR դարպասի ելքը սնուցեցի չօգտագործված ինվերտորներից մեկը հիշողության կառավարման տրամաբանությունից, այնուհետև դրա ելքը միացրեցի ժամացույցի քորոցին:. Ես նաև շտկեցի սխեմատիկան և գտա իմ թույլ տված մեկ այլ սխալ: Ես էլ եմ ուղղել:

n

Այդ ամենի վերջնական ավարտից հետո ես շատ փոքր աշխատանք ունեի անելու. Ես տախտակին մի կոճակ ավելացրի և մի կողմը բարձր պահելու համար օգտագործեցի 10K դիմադրություն: Մյուս կողմն անցնում է անմիջապես գետնին: Բարձր պահված կողմը /RESET ելքն է, որը գնում էր յուրաքանչյուր չիպի հետ /RESET պինով (պրոցեսորի և ելքային սողնակ): Միացման ռեժիմը վերականգնելու համար ես /RESET ելքին ավելացրեցի կոնդենսատոր: Գաղափարն այն է, որ մեծ արժեք ունեցող ռեզիստորը կհանգեցնի համեմատաբար մեծ կոնդենսատորի դանդաղ լիցքավորմանը և /RESET կապումներին ցածր պահելու ժամացույցի որոշակի ցիկլերի համար (պրոցեսորին անհրաժեշտ է չորս ժամացույցի ցիկլ): Դուք հավանաբար արդեն կարող եք կռահել, թե որն է այս սխեմայի բացասական կողմը: Դա նույն բացասականն է, ինչ նախորդ տարբերակը, քանի որ այն նույն շրջանն է: Երբ կոճակը սեղմվում է, կոնդենսատորը էապես կարճացվում է կոճակի միջով: Սա վատ է ինչպես գլխարկի, այնպես էլ կոճակի համար, այնպես որ, եթե ցանկանում եք ձեր կառուցվածքը մի փոքր ավելի մշտական դարձնել, գուցե ցանկանաք այն վերափոխել: Ես մտածում էի ևս 555 ժմչփի մասին, որը տեղադրված էր մոնոստաբիլ ռեժիմում: Բայց դրանով համակարգչային միացումն այժմ ավարտված է: Այո Հիմա ծրագրավորման կարիք ունի:

Քայլ 6: mingրագրավորում

Այս բանը ծրագրելը մղձավանջ էր: Ես կառուցեցի Arduino EEPROM ծրագրավորող: Դա չաշխատեց: Ես կառուցեցի ևս մեկը ՝ ուրիշի նախագծման և կոդավորման հիման վրա: Դեռ չի աշխատել: Վերադարձա հասցեներին և տվյալների բայթերը ձեռքով ձեռքով կարգավորելու փորձված մեթոդին: Ինչ -որ կերպ ես դա խառնեցի: Ես նորից փորձեցի և դեռ սխալվեցի: Ես նորից վերադարձա և պարզեցի, որ այն անջատված է մեկ բայթով, ուստի այն ուղղեցի և, ի վերջո, աշխատեց, փառք Աստծո:

n

Ինչ վերաբերում է իրական ծրագրին, ապա այն կարծես չափազանց բարդ է և դժվար է հետևել, բայց դա այդպես չէ: Իրականում դա բավականին պարզ է: Դրա կեսը պատճենում է շրջապատող թվերը: Մյուս կեսը բաժանվում է 16-բիթ մաթեմատիկայի, պայմանական թռիչքների և դեռ ավելի շատ թվերի պատճենահանման միջև: Այսպիսով, թույլ տվեք անցնել դրա միջով և պատմել, թե ինչպես է այն աշխատում:

n

Նախաստորագրումը պարզապես գրանցման որոշ արժեքներ է սահմանում ծրագրի օգտագործման համար: Րագրի օղակը մի փոքր ավելի բարդ է, բայց ոչ ամբողջովին: Նախ, այն ընդունում է մուտքագրումը 00 -ի A ռեգիստրում: Այնուհետև E գրանցամատյանը գրվում է հիշողության մեջ: Առաջին երկու օղակների վրա E գրանցամատյանը պարունակում է անպիտան տվյալներ, ուստի մենք փորձում ենք գրել այն ROM- ի տարածքի վերջին երկու բայթերին, քանի որ դրանք իրականում չեն գրվելու. հասցեի ցուցիչը (IY) այնուհետ ավելանում է: D- ում պահված արժեքը այնուհետև տեղափոխվում է E ՝ հաջորդը գրելու համար: A- ն այնուհետև բեռնվում է D- ում և L- ն, իսկ E- ն պատճենվում է H. HL- ում: Համեմատած առաջին արժեքը պահվում է B և C. գրանցամատյաններում: Եթե արժեքները նույնն են, ապա ծրագիրը անմիջապես ցատկում է RAM- ի տարածք, որտեղ ենթադրվում է, որ բնակվում է օգտվողի կոդը: Եթե BC- ի ծածկագիրը համընկնում չէ, ապա HL- ն վերաբեռնվում է D և E- ի սկզբնական արժեքներով և կրկին համեմատվում է SP- ի արժեքի հետ նույն կերպ, ինչպես մ.թ.ա. Եթե դա համընկնում է, այն ունի նույն արդյունքը, բայց հիշողության մեջ գրվում է երեք լրացուցիչ բայթ: Բայթերը կոդ են, որը ստիպում է պրոցեսորը վերադառնալ իր ծրագրի հենց սկզբում (ծրագրակազմի վերականգնում): Եթե երկրորդ համեմատությունը համընկնում չէր, այնուամենայնիվ, ծրագիրը անցնում է այնտեղ, որտեղից օգտվողից արժեք է գրավում:

n

LD SP, EDBFH; exe կոդ (ավելացնում է ցատկել)

n

LD IY, FFEH; սկզբնական հիշողության ցուցիչ `կոդի պահպանման համար

n

LD BC, EDC3H; exe կոդ (առանց հանգույցի)

n

հանգույց; assembler դիրեկտիվը, որպեսզի մենք ստիպված չլինենք իմանալ, թե հիշողության մեջ որտեղ է գտնվում այս մասը

n

Ա, (00H); ստանալ ծրագրի տվյալները

n

LD (IY+00H), E; E- ն պարունակում է պահելու կոդ

n

INC IY; տեղափոխել հաջորդ հիշողության վայր

n

LD E, D; l D- ն E- ի մեջ

n

LD D, A; ld A- ն D- ի մեջ

n

LD H, E; ld E- ը H- ում

n

LD L, D; l D- ն L- ում

n

ԿԱ Ա; վերականգնել կրելու դրոշը

n

SBC HL, BC; վերադարձնում է 0 -ն, եթե մուտքագրված է exe կոդը 2

n

JP Z, 1000H; եթե այո, անցեք և գործարկեք ծրագիրը

n

LD H, E; հակառակ դեպքում դրանք թարմացրեք համապատասխան արժեքներին

n

ԼԴ Լ, Դ

n

ԿԱ Ա; առաջին հանումը կարող է սահմանել կրել դրոշը: Մաքրել այն

n

SBC HL, SP; վերադարձնում է 0 -ն, եթե մուտքագրվել է exe կոդը 1

n

JP NZ, հանգույց; եթե ոչ, կրկնել գործընթացը (սկսած արժեք ստանալուց)

n

LD (IY+00H), C3H; հակառակ դեպքում, օգտագործողի ծրագրի վերջում ներարկեք ցատկման կոդ

n

LD (IY+01H), 00H; jump- ը հիմնականում գործում է որպես ծրագրակազմի վերակայում

n

LD (IY+02H), 00H; դա լիարժեք վերականգնում է, եթե գրանցամատյանները փոփոխվեն

n

JP 1000H; անցնել և կատարել օգտվողի ծրագիրը

Խորհուրդ ենք տալիս: