I'm trying to set MOS 6522 to "Shift Out controlled by T2 timer" as per the spec.
My goal is to send a parallel pattern of 0s and 1s to the Shift Register, and receive those 0s and 1s in series on CB2 pin; the pattern should be output at T2 rate, continuously, without further engagement from Arduino.
Instead, on running the code I'm getting just one pulse on CB2 and nothing else. What am I doing wrong?
Here's my setup:
Here's my code:
// Define Arduino pin constants to correspond with MOS6522 pins
const byte CS1 = 24; // Chip Select 1
const byte CS2 = 23; // Chip Select 2
const byte RS0 = 38; // Register Select 0
const byte RS1 = 37; // Register Select 1
const byte RS2 = 36; // Register Select 2
const byte RS3 = 35; // Register Select 3
const byte RW = 22; // Read-Write Line
const byte D0 = 33; // Data Bus 0
const byte D1 = 32; // Data Bus 1
const byte D2 = 31; // Data Bus 2
const byte D3 = 30; // Data Bus 3
const byte D4 = 29; // Data Bus 4
const byte D5 = 28; // Data Bus 5
const byte D6 = 27; // Data Bus 6
const byte D7 = 26; // Data Bus 7
const byte CLOCKOUT = 11; // Mega 2560 clock goes to
void setup() {
// set all digital ports to output mode
int inMin = 11; // Lowest input pin
int inMax = 38; // Highest input pin
for(int i = inMin; i <= inMax; i++)
{
pinMode(i, OUTPUT);
}
// set up 1 MHz timer on CLOCKOUT (OC1A)
pinMode (CLOCKOUT, OUTPUT);
// set up Timer 1
TCCR1A = bit (COM1A0); // toggle OC1A on Compare Match
TCCR1B = bit (WGM12) | bit (CS10); // CTC, no prescaling
OCR1A = 7; // output every eight cycle
// per 6522 datasheet:
// "selected MCS6522 register will be accessed when CS1 is high and CS2 is low"
digitalWrite(CS1, HIGH);
digitalWrite(CS2, LOW);
// RW needs to be low too
digitalWrite(RW, LOW);
// first set Register Select to select ACR (1011):
delay(1);
digitalWrite(RS3, HIGH);
digitalWrite(RS2, LOW);
digitalWrite(RS1, HIGH);
digitalWrite(RS0, HIGH);
// then set the ACR to enable Shift Out
// Start by zeroing the 3 relevant ACR bits (000):
delay(1);
digitalWrite(D4, LOW);
digitalWrite(D3, LOW);
digitalWrite(D2, LOW);
// then set to Shift Out, shift rate controlled by T2 (101):
delay(1);
digitalWrite(D4, HIGH);
digitalWrite(D3, LOW);
digitalWrite(D2, HIGH);
// now set Register Select to select T2C-L timer (1000):
delay(1);
digitalWrite(RS3, HIGH);
digitalWrite(RS2, LOW);
digitalWrite(RS1, LOW);
digitalWrite(RS0, LOW);
// set T2C-L timer to a value, say A0 (10100000)
delay(1);
digitalWrite(D7, HIGH);
digitalWrite(D6, LOW);
digitalWrite(D5, HIGH);
digitalWrite(D4, LOW);
digitalWrite(D3, LOW);
digitalWrite(D2, LOW);
digitalWrite(D1, LOW);
digitalWrite(D0, LOW);
// now set Register Select to select Shift Register (1010):
delay(1);
digitalWrite(RS3, HIGH);
digitalWrite(RS2, LOW);
digitalWrite(RS1, HIGH);
digitalWrite(RS0, LOW);
// send a pattern to Shift Register (e.g. 00011000)
delay(1);
digitalWrite(D7, LOW);
digitalWrite(D6, LOW);
digitalWrite(D5, LOW);
digitalWrite(D4, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D2, LOW);
digitalWrite(D1, LOW);
digitalWrite(D0, LOW);
}
void loop() {
}