산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

브레드보드 컴퓨터 프로그래머

구성품 및 소모품

Arduino UNO
× 1

이 프로젝트 정보

이 프로젝트는 무엇입니까?

이것은 Ben Eater의 8비트 브레드보드 컴퓨터 프로젝트의 확장입니다. 나는 브레드보드 컴퓨터를 만드는 방법과 나만의 버전을 만드는 방법에 대한 Ben의 비디오를 따라가는 것을 매우 즐겼습니다. Ben을 따라가지 않았다면 읽기 전에 그의 비디오를 시청하는 것이 좋습니다. 이 프로젝트는 컨텍스트 없이는 거의 의미가 없습니다.

컴퓨터를 만든 후에는 켤 때마다 DIP 스위치를 통해 프로그램을 수동으로 토글해야 하면 전혀 사용하지 않을 것이라는 사실이 빠르게 분명해졌습니다. 16바이트를 계속해서 토글하는 것조차 매우 빨리 낡아집니다. 또한 메모리를 256바이트로 확장할 계획이었는데 프로그램을 로드하고 저장할 수 있는 경우에만 유용할 것입니다.

이걸로 무엇을 할 수 있나요?

<울>
  • 브레드보드 컴퓨터 RAM에서 프로그램 저장
  • <울>
  • 브레드보드 컴퓨터 RAM에 프로그램 로드
  • <울>
  • 브레드보드 컴퓨터가 시작될 때 저장된 프로그램 자동 실행
  • <울>
  • 직렬 연결을 통해 메모리 내용 검사 및 수정
  • <울>
  • 어셈블리 언어로 브레드보드 컴퓨터 프로그래밍
  • <울>
  • 메모리 콘텐츠 분해
  • <울>
  • 지시를 통한 1단계 지침
  • <울>
  • 중단점 설정 및 중단점까지 실행
  • 다음은 이러한 기능을 보여주는 비디오입니다. 동영상 품질을 양해해 주십시오. 저는 전문적인 동영상 콘텐츠 제작자가 아닙니다.

    어떻게 작동합니까?

    이 프로젝트를 만드는 동안 염두에 두었던 몇 가지 목표:

    <울>
  • 제작에 필요한 최소한의 하드웨어
  • <울>
  • 브레드보드 컴퓨터 자체에 대한 최소한의 변경
  • 처음에는 EEPROM을 사용하여 프로그램을 저장한 다음 EEPROM에서 브레드보드 컴퓨터의 RAM으로 프로그램을 전송하는 일종의 논리에 대해 설명했습니다. 그러나 전송 논리를 생각해 내는 것은 내가 처리할 수 있는 것보다 더 복잡한 것으로 판명되었습니다(하드웨어 가까이에서 작업하는 것을 정말 좋아하지만 소프트웨어 전문가에 가깝습니다). 저는 Arduino의 열렬한 팬이어서 어느 시점에서 전송 로직을 Arduino로 교체할 생각을 하기 시작했습니다. Arduino를 사용하는 것이 부정 행위가 아니라는 것을 확신하는 데 시간이 좀 걸렸지만(결국 Arduino UNO도 브레드보드 컴퓨터 자체보다 훨씬 강력함) 결과에 만족하므로 안심했습니다.

    그렇다면 Arduino가 할 수 있는 것은 무엇입니까? 음, 메모리에서 데이터를 읽고 메모리에 데이터를 쓸 수 있어야 합니다. 이를 수행하는 가장 쉽고 덜 방해가 되는(브레드보드 컴퓨터에 대한) 방법은 메모리 모듈에 이미 있는 것과 동일한 인터페이스인 버스 및 제어 신호를 사용하는 것입니다. Arduino 디지털 I/O 핀은 양방향이므로 8개를 버스에 직접 연결하면 Arduino가 버스에서 읽고 쓸 수 있습니다. RAM 모듈을 버스에서 읽거나 버스에 쓰도록 하려면 MI/RI/RO 신호를 적절하게 설정하기만 하면 됩니다. 이제 이러한 신호는 일반적으로 제어 로직의 EEPROM에 의해 구동되므로 Arduino가 이를 제어하면 충돌 및 가능한 단락 상황이 발생할 수 있습니다. 그러나 Ben이 사용하는 AT28C16 EEPROMS에는 모든 데이터 출력을 high-z 상태로 전환하는 칩 활성화(CE) 입력이 있어 Arduino가 신호를 조작할 수 있습니다. RAM을 읽으려면 Arduino가 다음을 수행해야 합니다.

    <울>
  • EEPROM의 CE 신호를 높게 설정(즉, 제어 로직 비활성화)
  • <울>
  • 버스에서 읽을 첫 번째 주소 출력
  • <울>
  • MI 신호를 높게 설정하고 클록 로우-하이 전환을 기다립니다.
  • <울>
  • MI를 낮고 RO를 높게 설정하고 클록이 낮음-높음 전환을 기다립니다.
  • <울>
  • 버스에서 데이터 바이트 읽기
  • <울>
  • 16개 주소 모두에 대해 2단계부터 반복
  • <울>
  • EEPROM의 CE 신호를 낮게 설정(즉, 제어 로직을 다시 활성화)
  • 그리고 그게 다야. RAM 내용을 쓰는 것은 매우 유사합니다. Arduino는 버스에 쓰고 RO 대신 RI를 높게 설정하기만 하면 됩니다. 물론 해결해야 할 기술적인 문제도 있지만 위의 기본 메커니즘이 이 프로젝트의 핵심입니다.

    브레드보드 컴퓨터를 어떻게 변경해야 하나요?

    두 가지 변경이 필요합니다.

    <울>
  • 제어 로직 EEPROM의 데이터 출력에 풀다운 저항을 넣습니다.
  • <울>
  • EEPROM이 비활성화된 동안 링 카운터 비활성화(또는 지속적으로 재설정)
  • 풀다운 저항기

    풀다운 저항은 EEPROM이 비활성화되면 제어 신호(예:AO/AI/EO...)가 연결된 논리 게이트의 풀업 저항이 해당 신호를 하이로 끌어오기 때문에 필요합니다. 즉, 여러 레지스터가 버스에 기록되어 충돌이 발생합니다.

    74LS 게이트 입력의 풀업 저항은 약 10k입니다. 따라서 풀다운 저항은 전압을 낮은 영역으로 낮추기에 충분히 작아야 합니다. 대부분의 신호 라인에 대해 3.3kOhm 저항을 사용했습니다. 그러나 두 가지 예외가 있습니다. 첫째, "SU" 신호가 8개의 배타적 OR 게이트에 연결되어 유효 풀업 저항이 10kOhm/8 =1.25kOhm임을 의미합니다. 풀다운 저항은 이 값을 낮추기 위해 1k보다 훨씬 작아야 합니다. 운 좋게도 SU(빼기) 신호는 버스와의 상호 작용을 제어하지 않으므로 무시하고 풀다운 저항을 사용할 수 없습니다. 둘째, CE(카운터 활성화)에는 1k 풀다운 저항이 필요했습니다. 값이 클수록 어떤 경우에는 임의의 프로그램 카운터 동작이 발생했습니다.

    모든 파란색 LED를 유지하는 브레드보드에 풀다운 저항을 추가하는 것이 가장 쉽다는 것을 알았습니다. 즉, LED 양극(EEPROM 출력에 연결됨)과 GND 사이에 있습니다.

    [여기에 HLT/MI/RI 신호용 저항을 맞출 수 없어서 브레드보드의 다른 위치에 추가했습니다.]

    벨소리 카운터 재설정

    다른 수정은 링 카운터를 재설정하는 것입니다. 기술적으로 이것은 프로그램의 저장/로드를 허용하는 데 실제로 필요한 것은 아니지만 Arduino에서 제어 로직으로 다시 원활하게 제어를 전송할 수 있습니다. 요점은 CE가 하이(즉, 제어 로직이 비활성화된 경우) 동안 링 카운터를 0으로 유지하는 것입니다. Arduino가 CE를 다시 로우로 전환하면(제어 로직 활성화) 링 카운터는 0이 되고 브레드보드 컴퓨터는 다음 명령을 실행하기 시작합니다.

    내 빌드에서는 하나의 EEPROM 출력을 사용하여 링 카운터를 재설정하기 때문에 이 작업을 위해 아무 것도 할 필요가 없었습니다. 이렇게 하면 명령이 완료되는 즉시 링 카운터를 재설정하여 성능이 향상됩니다. 또한 제어 로직 EEPROM이 비활성화되면 자동으로 링 카운터 재설정을 제공합니다. EEPROM 출력의 풀다운 저항은 신호를 낮추어 링 카운터를 재설정합니다.

    Ben의 고정 5단계 링 카운터 구현을 사용하는 경우 CE가 높을 때 그의 재설정 회로에 대한 다음 확장이 카운터를 재설정해야 한다고 생각합니다(아래 왼쪽/오른쪽 화살표를 클릭하여 Ben의 원래 회로와 확장 버전):

    보시다시피 3개의 NAND 게이트, 즉 1개의 74LS00 칩이 더 필요합니다. 이 접근 방식을 테스트하지는 않았지만 내가 볼 수 있는 한 작동해야 합니다.

    이 수정은 절대적으로 필요한 것은 아닙니다. 처음에는 그대로 둘 수 있습니다. 로드 및 저장은 물론 모니터/어셈블러/디스어셈블러도 정상적으로 작동합니다. 그러나 Arduino에서 제어 로직으로 제어를 전송해야 하는 작업은 작동하지 않습니다. 가장 주목할 만한 것은 시작 시 저장된 프로그램을 자동 실행하고 디버거에서 한 단계씩 실행하는 것입니다.

    Arduino를 어떻게 설정합니까?

    GIT 아카이브에서 Arduino로 스케치를 업로드하고 다음과 같이 Arduino를 브레드보드 컴퓨터에 연결합니다.

    <울>
  • Arduino 5V 핀(아님 Vin!)을 브레드보드의 5V 레일에 연결
  • <울>
  • Arduino GND 핀을 브레드보드의 GND 핀으로
  • <울>
  • 버스 0-7에 대한 Arduino 디지털 핀 2-9
  • <울>
  • RO를 제어하는 ​​로직 EEPROM 출력을 제어하는 ​​Arduino 디지털 핀 10
  • <울>
  • RI를 제어하는 ​​로직 EEPROM 출력을 제어하는 ​​Arduino 디지털 핀 11
  • <울>
  • MI를 제어하는 ​​로직 EEPROM 출력을 제어하는 ​​Arduino 디지털 핀 12
  • <울>
  • Arduino 아날로그 핀 0-CLOCK 신호
  • <울>
  • 모두의 CE(핀 18)에 대한 Arduino 아날로그 핀 3 제어 로직 EEPROM 10k 저항을 통해 +5v
  • 그 외에도 회로도에 표시된 대로 Arduino의 아날로그 1 및 아날로그 2 입력 핀을 DIP 스위치와 푸시 버튼에 연결해야 합니다(자세한 내용은 첨부된 Fritzing 파일 참조).

    절대 최소(그러나 여전히 작동하는) 버전의 경우 다음을 수행할 수 있습니다.

    <울>
  • AO, CO, EO, IO, RO를 제어하는 ​​EEPROM 출력 핀에 3.3kOhm 풀다운 저항 추가
  • <울>
  • 위의 '벨소리 카운터 재설정' 지침 건너뛰기
  • <울>
  • 위에 표시된 대로 Arduino를 브레드보드 컴퓨터 배선으로 수행합니다(원하는 경우 마지막 단계에서 10k 저항을 생략할 수 있음)
  • <울>
  • 아날로그 핀 1과 아날로그 핀 2를 모두 GND에 연결
  • 로드/저장 버튼을 사용하려면 회로도에 따라 버튼, DIP 스위치 및 관련 저항을 아날로그 핀 1 및 2에 연결하기만 하면 됩니다.

    자동 시작 기능을 사용하려면 Arduino는 프로그램 카운터를 리셋하는 동안과 프로그램이 전송되는 동안 0으로 유지하고 링 카운터를 0으로 유지해야 합니다. 아날로그 핀 3과 +5V 사이의 풀업 저항은 Arduino가 재설정되는 동안 제어 로직을 비활성화(따라서 프로그램 카운터는 0) 상태로 유지합니다. 링 카운터의 경우 위의 "링 카운터 재설정" 지침을 따르세요.

    프로그램을 로드하고 저장하려면 어떻게 합니까?

    위의 최소 설정을 통해 직렬 인터페이스를 통해 Arduino를 제어할 수 있습니다. Arduino와 통신하려면 Putty 또는 TeraTerm과 같은 터미널 프로그램이 필요합니다. Arduino 소프트웨어의 직렬 모니터도 작동하지만 직렬 모니터의 입력 영역과 출력 영역이 분리되어 있기 때문에 이 시나리오에서는 약간 어수선합니다.

    <울>
  • 브레드보드 컴퓨터 켜기
  • <울>
  • USB 케이블을 통해 PC를 Arduino에 연결
  • <울>
  • 터미널 프로그램을 시작하고 9600 보드, 8비트, 패리티 없음, 1 정지 비트로 구성
  • <울>
  • 터미널 창에서 ESC를 눌러 모니터 모드로 들어갑니다.
  • <울>
  • "."가 표시되어야 합니다. 명령 프롬프트로
  • <울>
  • 지원되는 명령 목록을 보려면 "h"를 입력하고 Enter 키를 누르세요.
  • 최소한의 설정으로 "m", "M", "C", "l" 및 "s" 명령을 사용할 수 있어야 합니다. 이를 통해 메모리 내용을 보고, 메모리 내용을 수정하고, 프로그램을 로드 및 저장할 수 있습니다.

    버튼을 통해 프로그램을 저장하거나 로드하려면:

    <울>
  • 브레드보드 컴퓨터의 시계 끄기
  • <울>
  • DIP 스위치를 설정하여 데이터를 저장할 파일 번호를 선택합니다.
  • <울>
  • '저장' 또는 '로드' 버튼을 누릅니다. CE에 연결된 LED가 켜져 Arduino가 제어되었음을 나타냅니다.
  • <울>
  • 브레드보드 컴퓨터의 시계를 켭니다. Arduino가 주소를 순환하는 것을 볼 수 있습니다(메모리 주소 레지스터의 LED를 보십시오).
  • <울>
  • 버스 LED가 깜박임을 멈추고 메모리 주소 레지스터의 LED가 1111을 표시할 때까지 기다립니다.
  • <울>
  • 브레드보드 컴퓨터의 시계를 끕니다. CE에 연결된 LED가 꺼지면 제어가 제어 논리로 반환되었음을 나타냅니다.
  • 시작할 때 프로그램을 자동으로 실행하려면(필요한 모든 회로가 제자리에 있는지 확인하십시오) DIP 스위치를 프로그램이 저장된 파일 번호로 설정하고 브레드보드 컴퓨터를 켜십시오(또는 재설정 버튼을 누르십시오). 두 가지 특별한 경우가 있습니다. 모든 DIP 스위치가 꺼져 있으면 컴퓨터가 자동 시작 없이 정기적으로 시작됩니다. 모든 DIP 스위치가 켜져 있으면 Arduino는 시작 시 바로 모니터 모드로 들어갑니다.

    어셈블러와 디스어셈블러는 어떻게 사용하나요?

    어셈블러/디스어셈블러 및 디버거 기능을 사용하려면 먼저 Arduino의 프로그램을 특정 설정에 맞게 변경해야 합니다. 소스 코드에서 opcodes_4bit 구조를 정의하는 섹션을 찾습니다.

    구조 opcodes_struct opcodes_4bit [] ={ {"NOP ", B00000000, 0, false}, {"LDA ", B00010000, 2, true}, ... {".OR ", B11111110, 0, true}, // 시작 주소 설정 {".BY ", B11111111, 0, true}, // 데이터의 1바이트 정의 {NULL, 0, 0, false} }; 

    각 줄은 하나의 opcode를 지정합니다.

    <울>
  • 첫 번째 필드는 니모닉("LDA")입니다. 즉각적인 주소 지정을 위해 니모닉에 "#"을 포함합니다. 따라서 Ben이 "LDI"라고 부르는 것을 여기서 "LDA #"라고 합니다. 제가 C64에서 6510 어셈블러를 프로그래밍하면서 자랐다고 말할 수 있습니까?
  • <울>
  • 두 번째 필드는 opcode 자체입니다. 하위 4비트는 항상 0이어야 합니다(특수 opcode .OR 및 .BY 제외, 아래 참조)
  • <울>
  • 세 번째 필드는 opcode가 실행하는 데 걸리는 주기 수입니다(이것은 가져오기 주기에 추가됨). 예를 들어, 내 구현에서 LDA에는 opcode 0001이 있고 실행하는 데 총 4개의 주기가 필요하며 그 중 2개는 가져오기 주기입니다. Ben의 지시를 따랐다면(모든 opcode가 5주기를 사용하는 경우) 이것은 항상 3이어야 합니다.
  • <울>
  • 마지막 필드는 이 opcode에 인수가 필요한지 여부를 지정합니다. 예를 들어 LDA에는 인수가 필요하지만 OUT에는 인수가 필요하지 않습니다.
  • 브레드보드 컴퓨터에 구현한 opcode를 반영하도록 이 목록을 조정해야 합니다. 마지막 두 줄은 어셈블러에서 사용하는 특수 opcode이며 그대로 두어야 합니다.

    모든 opcode를 입력한 후 소프트웨어를 Arduino에 업로드하십시오. 터미널을 연결하고 모니터 모드로 들어갑니다(터미널 창에서 ESC를 누르거나 모든 DIP 스위치를 켜짐으로 설정). 이제 프로그램을 디스어셈블할 수 있어야 합니다. 모니터에 "d"만 입력하면 주소 0에서 분해가 시작됩니다.

    어셈블러는 최소한이지만 꽤 잘 작동합니다. 주소 0에서 조립을 시작하려면 "a"를 입력하십시오. 규칙은 다음과 같습니다.

    <울>
  • 라인이 공백으로 시작하지 않으면 레이블 정의로 시작해야 합니다. 라벨은 영문자로 시작하고 그 뒤에 영숫자가 와야 하며 최대 3자까지 가능하며 대소문자를 구분합니다.
  • <울>
  • 라인의 첫 번째 공백 다음에 어셈블러는 니모닉(LDA, STA, OUT...)을 예상합니다.
  • <울>
  • 특수 니모닉 ".BY"는 현재 위치에 저장할 데이터 바이트를 직접 지정합니다.
  • <울>
  • 특수 니모닉 ".OR"은 어셈블러에게 새 주소에서 계속 어셈블하도록 지시합니다.
  • <울>
  • 인수가 알파벳 문자로 시작하면 레이블로 간주됩니다.
  • <울>
  • 모든 숫자 인수는 십진수여야 합니다. 16진수를 지정하려면 인수 앞에 "$"를 붙입니다. 예를 들어, 16진수 FF 숫자를 A 레지스터에 로드하려면 "LDA #$FF"를 사용합니다.
  • <울>
  • ";" 뒤에 오는 모든 것 주석으로 간주되어 무시됩니다.
  • 예를 들어, 피보나치 코드는 다음과 같이 입력할 수 있습니다.

    첫 번째 LDA #0; x =0 STA x LDA #1; y =1 STA y lp ADD x; z =y + x STA z JC 먼저; 오버플로가 발생하면 다시 시작 OUT; 인쇄 z LDA y; x =y STA x LDA z; y =z STA y JMP lp; 루프 x .BY 0 y .BY 0 z .BY 0  

    제한 사항은 무엇입니까?

    Arduino의 RAM 공간을 절약하기 위해 어셈블러는 1패스 어셈블러로 작동합니다(그렇지 않으면 Arduino가 모든 소스 코드를 버퍼링해야 함). 어셈블러는 입력되는 대로 브레드보드 컴퓨터의 메모리에 opcode를 씁니다. 이것은 브레드보드 컴퓨터의 클럭 속도로 조립이 느려진다는 것을 의미합니다. 터미널 창에 텍스트를 복사하여 붙여넣으면 Arduino가 9600 보드로 들어오는 문자를 따라갈 수 없기 때문에 문자가 손실될 수 있습니다(브레드보드 컴퓨터의 시계를 기다리는 데 너무 많은 시간을 소비하기 때문). 이 문제를 해결하려면 전송 속도를 줄이거 나 전송된 문자 사이의 지연을 지정하는 설정을 제공하는 TeraTerm을 사용하십시오. 다른 해결 방법은 브레드보드 컴퓨터의 클럭 속도를 높이는 것입니다. 내 시계는 160kHz까지 올라가고 그 속도에서는 문제 없이 9600보드로 코드를 복사하여 붙여넣을 수 있습니다.

    기본 구성에서 Arduino 스케치는 최대 약 1-2kHz(약간 더 많을 수 있음)의 브레드보드 컴퓨터에서 클록 주파수를 처리할 수 있습니다. 기본 구성에서 Ben의 시계는 500Hz보다 빠르지 않습니다. 시계가 더 빠른 경우 #ifdef FAST_IO를 찾으세요. 코드에서 전환하십시오. FAST_IO를 켜면 Arduino가 최대 250kHz의 클럭 속도로 작동해야 합니다. 160kHz까지 테스트했습니다. 시간이 중요한 루프를 어셈블러에서 직접 구현하여 더 높은 속도를 지원하는 것이 가능할 수도 있지만 솔직히 160kHz 클럭 속도는 이미 제한된 기능을 가진 브레드보드 컴퓨터에서 너무 빠르게 느껴집니다. FAST_IO를 켜기 전에 코드에서 해당 주석을 읽으십시오.

    Arduino에는 1k의 EEPROM이 있으므로 1024/16=64개의 다른 프로그램을 저장할 수 있습니다. 실제로는 16바이트가 구성 데이터를 저장하기 위해 예약되어 있기 때문에 63입니다. 많지는 않지만 아마도 당신이 생각해낼 수 있는 모든 프로그램을 담기에 충분할 것입니다. 그 중 프로그램 번호 0-15만 딥 스위치(자동 시작의 경우 1-14)를 통해 선택할 수 있지만 "s" 및 "l" 명령은 전체 0-62 범위에서 작동합니다.

    조금 지저분해 보입니다. 정리할 수 있나요?

    네! 여기의 최종 버전에서는 실제로 Arduino UNO 대신 베어 Atmega 328P 칩(16MHz 크리스탈 및 커패시터와 함께)을 사용했습니다. Arduino가 어쨌든 전원 공급 장치의 5V를 직접 사용하기 때문에 UNO의 전압 조정기는 여기에서 필요하지 않습니다. 유일한 손실은 이제 Atmega와 통신하기 위해 별도의 USB-직렬 변환기(FTDI 또는 이와 유사한 것)를 사용해야 한다는 것입니다. 전체적인 모양은 나머지 브레드보드 컴퓨터와 훨씬 잘 어울립니다.

    또 다른 최적화는 Arduino/Atmega에서 부트로더를 제거하는 것입니다. Arduino 부트 로더가 시작되는 동안 2초 지연이 제거됩니다. 사람들이 관심을 가질 경우 수행하는 방법에 대한 지침을 게시할 것입니다. 댓글로 알려주세요!

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    브레드보드 컴퓨터 프로그래머
    브레드보드 컴퓨터 프로그래머를 위한 Arduino 스케치https://github.com/dhansel/programmer

    회로도

    drive_pD8k28E85v.fzz

    제조공정

    1. 컴퓨터 마우스
    2. 실제 센서로 효과 제어
    3. Arduino 스파이봇
    4. FlickMote
    5. 수제 TV B-Gone
    6. 마스터 시계
    7. 나를 찾기
    8. Arduino Power
    9. Tech-TicTacToe
    10. Arduino Quadruped