LM75 - C - MPLAB C18

OP #1533029
Lesenswert?

Hallo,
Ich möchte mit einem PIC18F2550 über I²C den LM75 ansprechen. Ich 
benutze den Compiler von MPLAB C18.
Wenn ich beim Oszi schaue leuft über I²C nichts.
Ich hab mir den Code aus verschidenen beiträgen die ich im Internet 
gefunden habe zusammengepusselt.

Die zweite ausgabe (printLCD(": ";)) erscheint nicht auf dem Display. 
ratlos

PS: Ja ich weis das ich das noch berechnen muss, aber befor ich keinen 
Wert habe kann ich au nichts berechnen!
PPS: Wäre net wenn einr mir kurz zeigt wie man des noch berechnet :D

Danke im Vorraus!
1
char GetTempLM75 (void)
2
{
3
  char LM75_Temperatur1 = 0;
4
  char LM75_Temperatur2 = 0;
5
  char addr = 0b1001001;
6

7
  OpenI2C(MASTER, SLEW_ON);  // Master, for 400kHz mode
8
  SSPADD = 18;        // 400kHz
9
  IdleI2C();
10
  StartI2C();
11
  IdleI2C();
12
  putcI2C(addr);
13
  IdleI2C();
14
  if (SSPCON2bits.ACKSTAT)
15
  {
16
    StopI2C();
17
    return 0;
18
  }
19
  LM75_Temperatur1 = getcI2C();
20
  LM75_Temperatur2 = getcI2C();
21
  IdleI2C();
22
  if (SSPCON2bits.ACKSTAT)
23
  {
24
    StopI2C();
25
    return 0;
26
  }
27
  StopI2C();
28
  CloseI2C();
29
  return LM75_Temperatur2;
30
}
31

32

33
void main (void)
34
{
35
  char TempLM75;
36

37
  TRISA = 0x00;    // PORT A ist ein Ausgang
38
  TRISB = 0x00;    // PORT B ist ein Ausgang
39
  TRISBbits.TRISB0 = 1;  // Pin 0 an PORT B ist ein Eingang
40
  TRISBbits.TRISB1 = 1;  // Pin 1 an PORT B ist ein Eingang
41
  TRISC = 0xFF;    // PORT C ist ein Eingang
42
  TRISCbits.TRISC7 = 0;  // PIN 7 an PORT C ist ein Ausgang
43

44
  
45
  LATA = 0x00;
46
  LATB = 0x00;
47
  LATC = 0x00;
48

49
  config_LCD();          // LCD Konfigurieren
50
  Delay10KTCYx(200);     // Warten, dass ich am Oszi eindeutig sehe wenn was passiert
51
  printLCD("Temperatur"); // Ausgabe auf dem LCD
52
  TempLM75 = GetTempLM75(); // Temperatur herrausfinden
53
        printLCD(": ");           // Zweite Ausgabe
54
  sendLCD(TempLM75);        // Varialbe am Display ausgeben
55
  while (1);
56
}
OP #1533244
Lesenswert?

Meinst du so, oder wie?
1
char GetTempLM75 (void);
2

3
char GetTempLM75 (void)
4
{
5
  char LM75_Temperatur1 = 0;
6
  char LM75_Temperatur2 = 0;
7
  char addr = 0b1001001;
8

9
  OpenI2C(MASTER, SLEW_ON);  // Master, for 400kHz mode
10
  SSPADD = 18;        // 400kHz
11
  IdleI2C();
12
  StartI2C();
13
  IdleI2C();
14
  putcI2C(addr);
15
  IdleI2C();
16
  if (SSPCON2bits.ACKSTAT)
17
  {
18
    StopI2C();
19
    return 0;
20
  }
21
  LM75_Temperatur1 = getcI2C();
22
  LM75_Temperatur2 = getcI2C();
23
  IdleI2C();
24
  if (SSPCON2bits.ACKSTAT)
25
  {
26
    StopI2C();
27
    return 0;
28
  }
29
  StopI2C();
30
  CloseI2C();
31
  return LM75_Temperatur2;
32
}
33

34

35
void main (void)
36
{
37
  char TempLM75;
38

39
  TRISA = 0x00;    // PORT A ist ein Ausgang
40
  TRISB = 0x00;    // PORT B ist ein Ausgang
41
  TRISBbits.TRISB0 = 1;  // Pin 0 an PORT B ist ein Eingang
42
  TRISBbits.TRISB1 = 1;  // Pin 1 an PORT B ist ein Eingang
43
  TRISC = 0xFF;    // PORT C ist ein Eingang
44
  TRISCbits.TRISC7 = 0;  // PIN 7 an PORT C ist ein Ausgang
45

46
  
47
  LATA = 0x00;
48
  LATB = 0x00;
49
  LATC = 0x00;
50

51
  config_LCD();          // LCD Konfigurieren
52
  Delay10KTCYx(200);     // Warten, dass ich am Oszi eindeutig sehe wenn was passiert
53
  printLCD("Temperatur"); // Ausgabe auf dem LCD
54
  TempLM75 = GetTempLM75(); // Temperatur herrausfinden
55
        printLCD(": ");           // Zweite Ausgabe
56
  sendLCD(TempLM75);        // Varialbe am Display ausgeben
57
  while (1);
58
}
OP #1534735
Lesenswert?

holger schrieb:
> Hast du die Analogfunktionen von PORTB abgeschaltet?
> PBADEN in CONFIG3H auf 0 gesetzt? Oder ADCON1 richtig gesetzt?

Nein hatte ich nicht, eingestellt -> LEUFT :D JUHU!
Bei dem 18F4550 wars au eingestellt, deswegen liefs da au, jetzt leufts 
aber auch aufm anderm :D

Jetzt müsst ich nur noch wissen wie ich die werte bearbete xD
Wäre nett wenn mir das einer kurz erleutern würde!

PS: JUHU!
OP #1536293
Lesenswert?

Ich rufe mit der Funktion "menu" die Funktion "GetTempLM75" auf und gebe 
die Temeperatur auf dem LCD aus, aber die Temperatur stimmt nicht, sie 
beträgt bei zimmertemperatur 50 (Für Celcius zu hoch ^^, und bei 
fahrenheit wären das ca 10°C). Dazu kommt das manchmal die zahl mit der 
rundenangabe erst wieder erscheint wenn ich mit dem oszi an die 
SDA-Leitung herankomme.

HILFE!
1
void menu (void)
2
{
3
  int i = 0;
4
  char round[5];
5
  char c_temperatur[21];
6
  unsigned int LM75_temperatur;
7
  
8
  while (1)
9
  {
10
    printLCD ("\t------- Menu -------");
11
    printLCD ("Temperatur:  ");
12
    LM75_temperatur = GetTempLM75();
13
    sprintf (c_temperatur, "%d", LM75_temperatur);
14
    sendLCD(c_temperatur);
15
    printLCD ("\nRound:   ");
16
    sprintf (round, "%d", i);
17
    sendLCD (round);
18
    Delay10KTCYx(200);
19
    i++;
20
  }
21
}
22

23
unsigned int GetTempLM75 (void)
24
{
25
  char LM75_Temperatur1;
26
  char LM75_Temperatur2;
27
  char addr = 0b10010001;
28
  unsigned int return_value;
29
  
30

31
  SSPSTATbits.CKE = 1;    //enable SMBus specific inputs
32
  SSPCON1 = 0x38;      //I²C Master Mode, SSPEN enable
33
  SSPADD = 18;        // 400kHz bei 20MHz Quartz
34
  OpenI2C(MASTER, SLEW_ON);  // Master, for 400kHz mode
35
  
36

37
  IdleI2C();
38
  StartI2C();
39
  IdleI2C();
40
  putcI2C(addr);
41
  IdleI2C();
42
  if (SSPCON2bits.ACKSTAT)
43
  {
44
    StopI2C();
45
    return 0;
46
  }
47
  LM75_Temperatur1 = getcI2C();
48
  LM75_Temperatur2 = getcI2C();
49
  IdleI2C();
50
  if (SSPCON2bits.ACKSTAT)
51
  {
52
    StopI2C();
53
    return 0;
54
  }
55
  StopI2C();
56
  CloseI2C();
57
  
58
  return_value = LM75_Temperatur1 << 1;
59
  LM75_Temperatur2 = LM75_Temperatur2 >> 7;
60
  return_value = return_value | LM75_Temperatur2;
61
  return return_value;
62
}
OP #1537826
Lesenswert?

Ich habe bemerkt das er bei der zweiten abfrage hängen bleibt, wenn ich 
diese ausklammer und den ersten wert direkt ausgeben kommt die korrekte 
zimmertemperatur raus.
Nun leufts au stabil!
Wie bekomm ich dann die Kommastelle raus?
1
unsigned int GetTempLM75 (void)
2
{
3
  char LM75_Temperatur1;
4
  char LM75_Temperatur2;
5
  char addr = 0b10010001;
6
  unsigned int return_value;
7
  
8

9
  SSPADD = 18;        // 400kHz bei 20MHz Quartz
10
  OpenI2C(MASTER, SLEW_ON);  // Master, XXX
11
  
12
  IdleI2C();
13
  StartI2C();
14
  IdleI2C();
15
  putcI2C(addr);
16
  IdleI2C();
17
  if (SSPCON2bits.ACKSTAT)
18
  {
19
    StopI2C();
20
    return 0;
21
  }
22
  LM75_Temperatur1 = getcI2C();
23
  IdleI2C();
24
  //LM75_Temperatur2 = getcI2C();      // Zweiter Wert
25
  IdleI2C();
26
  if (SSPCON2bits.ACKSTAT)
27
  {
28
    StopI2C();
29
    return 0;
30
  }
31
  StopI2C();
32
  CloseI2C();
33
  
34
  
35
  //return_value = LM75_Temperatur1 << 1;
36
  //LM75_Temperatur2 = LM75_Temperatur2 >> 8;
37
  //return_value = return_value | LM75_Temperatur2;
38
  //return return_value;
39

40
  return LM75_Temperatur1;         // Ersten Wert direkt ausben
41
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren