PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei PIC16F877A



Scuido
13.02.2008, 18:21
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é



/********************************* 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;
}
/************************************************** ***********************************************/

StEndres
14.02.2008, 12:15
Hallo,

erst mal zur Hardware:

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

Scuido
15.02.2008, 14:03
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

StEndres
16.02.2008, 08:25
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)

Scuido
16.02.2008, 10:29
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

StEndres
16.02.2008, 14:37
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.

Scuido
20.02.2008, 13:19
hey, danke für die antwort. nun funktioniert es.

gruß
Andé