MCP23017 |
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.
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:
Extra uitleg over binaire getallen vind je in de sketch bij project 1 en op Wikipedia.
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.
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 Het IODIR register bestaat eigelijk uit twee registers, IODIRA en IODIRB, voor beide 8-poorten A en B.
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 Het IPOL register bestaat eigelijk uit twee registers, IPOLA en IPOLB, voor beide 8-poorten A en B.
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 Het GPPU register bestaat eigelijk uit twee registers, GPPUA en GPPUB, voor beide 8-poorten A en B.
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' Het GPIO register bestaat eigenlijk uit twee registers, GPIOA en GPIOB, voor beide 8-poorten A en B.
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
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. Uitleg bij deze sketch: Dit volgt nog...
Project 2 - 8 inputs en 8 outputs: Ontwikkeld door Peter Zorgdrager en Peter Hogenstijn. Onderdelen: 1x MCP23017
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
Uitleg bij dit schema: Volgt nog.
Sketch:
De sketch kun je hier (nog niet) downloaden. Uitleg bij deze sketch: Dit volgt nog... |