Interfaz Arduino e Intel 8255A-5

Estoy tratando de conectar un Arduino Mega a un Intel 8255 y parece que no funciona, aquí está mi configuración:

foto de protoboard

esquemático

Estoy usando como LS245 IC para conectar 4 LED. Los pines CS, RESET están conectados a GND. Estoy tratando de usar el Puerto B para enviar datos para ENCENDER/APAGAR LED individuales. Mi código simplemente establece el registro de control en el modo de E/S, y el puerto B se establece como SALIDA. ¿Algún consejo sobre lo que puede estar mal?

Mi código:

#define CS 22
#define RD 23
#define WR 24
#define A_1 27
#define A_0 26
#define RESET 8

char buffer[8] = {0, 0, 0, 0, 0, 0, 0, 1} ; 

void setup()
{
  pinMode(CS, OUTPUT) ; 
  pinMode(A_0, OUTPUT) ;
  pinMode(A_1, OUTPUT) ; 
  pinMode(WR, OUTPUT) ; 
  pinMode(RD, OUTPUT) ; 
  int i=0, p=0 ;
  for (i=32; i <=39; i++)
  {
    pinMode(i, OUTPUT) ; 
  }
  digitalWrite(CS, LOW) ; 
  digitalWrite(WR, LOW) ;  
  digitalWrite(RD, HIGH) ;  
  digitalWrite(A_0, HIGH) ;  
  digitalWrite(A_1, HIGH) ;    
  for (i=32; i <=39; i++)
  {
    if (buffer[p]) 
    {
      digitalWrite(i, HIGH) ; 
    }
    else
   { 
     digitalWrite(i, LOW) ;
   }
    p++ ;  
  }
}

void loop()
{
  digitalWrite(A_0, HIGH) ;  
  digitalWrite(A_1, LOW) ;
  digitalWrite(WR, LOW) ; 
  digitalWrite(RD, HIGH) ;    
  int i=0 ;
  for (i=32; i <= 39; i++)
  {
     digitalWrite(i, HIGH) ;  
  }
  delay(2000) ;
}
Lo siento, pero esa foto no vale nada. Agregue un esquema adecuado.
Solo para detectar un posible error simple, y como no está muy claro en la foto, los rieles de "suministro" en el protoboard (las tiras anchas de dos pines en cada lado) generalmente tienen una ruptura en ellos cada pocos de esos "bloques de 5 pines". ". En caso de que lo estuviera usando como un bus de suministro/tierra, a menudo verá pequeños puentes en cortocircuito cada pocas cuadras como en estas imágenes.
Agregué esquemas: cl.ly/image/3l3E0x160t1A

Respuestas (1)

El 8255 está diseñado para interactuar con un microprocesador que tiene una memoria externa y un bus de E/S, y funciona muy bien en ese entorno.

Sin embargo, el Arduino no tiene un bus externo, por lo que se ve obligado a emular ese bus golpeando los pines de E/S individuales, lo cual es lento y doloroso. Su código necesita generar pulsos en los pines RD, WR y CS, y actualmente no lo está haciendo. Debe observar más de cerca los diagramas de tiempo en la hoja de datos 8255.

Hay mejores formas de hacer la expansión de E/S en Arduino usando SPI o I2C. Por ejemplo, eche un vistazo a los chips Microchip MCP23S17 y MCP23017 .

Gracias. Por lo tanto, se necesita un momento adecuado. ¿Alguna documentación sobre cómo aprender a leer diagramas de tiempo?
No es tanto el tiempo como la secuenciación. Además, el hardware avr le permite configurar un puerto de byte completo en una sola operación, por lo que el proceso no tiene por qué ser tan feo como lo hace parecer este programa.