mcio24 - 24 digitale IO-s für Mikrocontroller


System:Xilinx XC9536 (VHDL)
Verision:0.30
Status: getestet, einsetzbar
Autor:Joerg Wolfram (joerg@jcwolfram.de)

1.Allgemeines und Lizenz
Die Programme unterliegen der GPL (Gnu Public License) Version 2 oder später und die Dokumentation der Hardware der FDL (Free Document License). Ich übernehme ausdrücklich keinerlei Haftung für die Richtigkeit und Funktionsfähigket der im Projekt enthaltenen Informationen. In der Dokumentation genannte Marken sind Eigentum des Markeninhabers.

2.Hardware
Das Projekt realisiert 24 digitale IO's für Microcontroller. Da aber 8 Portsignale benötigt werden, ist es eigentlich nur eine Erweiterung um 16 IO's. Die Signale haben, equivalent zu den Portpins der 51-er Mikrocontroller "Open-Kollektor"-Eigenschaften. Bei einer logischen "1" sind sie hochohmig und können als Eingänge benutzt werden. Dabei ist zu beachten, dass die CPLD's der XC9000-er Serie keine internen Pullup-Widerstände haben und diese extern an die IO-Pins anzuschließen sind. Das gilt natürlich nur für Anschlüsse, die nicht durch die externe Beschaltung im hochohmigen Zustand auf ein definiertes Potential (0 oder 1) gezogen werden. Pin 5 und Pin 6 müssen mit einer Brücke verbunden werden (VQFP: Pin 43 und 44). Auf diese Weise wird das Strobe-Signal für die Ausgangsregister etwas verzögert und es ist keine Vorhaltezeit für die Datensignale notwendig. Laufzeitunterschiede werden eliminiert und alle 8 Portsignale können gleichzeitig gesetzt werden, ohne dass es zu Fehlinterpretungen kommen kann.

Folgende Resourcen werden bei der realisierten Implementierung belegt:

Resource Belegung Prozentual
Makrozellen 36/36 100%
Register 24/36 67%
Produktterme 103/180 57%
Signale 72/72 100%
Pins 34/34 100%
Resource Funktional als IO
Globaler Takt 1 2
Globaler Tristate 0 2
Globaler Reset 0 1
Inwieweit die Belegung der PIN's des CPLD geändert werden kann, habe ich nicht untersucht, das muss eventuell durch Versuche herausgefunden werden. Die vorliegende Konfiguration ist das Ergebnis verschiedener Optimierungen, da sich nicht alle möglichen Pinbelegungen fitten lassen. Auf der "Controllerseite" sind folgende 8 Signale notwendig:

Signal Controller PLCC44-Pin VQFP44-Pin
Portpin 0 11 5
Portpin 1 9 3
Portpin 2 8 2
Portpin 3 7 1
Portpin 4 4 42
Portpin 5 3 41
Portpin 6 2 40
Portpin 7 1 39

Die 24 "Peripherie-Signale" sind nibbleweise angeordnet und werden auch so angesprochen:

IO-Signal PLCC44 VQFP44 IO-Signal PLCC44 VQFP44 IO-Signal PLCC44 VQFP44
IO 0/0 12 6 IO 2/0 25 19 IO 4/0 36 30
IO 0/1 13 7 IO 2/1 26 20 IO 4/1 37 31
IO 0/2 14 8 IO 2/2 27 21 IO 4/2 38 32
IO 0/3 18 12 IO 2/3 28 22 IO 4/3 39 33
IO 1/0 19 13 IO 3/0 29 23 IO 5/0 40 34
IO 1/1 20 14 IO 3/1 33 27 IO 5/1 42 36
IO 1/2 22 16 IO 3/2 34 28 IO 5/2 43 37
IO 1/3 24 18 IO 3/3 35 29 IO 5/3 44 38

