Arduino- und Intel 8255A-5-Schnittstelle

Ich versuche, ein Arduino Mega mit einem Intel 8255 zu verbinden, und es scheint nicht zu funktionieren, hier ist mein Setup:

Foto von Steckbrett

schematisch

Ich verwende als LS245 IC, um 4 LEDs anzuschließen. Die Pins CS, RESET sind mit GND verbunden. Ich versuche, Port B zu verwenden, um Daten zum Ein- und Ausschalten einzelner LEDs zu senden. Mein Code setzt das Steuerregister nur in den E / A-Modus, und Port B wird als AUSGANG festgelegt. Irgendwelche Hinweise, was falsch sein kann?

Mein Code:

#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) ;
}
Sorry, aber das Foto ist wertlos. Bitte fügen Sie einen richtigen Schaltplan hinzu.
Nur um einen möglichen einfachen Fehler zu erkennen, und da es auf dem Foto nicht sehr klar ist, haben die "Versorgungs" -Schienen auf dem Protoboard (die zwei Stifte breiten Streifen auf beiden Seiten) normalerweise alle paar dieser 5-Stift-"Blöcke" eine Unterbrechung ". Falls Sie es als Versorgungs-/Erdungsbus verwendet haben, sehen Sie oft alle paar Blöcke kleine Kurzschlussbrücken, wie in diesen Bildern
Ich habe Schaltpläne hinzugefügt: cl.ly/image/3l3E0x160t1A

Antworten (1)

Der 8255 ist als Schnittstelle zu einem Mikroprozessor mit externem Speicher und E/A-Bus ausgelegt und funktioniert in dieser Umgebung sehr gut.

Der Arduino hat jedoch keinen externen Bus, sodass Sie gezwungen sind, diesen Bus zu emulieren, indem Sie einzelne I/O-Pins mit Bits schlagen, was langsam und schmerzhaft ist. Ihr Code muss Impulse an den RD-, WR- und CS-Pins erzeugen, und das tut er derzeit nicht. Sie müssen sich die Timing-Diagramme im 8255-Datenblatt genauer ansehen.

Es gibt bessere Möglichkeiten, I/O-Erweiterungen auf Arduino mit SPI oder I2C durchzuführen. Schauen Sie sich zum Beispiel die Chips MCP23S17 und MCP23017 von Microchip an .

Danke schön. Es braucht also das richtige Timing. Irgendeine Dokumentation, wie man lernt, Timing-Diagramme zu lesen?
Es ist weniger Timing als vielmehr Sequenzierung. Mit der avr-Hardware können Sie auch einen ganzen bytebreiten Port in einem Vorgang festlegen, sodass der Prozess nicht so hässlich sein muss, wie dieses Programm es aussehen lässt.