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 :-)
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.
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
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
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>"
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?
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.
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.
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.
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?
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?
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.
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.
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 ;-)
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
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.
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. :-)
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.
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?
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.
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.
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.
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.
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
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.
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?
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?
...
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?
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.
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?
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).
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
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.
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 :)
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
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!
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
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
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.