Second prototype using the 82C54
The second prototype uses a 74HC595 shift register to adress the datalines of the 82C54. It is now possible to send different divider values to the 82C54 and thus creating different pulse waveform frequencies.
The code:
//Pin connected to ST_CP of 74HC595 int latchPin = 8; //Pin connected to SH_CP of 74HC595 int clockPin = 12; ////Pin connected to DS of 74HC595 int dataPin = 11; int statusled = 13; int incomingByte = 0; // for incoming serial data void setup() { //set pins to output so you can control the shift register pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(statusled, OUTPUT); digitalWrite(statusled,HIGH); // init 8254 control ports 2,3,4 pinMode(2, OUTPUT); // WR digitalWrite(2, HIGH); // disabled pinMode(3, OUTPUT); // A0 pinMode(4, OUTPUT); // A1 digitalWrite(3, LOW); digitalWrite(4, LOW); Serial.begin(9600); //settozero(); } void loop() { if(Serial.available() > 0) { incomingByte = Serial.read(); if (incomingByte == 49) { // 1 firstrun(); } } } void firstrun() { // control word sequence Serial.println("A0A1 -> 1"); digitalWrite(3, HIGH); digitalWrite(4, HIGH); Serial.println("2 low"); digitalWrite(2, LOW); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, B01101100); digitalWrite(latchPin, HIGH); Serial.println("595 loaded"); Serial.println("2 high"); digitalWrite(2, HIGH); // end control word sequence // start data transfer, LSB MSB // 18181 for 400hz data_transfer( 5, 71); } void data_transfer(int LSB, int MSB) { Serial.println("A0A1 -> 0"); digitalWrite(3, LOW); digitalWrite(4, LOW); Serial.println("2 low"); digitalWrite(2, LOW); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, LSB); digitalWrite(latchPin, HIGH); Serial.println("595 LSB"); Serial.println("2 high"); digitalWrite(2, HIGH); Serial.println("2 low"); digitalWrite(2, LOW); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, MSB); digitalWrite(latchPin, HIGH); Serial.println("595 MSB"); Serial.println("2 high"); digitalWrite(2, HIGH); }