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