@ Patrick F. (breaker87)
>Ich kann Daten sowohl lesen, als auch schreiben, das Problem ist aber,
>dass beim Lesen die Ausgänge kurzzeitig alle auf low geschalten werden.
Ja logisch, das machst du doch selber!
>Hier mal der Codeausschnitt mit dem ich lese und schreibe (läuft zur
>zeit im main als endlosschleife ab (mit Delay, denn sonst klappern meine
>Relais):
> //READ
> I2C1_Start();
> I2C1_SendByte(0x40); //Schreibadresse
> I2C1_WaitAck();
> I2C1_SendByte(0xF0); //Eingangspins HIGH sezten --> auch bei 0xFF
> //bleibt der Fehler erhalten
???
Warums schreibst du, wenn der Kommentar sagt lesen? Und dass hier IMMER
deine Ausgänge LOW werden, sollte jeder sehen.
Wo ist das STOP?
> I2C1_WaitAck();
> I2C1_Start();
> I2C1_SendByte(0x41); //Leseadresse
> I2C1_WaitAck();
> input = I2C1_ReceiveByte();
> I2C1_NoAck();
> I2C1_Stop();
DAS ist das Lesen.
> new_input = (input) >> 4; //Eingelesene Daten direkt wieder ausgeben
Warum dann schieben? Lass es so wie es ist.
> I2C1_Start();
> I2C1_SendByte(0x40); //Schreibadresse
> while(I2C1_WaitAck());
> I2C1_SendByte(new_input);
> I2C1_Stop();
>Was übersehe ich?
Siehe oben. Man muss die Port P4-7 nur EINMAL mit 0xF beschreiben, die
bleiben dann high, wenn man es richtig macht. Eher so.
1 | my_i2c_write (uint8_t data) {
|
2 |
|
3 | I2C1_Start();
|
4 | I2C1_SendByte(0x40); //Schreibadresse
|
5 | I2C1_WaitAck();
|
6 | I2C1_SendByte(0xF0 | data); //P4-P7 Eingänge ->HIGH
|
7 | I2C1_Stop();
|
8 | }
|
9 |
|
10 | uint8_t my_i2c_read() {
|
11 |
|
12 | uint8_t input;
|
13 |
|
14 | I2C1_Start();
|
15 | I2C1_SendByte(0x41); //Leseadresse
|
16 | I2C1_WaitAck();
|
17 | input = I2C1_ReceiveByte();
|
18 | I2C1_NoAck();
|
19 | I2C1_Stop();
|
20 | return input;
|
21 | }
|