1 | #include <stdbool.h>
|
2 | #include <avr/pgmspace.h>
|
3 | #include "main.h"
|
4 | #include "i2cmaster.h"
|
5 | #include "avr/io.h"
|
6 | #include "util/delay.h"
|
7 | #include "avr/interrupt.h"
|
8 | #include "stdlib.h"
|
9 |
|
10 | // Controll Register ICON.Bank = 0
|
11 | // Richtungsregister von Port A und B
|
12 | #define MCP23017_IODIRA 0x00 // Steuert die Richtung der Daten am Port A, Pin gesetzt=Eingang, nicht gesetzt=Ausgang
|
13 | #define MCP23017_IODIRB 0x01 // Steuert die Richtung der Daten am Port B, Pin gesetzt=Eingang, nicht gesetzt=Ausgang
|
14 | // Register um Logik Polarität umzustellen an Port A und B
|
15 | #define MCP23017_IPOLA 0x02 // konfiguriert die Polarität GPIO Port Bits
|
16 | #define MCP23017_IPOLB 0x03
|
17 |
|
18 | #define MCP23017_GPINTENA 0x04 // steuert die Interrupt-On-Change
|
19 | #define MCP23017_GPINTENB 0x05
|
20 |
|
21 | #define MCP23017_DEFVALA 0x06 // Standardvorgabe für Eingangspins
|
22 | #define MCP23017_DEFVALB 0x07
|
23 | #define MCP23017_INTCONA 0x08 // legt fest wie der zugehörige Pin-Wert für die Interrupt-On-Change-Funktion verglichen wird
|
24 | #define MCP23017_INTCONB 0x09
|
25 |
|
26 | #define MCP23017_IOCON 0x0A // enthält etliche Bits für die Konfiguration
|
27 |
|
28 | // Interne Pull-Up-Widerstände einschalten an Port A und B
|
29 | #define MCP23017_GPPUA 0x0C // steuert die Pull-UP-Widerstände für Port-Pins
|
30 | #define MCP23017_GPPUB 0x0D
|
31 |
|
32 | #define MCP23017_INTFA 0x0E // spiegelt die Interupt-Bedingungen auf den Port-Pins wieder
|
33 | #define MCP23017_INTFB 0x0F
|
34 |
|
35 | #define MCP23017_INTCAPA 0x10 // erfassen den GPIO-Port-Wert zum Zeitpunkt des Interrups
|
36 | #define MCP23017_INTCAPB 0x11
|
37 | // Datenregister Port A und B
|
38 | #define MCP23017_GPIOA 0x12 // geben den Wert der Portleitungen zurück. Ein lesen entspricht dem lesen der Portleitungen
|
39 | #define MCP23017_GPIOB 0x13 // ein schreiben entspricht dem schreiben in die Ausgangslatches
|
40 |
|
41 | #define MCP23017_OLATA 0x14 // erlaubt den Zugriff auf die als Ausgang konfigurierten Pins Register A
|
42 | #define MCP23017_OLATB 0x15 // erlaubt den Zugriff auf die als Ausgang konfigurierten Pins Register B
|
43 |
|
44 | #define MCP23017_ADDR 0x40 // Habe A0 bis A2 auf GND gelegt, Adresse 0x40
|
45 | //#define Data
|
46 | uint8_t Data;
|
47 | int main(void)
|
48 | {
|
49 | i2c_init(); // initialize I2C library
|
50 |
|
51 | //setzt Port A als Ausgang mit IODIRA
|
52 | i2c_start(MCP23017_ADDR); // Adresse
|
53 | i2c_write(MCP23017_IODIRA); // Steuert die Richtung der Daten am Port A
|
54 | i2c_write(0x00); // Angabe Ausgang 0x00-alle, 0xff-alle aus
|
55 | i2c_stop();
|
56 |
|
57 | // setzt Port B alle R mit GPPUB als Eingang
|
58 | i2c_start(MCP23017_ADDR); // Adresse
|
59 | i2c_write(MCP23017_GPPUB); // aktivierung der internen Pullups Widerstände
|
60 | i2c_write(0xff); // schalte alle Eingänge auf 5V
|
61 | i2c_stop();
|
62 |
|
63 | while(1)
|
64 | {
|
65 | // einlesen der Port / Taster
|
66 | i2c_start(MCP23017_ADDR); // Adresse
|
67 | i2c_write(MCP23017_GPIOB);
|
68 | Data = i2c_read(0xff); // liest Ausgänge ein
|
69 | i2c_stop();
|
70 |
|
71 | if (Data == 0x01)
|
72 | {
|
73 | i2c_start(MCP23017_ADDR); // Adresse
|
74 | i2c_write(MCP23017_OLATA);
|
75 | i2c_write(0x0a); // schalte Ausgänge ein
|
76 | i2c_stop();
|
77 | }
|
78 | else
|
79 | {
|
80 | i2c_start(MCP23017_ADDR); // Adresse
|
81 | i2c_write(MCP23017_OLATA);
|
82 | i2c_write(0x00); // schalte Ausgänge ein
|
83 | i2c_stop();
|
84 | }
|
85 |
|
86 |
|
87 | // schreiben der Rister für LEDs
|
88 | i2c_start(MCP23017_ADDR); // Adresse
|
89 | i2c_write(MCP23017_OLATA);
|
90 | i2c_write(0x05); // schalte Ausgänge ein
|
91 | i2c_stop();
|
92 |
|
93 | _delay_ms(1500);
|
94 |
|
95 | i2c_start(MCP23017_ADDR); // Adresse
|
96 | i2c_write(MCP23017_OLATA);
|
97 | i2c_write(0x50); // schalte Ausgänge aus
|
98 | i2c_stop();
|
99 |
|
100 | _delay_ms(1500);
|
101 | }
|
102 | }
|