мрак, подумал проверить PPI, сочинил sketch для ардуины:
Код:
/*
test i8255
arduino pin -> i8255 pin
14->~RD 5
15->~CS 6
16->ADDR[1] 8
17->ADDR[0] 9
18->~WR 36
19->RESET 35
2->D0 34
3->D1 33
4->D2 32
5->D3 31
6->D4 30
7->D5 29
8->D6 28
9->D7 27
*/
// name = arduino PIN
const int DATA[8] = {2, 3, 4, 5, 6, 7, 8, 9}; // ARDUINO PINS
const int RD_L = 14; // ~RD
const int CS_L = 15; // ~CS
const int ADDR[2] = {17, 16}; // A0..A1
const int WR_L = 18; // ~WR
const int RESET = 19; // RESET
const int delay_val = 5000;
// *** setup ***
void setup() {
Serial.begin(115200);
noInterrupts();
pinMode(LED_BUILTIN, OUTPUT);
for(int n = 0; n < 8; n++) {
pinMode(DATA[n], OUTPUT); //set D0..D7 as out pins
digitalWrite(DATA[n], HIGH); //set default D0..D7 = 1
}
for(int k = 0; k < 2; k++) {
pinMode(ADDR[k], OUTPUT); //set A0..A1 as out pins
digitalWrite(ADDR[k], HIGH); //set default A0..A1 = 1
}
//set defaults for control pins
pinMode(RD_L, OUTPUT); digitalWrite(RD_L, HIGH);
pinMode(CS_L,OUTPUT); digitalWrite(CS_L, HIGH);
pinMode(WR_L, OUTPUT); digitalWrite(WR_L, HIGH);
pinMode(RESET, OUTPUT); digitalWrite(RESET, LOW);
interrupts();
Serial.println("resetting i8255");
noInterrupts();
digitalWrite(RESET, HIGH);
digitalWrite(RESET, LOW);
delay(delay_val);
interrupts();
Serial.println("setting i8255 to out in mode0 and write clk to PA0..PA7");
noInterrupts();
writeValue(0x3, 0x80);
} //**** setup ****
//**** loop ****
void loop() {
for (unsigned int clk = 0; clk < 256; clk++) {
digitalWrite(LED_BUILTIN,HIGH);
interrupts();
Serial.print("writting:");
Serial.println(clk);
Serial.flush();
noInterrupts();
writeValue(0x0, clk);
digitalWrite(LED_BUILTIN,LOW);
}
interrupts();
Serial.print("completed.");
Serial.flush();
noInterrupts();
}; //**** loop ****
void writeValue(unsigned int address, unsigned int value) {
// set address
for (unsigned int i = 0; i < 2; i++) digitalWrite(ADDR[i],((address >> i) & 1) ? HIGH : LOW);
// set data
for (unsigned int i = 0; i < 8; i++) digitalWrite(DATA[i],((value >> i) & 1) ? HIGH : LOW);
digitalWrite(CS_L, LOW);
digitalWrite(WR_L, LOW);
digitalWrite(WR_L, HIGH);
digitalWrite(CS_L, HIGH);
} // writeValue
все пашет нормально PPI (правда частота тут раза в 4 ниже...)
но блин!!! шо ж оно такое то? какой уровень на ноге RESET должен быть в рабочем состоянии PPI?