- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 7 von 7

Thema: Hilfe bei PIC16F877A

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.02.2008
    Ort
    Süderstapel
    Alter
    38
    Beiträge
    23

    Hilfe bei PIC16F877A

    Hallo,

    kann mir irgendjemand helfen?? Habe das halbe Forum auf den Kopf
    gestellt und nix zum LM75 mit PIC16F877A gefunden.

    Mein Problem, ich möchte nur eine I²C verbindung herstellen. Der Pic
    soll nur die Temp ohne "0,5" und ohne "-" auslesen. Ich bekomme aber
    noch nichteinmal ne reaktion vom LM75. Ich weiß nicht mehr weiter. Habe
    da wohl anscheind irgendetwas nicht verstanden

    Mein Compiler CC5X

    Danke schonmal im voraus.

    Gruß
    André


    Code:
    /********************************* Include ********************************************************/
    #include <C:\cc5\16F877A.H>
    #include <C:\cc5\delay20.c>
    /********************************* Globale Variabeln **********************************************/
    
    
    /********************************* Funktion *******************************************************/
    void main(void)
    {
    /////////////////////******************** Var ***********************///////////////////////////////
    char h_byte;
    
    
    /////////////////////******************** I/O ***********************///////////////////////////////
    TRISB = 0b.0000.0000;
    TRISC = 0b.1111.1111;
    
    /////////////////////***************** Einstellen der Werte ********************///////////////////////////////
    PORTB = 0;
    
    SSPADD = 12;             // für I²C -> bei 20MHz = 385kHz
    SSPCON = 0b.00001000;    // für master-mode
    SSPEN = 1;
    
    anfang:
    /////////////////////******************** Schleife ******************///////////////////////////////
    /*  Pointer ausrichten  */
    
    SSPIF = 0;      
    SEN = 1;        // // // // // // //
    while(!SSPIF);  // Bus übernehmen //
    SSPIF = 0;      // // // // // // //
    
    SSPBUF = 0x90;  // // // // // // //
    while(!SSPIF);  // LM75 Adresse
    SSPIF = 0;      // // // // // // //
    
    SSPBUF =  0;    // // // // // // //
    while(!SSPIF);  // Temp addressieren
    SSPIF = 0;      // // // // // // //
    
    PEN = 1;        // // // // // // //
    while(!SSPIF);  // Bus freigeben
    SSPIF = 0;      // // // // // // //
    
    /* Byte des Pointers auslesen */
    
    SEN = 1;        // // // // // // //
    while(!SSPIF);  // Bus übernehmen //
    SSPIF = 0;      // // // // // // //
    
    SSPBUF = 0x91;  // // // // // // // // // // // // //
    while(!SSPIF);  // LM75 Adresse mit Leseanweisung   //
    SSPIF = 0;      // // // // // // // // // // // // //
    
    RCEN = 1;       // // // // // // // // // // // // //
    while(!SSPIF);  // LM75 "starte" lesen              //
    SSPIF = 0;      // // // // // // // // // // // // //
    h_byte = SSPBUF;
    
    PEN = 0;         // // // // // // // // // // // // //
    while(!SSPIF);  // Bus freigeben                    //
    SSPIF = 0;      // // // // // // // // // // // // //
    
    PORTB = h_byte;
    
    Delay1ms(100);
    goto anfang;
    }
    /*************************************************************************************************/

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.01.2005
    Beiträge
    127
    Hallo,

    erst mal zur Hardware:

    alles richtig angeschlossen, mit richtig dimensionierten Pull-Up-Widerständen?

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    03.02.2008
    Ort
    Süderstapel
    Alter
    38
    Beiträge
    23
    Hey,
    also ich habe alles richtig angeschlossen, habs sicherhaltshalber nochmal überprüft. als pullup habe ich jeweils 2K genommen eigentlich sollen 1,8 k sein, aber das dürfte ja normalerweise nicht das problem sein.

    merkwürdig ist, dass er das SSPIF bit nie richtig setzt. hatte zur kontrolle if's dazwischengesetzt(wenn SSPIF == 1 erfolgreich... sonst nicht erfolgreich..., auf display ausgegeben). Aber selbst dort ist er immer in jede if gegangen.

    freue mich über jeden ratschlag.

    gruß
    Andre

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.01.2005
    Beiträge
    127
    Könnte sein, dass du die PINs für I²C auf Ausgang stellen musst. Probiers einfach mal. Im Datenblatt steht das etwas unklar. Hast du ein Oszilloskop?

    Unten in deinem Code schreibst du mal PEN=0. Sollte aber PEN=1 sein, oder?
    Was für eine Adresse hat der Sensor genau? (in Dezimalschreibweise)

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    03.02.2008
    Ort
    Süderstapel
    Alter
    38
    Beiträge
    23
    hey,
    also soweit ich das verstanden habe ist das bit PEN dafür da, den bus wieder freizugeben und das bit SEN ihn wieder einzuschalten. ein oszi habe ich leider nicht.

    leider bin ich noch nicht zuhause, aber ich werde heute abend nochmal schreiben was ich nun alles genau habe.

    danke schomal für die antwort.

    gruß
    andre

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.01.2005
    Beiträge
    127
    Um den BUS freizugeben musst du PEN aber auf 1 setzen und nicht auf 0. Im letzten Abschnitt setzt du PEN=0. Dadurch blockierts du dir den BUS. Durch deine Schleife siehst du dann am Display nicht, dass es einmal funktioniert hat, weil du das durch die Fehlermeldung wieder überschreibst.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    03.02.2008
    Ort
    Süderstapel
    Alter
    38
    Beiträge
    23
    hey, danke für die antwort. nun funktioniert es.

    gruß
    Andé

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen