Forum: Mikrocontroller und Digitale Elektronik DS18B20 Tempsensor mit PIC18F - Oszillatorprobleme?


von danny (Gast)


Lesenswert?

Hallo zusammen,

ich versuche grade einen DS18B20 Temperatursensor mit einem PIC18F2550 
anzusprechen. Was Mikrocontroller angeht bin ich noch realtiv 
unerfahren.
Der Sensor ist mit einem 4,7k Pullup Widerstand zwischen Vdd und DQ des 
Sensors angeschlossen.

Ich wollte das Rad nicht neu erfinden und habe mich dabei an dem Code 
von 
http://www.dutchforce.com/~eforum/index.php?showtopic=43185&st=0&pid=381093 
gehalten. Die dort beschriebene LCD Funktionalität nutze ich nicht.. Ich 
möchte den internen Oszillator nutzen.

Zunächst hat der DS18B20 auf den onewire_reset nicht mit einem presence 
pulse reagiert. Nachdem ich _XTAL_FREQ auf 480000 runtergesetzt habe 
(vorher 4800000) funktionierte der onewire_reset() solange der Sensor 
angeschlossen ist, also scheint der Sensor mit dem presence pulse zu 
antworten. Das macht soweit Sinn, da die Kommunikation mit dem 
Tempsensor laut Datenblatt ziemlich genau getaktet ist und vorher wohl 
nicht stimmig war.

Die Idee kam mir, als __delay_us(x) nicht die erwartete Verzögerung 
lieferte. Also habe ich die Frequenz angepasst bis es passte. :-/

Die Temperatur wird trotzdem nicht gemessen, entweder der onewire_write 
und/oder onewire_read klappen nicht.

Ich kann jetzt z.B. eine LED mit folgendem Codeschnipsel im Sekundentakt 
blinken lassen:
1
while(1){
2
PORTCbits.RC2 = 1;
3
for (j=0;j<10000; j++) {__delay_us(100);}
4
PORTCbits.RC2 = 0;
5
for (j=0;j<10000; j++) {__delay_us(100);}
6
}
Trotzdem fällt mir eine leichte Ungenauigkeit auf nach ca 30 Sekunden.

Wenn ich den delay_us jetzt auf 1000 erhöhe und einen 10 Sekundentakt 
erwarte, blinkt die LED im 6 Sekundentakt.

Meine Vermutung ist, dass ich mich ganz übel mit der Frequenz des PIC 
verrannt habe. Dadurch klappt in dieser Konstallation der onewire_reset, 
aber nicht die read und write Funktionen, die noch genauer getaktet 
sind.

Ich verwende MPLAB X mit dem XC8 Compiler. Folgender Codeausschnitt 
enthält meine Konfiguration:
1
#include "p18f2550.h" 
2
#include <xc.h>
3
#include <delays.h>
4
#define _XTAL_FREQ 480000
5
6
#pragma config FOSC     = INTOSC_EC
7
#pragma config WDT      = OFF
8
#pragma config LVP      = OFF
9
#pragma config BOR      = OFF
10
#pragma config MCLRE    = ON
11
#pragma config PWRT     = ON
12
#pragma config PBADEN   = OFF
13
14
#include <stdio.h>
15
#include <stdlib.h>
16
#include <string.h>
17
#include "onewire.h"

Kann es sein das das Problem durch die falsche Frequenz ausgelöst wird? 
Ich habe schon verschiedene Kombinationen ausprobiert, vielleicht sehe 
ich den Wald vor lauter Bäumen nicht mehr. :-/
Wenn jemand eine Idee hat was ich falsch mache wäre ich sehr dankbar :-)

Für Denkanstöße und alternative Wege den Sensor mit dem PIC ans laufen 
zu bekommen bin ich natürlich offen.

Vielen Dank schonmal im Voraus

Danny :-)

von Stefan (Gast)


Lesenswert?

Der Interne Takt ist 8 MHz.

von Max H. (hartl192)


Lesenswert?

danny schrieb:
> Wenn jemand eine Idee hat was ich falsch mache wäre ich sehr dankbar :-)
Ich würde das Kapitel "2.0 OSCILLATOR CONFIGURATIONS" im Datenblatt 
ansehen und nicht nur versuchen die eingestellte CPU-Frequenz zu 
erraten.


Stefan schrieb:
> Der Interne Takt ist 8 MHz.
Wenn er das OSCCON nicht anrührt, wird der aber durch 8 geteilt, also 
wird die CPU mit 1MHz getaktet.

: Bearbeitet durch User
von danny (Gast)


Lesenswert?

Max H. schrieb:
> Ich würde das Kapitel "2.0 OSCILLATOR CONFIGURATIONS" im Datenblatt
> ansehen und nicht nur versuchen die eingestellte CPU-Frequenz zu
> erraten.

Das Kapitel war meine erste Anlaufstelle, aber ich konnte die relevanten 
Informationen nicht finden. Wie kann ich denn zuverlässig messen, welche 
Frequenz eingestellt ist? Oder ob der delay richtig bemessen ist?

Max H. schrieb:
> Stefan schrieb:
>> Der Interne Takt ist 8 MHz.
> Wenn er das OSCCON nicht anrührt, wird der aber durch 8 geteilt, also
> wird die CPU mit 1MHz getaktet.

Unter 2.4.2 im Datenblatt steht auch, dass 1MHz als default unter INTOSC 
eingestellt ist. _XTAL_FREQ auf 1000000 zu setzen, hat auch zu keinem 
stimmigen Ergebnis geführt. Ging die Idee denn in die richtige Richtung, 
oder konfiguriere ich an der falschen Stelle?

Schonmal vielen Dank für die schnellen Antworten

danny

von Max H. (hartl192)


Lesenswert?

danny schrieb:
> Wie kann ich denn zuverlässig messen, welche Frequenz eingestellt ist?
1
  PORTB = 0x00;
2
  LATB = 0x00;
3
  ADCON1 = 0x0E;
4
  TRISB = 0x00;
5
  
6
  asm("loop: comf LATB, f");
7
  asm("goto loop");
und dann die Frequenz an einem Pin von PORTB messen, sie sollte einem 
Fosc/24 (6 Befehlszyklen pro Periode * 4 Taktzyklen pro Befehlszyklus) 
entsprechen.


BTW: Zum Thema 1wire gibt's auch eine Appnote von Microchip:
http://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en535817

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

danny schrieb:
> #include "p18f2550.h"
> #include <xc.h>
> #include <delays.h>
> #define _XTAL_FREQ 480000

Deinen PIC Compiler kenne ich nicht. Aber üblicherweise steht die 
Definition der Frequenz vor dem "include <delays.h>"

von danny (Gast)


Lesenswert?

Max H. schrieb:
> BTW: Zum Thema 1wire gibt's auch eine Appnote von Microchip:
> http://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en535817

Ich habe jetzt umgesattelt und den oben genannten Code ausprobiert. Dazu 
bin ich auf den C18 Compiler umgestiegen.

Der Code erkennt einen prensence pulse wenn der Sensor NICHT 
angeschlossen ist. Wenn er angeschlossen ist erkennt er keinen presence 
pulse.

Wenn ich dem PICkit3 als Debugger verwende und die Seriennummer 
betrachte, ist sie in beiden Fällen eine Abfolge des Zeichen 'ÿ'. Auch 
wenn ich einen anderen Sensor anstecke.

Mir fällt als einzige Fehlerquelle die Taktrate ein. :-/

Als Konfiguration habe ich wieder folgenden Abschnitt verwendet:
1
#pragma config FOSC     = INTOSC_EC
2
#pragma config WDT      = OFF
3
#pragma config LVP      = OFF
4
#pragma config BOR      = OFF
5
#pragma config MCLRE    = ON
6
#pragma config PWRT     = ON
7
#pragma config PBADEN   = OFF


Max H. schrieb:
> und dann die Frequenz an einem Pin von PORTB messen

Wie kann ich die denn messen? Ein Oszilloskop habe ich nicht.

Hat jemand schonmal so ein Problem gehabt oder einen DS18B20 erfolgreich 
an einen Pic verbunden?

von Stefan (Gast)


Lesenswert?

Auf was gibst du denn die Temperatur aus, wenn
du kein LCD benutzt ?

von danny (Gast)


Lesenswert?

Stefan schrieb:
> Auf was gibst du denn die Temperatur aus, wenn
> du kein LCD benutzt ?

In der ersten Variante einfach in den EEPROM geschrieben unter XC8 mit 
Write_b_eep(address, data). In der zweiten Variante unter C18 mit dem 
PICkit3 als Debugger einen Breakpoint gesetzt und die entsprechende 
Variable betrachtet.

Ich hab vergessen zu erwähnen, dass ich in der zweiten Variante auch 
nicht UART verwende, den Part habe ich entsprechend auskommentiert.

von Stefan (Gast)


Lesenswert?

Was erwachtest du denn, was im EEprom steht ?
Hoffe nicht das du meinst das da die Temperatur
wie 30 Grad oder 27,5 Grad drin steht.
Es sei denn du hast die Werte vom Sensor
umgerechnet.

von chris (Gast)


Lesenswert?

Wieso kannst di nicht den clock konfigurieren,
Und wieso EC und nicht hs?

von danny (Gast)


Lesenswert?

Stefan schrieb:
> Was erwachtest du denn, was im EEprom steht ?
> Hoffe nicht das du meinst das da die Temperatur
> wie 30 Grad oder 27,5 Grad drin steht.
> Es sei denn du hast die Werte vom Sensor
> umgerechnet.

Die Werte werden laut der Formel aus dem ersten Link natürlich 
umgerechnet:
1
       a = OW_read_byte(); //Read temp 1st byte
2
       b = OW_read_byte(); //Read temp 2nd byte
3
       a = a+(b<<8); //a is now both bytes
4
5
       if ((b & 0x80) == 0x80){ //Is temp negetive?
6
           minus=-1;
7
           c = ~a; // "a" is raw data as 2 bytes
8
           d = (c & 0x000f)+1; //"d" is the decimal part as 4 bits
9
           c = c>>4; //"c" is the integer part as 2 bytes
10
       }
11
       else {
12
           minus=1;
13
           d = (a & 0x000f);
14
           c = a>>4;
15
       }
16
       centigrade = minus*(c+(d/16.0)); //The DS18B20 is pre-calibrated

Später wird centigrade mittels sprintf in ein char-array überführt und 
in den EEPROM geschrieben. Diesen lese ich dann aus und betrachte die 
ASCII-Zeichen. Der Code aus dem Link ist nur an den Stellen verändert, 
die die LCD-Ausgabe betreffen.

Aber es kommt ja erst garnicht zu Temperaturwerten, da die Kommunikation 
mit dem Sensor nicht funktioniert. Es steht immer der Wert im EEPROM, 
der auftritt, wenn der Sensor nicht antwortet.

von danny (Gast)


Lesenswert?

chris schrieb:
> Wieso kannst di nicht den clock konfigurieren,
> Und wieso EC und nicht hs?

EC und HS haben keinen Unterschied gemacht, ganz ürsprünglich habe ich 
INTOSC_HS verwendet.

Wie kann ich denn den Clock konfigurieren?

von danny (Gast)


Lesenswert?

Das kann doch nicht so kompliziert sein, warum will denn keine Variante 
funktionieren?
Ich google mir seit 3 Tagen die Finger wund, aber jeder Code den ich 
finde oder selber schreibe läuft darauf hinaus, das der Sensor nicht 
antworten will. Ich habe 3 Sensoren ausprobiert, es muss am Code (also 
an mir) liegen. Aber ich kann einfach den Fehler nicht sehen.

Woran kann denn die Kommunikation noch scheitern? Da bleibt doch nur 
eine falsche Taktung übrig, oder übersehe ich da etwas?

Den Sensor haben doch schon viele zum laufen gebracht, hat denn einer 
Erfahrungen mit dem onewire Protokoll?

von Max H. (hartl192)


Lesenswert?

danny schrieb:
> Max H. schrieb:
>> und dann die Frequenz an einem Pin von PORTB messen
>
> Wie kann ich die denn messen? Ein Oszilloskop habe ich nicht.
Frequenzzähler, Multimeter mit Frequenzmessfunktion, wenn du schnell 
bis: LED anhängen und mitzählen.
> Hat jemand schonmal so ein Problem gehabt oder einen DS18B20 erfolgreich
> an einen Pic verbunden?
Ich hab den Code aus der oben genannten Appnote ein bisschen angepasst 
und problemlos auf einen PIC12 und PIC24 laufen.

: Bearbeitet durch User
von r_u_d_i (Gast)


Lesenswert?

danny schrieb:
> Ich google mir seit 3 Tagen die Finger wund, aber jeder Code den ich
> finde oder selber schreibe läuft darauf hinaus, das der Sensor nicht
> antworten will. Ich habe 3 Sensoren ausprobiert, es muss am Code (also
> an mir) liegen. Aber ich kann einfach den Fehler nicht sehen.

http://www.puntoflotante.net/BOLT-SYSTEM-7-PROJECTS-EXPRESS.htm

c code und hex file unter project 2.
passende Pic Board & DS18B20 eventuell nach dem Poststreik bei dir in 
4-6 wochen ;-) oder bei mir abholen.

Beitrag "[V] Verkaufe PIC 18F2550 USB Educational Development Board"

lg rudi ;-)

DS18B20 gibt es verschiedene, welchen hast du?
mit kabel, ohne kabel, eingelassen ( wasserdicht ), bauform.

von r_u_d_i (Gast)


Angehängte Dateien:

Lesenswert?

In jedem Fall muss du den DS18B20 aber noch abgleichen.
Er ist zwar vor Kalibriert - aber nicht örtlich angepasst.
Das erreichst du dann mit Ist und Sollmessung und gleichst den Wert mit
einer Faustformel ab.

Schauh dir mal dazu die bebilderten Beiträge an:

http://www.matrixtsl.com/mmforums/viewtopic.php?f=54&t=15257#p62464

und wichtig! 10KOhm nicht vergessen...
denn sonnst kommt nichts ;-)

von danny (Gast)


Lesenswert?

r_u_d_i schrieb:
> c code und hex file unter project 2.

Den hab ich mal ausprobiert:
Er hängt beim Abschnitt
1
while(busy == 0)                //Wait while busy (bus is low) 
2
busy = onewire_read();
in einer Dauerschleife.

Ich hab erstmal versucht eine LED im Code leuchten zu lassen. Das ging 
erst, nachdem ich folgende Pragma mit reinkopiert hatte:
1
#pragma config FOSC        = INTOSC_EC
2
#pragma config WDT         = OFF
3
#pragma config LVP           = OFF
4
#pragma config BOR          = OFF
5
#pragma config MCLRE     = ON
6
#pragma config PWRT        = ON
7
#pragma config PBADEN   = OFF

Wenn ich diese Pragmas weglasse, lässt MPLAB mich nichtmal mehr debuggen 
mit der Meldung:
"The target device is not ready for debugging. Please check your 
configuration bit settings and program the device before proceeding. The 
most common causes for this failure are oscillator and/or PGC/PGD 
settings."

Mein Verdacht erhärtet sich, dass das Kommunizieren an falschen 
Konfigbits scheitert.

r_u_d_i schrieb:
> DS18B20 gibt es verschiedene, welchen hast du?
> mit kabel, ohne kabel, eingelassen ( wasserdicht ), bauform.
Ich habe den einfachen DS18B20 von Reichelt bestellt. Ich habe auch den 
DS18S20. Beide ohne Kabel als TO-92 Bauform auf mein Board gesteckt. 
(Später soll eine Variante mit Tauchhülse und Kabel verwendet werden, 
aber noch nicht jetzt.)

r_u_d_i schrieb:
> Beitrag "[V] Verkaufe PIC 18F2550 USB Educational Development Board"
Vielen Dank für das Angebot, aber ich habe schon ein PIC18F45K20 
Demoboard. Der Problem-PICF2550 habe ich auf einer selbstgelöteten 
Platine sitzen. :-)

r_u_d_i schrieb:
> und wichtig! 10KOhm nicht vergessen...
> denn sonnst kommt nichts ;-)
Ich habe 4,7kOhm verwendet, steht so im Datenblatt. Sollte ich umlöten? 
Der Widerstand hängt zwischen DQ und Vdd.

Nachdem schon der dritte Code scheitert, der bei anderen mit dem selben 
µController funktioniert, glaube ich wirklich, dass es an meinen 
Konfigurationsbits liegt. Warum kann ich keine LED blinken lassen, ohne 
die Pragmas zu setzen? In keinem der Beispielcodes waren die Pragmas mit 
drin.
Diesmal verwendeter Compiler: C18 Version 3.47
(Mittlerweile habe ich den XC8, den C18, den HI-TECH, den mpasm und den 
mikroC Compiler ausprobiert. :-/)

Vielen Dank für die Antworten,

danny

von Max H. (hartl192)


Lesenswert?

danny schrieb:
> Wenn ich diese Pragmas weglasse, lässt MPLAB mich nichtmal mehr debuggen
> mit der Meldung:
Könnte daran liegen, dass default HSPLL Einstellung ist und du keinen 
Quarz angeschlossen hast.

> r_u_d_i schrieb:
>> und wichtig! 10KOhm nicht vergessen...
>> denn sonnst kommt nichts ;-)
> Ich habe 4,7kOhm verwendet, steht so im Datenblatt. Sollte ich umlöten?
4.7kOhm ist auch ok.

> Warum kann ich keine LED blinken lassen, ohne
> die Pragmas zu setzen?
Weil die default Einstellung nicht zu deiner Hardware passen.

Zu den Configs und der Oszillator Konfiguration kann ich Kapitel 2.0 
Oscillator Configurations und 25.1 Configuration Bits im Datenblatt als 
Lektüre empfehlen: 
http://ww1.microchip.com/downloads/en/DeviceDoc/39632e.pdf

Noch was: Bevor du das mit dem Oszillator/Configs nicht in den Griff 
bekommst, macht es keinen Sinn alle möglichen Codes auszuprobieren.

: Bearbeitet durch User
von danny (Gast)


Lesenswert?

Max H. schrieb:
> Könnte daran liegen, dass default HSPLL Einstellung ist und du keinen
> Quarz angeschlossen hast.

Wenn ich mir das Datenblatt durchlese stellt sich mir die Frage ob ich 
den DS18B20 überhaupt mit dem internen Oszillator ansprechen kann, oder 
ob ich einen externen verwenden muss.

Kann ich den DS18B20 überhaupt mit dem internen Oszillator verwenden?
Bzw. wenn nicht: Kann jemand einen Oszillator von Reichelt empfehlen?

Max H. schrieb:
> Noch was: Bevor du das mit dem Oszillator/Configs nicht in den Griff
> bekommst, macht es keinen Sinn alle möglichen Codes auszuprobieren.

Vollkommen richtig, aber es hat mir geholfen den kleinsten gemeinsamen 
Nenner zu finden. :-)

von Max H. (hartl192)


Lesenswert?

danny schrieb:
> Kann ich den DS18B20 überhaupt mit dem internen Oszillator verwenden?
Auf meinem PIC24 und PIC12 läuft er auch mit dem Intosc. Auch wenn ich 
bei f_osc = 32MHz  #define FOSC 34000000  oder  #define FOSC 30000000 
schreibe.

: Bearbeitet durch User
von danny (Gast)


Lesenswert?

Max H. schrieb:
> Auf meinem PIC24 und PIC12 läuft er auch mit dem Intosc. Auch wenn ich
> bei f_osc = 32MHz  #define FOSC 34000000  oder  #define FOSC 30000000
> schreibe.

Was ist denn bei meiner Konfiguration noch falsch, dass es noch nicht 
funktioniert?

Habe ich vllt. irgendetwas übersehen, das ausserhalb dieser Pragmas 
gemacht werden muss?

von Max H. (hartl192)


Lesenswert?

Ohne den vollständigen Code wird das schwierig zu beurteilen.
Was auch sein kann ist, dass ein Eingang nicht funktioniert, weil er 
nach dem Reset als analog konfiguriert ist und er nie auf digital 
umgestellt wurde.

: Bearbeitet durch User
von danny (Gast)


Angehängte Dateien:

Lesenswert?

Max H. schrieb:
> Ohne den vollständigen Code wird das schwierig zu beurteilen.
Daran soll es nicht scheitern, siehe Anhang.
Das ist jetzt der Code, den r_u_d_i mir empfohlen hat, LCD 
auskommentiert.

Der Eingang ist meines Wissens nach nur digital.

von danny (Gast)


Lesenswert?

Die if(1){...} Bedingung war zum testen, ob die LED leuchtet (was sie an 
der Stelle nicht tut wegen der besagten Dauerschleife beim onewire 
Reset).

War ursprünglich zum prüfen, was in GRADOS steht.

von Max H. (hartl192)


Lesenswert?

danny schrieb:
> Der Eingang ist meines Wissens nach nur digital.
RA3 hat auch eine analog Funktion.

Der Code ist für Fosc = 20MHZ geschrieben, da du das OSCCON nicht 
änderst, läuft der PIC mit 1MHZ.

von danny (Gast)


Lesenswert?

Max H. schrieb:
> RA3 hat auch eine analog Funktion.
>
> Der Code ist für Fosc = 20MHZ geschrieben, da du das OSCCON nicht
> änderst, läuft der PIC mit 1MHZ.

Du hast Recht, "AN3", habe ich mir sogar extra auf der Platine notiert 
:-S

Ich dachte der PIC läuft default mit 8MHz? Auf mehr als 8MHz bekomme ich 
den mit dem internen Oszillator auch nicht, richtig? Kann man den Code 
auf 8MHz oder weniger Takten?

Vielen Dank
danny

von Max H. (hartl192)


Lesenswert?

danny schrieb:
> Ich dachte der PIC läuft default mit 8MHz?
Du hast Kapitel 2.0 Oscillator Configurations immer noch nicht gelesen? 
Steht beim OSCCON sogar als Fußnote (3).
> Auf mehr als 8MHz bekomme ich den mit dem internen Oszillator
> auch nicht, richtig?
Richtig

> Kann man den Code auf 8MHz oder weniger Takten?
Wenn du die Delays anpasst, könnte es funktionieren.

: Bearbeitet durch User
von danny (Gast)


Lesenswert?

Max H. schrieb:
> Du hast Kapitel 2.0 Oscillator Configurations immer noch nicht gelesen?
> Steht beim OSCCON sogar als Fußnote (3).

Doch, hatte nur noch die 8MHz von der ersten Antwort oben im Kopf. Hab 
mir sogar grade selber widersprochen (wie peinlich):

danny schrieb:
> Unter 2.4.2 im Datenblatt steht auch, dass 1MHz als default unter INTOSC
> eingestellt ist.

------

Jetzt habe ich folgende Codezeile:
1
Delay1KTCYx(12);   //A 20 MHZ, 1 MS APROX.
Wenn ich die Funktion google und versuche auszurechnen komme ich auf
TCY = 4/1Mhz =4us
100*4us*25 = 1000us = 1ms
Was folgendes ergibt:
1
Delay100TCYx(25);

Es funktioniert immernoch nicht, ist die Funktion falsch dimensioniert?

von Max H. (hartl192)


Lesenswert?

danny schrieb:
> 100*4us*25 = 1000us = 1ms

Es gibt auch noch ein delay_us.

Wenn das auch nicht hilft, könntest du mal versuchen das Problem 
einzugrenzen:
- Antwortet der Sensor auf den reset Puls?
- Kannst du irgendwas (z.B. die Adresse) von Chip einlesen?
...

: Bearbeitet durch User
von danny (Gast)


Lesenswert?

Max H. schrieb:
> Es gibt auch noch ein delay_us.

Ich muss grade feststellen, das delay_us garkeinen Effekt hat, egal wie 
es dimensioniere: Eine blinkende Test-LED leuchtet dauerhaft:
1
delay_us(1000000);
2
PORTCbits.RC0 = 0;
3
delay_us(1000000);
4
PORTCbits.RC0 = 1;

Wenn ich für eine Millisekunde Delay10TCYx(25); verwende und 1.000 mal 
laufen lasse, nähert sich das ganze nur ganz grob an eine Sekunde an, 
der errechnete Befehl von oben erzeugt ca 10,5 Sekunden.

Himmelherrgott, ist das denn wirklich so kompliziert nen PIC zu Takten?

von Max H. (hartl192)


Lesenswert?

danny schrieb:
> Delay1KTCYx(12);   //A 20 MHZ, 1 MS APROX.
Wenn ich das so nachrechne, stimmt das auch nicht:

danny schrieb:
> Eine blinkende Test-LED leuchtet dauerhaft:
> delay_us(1000000);
> PORTCbits.RC0 = 0;
> delay_us(1000000);
> PORTCbits.RC0 = 1;
delay_us ist als Delay10TCYx definiert und das will nur eine 8bit Zahl 
(unsigned char). Die unteren 8bit von 1000000 sind: 0x40 = 64d. Die LED 
blinkt vllt. nur schneller als du sehen kannst.

Und 10TCY @ 20MHz wären 2µs.

> Himmelherrgott, ist das denn wirklich so kompliziert nen PIC zu Takten?
Eigentlich nicht.

: Bearbeitet durch User
von danny (Gast)


Lesenswert?

Max H. schrieb:
> Wenn ich das so nachrechne, stimmt das auch nicht

Habe ich dann eine falsche Formel verwendet?

Max H. schrieb:
>> Himmelherrgott, ist das denn wirklich so kompliziert nen PIC zu Takten?
> Eigentlich nicht.

Kannst du mir dann bitte sagen, wie ich was dimensionieren/ definieren/ 
konfigurieren muss, damit ein 1ms delay eine Millisekunde und 1us delay 
eine Mikrosekunde dauert beim PIC18F2550 unter Verwendung des internen 
Oszillators?

von Max H. (hartl192)


Angehängte Dateien:

Lesenswert?

danny schrieb:
> Max H. schrieb:
>> Wenn ich das so nachrechne, stimmt das auch nicht
> Habe ich dann eine falsche Formel verwendet?
Das war aus dem original Code.

> Kannst du mir dann bitte sagen, wie ich was dimensionieren/ definieren/
> konfigurieren muss...
Mit dem C18 kann ich dir jetzt nicht weiterhelfen, da ich nur den XC8 
habe. Bei dem würde es so wie im Anhang aussehen. Wenn ich keinen Fehler 
gemacht habe, sollte eine LED an PORTA mit 1Hz blinken (Ein bisschen 
langsamer, da die schleifen auch ein paar Befehlszyklen brauchen).

: Bearbeitet durch User
von r_u_d_i (Gast)


Lesenswert?

Max H. schrieb:
> danny schrieb:
>> Himmelherrgott, ist das denn wirklich so kompliziert nen PIC zu Takten?
> Eigentlich nicht.

eigentlich wirklich nicht :)
geh es mal langsam an:

wie sind deine bits?
0x300005 0x80
u.a.
portb configured as digital -> BIT 41

0x300000 0x24
u.a. BIT5 clk src from 96MHz PLL/2
u.a. BIT 3-4  OSC/1 or PLL/2
u.a. BIT 0-2  div by 5 {20 Mhz input}


0x300001 0xE
u.a. BIT 8-11 HS: HS+PLL, USB+HS

ah - du hast ja keinen 20mhz ..

> Der Code ist für Fosc = 20MHZ geschrieben, da du das OSCCON nicht
> änderst, läuft der PIC mit 1MHZ.

und dann eigentlich 1/4 zu langsam ( 4 MHz : 1 MHz )

wenn du also 1 sek erwartest
dann musst du 4 sek angeben :)

denn no divide = 4Mhz input
immer von 20 MHz ausgehend
aber du hast ja keinen 20er sondern willst den internen verwenden,

http://sprut.de/electronic/pic/osc/index.htm#er


lg
rudi :)


btw:
von anfang an am besten:
http://sprut.de/electronic/pic/osc/index.htm

zwischen den zeilen stehen ein paar sachen:
http://pic-projekte.de/phpBB3/viewtopic.php?t=66

von Max H. (hartl192)


Lesenswert?

r_u_d_i schrieb:
>> Der Code ist für Fosc = 20MHZ geschrieben, da du das OSCCON nicht
>> änderst, läuft der PIC mit 1MHZ.
>
> und dann eigentlich 1/4 zu langsam ( 4 MHz : 1 MHz )
Was? Hab ich da etwas verpasst? Als ich das rechnen gelernt habe war 
20MHz vs. 1MHz noch 1/20 zu langsam.

von r_u_d_i (Gast)


Lesenswert?

Max H. schrieb:
> r_u_d_i schrieb:
>>> Der Code ist für Fosc = 20MHZ geschrieben, da du das OSCCON nicht
>>> änderst, läuft der PIC mit 1MHZ.
>>
>> und dann eigentlich 1/4 zu langsam ( 4 MHz : 1 MHz )
> Was? Hab ich da etwas verpasst? Als ich das rechnen gelernt habe war
> 20MHz vs. 1MHz noch 1/20 zu langsam.

ich geh ins bett :)
ist wahrlich schon spät
muss morgen rasenmähen :)

lg rudi :)

von danny (Gast)


Lesenswert?

Max H. schrieb:
> Wenn ich keinen Fehler
> gemacht habe, sollte eine LED an PORTA mit 1Hz blinken (Ein bisschen
> langsamer, da die schleifen auch ein paar Befehlszyklen brauchen).

Entschuldigung dass ich ne halbe Stunde später antworte. Ich war 
beschäftigt deinen perfekten 1-Sekundentakt zu würdigen.

Ich habe die Konfiguration von dir im Code von gaaanz oben eingefügt, 
die aus dem ersten Post. Etwas angepasst uuuuund: es sind 24,31 Grad C 
im Zimmer! (Kommt mir vor wie 50 Grad C!)

Ich räume den Code jetzt etwas auf und lade ihn hoch, damit andere auch 
was davon haben.

Ich kann euch allen garnicht genug danken!

Viele Grüße
danny

von r_u_d_i (Gast)


Lesenswert?

..peinlich ..
lg

von r_u_d_i (Gast)


Lesenswert?

danny schrieb:
> Max H. schrieb:
>> Wenn ich keinen Fehler
>> gemacht habe, sollte eine LED an PORTA mit 1Hz blinken (Ein bisschen
>> langsamer, da die schleifen auch ein paar Befehlszyklen brauchen).
>
> Entschuldigung dass ich ne halbe Stunde später antworte. Ich war
> beschäftigt deinen perfekten 1-Sekundentakt zu würdigen.
>
> Ich habe die Konfiguration von dir im Code von gaaanz oben eingefügt,
> die aus dem ersten Post. Etwas angepasst uuuuund: es sind 24,31 Grad C
> im Zimmer! (Kommt mir vor wie 50 Grad C!)
>
> Ich räume den Code jetzt etwas auf und lade ihn hoch, damit andere auch
> was davon haben.
>
> Ich kann euch allen garnicht genug danken!
>
> Viele Grüße
> danny

hey -
dass ich das heut noch vor dem bett gehen lesen kann
ist super, sonst würde ich beim vielen nachdenken morgen
alle blumen die köpfe abmähen :)
supi danny! gut gemacht, drangeblieben und eingezäunt.
lg rudi :)
..guter Max - ;-)
du hast den blumen und mir den tag morgen gerettet :)
;-)
guats nächtle!

von r_u_d_i (Gast)


Lesenswert?

danny schrieb:
> Ich habe die Konfiguration von dir im Code von gaaanz oben eingefügt,
> die aus dem ersten Post. Etwas angepasst uuuuund: es sind 24,31 Grad C
> im Zimmer! (Kommt mir vor wie 50 Grad C!)
aber anpassen noch danny - meist sind es 2-4 kelvin delta teta zum 
nachjustieren, am besten du lässt den 1-2 stunden laufen
nicht zu oft abfragen wegen eigenerwärmung, und dann eichst den mit 
einem thermometer, alles gut 1-2 stunden klimatisieren lassen und dann 
vergleichen und nachjustieren mit einem float oder mit einem int
je nachdem.
lg

von danny (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

wie versprochen eine funktionierende Version.

Code basiert auf:
http://www.dutchforce.com/~eforum/index.php?showtopic=43185&st=0&pid=381093
und der Konfiguration von Max H. (hartl192).

Der DS18B20 wird mit einem 4.7kOhm Pullup Widerstand verwendet.
DQ vom DS18B20 wird an RB5 angeschlossen.

IDE: MPLAB C Version 3.00
Kompiler: XC8 Version 1.34
µContoller: PIC18F2550
PICkit3 mit selbstgelöteter Platine

Die LCD Funktionalität sowie Fahrenheit wurden entfernt, die 
Celsiustemperatur wird zum debuggen einfach in den EEPROM geschrieben.
Betonung liegt auf debuggen, ich kann keine Aussage darüber treffen 
wieviele Schreibzyklen der EEPROM verträgt, aber bestimmt nicht soviele 
im Sekundentakt auf Dauer.
Zum verträglicheren debuggen empfehle ich z.B. den PICkit 3 mit einem 
Breakpoint auf Zeile 101 der Datei main.c (die sprintf-zeile). Die 
Variable centigrade enthält dann die Temperatur.

Anekdote nebenbei: Ich habe einen der DS18B20 mal für ca. ne Minute 
verpolt, der Gute ist ordentlich Heiß geworden und wurde aussortiert, 
bis das Programm funktioniert. Grade mal angeschlossen und er hat 
überlebt. Zähes Biest!


Schöne Grüße und nochmal vielen Dank an euch,

danny

von Max H. (hartl192)


Lesenswert?

danny schrieb:
> ich kann keine Aussage darüber treffen
> wieviele Schreibzyklen der EEPROM verträgt,
Microchip garantiert 1,000,000 Erase/Write Cycles.
> aber bestimmt nicht soviele
> im Sekundentakt auf Dauer.
11.57 Tage.

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.