www.mikrocontroller.net

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


Autor: Michael ** (michael95)
Datum:

Bewertung
0 lesenswert
nicht 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!
char GetTempLM75 (void)
{
  char LM75_Temperatur1 = 0;
  char LM75_Temperatur2 = 0;
  char addr = 0b1001001;

  OpenI2C(MASTER, SLEW_ON);  // Master, for 400kHz mode
  SSPADD = 18;        // 400kHz
  IdleI2C();
  StartI2C();
  IdleI2C();
  putcI2C(addr);
  IdleI2C();
  if (SSPCON2bits.ACKSTAT)
  {
    StopI2C();
    return 0;
  }
  LM75_Temperatur1 = getcI2C();
  LM75_Temperatur2 = getcI2C();
  IdleI2C();
  if (SSPCON2bits.ACKSTAT)
  {
    StopI2C();
    return 0;
  }
  StopI2C();
  CloseI2C();
  return LM75_Temperatur2;
}


void main (void)
{
  char TempLM75;

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

  
  LATA = 0x00;
  LATB = 0x00;
  LATC = 0x00;

  config_LCD();          // LCD Konfigurieren
  Delay10KTCYx(200);     // Warten, dass ich am Oszi eindeutig sehe wenn was passiert
  printLCD("Temperatur"); // Ausgabe auf dem LCD
  TempLM75 = GetTempLM75(); // Temperatur herrausfinden
        printLCD(": ");           // Zweite Ausgabe
  sendLCD(TempLM75);        // Varialbe am Display ausgeben
  while (1);
}

Autor: J. K. (psoc)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael ** (michael95)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meinst du so, oder wie?
char GetTempLM75 (void);

char GetTempLM75 (void)
{
  char LM75_Temperatur1 = 0;
  char LM75_Temperatur2 = 0;
  char addr = 0b1001001;

  OpenI2C(MASTER, SLEW_ON);  // Master, for 400kHz mode
  SSPADD = 18;        // 400kHz
  IdleI2C();
  StartI2C();
  IdleI2C();
  putcI2C(addr);
  IdleI2C();
  if (SSPCON2bits.ACKSTAT)
  {
    StopI2C();
    return 0;
  }
  LM75_Temperatur1 = getcI2C();
  LM75_Temperatur2 = getcI2C();
  IdleI2C();
  if (SSPCON2bits.ACKSTAT)
  {
    StopI2C();
    return 0;
  }
  StopI2C();
  CloseI2C();
  return LM75_Temperatur2;
}


void main (void)
{
  char TempLM75;

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

  
  LATA = 0x00;
  LATB = 0x00;
  LATC = 0x00;

  config_LCD();          // LCD Konfigurieren
  Delay10KTCYx(200);     // Warten, dass ich am Oszi eindeutig sehe wenn was passiert
  printLCD("Temperatur"); // Ausgabe auf dem LCD
  TempLM75 = GetTempLM75(); // Temperatur herrausfinden
        printLCD(": ");           // Zweite Ausgabe
  sendLCD(TempLM75);        // Varialbe am Display ausgeben
  while (1);
}

Autor: Michael ** (michael95)
Datum:

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

Autor: Michael ** (michael95)
Datum:

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

Trotzdem leufts nicht

Autor: holger (Gast)
Datum:

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

Autor: Michael ** (michael95)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael ** (michael95)
Datum:

Bewertung
0 lesenswert
nicht 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!
void menu (void)
{
  int i = 0;
  char round[5];
  char c_temperatur[21];
  unsigned int LM75_temperatur;
  
  while (1)
  {
    printLCD ("\t------- Menu -------");
    printLCD ("Temperatur:  ");
    LM75_temperatur = GetTempLM75();
    sprintf (c_temperatur, "%d", LM75_temperatur);
    sendLCD(c_temperatur);
    printLCD ("\nRound:   ");
    sprintf (round, "%d", i);
    sendLCD (round);
    Delay10KTCYx(200);
    i++;
  }
}

unsigned int GetTempLM75 (void)
{
  char LM75_Temperatur1;
  char LM75_Temperatur2;
  char addr = 0b10010001;
  unsigned int return_value;
  

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

  IdleI2C();
  StartI2C();
  IdleI2C();
  putcI2C(addr);
  IdleI2C();
  if (SSPCON2bits.ACKSTAT)
  {
    StopI2C();
    return 0;
  }
  LM75_Temperatur1 = getcI2C();
  LM75_Temperatur2 = getcI2C();
  IdleI2C();
  if (SSPCON2bits.ACKSTAT)
  {
    StopI2C();
    return 0;
  }
  StopI2C();
  CloseI2C();
  
  return_value = LM75_Temperatur1 << 1;
  LM75_Temperatur2 = LM75_Temperatur2 >> 7;
  return_value = return_value | LM75_Temperatur2;
  return return_value;
}

Autor: Michael ** (michael95)
Datum:

Bewertung
0 lesenswert
nicht 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?
unsigned int GetTempLM75 (void)
{
  char LM75_Temperatur1;
  char LM75_Temperatur2;
  char addr = 0b10010001;
  unsigned int return_value;
  

  SSPADD = 18;        // 400kHz bei 20MHz Quartz
  OpenI2C(MASTER, SLEW_ON);  // Master, XXX
  
  IdleI2C();
  StartI2C();
  IdleI2C();
  putcI2C(addr);
  IdleI2C();
  if (SSPCON2bits.ACKSTAT)
  {
    StopI2C();
    return 0;
  }
  LM75_Temperatur1 = getcI2C();
  IdleI2C();
  //LM75_Temperatur2 = getcI2C();      // Zweiter Wert
  IdleI2C();
  if (SSPCON2bits.ACKSTAT)
  {
    StopI2C();
    return 0;
  }
  StopI2C();
  CloseI2C();
  
  
  //return_value = LM75_Temperatur1 << 1;
  //LM75_Temperatur2 = LM75_Temperatur2 >> 8;
  //return_value = return_value | LM75_Temperatur2;
  //return return_value;

  return LM75_Temperatur1;         // Ersten Wert direkt ausben
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.