>die habe ich als Ausgang definiert.
>Kann ich trotzdem PINA verwenden?
Jein. Du kannst zwar über PINA den Zustand des Pins lesen, unabhängig
davon, ob der Pin als Ein- oder Ausgang definiert ist, aber was genau
dann da ansteht, wissen die Götter. I²C, und vermutlich auch dein
komischer E2-Bus, basiert auf wired and. Wenn da ein Busteilnehmer eine
Leitung auf Null zieht, muß die auch Null sein. Hochgehalten wird die
nur durch die 10k-Pull-Ups (die du hoffentlich auch eingebaut hast).
1 | temperature = -300; // default value (error code)
|
2 | E2Bus_start();
|
3 | E2Bus_send(0xA1); // MW2-low request
|
4 | if (check_ack()==ACK)
|
5 | {
|
6 | temp_low = E2Bus_read();
|
7 | ...
|
Der als Ausgang konfigurierte Pin SDA wird am Ende von E2Bus_send() auf
Null gesetzt, und zieht damit die Leitung auf Null, und damit dürften
dann nur noch Nullen gelesen werden.
Falls dieer E2-Bus ein I²C sein soll, ist sowieso die Logik (auch in dem
Beispiel im der Application note) falsch rum. Eine Leitung ist aktiv,
wenn sie aktiv auf Null gezogen wird, und nicht aktiv, wenn sie im
tri-state-Zustand ist.
Probier mal (ungetestet, daher selber mitdenken erwünscht):
1 | // in main.c
|
2 | DDRA &=~ ((1<<PA1) | (1<<PA2)); // default: Bus-Pins sind Eingänge
|
3 | PORTA = 0x00; // keine Pull ups für PA1 und PA2 einschalten
|
4 | // 10k-Pull-Up-Widerstände sind extern erforderlich !!!
|
5 |
|
6 | ...
|
7 |
|
8 | void set_SDA(void)
|
9 | {
|
10 | DDRA |= (1<<PA1); // setzt PA1 als Ausgang und zieht die Leitung auf Low
|
11 | }
|
12 |
|
13 | void clear_SDA(void)
|
14 | {
|
15 | DDRA &= ~(1<<PA1); // setzt PA1 als Eingang, damit hochohmig, und gibt die Leitung frei
|
16 | }
|
17 |
|
18 | bit read_SDA(void) // C kennt keinen Datentyp bit...
|
19 | {
|
20 | DDRA &= ~(1<<PA1); // setzt PA1 zur Sicherheit als Eingang, falls er das nicht schon ist
|
21 | //(da wäre dann aber ein Programmfehler an anderer Stelle)
|
22 |
|
23 | if (PINA &= (1<<PA1)) // liest den Leitungsstatus
|
24 | return 1;
|
25 | else
|
26 | return 0;
|
27 | }
|
28 |
|
29 | void set_SCL(void)
|
30 | {
|
31 | DDRA |= (1<<PA2); // setzt PA2 als Ausgang und zieht die Leitung auf Low}
|
32 |
|
33 | void clear_SCL(void)
|
34 | {
|
35 | DDRA &= ~(1<<PA2); // setzt PA2 als Eingang, damit hochohmig, und gibt die Leitung frei
|
36 | }
|
Oliver