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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.