Leon van der Horst - Microcontrollers

MCP23017

Arduino

Boarduino

Basic Stamp

JeeLink/Node

Projecten

Workshop

Links

Terug naar hoofd pagina

Projecten met MCP23017

MCP23017 - Eigenschappen en uitleg over deze I/O extender.

Project 1 - 16 outputs voor LEDs: Ontwikkeld door Peter Zorgdrager.

Project 2 - 8 inputs en 8 outputs: Ontwikkeld door Peter Zorgdrager en Peter Hogenstijn.

Project 3 - Aansturen LCD en uitlezen buttons: Nog te doen.

 

 

MCP23017

De MCP23017 is een 16-poorts digitale I/O chip welke via I2C™ aangestuurd kan worden. Er zijn twee varianten, de eerder genoemde I²C versie en een versie die aangestuurd wordt via een SPI interface. Wij gaan hier I²C gebruiken, omdat we hoofdzakelijk deze interface gebruiken, ondanks dat SPI veel hogere snelheden aan kan. De 23S017 is degene met SPI interface, de 23017 met I²C interface.
De MCP23017 (
datasheet) wordt geleverd in verschillende behuizingen, de bekende DIP (28-pins) uitvoering en als SMD.

 

Eerst uitleg over de adressering via de I²C bus, hieronder staat uitgeschreven hoe zo'n pakketje eruit ziet:

Er wordt begonnen met een start-bit, gevolg door een 7-bits adres, waarin bit 0, 1 en 2 variabel zijn (worden hardwarematig bepaald) en bit 3 t/m 6 vastliggen. Een binair getal (indien het een byte is) bestaat normaliter uit 8 bits. Elke bit kan een 0 of een 1 zijn. De complete 'Control Byte' bestaat ook uit 8 bits en bij binaire notatie van getallen wordt van rechts naar links gelezen. Het meest rechtse bit is het eerste bit, genaamd bit 0, het meest rechtse bit is het laatste bit, genaamd bit 7. Elk bit representeert een waarde:

bit 0 = 1
bit 1 = 2
bit 2 = 4
bit 3 = 8
bit 4 = 16
bit 5 = 32
bit 6 = 64
bit 7 = 128

Als we nu naar dit 'Control Byte' kijken zien we dit:

bit 7     bit 6     bit 5     bit 4      bit 3      bit 2      bit 1      bit 0
  0           0         1          0           X           X           X        R/W

LET OP: Het adres is 7-bits, we dienen dit dus eigelijk te herschrijven als volgt:

bit 6     bit 5     bit 4      bit 3      bit 2      bit 1      bit 0
  0         1          0           0           X           X         X

De X waarden zijn een '0' of een '1', de mogelijk waarden kunnen zijn:

0100000 = 32 (decimaal); 20 (hexadecimaal)
0100001 = 33 (decimaal); 21 (hexadecimaal)

0100010 = 34 (decimaal); 22 (hexadecimaal)

0100011 = 35 (decimaal); 23 (hexadecimaal)

0100100 = 36 (decimaal); 24 (hexadecimaal)

0100101 = 37 (decimaal); 25 (hexadecimaal)

0100110 = 38 (decimaal); 26 (hexadecimaal)

0100111 = 39 (decimaal); 27 (hexadecimaal)

 

Extra uitleg over binaire getallen vind je in de sketch bij project 1 en op Wikipedia.
Bij het programeren van de Arduino/JeeLink/JeeNode in de taal "C" kun je waarden op verschillende manieren noteren:
binair ("B00100110"), decimaal (38), hexadecimaal ("0x26").

 

Hieronder een blokdiagram van de chip:

Links de adresdecoder (A2 t/m A0) waarmee acht verschillende adressen mogelijk zijn. SCL (clock) en SDA (data) zijn de twee lijnen van de I²C interface. De RESET dient hoog gehouden te worden (met pull-up of direct aan de +5V). De 'Configuration/Control Registers' bepalen het gedrag van de in/uit gangen (GPIOA en GPIOB). Daarnaast zijn er nog twee interrupt lijnen (uitgangen) waarmee het mogelijk is dat de chip een interrupt signaal afgeeft zodra op de GPIO poorten een bepaalde conditie zich voordoet.

De datasheet geeft alle opties weer van deze chip, alhoewel er nog een extra document (AppNote 1043) beschikbaar is, deze kun je hier downloaden. Twee registers zijn van groot van belang voor het programmeren van deze digitale 16-bit I/O extender, n.l.: IODIRA/B welke bepaald of een poort input of output is en GPIOA/B om te lezen of te schrijven naar een poort. Hieronder een pagina uit de AppNote 1043:

Voor het gebruik van deze chip worden enkele relevante registers en opties besproken. Ten eerste één van de belangrijkste registers.

Het IOCON (Configuration) register:

Het IOCON register bepaald de volgende zaken:

Bit 7 = BANK: Dit bepaald of de chip in 8-bit (bit7=1) of 16-bit (bit7=0) mode draait.
Bit 6 = MIRROR: Bit6=0: Interrupt pins zijn intern verbonden met elkaar, Bit7=1: Niet verbonden. INTA is voor GPIOA en INTB is voor GPIOB.
Bit 5 = SEQOP: Bit5=0: Intern adres wijzer wordt met één verhoogd na schrijfactie, Bit5=1: Adres wijzer wijzigt niet.
Bit 4 = DISSLW: Bit4=0: Slew rate voor SDA output staat aan (gebruiken wij ook), Bit4=1: Slew rate is uit.
Bit 3 = HAEN: Alleen van belang (is "Chip Select") bij de ISP-interface versie, de MCP23S017. Behandelen we hier niet.
Bit 2 = ODR: Open drain voor interrupt. Bit2=0: Active driver (INTPOL bepaalt de polariteit), Bit2=1: Open Drain (overschrijft de INTPOL bit)
Bit 1 = INTPOL: Interrupt polariteit. Bit1=0: Laag actief, Bit1=1: Hoog actief.
Bit 0 = U: Unused ofwel niet in gebruik.

 

Het IODIR (I/O Direction) register:

Het IODIR register bepaald de volgende zaken:

Bit 7 = bit7 = 1 -> Bit7 aansluiting is een input; Bit 7 = 0 -> aansluiting is een output
Bit 6 = bit7 = 1 -> Bit6 aansluiting is een input; Bit 6 = 0 -> aansluiting is een output
Bit 5 = bit7 = 1 -> Bit5 aansluiting is een input; Bit 5 = 0 -> aansluiting is een output

Bit 4 = bit7 = 1 -> Bit4 aansluiting is een input; Bit 4 = 0 -> aansluiting is een output

Bit 3 = bit7 = 1 -> Bit3 aansluiting is een input; Bit 3 = 0 -> aansluiting is een output

Bit 2 = bit7 = 1 -> Bit2 aansluiting is een input; Bit 2 = 0 -> aansluiting is een output

Bit 1 = bit7 = 1 -> Bit1 aansluiting is een input; Bit 1 = 0 -> aansluiting is een output

Bit 0 = bit7 = 1 -> Bit0 aansluiting is een input; Bit 0 = 0 -> aansluiting is een output

Het IODIR register bestaat eigelijk uit twee registers, IODIRA en IODIRB, voor beide 8-poorten A en B.
Elke I/O-poort is via deze weg onafhankelijk van elkaar als input of output te schakelen.

 

Het IPOL (Input Polarity) register:

Het IPOL register bepaald de volgende zaken:

Bit 7 = bit7 = 1 -> Bit7 aansluiting wordt geïnverteerd; Bit 7 = 0 -> aansluiting wordt 1:1 doorgelaten
Bit 6 = bit7 = 1 -> Bit6 aansluiting wordt geïnverteerd; Bit 6 = 0 -> aansluiting wordt 1:1 doorgelaten

Bit 5 = bit7 = 1 -> Bit5 aansluiting wordt geïnverteerd; Bit 5 = 0 -> aansluiting wordt 1:1 doorgelaten

Bit 4 = bit7 = 1 -> Bit4 aansluiting wordt geïnverteerd; Bit 4 = 0 -> aansluiting wordt 1:1 doorgelaten

Bit 3 = bit7 = 1 -> Bit3 aansluiting wordt geïnverteerd; Bit 3 = 0 -> aansluiting wordt 1:1 doorgelaten

Bit 2 = bit7 = 1 -> Bit2 aansluiting wordt geïnverteerd; Bit 2 = 0 -> aansluiting wordt 1:1 doorgelaten

Bit 1 = bit7 = 1 -> Bit1 aansluiting wordt geïnverteerd; Bit 1 = 0 -> aansluiting wordt 1:1 doorgelaten

Bit 0 = bit7 = 1 -> Bit0 aansluiting wordt geïnverteerd; Bit 0 = 0 -> aansluiting wordt 1:1 doorgelaten

Het IPOL register bestaat eigelijk uit twee registers, IPOLA en IPOLB, voor beide 8-poorten A en B.
Elke I/O-poort is via deze weg onafhankelijk van elkaar als inverter te schakelen.

 

Het GPPU - GPIO (Pull-Up Resistor Configuration) register:

Het GPPU register bepaald de volgende zaken:

Bit 7 = bit7 = 1 -> Bit7 pull-up weerstand geactiveerd; Bit 7 = 0 -> geen pull-up weerstand
Bit 6 = bit7 = 1 -> Bit6 pull-up weerstand geactiveerd; Bit 6 = 0 -> geen pull-up weerstand

Bit 5 = bit7 = 1 -> Bit5 pull-up weerstand geactiveerd; Bit 5 = 0 -> geen pull-up weerstand

Bit 4 = bit7 = 1 -> Bit4 pull-up weerstand geactiveerd; Bit 4 = 0 -> geen pull-up weerstand

Bit 3 = bit7 = 1 -> Bit3 pull-up weerstand geactiveerd; Bit 3 = 0 -> geen pull-up weerstand

Bit 2 = bit7 = 1 -> Bit2 pull-up weerstand geactiveerd; Bit 2 = 0 -> geen pull-up weerstand

Bit 1 = bit7 = 1 -> Bit1 pull-up weerstand geactiveerd; Bit 1 = 0 -> geen pull-up weerstand

Bit 0 = bit7 = 1 -> Bit0 pull-up weerstand geactiveerd; Bit 0 = 0 -> geen pull-up weerstand

Het GPPU register bestaat eigelijk uit twee registers, GPPUA en GPPUB, voor beide 8-poorten A en B.
Elke I/O-poort is via deze weg onafhankelijk van elkaar met een pull-up weerstand te schakelen.

 

Het GPIO (General Purpose I/O) register:

Het GPIO register bepaald de volgende zaken:

Bit 7 = bit7 = 1 -> Bit7 is een logische '1'; Bit 7 = 0 -> is een logische '0'
Bit 6 = bit7 = 1 -> Bit6 is een logische '1'; Bit 6 = 0 -> is een logische '0'

Bit 5 = bit7 = 1 -> Bit5 is een logische '1'; Bit 5 = 0 -> is een logische '0'

Bit 4 = bit7 = 1 -> Bit4 is een logische '1'; Bit 4 = 0 -> is een logische '0'

Bit 3 = bit7 = 1 -> Bit3 is een logische '1'; Bit 3 = 0 -> is een logische '0'

Bit 2 = bit7 = 1 -> Bit2 is een logische '1'; Bit 2 = 0 -> is een logische '0'

Bit 1 = bit7 = 1 -> Bit1 is een logische '1'; Bit 1 = 0 -> is een logische '0'

Bit 0 = bit7 = 1 -> Bit0 is een logische '1'; Bit 0 = 0 -> is een logische '0'

Het GPIO register bestaat eigenlijk uit twee registers, GPIOA en GPIOB, voor beide 8-poorten A en B.
Elke I/O-poort is via deze weg onafhankelijk van elkaar te schakelen (indien poort een output is) of in te lezen (indien poort een input is).

 

 

Overige registers volgen nog...

 

Voor de Arduino is inmiddels een library gemaakt voor de MCP23017, deze kun je hier downloaden.

Hieronder volgen enkele projecten die we tijdens de microcontroller workshop bij de S.M.G. IJmond hebben gerealiseerd. Ten eerste: De MCP23017 gebruiken als 16 outputs om daarmee 16 LEDs aan te sturen, dit project is ontwikkeld door Peter Zorgdrager.

Project 1 - 16 outputs voor LEDs: Ontwikkeld door Peter Zorgdrager.

Onderdelen:

1x MCP23017
16x LED
16x 560 Ohm weerstand
2x 1K8 Ohm weerstand

 

Uitleg bij dit schema:

Pin 1 t/m 8 beschikken ook over een 8-tal weerstanden van 560 Ohm en LED (staat niet getekend in het schema). De reset lijn (pin 18) mag niet vrij 'hangen', deze het beste aan de plus monteren. Indien deze wel loshangt kan dit er voor zorgen de chip geregeld en geheel willekeurig zichzelf reset.

 

Sketch:

De sketch (PDE-file) kun je hier downloaden.
De sketch (INO-file) kun je
hier downloaden.

Uitleg bij deze sketch:

Dit volgt nog...

 

 

Project 2 - 8 inputs en 8 outputs: Ontwikkeld door Peter Zorgdrager en Peter Hogenstijn.

Onderdelen:

1x MCP23017
8x LED
8x 560 Ohm weerstand
2x 1K8 Ohm weerstand
8x schakelaar

 

Uitleg bij dit schema:

PoortA wordt gebruikt om een 8-tal LEDs aan te sturen, terwijl PoortB wordt gebruikt om een 8-tal schakelaars in te lezen. Bij het schakelen van een schakelaar gaat de corresponderende LED aan de andere zijde aan/uit. Let op: De I/O poorten van PortA en PortB zitten niet recht tegenover elkaar. De reset lijn (pin 18) mag niet vrij 'hangen', deze het beste aan de plus monteren. Indien deze wel loshangt kan dit er voor zorgen de chip geregeld en geheel willekeurig zichzelf reset.

 

Sketch:

De sketch (PDE-file) kun je hier downloaden.

De sketch (INO-file) kun je hier downloaden.

Uitleg bij deze sketch:

Dit volgt nog...

 

 

Project 3 - LCD met menubuttons: Ontwikkeld door .

 

Onderdelen:

1x MCP23017
1x LCD
....

 

Uitleg bij dit schema:

Volgt nog.

 

Sketch:

 

De sketch kun je hier (nog niet) downloaden.

Uitleg bij deze sketch:

Dit volgt nog...

 

Naar elektronica          Naar microcontrollers          Naar hoofd pagina