Სარჩევი:

გადახედეთ Z80 კომპიუტერს: 6 ნაბიჯი
გადახედეთ Z80 კომპიუტერს: 6 ნაბიჯი

ვიდეო: გადახედეთ Z80 კომპიუტერს: 6 ნაბიჯი

ვიდეო: გადახედეთ Z80 კომპიუტერს: 6 ნაბიჯი
ვიდეო: И ЭТО ТОЖЕ ДАГЕСТАН? Приключения в долине реки Баараор. БОЛЬШОЙ ВЫПУСК (Путешествие по Дагестану #3) 2024, ნოემბერი
Anonim
გადახედეთ Z80 კომპიუტერს
გადახედეთ Z80 კომპიუტერს
გადახედეთ Z80 კომპიუტერს
გადახედეთ Z80 კომპიუტერს

წარსულში, მე დავწერე სახელმძღვანელო, თუ როგორ უნდა ავაშენოთ Z80– ზე დაფუძნებული კომპიუტერი და მე შევიმუშავე წრე მაქსიმალურად გამარტივებული, რათა ის რაც შეიძლება მარტივად აშენებულიყო. მეც დავწერე პატარა პროგრამა სიმარტივის იმავე იდეის გამოყენებით. ეს დიზაინი საკმაოდ კარგად მუშაობდა, მაგრამ მე არ ვიყავი კმაყოფილი. დავიწყე პროგრამის გადაწერა, რომლის საშუალებითაც შესაძლებელი იყო მისი პროგრამირება გაშვების დროს. ეს იყო იმის საშუალება, რომ მე გამომეცადა კოდის ნაწილები EEPROM– ისთვის მიძღვნის გარეშე, რაც თავის მხრივ მოითხოვდა EEPROM– ის გადაპროგრამებას. ეს ჩემთვის სახალისო იდეას არ ჰგავდა. შემდეგ დავიწყე ფიქრი მეხსიერების სივრცეებზე. თუ მინდოდა აპარატურის (ძირითადად IO) ინტერფეისის დამყარება, კოდის ნაწილმა შეიძლება პოტენციურად გადააჭარბოს სისტემისთვის ხელმისაწვდომი მეხსიერების სივრცის რაოდენობას. გახსოვდეთ, დიზაინი მხოლოდ მისამართის ავტობუსის ქვედა ბაიტს იყენებდა და შემდეგ მაღალი ბაიტის ქვედა ბიტს იყენებდნენ ROM და RAM სივრცეებს შორის ასარჩევად. ეს ნიშნავს, რომ მე მხოლოდ 253 ბაიტი მქონდა გამოსაყენებელი. თქვენ შეიძლება გკითხოთ, რატომ 253 256 -ის ნაცვლად. ეს იმიტომ ხდება, რომ ჩემი ახალი კოდი წერს პროგრამის დასასრულს სამ ბაიტ მონაცემს (ეს მოგვიანებით იქნება გაშუქებული, რადგან მე შევცვალე ის ახალ დიზაინზე მუშაობისთვის).

n

დავბრუნდი ჩემს ძველ სქემებზე, რომ მენახა სხვა რა ხდებოდა. მე აღმოვაჩინე მცირე ხარვეზი მეხსიერების შერჩევის სქემასთან, რომელსაც იქ დაფარვისთანავე დავფარავ. გამარტივებული ვერსია: ყველა წერის მოთხოვნა რეალურად გადიოდა, თუმცა ის ყოველთვის RAM- ში იდო. ეს ალბათ არ იყო რაიმე შეშფოთების ღირსი, მაგრამ მე მინდოდა ამის გაკეთება სწორად ამჯერად. და ამით დავიწყე ახალი სქემის დახატვა. ამ გვერდზე დართული ორი სურათი არის რეალური წრის დაწყებამდე და მის შემდეგ. იმდენი გავწმინდე სპაგეტის გაყვანილობა, ეს არ არის სასაცილო.

n

თუ თქვენ მიჰყვებით ჩემს თავდაპირველ წარდგენას და გეგმავთ მის გაყოლას, თქვენ მეზიზღებით. თუ ახლიდან იწყებ, მაშინ იღბლიანი ხარ. უბრალოდ აიღეთ ნაწილები სიაში (ან მათი ექვივალენტი) და მიჰყევით.

მასალები:

LM7805 - 5 ვოლტიანი რეგულატორი Z80 - პროცესორი; სისტემის ტვინი AT28C64B - EEPROM. "მუდმივი" მონაცემთა შენახვა, რომელიც გამოიყენება კომპიუტერის firmware- ისთვის IDT6116SA - SRAM; გამოიყენება მომხმარებლის კოდის ან /და მონაცემთა ზოგადი შესანახად N555 - სისტემის საათი 74HC374 - ოქტალური D -Latch ერთად /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 Ohm რეზისტორები - ერთი გამოიყენება 555 ქრონომეტრის წრეში, ასე რომ გამოიყენეთ ის მნიშვნელობა, რაც გსურთ ამისთვის 4 1K Ohm Resistors - ერთი გამოიყენება 555 ტაიმერის წრე, ასე რომ გამოიყენეთ რაც გსურთ. მეორე გამოიყენება LED- ების მართვისთვის, ასე რომ თქვენც შეცვალეთ თუ გნებავთ 8x330 Ohm Resistor Bus8x10K Ohm Resistor Bus11 LED- ები - სამი გამოიყენება სისტემის სტატუსისთვის და დანარჩენი რვა არის გამოსავალი. მე 8 -ისთვის გამოვიყენე ბარის გრაფიკის ჩვენება (HDSP -4836) 4 კონდენსატორი - ორი გამოიყენება LM7805; 0.22uF და 0.1uF. ერთი არის 555 ქრონომეტრისთვის, ასე რომ გამოიყენეთ ის, რაც თვლით რომ სწორია. ბოლო არის ჩართვის გადატვირთვისთვის; 100uF2 N. O. Push ღილაკები - ერთი გამოიყენება შესასვლელად, მეორე გამოიყენება reset8 SPST DIP კონცენტრატორები - მონაცემთა შეყვანა; მე გამოვიყენე Piano Key styleWire. ბევრი და ბევრი მავთული

n

შენიშვნა: MC14572 მეშვეობით ხვრელი ვერსია არის მოძველებული, მაგრამ SMD ვერსია ჯერ კიდევ აქტიურია (არც კი "ახალი დიზაინისთვის" სტატუსი), ასე რომ თქვენ შეიძლება დაგჭირდეთ მიკროსქემის ყიდვა მისი გამოყენების უფლების მისაცემად. მეორე 74LS32 შეიძლება გამოყენებულ იქნას MC14572- ის ნაცვლად (იხილეთ წინა მეხსიერების სქემა "მეხსიერების შერჩევა")

ნაბიჯი 1: ცვლილებების + სქემების სწრაფი მიმოხილვა

ცვლილებების + სქემების სწრაფი მიმოხილვა
ცვლილებების + სქემების სწრაფი მიმოხილვა

როგორ წავიკითხოთ სქემები: ჩიპზე მითითებული ისარი არის შეყვანა: შეყვანა>-ჩიპიდან მოხსნილი ისარი არის გამომავალი: გამომავალი <-ავტობუსები ისრის ნაცვლად იყენებენ ხაზს: ავტობუსი |-

n

ჩიპების უმეტესობა შედგენილია მათი ზუსტი პინებით. პატარა ჩავარდნა ამ ჩიპებზე. ჩიპების უმეტესობას ასევე აქვს პინის ნომრები და ეტიკეტები. მათი წაკითხვა შეიძლება საკმაოდ რთული იყოს. ჩემი ფანქარი დუნდებოდა.

n

წრიული კავშირების თვალსაზრისით, ახალი დიზაინის განლაგება ძირითადად უცვლელია ორიგინალისგან. მე დავამატე მისამართის მაღალი ბაიტი ქვედა მეხსიერებაში მეხსიერებებთან და შემდეგ გამოვიყენე ზედა ნაწილის დაბალი ბიტი (A12) RAM/ROM შერჩევისთვის. ეს იმას ნიშნავდა, რომ ROM სივრცე წავიდა 0000-00FF– დან 0000-0FFF– მდე. რამ ადგილი გადიოდა 0100-01FF– დან 1000-1FFF– მდე. მე ასევე შევცვალე მეხსიერების კონტროლის ლოგიკა უკეთესი დიზაინისთვის და დავამატე ორი ახალი სტატუსის LED (და წებოს ლოგიკა). მე ასევე დავხატე (მაგრამ არ მავთული) საათის გამყოფი წრე. ის უნდა შეასრულოს ორი ფუნქცია. აშკარა ფუნქციაა საათის სიხშირის დაყოფა. სხვა ფუნქცია არის PWM (პულსის სიგანის მოდულაცია) მიზნებისათვის, რადგან 555 არ წარმოქმნის ტალღებს 50% –იანი სამუშაო ციკლით. ამ წრეში ამას ნამდვილად არ აქვს მნიშვნელობა, მაგრამ თუ თქვენ გინდათ საათის გამოყენება LED- ების მართვისთვის, თქვენ აუცილებლად შეამჩნევთ ეფექტებს (ერთი (კომპლექტი) LED (ები) იქნება უფრო მუქი ვიდრე მეორე). სქემის მთელი დანარჩენი არსებითად უცვლელია.

ნაბიჯი 2: პროცესორი, მეხსიერება და მეხსიერების კონტროლი

პროცესორი, მეხსიერება და მეხსიერების კონტროლი
პროცესორი, მეხსიერება და მეხსიერების კონტროლი
პროცესორი, მეხსიერება და მეხსიერების კონტროლი
პროცესორი, მეხსიერება და მეხსიერების კონტროლი
პროცესორი, მეხსიერება და მეხსიერების კონტროლი
პროცესორი, მეხსიერება და მეხსიერების კონტროლი
პროცესორი, მეხსიერება და მეხსიერების კონტროლი
პროცესორი, მეხსიერება და მეხსიერების კონტროლი

ეს ის ნაწილია, სადაც ჩემი წინა ვერსიის მკითხველები მძულს. თავდაპირველ სტრუქტურაში, მე რაღაცნაირად დავაყარე ნაწილები დაფაზე იმ ადგილას, სადაც ჩანდა, რომ მათ მცირედი პრობლემა უნდა დაეყენებინათ გაყვანილობისთვის. შედეგი ჰგავდა, რომ ვიღაცამ სპაგეტის თეფში გადაყარა და "მავთულხლართებს" ჰგავდა. მე მინდოდა მისი გაწმენდა ცოტათი, ასე რომ დავიწყე ყველაფრის გაფუჭებით, გარდა CPU, RAM და ROM. მე გამოვიყვანე თითქმის მთელი შეყვანის წრე, გამომავალი წრე და წებოს ლოგიკა. ეს კინაღამ მტკიოდა, მაგრამ ეს აუცილებელი იყო. დავტოვე ყველა მონაცემთა კავშირი ხელუხლებელი და მისამართის ავტობუსის ქვედა ბაიტი. შემდეგ დავაკავშირე მისამართის ავტობუსის შემდეგი ოთხი ბიტი (A8-A11) ROM ჩიპთან. მე ვიზრუნე ამჯერად ჩიპის გარშემო წასვლაზე, რათა გამიადვილდეს ხელახალი დაგეგმვა. მე ასევე გადავაგდე მისამართის კავშირები RAM ჩიპზე.

n

ამის თავიდან აცილების მიზნით, მეხსიერების კონტროლის ლოგიკა უნდა გამეერთებინა. თავდაპირველ სქემატურ რეჟიმში, მე პროცესორის /MREQ ხაზი პირდაპირ /CE- ს დავუკავშირე მეხსიერების ორივე ჩიპს, შემდეგ შევაერთე /WR RAM– ის /WE– სთან. შემდეგ მე მქონდა CPU /RD და /MREQ ლოგიკურად OR'd ერთად, ასევე A9. არსებითად, ის ისე იყო დაყენებული, რომ მეხსიერების ყველა მოთხოვნა გააქტიურებული იყო როგორც RAM, ასევე ROM, მაგრამ A9 გამოიყენებოდა ჩიპების /OE- დან რომელი შეირჩა. ეს კარგად იყო და ყველაფერი იმიტომ, რომ ჩიპები დარჩებოდა უმოქმედო მეხსიერების მოთხოვნის გაკეთებამდე და შემდეგ მხოლოდ ერთი /OE იქნებოდა აქტიური წაკითხვის მოთხოვნის დროს. ამან ხელი შეუშალა ჯვრისწერას, მაგრამ შემოიღო უხერხული ნიუანსი. იმის გამო, რომ A9 გამოიყენებოდა მხოლოდ იმის დასადგენად, თუ რომელი ჩიპი აწარმოებდა მონაცემებს და რადგან CPU– ს ჰქონდა პირდაპირი წვდომა RAM– ის /WE პინზე, ნებისმიერი და ყველა მოთხოვნის მოთხოვნა გადიოდა. ეს ნორმალური იყო ROM– ისთვის, რადგან მისი ჩაწერის რეჟიმი შეფერხებულია პირდაპირ 5V წყაროსთან /WE– ს მიბმით. ოპერატიული მეხსიერება დაიწერება, მიუხედავად A9. ეს ნიშნავს, რომ ROM სივრცის ადგილმდებარეობის ჩაწერის მცდელობა ჩაწერს იმავე ადგილს RAM სივრცეში.

n

ამის ერთი გამოსავალი იქნება საკონტროლო ლოგიკის გადაკეთება ისე, რომ CPU- ს ჰქონდეს პირდაპირი წვდომა ჩიპების /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- ები
სისტემის სტატუსის LED- ები

სანამ ამ პროექტს დავიწყებდი, ვცდილობდი რაიმე IC– სთან დაკავშირება, მაგრამ მე მას პრობლემები შემექმნა. დარწმუნებული არ ვარ რა ხდებოდა, მე გამოვიყენე პანელის დამონტაჟების შუქდიოდი (ერთ – ერთი იმ ასამბლეისგან, რომელშიც ჩამონტაჟებულია რეზისტორი). ამის გაკეთებამ მომცა ნოსტალგიური იდეა, რომელიც დღესაც გამოიყენება: სტატუსის 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 დრაივერს. ეს შეიძლება უხერხულ ბრძანებად მოგეჩვენოთ, რომ ეს შეაერთოთ, მაგრამ ეს იყო მიზეზის გამო. გამომავალი ჩამკეტის შეყვანა უნდა იყოს დაკავშირებული მონაცემთა ავტობუსთან, ასევე შეყვანის ჩამკეტის გამოსასვლელთან. იდეა იყო შეყვანის ჩამკეტის გამოსასვლელების დაკავშირება გამომავალი ჩამკეტის შესასვლელებთან, რაც მე გავაკეთე. შემდეგ ყველაფერი რაც მე უნდა გამეკეთებინა იყო ის არეულობა, რომელიც დაკავშირებულია მონაცემთა ავტობუსთან. არ აქვს მნიშვნელობა სად წავიდა ეს კავშირები ფიზიკურად, რადგან ისინი ყველა ელექტრონულად იქნებოდა დაკავშირებული. კომპიუტერი ახლა თითქმის დასრულებულია.

ნაბიჯი 5: შეყვანისა და გამოყვანის გადატვირთვა და დასრულება

უკაცრავად, ამ ნაბიჯის სურათები არ არის. იხილეთ წინა ნაბიჯი სურათებისთვის.

n

თქვენ შეიძლება შენიშნეთ წინა ნაბიჯის ბოლო სურათზე, მე მქონდა მწვანე ღილაკი და სხვა ლოგიკური ჩიპი დაყენებული. ჩიპი არის OR კარიბჭე. ორი კარიბჭე გამოიყენება /WAIT სიგნალის შესაქმნელად. ისე, ერთი წარმოქმნის სიგნალს პროცესორიდან OR-ing /IORQ და /RD. გამომავალი გადადის მეორე კარიბჭეში, სადაც ის კვლავ იღებს OR’d ღილაკს. ღილაკს მოაქვს კარიბჭის შეყვანა მაღალი, რითაც გამომავალი მაღალი. ეს გამომავალი იკვებება პროცესორებით /WAIT pin- ით. მიუხედავად იმისა, რომ არ არის დაჭერილი, რეზისტორი ინარჩუნებს შეყვანის დონეს. მე თავდაპირველად ვიყენებდი 10K რეზისტორს, მაგრამ LS32 ფაქტობრივად ძაბვას გამოსცემდა შეყვანისას. რეზისტორი საკმარისად დაბლა არ დაეცა და მე უნდა შევცვალო 1K. ყოველ შემთხვევაში, იდეა იმაში მდგომარეობს, რომ როდესაც IO წაკითხვის მოთხოვნა ხდება, პირველი და მეორე OR კარიბჭე ეუბნება პროცესორს დაელოდოს. მას შემდეგ რაც შეყვანის გადამრთველებს დააყენებთ რაც გინდათ, დააჭირეთ ღილაკს და ის გამოაქვს პროცესორი ლოდინის მდგომარეობიდან. მწვანე "შეყვანის" LED, როგორც მე მას ადრეულ საფეხურზე ვუწოდებ, სადენიანია ისე, რომ როდესაც /WAIT pin დაბლა მიდის, ის ანათებს.

n

მაგრამ ჩვენ ჯერ არ დავასრულეთ. შეყვანის ფლიპ ფლოპს სჭირდება სიგნალი, რომ შეატყობინოს, როდესაც მონაცემების შეყვანა ძალაშია და უნდა გადაეცეს პროცესორს. ეს საათის პინი აქტიურია მაღალი. ადრე, ჩვენ უბრალოდ დავუკავშირდით ღილაკს. ეს ჯერ კიდევ მოქმედი ვარიანტია, მაგრამ ამჯერად მე ავირჩიე ის იმავე გამომავალზე, როგორც მეორე OR კარიბჭე. ამ IC- ს ასევე აქვს /OE pin, რომლის მართვაც საჭიროა. თუ ის მაღლა უნდა ეჭირა, ის არასოდეს ჩადებდა მონაცემებს ავტობუსში. თუ ის დაბლა დაიჭირეს, ის ყოველთვის ავტობუსს მართავდა. ამის გამოსასწორებლად, მე უბრალოდ გამოვიყენე მესამე OR კარიბჭე. შეყვანა არის /IORQ და /RD და გამომავალი პირდაპირ მიემართება საკეტის /OE.

n

გამომავალ ჩამკეტს ასევე სჭირდება საათის პინის მართვა. ისევ და ისევ, ის აქტიურია მაღალი. ჩემს სქემატურ რეჟიმში მე დავხატე მეოთხე OR კარიბჭე, რომელიც პირდაპირ მართავს პინს /IORQ და /WR გამოყენებით. ეს იმას ნიშნავდა, რომ საათის ბუდე მაღლა იწევდა სანამ წერილობითი მოთხოვნა არ გაკეთდებოდა, შემდეგ კი დაბლა და ისევ მაღლა იწევდა. ეს ალბათ კარგი იქნებოდა, რადგან მონაცემთა ავტობუსს მაინც ექნებოდა მასზე სწორი მონაცემები ჩაწერის მცდელობისთანავე, მაგრამ საინჟინრო თვალსაზრისით, ეს იყო ნაგვის დიზაინი. მე არ შევამჩნიე ეს შეცდომა მანამ, სანამ არ გადავიღე საბოლოო სურათები, მაგრამ მე გავანადგურე ეს კავშირი და შემდეგ ჩავრთე OR კარიბჭის გამოსავალი მეხსიერების კონტროლის ლოგიკის ერთ გამოუყენებელ ინვერტორში, შემდეგ კი მისი გამომავალი შევაერთე საათის პინს. რა მე ასევე გავასწორე სქემა და აღმოვაჩინე კიდევ ერთი შეცდომა. მეც გავასწორე.

n

ყოველივე ამის დასრულებისთანავე, ძალიან მცირე სამუშაო მქონდა გასაკეთებელი: გადატვირთვის სქემა. მე დავამატე ღილაკი დაფაზე და გამოვიყენე 10K რეზისტორი, რომ ერთი მხარე მაღლა მეჭირა. მეორე მხარე პირდაპირ მიწაზე მიდის. გვერდი მაღალია /RESET გამომავალი, რომელიც მიდიოდა ყველა ჩიპს /RESET პინით (პროცესორი და გამომავალი ჩამკეტი). ენერგიის გადატვირთვის მიზნით, მე დავამატე კონდენსატორი /RESET გამომავალს. იდეა ისაა, რომ დიდი მნიშვნელობის რეზისტორი გამოიწვევს შედარებით დიდ კონდენსატორს ნელ -ნელა დამუხტვას და /RESET ქინძისთავების დაბალ შენარჩუნებას საათის გარკვეული ციკლის განმავლობაში (პროცესორს სჭირდება ოთხი საათის ციკლი). თქვენ ალბათ უკვე მიხვდებით რა არის ამ წრის უარყოფითი მხარე. ეს იგივე უარყოფითია, როგორც წინა ვერსია, რადგან ეს იგივე წრეა. ღილაკზე დაჭერისას კონდენსატორი არსებითად იკლებს ღილაკზე. ეს ცუდია როგორც ქუდისთვის, ასევე ღილაკისთვის, ასე რომ, თუ გსურთ თქვენი მშენებლობა ცოტა უფრო მუდმივი გახადოთ, შეიძლება დაგჭირდეთ მისი ხელახალი დიზაინი. მე ვფიქრობდი სხვა 555 ქრონომეტრზე, რომელიც დაყენებული იყო მონოსტაბილურ რეჟიმში. მაგრამ ამით, კომპიუტერის წრე უკვე დასრულებულია. კაი ახლა მას სჭირდება პროგრამირება.

ნაბიჯი 6: პროგრამირება

ამ ნივთის დაპროგრამება კოშმარი იყო. მე ავაშენე Arduino EEPROM პროგრამისტი. არ მუშაობდა. სხვა ავაშენე სხვისი დიზაინისა და კოდირების საფუძველზე. მაინც არ მუშაობდა. მე დავუბრუნდი აპრობირებულ მეთოდს მისამართების და მონაცემების ბაიტების ხელით დაყენების მიზნით. რატომღაც, მე ეს გავაფუჭე. კიდევ ერთხელ ვცადე და მაინც არასწორად გავიგე. ისევ დავბრუნდი და აღმოვაჩინე, რომ ის იყო ერთი ბაიტი, ამიტომ შევასწორე და საბოლოოდ იმუშავა, მადლობა ღმერთს.

n

რაც შეეხება რეალურ პროგრამას, როგორც ჩანს, ეს არის ძალიან რთული და ძნელი შესასრულებელი, მაგრამ ეს ასე არ არის. ეს საკმაოდ მარტივია, სინამდვილეში. მისი ნახევარი არის ნომრების კოპირება გარშემო. მეორე ნახევარი 16 ბიტიანი მათემატიკის, პირობითი ნახტომის და კიდევ უფრო მეტი რიცხვის კოპირებას შორისაა. ნება მომეცით გავიარო და გითხრათ როგორ მუშაობს.

n

ინიციალიზაცია მხოლოდ ადგენს ზოგიერთი რეგისტრის მნიშვნელობას პროგრამისთვის გამოსაყენებლად. პროგრამის მარყუჟი ცოტა უფრო რთულია, მაგრამ არა მთლიანი. პირველი, იგი იღებს შეყვანას A რეგისტრში პორტში 00. შემდეგ E რეგისტრი იწერება მეხსიერებაში. პირველ ორ მარყუჟზე, E რეგისტრი შეიცავს უსარგებლო მონაცემებს, ამიტომ ჩვენ ვცდილობთ დავწეროთ იგი ROM სივრცის ბოლო ორ ბაიტზე, რადგან ის ფაქტობრივად არ დაიწერება; მისამართის მაჩვენებელი (IY) შემდეგ იზრდება. D- ში შენახული მნიშვნელობა გადადის E- ში, რათა შემდეგ დაიწეროს. შემდეგ A იტვირთება D- ში და L და E კოპირდება H. HL- ში, სადაც ღირებულებების შედარება ხდება გამოკლებისა და ZF (ნულოვანი დროშის) შემოწმების გზით. პირველი მნიშვნელობა შედარებული ინახება B და C. რეესტრებში B და C განიხილება როგორც ერთი 16 ბიტიანი რეგისტრი, ძვ. თუ ღირებულებები იგივეა, მაშინ პროგრამა გადადის პირდაპირ RAM სივრცეში, სადაც ვარაუდობენ, რომ მომხმარებლის კოდი ცხოვრობს. თუ ძვ.წ. კოდი არ ემთხვევა, მაშინ HL იტვირთება საწყისი მნიშვნელობებით D და E და კვლავ შეადარებს SP– ს მნიშვნელობას ისევე, როგორც ძვ. თუ ეს ემთხვევა, მას აქვს იგივე შედეგი, მაგრამ სამი დამატებითი ბაიტი იწერება მეხსიერებაში. ბაიტი არის კოდი, რომელიც იწვევს პროცესორის დაბრუნებას პროგრამის დასაწყისში (პროგრამული უზრუნველყოფის გადატვირთვა). თუკი მეორე შედარება არ იყო შესატყვისი, პროგრამა გადადის იქ, სადაც იღებს მომხმარებლის მნიშვნელობას.

n

LD SP, EDBFH; exe კოდი (ამატებს ნახტომს)

n

LD IY, FFEH; მეხსიერების საწყისი მაჩვენებელი კოდის შესანახად

n

LD BC, EDC3H; exe კოდი (მარყუჟის გარეშე)

n

მარყუჟი; ასამბლეის დირექტივა, ასე რომ ჩვენ არ უნდა ვიცოდეთ სად არის მეხსიერებაში ეს ნაწილი

n

A, (00H); მიიღეთ პროგრამის მონაცემები

n

LD (IY+00H), E; E შეიცავს შესანახ კოდს

n

INC IY; მეხსიერების შემდეგ ადგილას გადასვლა

n

LD E, D; ld D შევიდა E

n

LD D, A; ld შევიდა D

n

LD H, E; ld E შევიდა H

n

LD L, D; ld D შევიდა L

n

ან A; გადატვირთეთ ტარების დროშა

n

SBC HL, BC; აბრუნებს 0 თუ exe კოდი 2 იყო შეყვანილი

n

JP Z, 1000H; თუ ასეა, გადადით და შეასრულეთ პროგრამა

n

LD H, E; წინააღმდეგ შემთხვევაში, განაახლეთ ისინი შესაბამისი მნიშვნელობებით

n

LD L, D

n

ან A; პირველ გამოკლებას შეიძლება ჰქონდეს მითითებული ტარების დროშა. გაასუფთავე

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; გადადით და შეასრულეთ მომხმარებლის პროგრამა

გირჩევთ: