Porterweiterung für ATtiny13 mit Portbaustein 82C43
von Michael Gaus
Der
ATtiny13 bietet 5 digitale Ausgänge. Falls man jedoch einmal mehr
Ausgänge benötigen sollte, aber trotzdem den Tiny13 verwenden
möchte, bietet es sich an, den Porterweiterungsbaustein 82C43 zu
verwenden. Dieser Baustein ist zwar schon etwas betagt, aber immer noch
erhältlich, z.B. bei http://www.kessler-electronic.de oder bei
Ebay. Der 82C43 bietet 16 I/Os, die in 4 Gruppen mit jeweils 4-bit
steuerbar sind (P4 bis P7). Zur Ansteuerung verfügt er über
einen 4-Bit Controlport (P2), einen Chipselect-Pin sowie den Prog-Pin.
Bei
aktivem Chipselect liest der Baustein mit der fallenden Flanke am
Prog-Pin einen 4-bit Befehl über P2 ein. Die höchstwertigen 2
Bits geben dabei den eigentlichen Befehl an (Read, Write, OR, AND) und
die niederwertigsten 2 Bits geben den gewünschten Port (P4 bis P7)
an. Mit der steigenden Flanke am Prog-Pin liest der Baustein die zu
schreibenden 4-bit Daten über P2 ein (bei Write, OR, AND) bzw.
gibt die eingelesenen Daten an P2 aus (bei Read).
In dieser
Beispielanwendung sollen mit dem 82C43 insgesamt 16 LEDs angesteuert
werden. Da der 82C43 nur bei Ausgabe eines LOW-Pegels genügend
Strom zur Ansteuerung einer LED liefern kann, sind die LEDs über
einen Vorwiderstand gegen Vcc geschaltet. Die Ansteuerung muss somit
invertiert erfolgen, d.h. bei einer 0 am Ausgangspin leuchtet die
entsprechende LED. Die LEDs 1-16 sind der Reihe nach an P4.0 bis P4.3,
P5.0 bis P5.3 usw. angeschlossen. Der Chipselect-Pin des 82C43 ist fest
auf GND gelegt, da kein Ausgangspin am Tiny13 mehr frei ist, dies
funktioniert jedoch problemlos.
Der
Controlport P2 wird an die Pins Pb0-PB3 des Tiny13 angeschlossen. Um
bei versehentlichen Read-Befehlen zum 82C43 zu verhindern, dass die
dann als Ausgang geschalteten Pins von P2 gegen die
Digitalausgänge des AVRs treiben, werden 100 Ohm
Serienwiderstände als Schutz verwendet. Der PROG-Pin wird mit PB4
verbunden.
Um einen der 4 Ports des 82C43 zu steuern ist folgende Vorgehensweise erforderlich:
-
die 4 AVR-Pins PB3-PB0 setzen auf 01pp, wobei pp dem Bitmuster für
den gewünschten Port entspricht (00=P4, 01=P5, 10=P6, 11=P7)
- PB4 auf 0 setzen (LOW-Pegel am PROG-Pin)
- die 4 AVR-Pins PB3-PB0 invertiert auf das gewünschte LED-Muster setzen (0=LED an, 1=LED aus)
- PB4 auf 1 setzen (HIGH-Pegel am PROG-Pin)
Beispiel
für Bascom, um P5 auf 0011 zu setzen, d.h. die LEDs an P5.3 und
P5.2 leuchten (Pins=0), die LEDs an P5.1 und P5.0 sind aus (Pins=1):
Portb = &B10101 ' Befehl: Write P5
Portb.4 = 0 ' PROG fallende Flanke
Portb = &B00011 ' Daten für P5
Portb.4 = 1 ' PROG steigende Flanke
Im Beispiel wird davon ausgegangen, dass PB4 zuvor auf High-Pegel war.
Als
Beispielanwendung ist noch ein Bascom-Code beigefügt, der
folgendes LED-Muster erzeugt: Zunächst werden der Reihe nach alle
LEDs von 1-16 nacheinander eingeschaltet, bis alle LEDs leuchten. Nach
einer kurzen Pause werden alle LEDs wieder ausgeschaltet und das Muster
wiederholt sich.
Links:
[1] Datenblatt 82C43: http://www.dhservis.cz/docs_soubory/m82c43.pdf
[2] Bezugsquelle für 82C43: http://www.kessler-electronic.de
Download: Porterweiterung.zip
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 16
$swstack = 16
$framesize = 16
Dim I As Byte
Dim Port As Byte
Dim Value As Byte
Dim Inv_value As Byte
Declare Sub Write8243(byval Port As Byte , Byval Value As Byte) 'declare the SUB program
Portb = &B10000
Ddrb = &B11111
Waitms 100
Do
Call Write8243(4 , &HF)
Call Write8243(5 , &HF)
Call Write8243(6 , &HF)
Call Write8243(7 , &HF)
Waitms 500
For Port = 4 To 7
Value = 0
For I = 1 To 4
Shift Value , Left , 1
Value = Value Or 1
Inv_value = Not Value
Call Write8243(port , Inv_value)
Waitms 100
Next I
Next Port
Waitms 500
Loop
End
Sub write8243(byval Port As Byte , Byval Value As Byte) 'Port = port of 82C43: 4...7
Port = Port And &B00011
Portb = &B10100 Or Port
Portb.4 = 0
Portb = Value And &B01111
Portb.4 = 1
End Sub