mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von P. S. (fetter_homer)


Bewertung
0 lesenswert
nicht 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.
#define testOut PORTA.F0

unsigned temp = 0;

void main() {
     ANSELA = 0;
     TRISA.F0 = 0;

     do{
        // Perform temperature reading
        Ow_Reset(&PORTA, 4);                         // Onewire reset signal
        Ow_Write(&PORTA, 4, 0xCC);                   // Issue command SKIP_ROM
        Ow_Write(&PORTA, 4, 0x44);                   // Issue command CONVERT_T
        Delay_us(120);

        Ow_Reset(&PORTA, 4);
        Ow_Write(&PORTA, 4, 0xCC);                   // Issue command SKIP_ROM
        Ow_Write(&PORTA, 4, 0xBE);                   // Issue command READ_SCRATCHPAD

        temp = Ow_Read(&PORTA, 4);
        temp = temp >> 1;                            //remove 0,5 degree
        
        //just testing the values
        if(temp == 127){
          testOut = 1;
          temp = 0;
        }
        else{
          testOut = 0;
        }
        Delay_ms(500);
     }while(1);
}

Hat jemand eine Idee oder gar Erfahrung damit?

Vielen Dank und freundliche Grüße
Peter

: Verschoben durch Moderator
von Holger L. (max5v)


Bewertung
1 lesenswert
nicht 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)


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


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


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


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


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


Bewertung
0 lesenswert
nicht 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:
#define manuellEin PORTA.F3
#define testOut PORTA.F0
#define testOut2 PORTA.F2

unsigned temp = 0;

void main(){
     ANSELA = 0;
     TRISA = 0;
     
     PORTA = 0;
     LATA = 0;

     do{
        //Perform temperature reading
        Ow_Reset(&PORTA, 1);                         // Onewire reset signal
        Ow_Write(&PORTA, 1, 0xCC);                   // Issue command SKIP_ROM
        Ow_Write(&PORTA, 1, 0x44);                   // Issue command CONVERT_T
        Delay_ms(750);

        Ow_Reset(&PORTA, 1);
        Ow_Write(&PORTA, 1, 0xCC);                   // Issue command SKIP_ROM
        Ow_Write(&PORTA, 1, 0xBE);                   // Issue command READ_SCRATCHPAD

        temp = Ow_Read(&PORTA, 1);                   //Daten werden von uC-internem Schieberesgister (einzelne Bytes!) gelesen. Erst LSB, dann MSB.
        //temp = (Ow_Read(&PORTA, 1) << 8) + temp;
        temp = temp >> 1;                            //remove 0,5 degree

        if(temp == 127){
          testOut = 1;   //LED leuchtet immer...
        }
        else{
          testOut = 0;
        }
        
        if(manuellEin){
          testOut2 = 1;
        }
        else{
          testOut2 = 0;
        }
     }while(1);
}

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.