Hallo,
hier die Ausschnitte aus meinem Programm, die mit dem i2c zu tun haben:
Wie gesagt, ich nutze die i2c lib von Peter Fleury, die poste ich jetzt
nicht komplett...die Header fehlen auch und das ganz Unwichtige habe ich
aus der Main gestrichen.
Ich habe mir die Signale von SDA und SCL mit dem OSZI angeschaut. Falls
sinnvoll, kann ich gerne Bilder Posten.
Die Signale sahen recht vernünftig aus. Nur der geringe Pegel von SDA
hat mich etwas gewundert. (nur 1,5 V bei 5V VCC; SCL ist sauber auf 5V)
Wie schon vermutet, ist der Controller also wohl doch nicht im Eimer.
Zu den Wiederständen: Ich hatte bisher 10k angeschlossen und habe es
jetzt nochmal mit 5k versucht...leider ohne Erfolg. Kondensatoren sind
nicht im Bus.
Die Verbindung zwischen uC und Sensor ist mit normalen Einzeladern
verdrahtet. Dafür aber auch nur ca. 5cm lang. (Testboard)
***i2c_hyd_temp***
1 | #include <avr/io.h>
|
2 | #include "i2cmaster.h"
|
3 | #include "i2c_hyd_temp.h"
|
4 | #include "rtc.h"
|
5 | #define ADR_HYD 0x50
|
6 |
|
7 | //volatile unsigned char TempCurrent;
|
8 | //volatile unsigned char RLFCurrent;
|
9 |
|
10 |
|
11 | _Bool getSensVal(void)
|
12 | {
|
13 | int receive[4]; //receive-array
|
14 | int RLF_raw;
|
15 | int Temp_raw;
|
16 |
|
17 | i2c_start(ADR_HYD+I2C_SEND);
|
18 |
|
19 | //delay einfügen? TODO: schauen ob warten notwendig evtl. wait_i2c(1); implementieren
|
20 | time_out_i2c = 0;
|
21 | while(time_out_i2c < 150){} //150ms warten (versuch bei debugging)
|
22 |
|
23 |
|
24 | i2c_start(ADR_HYD+I2C_READ);
|
25 |
|
26 | receive[0] = i2c_readAck();
|
27 | if (receive[0] &= 0x40 == 0)
|
28 | {
|
29 |
|
30 | receive[1] = i2c_readAck();
|
31 | receive[2] = i2c_readAck();
|
32 | receive[3] = i2c_readNak();
|
33 | i2c_stop();
|
34 |
|
35 | RLF_raw = (receive[1] & (receive[0] << 8));
|
36 | RLFCurrent = (RLF_raw >> 2)/163.83;
|
37 | Temp_raw = (receive[3] & (receive[2] << 8));
|
38 | TempCurrent = (Temp_raw >> 2)/99.2909-40;
|
39 | return TRUE;
|
40 |
|
41 |
|
42 |
|
43 | }
|
44 | else
|
45 | {
|
46 | i2c_stop();
|
47 | return FALSE;
|
48 | }
|
49 |
|
50 | }
|
Da ich erst heute ein Display integriert habe, wird in dieser Version
nur über LEDs angezeigt, ob der Messwert (i2c) ungleich oder gleich null
ist.
***main***
1 | #include <avr/io.h>
|
2 | #include "rtc.h"
|
3 | #include <avr/interrupt.h>
|
4 | #include "i2c_hyd_temp.h"
|
5 | #include "i2cmaster.h"
|
6 |
|
7 |
|
8 | //#define fosc 12288000UL
|
9 |
|
10 | #ifndef F_CPU
|
11 | #define F_CPU 12288000UL
|
12 | #endif
|
13 |
|
14 |
|
15 | int main(void)
|
16 | {
|
17 |
|
18 | init_Timers();
|
19 | i2c_init();
|
20 | sei();
|
21 | unsigned char sekAlt = 0;
|
22 | DDRD = (1<<PD0) | (1<<PD1) | (1<<PD5);
|
23 | while(1)
|
24 | {
|
25 | if (Uhrzeit.Sekunden > sekAlt)
|
26 | {
|
27 | /*
|
28 | if (!getSensVal())
|
29 | {
|
30 | sekAlt++;
|
31 | }
|
32 | else
|
33 | {
|
34 | */
|
35 | sekAlt = sekAlt+3;
|
36 | //}
|
37 |
|
38 | getSensVal();//für debugging
|
39 |
|
40 |
|
41 | if (TempCurrent == 0)
|
42 | {
|
43 | PORTD |= (1<<PD0);//für debugging
|
44 | }
|
45 | else
|
46 | {
|
47 | PORTD |= (1<<PD1);//für debugging
|
48 | }
|
49 |
|
50 | }
|
51 |
|
52 | }
|
53 | return 1;
|
54 | }
|