3.Ansteuerung
Die Ansteuerung erfolgt über 8 Portpins des Mikrocontrollers. Dabei dienen die untersten 4 Bits als bidirektionale Datenpins. Die oberen 4 Bits stellen die Adresse dar. Wird das CPLD an Port P1 eines AT89C2051 angeschlossen, müssen an die Portpins P0 und P1 Pullup-Widerständevon ca. 10 KOhm angeschlossen werden. Die Adressierung gestaltet sich folgenddermassen:

Portpin 7 Portpin 6 Portpin 5 Portpin 4 Portpin 0-3 Funktion
0 0 0 0 Ausgabedaten Nibble 0 Nibble 0 schreiben
0 0 0 1 Ausgabedaten Nibble 1 Nibble 1 schreiben
0 0 1 0 Ausgabedaten Nibble 2 Nibble 2 schreiben
0 0 1 1 Ausgabedaten Nibble 3 Nibble 3 schreiben
0 1 0 0 Ausgabedaten Nibble 4 Nibble 4 schreiben
0 1 0 1 Ausgabedaten Nibble 5 Nibble 5 schreiben
0 1 1 0 beliebig keine Funktion
0 1 1 1 beliebig keine Funktion
1 0 0 0 Eingangsstatus von Nibble 0 Nibble 0 lesen
1 0 0 1 Eingangsstatus von Nibble 1 Nibble 1 lesen
1 0 1 0 Eingangsstatus von Nibble 2 Nibble 2 lesen
1 0 1 1 Eingangsstatus von Nibble 3 Nibble 3 lesen
1 1 0 0 Eingangsstatus von Nibble 4 Nibble 4 lesen
1 1 0 1 Eingangsstatus von Nibble 5 Nibble 5 lesen
1 1 1 0 beliebig keine Funktion
1 1 1 1 beliebig keine Funktion

Zwischen zwei Schreiboperationen muss immer Bit 7 gesetzt werden. In der Praxis ist das aber meist nicht weiter nachteilig.

4.Beispielcode für 51-er Mikrocontroller
Der 51-er Beispielcode soll zeigen, wie die (bitadressierbaren Datenbytes 2c-2e an die Ausgänge ausgegeben und die Eingänge in die Datenbytes 28-2a eingelesen werden, IO-Port ist P1. Die Routine benötigt 84 Taktzyklen.

 

iorout:	mov	p1,#$ff		;Vorsichtshalber alle Portpins auf 1
	mov	r0,#$2a		;Zeiger auf 3.Byte lesen
	mov	r1,#$2e		;Zeiger auf 3.Byte schreiben
	mov	r2,#6		;Schleifenzähler
ior1:	mov	a,@r1		;Byte lesen
	anl	a,$f0		;nur oberes Nibble
	orl	a,r2		;Adresse in die untersten 4 Bits
	dec	a		;Korrektur der Adresse
	swap	a		;Nibbles tauschen, damit Daten "unten"
	mov	p1,a		;Bits ausgeben
	setb	p1.7		;auf Lesen umschalten
	mov	a,p1		;Daten einlesen
	swap	a		;Daten in oberes Nibble
	xchd	a,@r0		;unteres Nibble holen
	mov	@r0,a		;Datum zurückschreiben
	dec	r2		;nächstniedrige Adresse
	mov	a,@r1		;Byte lesen
	swap	a		;Nibbles tauschen
	anl	a,$f0		;nur oberes Nibble			 
	orl	a,r2		;Adresse in die untersten 4 Bits
	dec	a		;Korrektur der Adresse
	swap	a		;Nibbles tauschen, damit Daten "unten"
	mov	p1,a		;Bits ausgeben
	setb	p1.7		;auf Lesen umschalten
	mov	a,p1		;Daten einlesen	
	xchd	a,@r0		;unteres Nibble schreiben
	dec	r0		;nächstniedriges Byte zum Lesen
	dec	r1		;nächstniedriges Byte zum Schreiben
	djnz	r2,ior1		;Schleife
	mov	p1,#$ff		;Vorsichtshalber alle Portpins auf 1
	ret			;und Schluss
 


5.Download