Forum: Mikrocontroller und Digitale Elektronik LM75 - C - MPLAB C18


von Michael *. (michael95)


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
}

von J. K. (psoc)


Lesenswert?

Wie wär's wenn Du gleich mal die erste Zeile korrigierst? Soll wohl eine 
Funktion sein; muss dann auch als Funktion definiert werden.
PSoC.

von Michael *. (michael95)


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
}

von Michael *. (michael95)


Lesenswert?

ich versteh das nicht, mit dem 18F4550 geht das einwandfrei. Der hängt 
sich au net auf oder ähnliches -.-

von Michael *. (michael95)


Lesenswert?

ich hab jetzt hier das noch übernommen:
Beitrag "I2C am Pic18f2550 läuft nicht an"

Trotzdem leufts nicht

von holger (Gast)


Lesenswert?

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

von Michael *. (michael95)


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!

von Michael *. (michael95)


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
}

von Michael *. (michael95)


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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.