1 | #include "main.h"
|
2 | #include "i2cmaster.h"
|
3 | #include <util/delay.h>
|
4 |
|
5 | #define PCA9536_I2C_ADR 0x82
|
6 | #define PCF8574_I2C_ADR 0x40
|
7 |
|
8 | #define PCA9536_INPUT_REG 0x00
|
9 | #define PCA9536_OUTPUT_REG 0x01
|
10 | #define PCA9536_POLARITY_REG 0x02
|
11 | #define PCA9536_CONFIG_REG 0x03
|
12 |
|
13 | int8_t Abfrage_Bus(uint8_t slave_adresse) {
|
14 | uint8_t ret;
|
15 |
|
16 | ret = i2c_start(slave_adresse);
|
17 | i2c_stop();
|
18 | return ret;
|
19 | }
|
20 |
|
21 | void PCA9536_Write(uint8_t slave_addresse, uint8_t cfg_reg, uint8_t data) {
|
22 | i2c_start(slave_addresse);
|
23 | i2c_write(cfg_Reg);
|
24 | i2c_write(data);
|
25 | i2c_stop();
|
26 | }
|
27 |
|
28 | void PCA9536_Read(uint8_t slave_adresse, uint8_t cfg_reg, uint8_t* data) {
|
29 | i2c_start(slave_adresse);
|
30 | i2c_write(cfg_reg);
|
31 | i2c_start(slave_adresse|0x01);
|
32 | *data=i2c_readNak();
|
33 | i2c_stop();
|
34 | }
|
35 |
|
36 | void PCF8574_Write(uint8_t slave_adresse, uint8_t data) {
|
37 | i2c_start(slave_adresse);
|
38 | i2c_write(data);
|
39 | i2c_stop();
|
40 | }
|
41 |
|
42 | void PCF8574_Read(uint8_t slave_adresse, uint8_t* data) {
|
43 | i2c_start(slave_adresse|0x01);
|
44 | *data=i2c_readNak();
|
45 | i2c_stop();
|
46 | }
|
47 |
|
48 | int main(void) {
|
49 | uint8_t Tasten_A, Tasten_B;
|
50 | uint8_t pcf8574_buffer=0xFF;
|
51 |
|
52 | i2c_init();
|
53 | DDRC=0x20; // Status LEDs am Prozessor
|
54 |
|
55 | // Prüfe I2C Slaves auf Vorhandensein
|
56 |
|
57 | if (Abfrage_Bus(PCA9536_I2C_ADR)) {
|
58 | PORTC |= (1<<PC5); // error
|
59 | while(1); // stop
|
60 | }
|
61 |
|
62 | if (Abfrage_Bus(PCF8574_I2C_ADR)) {
|
63 | PORTC |= (1<<PC5); // error
|
64 | while(1); // stop
|
65 | }
|
66 |
|
67 | // PCA9536 P0-P2 auf OUTPUT umstellen, P3 Input
|
68 |
|
69 | PCA9536_Write(PCA9536_I2C_ADR, PCA9536_CONFIG_REG, 0x08);
|
70 |
|
71 | while(1) { // Hauptschleife
|
72 |
|
73 | PCF8574_Read(PCF8574_I2C_ADR, &Tasten_A); // Lesezugriff P11
|
74 | PCA9536_Read(PCA9536_I2C_ADR, PCA9536_INPUT_REG, &Tasten_B); // Lesezugriff Abfrage WTMA
|
75 |
|
76 | if(~Tasten_B & 0x08) { // Taste 4 kopieren
|
77 | pcf8574_buffer &= ~0x80;
|
78 | } else {
|
79 | pcf8574_buffer |= 0x80;
|
80 | }
|
81 |
|
82 | if (~Taste_A & 0x08) { // Taste 1 kopieren
|
83 | pcf8574_buffer &= ~0x10;
|
84 | } else {
|
85 | pcf8574_buffer |= 0x10;
|
86 | }
|
87 |
|
88 | PCF8574_Write(PCF8574_I2C_ADR, pcf8574_buffer);
|
89 | PCA9536_Write(PCA9536_I2C_ADR, PCA9536_OUTPUT_REG, Taste_A & 0x07);
|
90 | }
|
91 | }
|