Forum: Mikrocontroller und Digitale Elektronik Probleme mit PIC12F1840 und Temperatursensor DS18S20


von P. S. (fetter_homer)


Lesenswert?

Hallo zusammen,
ich bin gerade am verzweifeln: Ich kann einfach nicht die Temperatur aus 
dem Dallas DS18S20 mit meinem PIC12F1840 auslesen. Ich habe den 
Beispiel-Code, der bei dem Compiler mikroC pro for PIC dabei war, 
weitestgehend kopiert, bekomme aber als Temperatur immer nur "0000 0000 
1111 1111" ausgelesen (dadurch ist "testOut" immer eingeschaltet...
Den uC takte ich mit dem internen Oszillator mit 4 MHz.
1
#define testOut PORTA.F0
2
3
unsigned temp = 0;
4
5
void main() {
6
     ANSELA = 0;
7
     TRISA.F0 = 0;
8
9
     do{
10
        // Perform temperature reading
11
        Ow_Reset(&PORTA, 4);                         // Onewire reset signal
12
        Ow_Write(&PORTA, 4, 0xCC);                   // Issue command SKIP_ROM
13
        Ow_Write(&PORTA, 4, 0x44);                   // Issue command CONVERT_T
14
        Delay_us(120);
15
16
        Ow_Reset(&PORTA, 4);
17
        Ow_Write(&PORTA, 4, 0xCC);                   // Issue command SKIP_ROM
18
        Ow_Write(&PORTA, 4, 0xBE);                   // Issue command READ_SCRATCHPAD
19
20
        temp = Ow_Read(&PORTA, 4);
21
        temp = temp >> 1;                            //remove 0,5 degree
22
        
23
        //just testing the values
24
        if(temp == 127){
25
          testOut = 1;
26
          temp = 0;
27
        }
28
        else{
29
          testOut = 0;
30
        }
31
        Delay_ms(500);
32
     }while(1);
33
}

Hat jemand eine Idee oder gar Erfahrung damit?

Vielen Dank und freundliche Grüße
Peter

: Verschoben durch User
von Holger L. (max5v)


Lesenswert?

Ist ein Pullup angeschlossen ?
Außerdem steht im Datenblatt noch "Converts temperature in 750ms (max.)"
das fehlt mir ein wenig.

von P. S. (fetter_homer)


Lesenswert?

Hallo,
ja ein Pull-up von 4,7k ist angeschlossen. Auch habe ich deutlich 
größere Zeiten ausprobiert (1s oder auch 10s): Der Effekt ist der 
Gleiche. Habe die Zeit wieder zurückgesetzt auf den Wert, der auch in 
dem Beispiel eingestellt war...

Gruß
Peter

von Holger L. (max5v)


Lesenswert?

Das er richtig angeschlossen ist weißt du auch ?
Im Datenblatt von Dallas wird für die Grafik "BOTTOM VIEW" angegeben, 
nicht das du es vertauscht hast obwohl es im parasitären Modus egal ist.

Ich meine zwar das es funtionieren müßte aber versuch trotzdem mal die 
komplette Temperatur auszulesen :
temp =  Ow_Read(&PORTA, 4);
temp = (Ow_Read(&PORTA, 4) << 8) + temp;


Sonnst könntest du noch versuchen den kompletten Scratchpad auszulesen 
und den CRC auszuwerten.

: Bearbeitet durch User
von P. S. (fetter_homer)


Lesenswert?

Ich habe jetzt mal einen ganz anderen uC ausprobiert und damit 
funktioniert es einwandfrei (mit 750ms)...
Kann man irgendwo nachlesen, welche uC Eindraht-Kommunikation überhaupt 
unterstützen? Ich habe bei dem PIC12F1840 so meine Zweifel... Außerdem 
habe ich ihn jetzt anscheinend kaputt gekriegt :-(


> Ich meine zwar das es funtionieren müßte aber versuch trotzdem mal die
> komplette Temperatur auszulesen :
> temp =  Ow_Read(&PORTA, 4);
> temp = (Ow_Read(&PORTA, 4) << 8) + temp;
Was passiert hier? Das habe ich schon mal gesehen (und ausprobiert), 
aber erkenne den Sinn dahinter nicht? :-/
Mit dem anderen uC macht das überhaupt keinen Unterschied... Kann das 
überhaupt sein?

Danke schon mal für die Hilfe :-)

von Holger L. (max5v)


Lesenswert?

Ich komme aus der Avr - Welt, zu den Pics kann ich dir nichts sagen.
Aber im Prinzip sollte jeder µC oneWire beherrschen, da eigentlich 
nichts anderes gemacht wird als den Pin in definierten Zeitabständen 
high bzw. low zu schalten.
In wie fern deinen benutzten Funktionen mit dem Pic zusammenpassen mußt 
du herausfinden.

P. S. schrieb:
>> temp =  Ow_Read(&PORTA, 4);
>> temp = (Ow_Read(&PORTA, 4) << 8) + temp;
> Was passiert hier? Das habe ich schon mal gesehen (und ausprobiert),
> aber erkenne den Sinn dahinter nicht? :-/
> Mit dem anderen uC macht das überhaupt keinen Unterschied... Kann das
> überhaupt sein?

Die Temperatur wir in zwei Bytes ausgelesen (Byte 0 LSB, Byte 1 MSB), 
und anschließend durch Linksshiften zusammengesetzt.
Näheres dazu verrät dir das Datenblatt auf
Seite 4 - Table 1. Temperature/Data Relationship
Seite 7 - Figure 7. DS18S20 Memory Map

http://datasheets.maximintegrated.com/en/ds/DS18S20.pdf

von Kein Name (Gast)


Lesenswert?

>Ich habe jetzt mal einen ganz anderen uC ausprobiert...
Da ist ja der erste Verdacht, eine der vielen Alternate Pin Functions 
könnte noch aktiviert sein.

von P. S. (fetter_homer)


Lesenswert?

Ich habe jetzt den Code, der auf einem anderen uC lief, auf einem neuen 
PIC12F1840 ausprobiert, aber hier will er einfach nicht funktionieren...
Ich habe sämtliche alternativen Pin Funktionen überprüft und die sind 
soweit alle standardmäßig deaktiviert.
Ganz abstrus ist folgendes: Wenn ich den internen Oszillator auf 31 kHz 
stelle, läuft mein uC schneller, als wenn ich ihn auf 32 MHz 
einstelle...
Hier nochmal der Code:
1
#define manuellEin PORTA.F3
2
#define testOut PORTA.F0
3
#define testOut2 PORTA.F2
4
5
unsigned temp = 0;
6
7
void main(){
8
     ANSELA = 0;
9
     TRISA = 0;
10
     
11
     PORTA = 0;
12
     LATA = 0;
13
14
     do{
15
        //Perform temperature reading
16
        Ow_Reset(&PORTA, 1);                         // Onewire reset signal
17
        Ow_Write(&PORTA, 1, 0xCC);                   // Issue command SKIP_ROM
18
        Ow_Write(&PORTA, 1, 0x44);                   // Issue command CONVERT_T
19
        Delay_ms(750);
20
21
        Ow_Reset(&PORTA, 1);
22
        Ow_Write(&PORTA, 1, 0xCC);                   // Issue command SKIP_ROM
23
        Ow_Write(&PORTA, 1, 0xBE);                   // Issue command READ_SCRATCHPAD
24
25
        temp = Ow_Read(&PORTA, 1);                   //Daten werden von uC-internem Schieberesgister (einzelne Bytes!) gelesen. Erst LSB, dann MSB.
26
        //temp = (Ow_Read(&PORTA, 1) << 8) + temp;
27
        temp = temp >> 1;                            //remove 0,5 degree
28
29
        if(temp == 127){
30
          testOut = 1;   //LED leuchtet immer...
31
        }
32
        else{
33
          testOut = 0;
34
        }
35
        
36
        if(manuellEin){
37
          testOut2 = 1;
38
        }
39
        else{
40
          testOut2 = 0;
41
        }
42
     }while(1);
43
}

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.