Hallo habe folgenden code zur initialisierung geschrieben:
1
uint8_tds1820_init(void)
2
{
3
uint8_twert=1;
4
5
DS_DDR|=(1<<DS_BIT);//als ausgang
6
DS_PORT|=(1<<DS_BIT);//auf HIGH
7
_delay_ms(5);
8
9
DS_PORT&=~(1<<DS_BIT);//auf LOW ziehen
10
_delay_us(485);//480µs warten
11
12
DS_DDR&=~(1<<DS_BIT);//als eingang schalten
13
_delay_us(65);//warten auf DS1820
14
15
wert=DS_PIN&(1<<DS_BIT);//zustand einlesen: 0 wenn präsent, 1 wenn nicht präsent
16
17
_delay_us(420);//warten bis fertig...
18
}
die Register sind so definiert:
1
#define DS_DDR DDRB
2
#define DS_PORT PORTB
3
#define DS_PIN PINB
4
#define DS_BIT PB0
Ich habe mir dann den Preset Pulse auf dem Logic analyzer angeschaut und
erhalte bild nr1.
Erwartet hätte ich aber bild nr2 wie aus dem datenblatt des DS1820.
verwendet wird ein atmega8, f_cpu ist mit 4000000UL angegeben, es ist
ein 4MHz quarz verbaut, der auch per fuse eingestellt ist.
Warum stimmt das so nicht???? Habe immer wieder Probleme mit dem Timing
des DS1820. Haette eigentlich einen Code der funktioniert... :(
hopper schrieb:> verwendet wird ein atmega8, f_cpu ist mit 4000000UL angegeben, es ist> ein 4MHz quarz verbaut, der auch per fuse eingestellt ist.
Soweit die Theorie. Es musst du nur noch rauskriegen, welche dieser
Aussagen nicht stimmt. Und ob F_CPU an der richtigen Stelle definiert
wird. Deine Einstellung zur Grossschreibung wird von C Compilern
übrigens nicht geteilt.
Ja, sorry, F_CPU natürlich! Ist die allererste überhaupt geschriebene
Programmzeile. Der Compiler bringt auch keinen Fehler!
wenn ich z.B.
1
DS_DDR|=(1<<DS_BIT);
2
DS_PORT|=(1<<DS_BIT);
3
_delay_ms(5);
4
5
DS_PORT&=~(1<<DS_BIT);
6
_delay_us(485);
7
DS_PORT|=(1<<DS_BIT);
schreibe dann funktioniert alles!
nochwas: der DS1820 wird normal versorgt: VDD an 4,5V, VSS an gnd und DQ
am PB0. zwischen DQ und VDD befindet sich ein 4,7kOhm widerstand...
Was mich ein wenig stutzig macht.
Du machst im Programm
1
DS_PORT&=~(1<<DS_BIT);//auf LOW ziehen
2
_delay_us(485);
und dein Logikanalysator behauptet das wären 960µs.
Der Rest sieht eigentlich nicht schlecht aus. Die Zeiten, sind im Rahmen
dessen, was zu erwarten ist.
Hast du einen externen Pullup an der Datenleitung?
hopper schrieb:> DS_DDR |= (1<<DS_BIT); //als ausgang> DS_PORT |= (1<<DS_BIT); //auf HIGH
Würde ich nicht empfehlen. Zwei Zustände sind sinnvoll:
output = 0
input
nicht aber
output = 1
denn da kämpft der DS gegen den µC und letzterer gewinnt.
hopper schrieb:> Ja, sorry, F_CPU natürlich! Ist die allererste überhaupt geschriebene> Programmzeile. Der Compiler bringt auch keinen Fehler!
Schön langsam sollte sich herumgesprochen haben, dass den Compiler deine
Logikfehler nicht im geringsten interessieren.
Die Herren Duden haben auch an
Karl Heinz schrieb:> Schön langsam sollte sich herumgesprochen haben, dass den Compiler deine> Logikfehler nicht im geringsten interessieren.> Die Herren Duden haben auch anDas Flugzeug schwimmt mit dem Messer durch> die Autobahn.> nachts auszusetzen. Grammatikalisch.
die aussage war darauf bezogen, dass ich im programm sehr wohl F_CPU und
nicht f_cpu geschrieben hatte. bei letzterem hätte der compiler eine
"not defined" warnung rausgebracht..!
hopper schrieb:> Karl Heinz schrieb:>> kontrollier nochmal deinen Pullup-Widerstand.>> genau 4,68kOhm von DQ nach +4,5V
Ich hatte anfänglich auch Probleme mit dem DS Sensoren. Nach einigen
Testen bin ich dann bei 2,2k Wiederstand angekommen. Jetzt läuft alles
perfekt.
Darüber hinaus musst man mit den Timings "spielen".
Selber Code einmal direkt im Hauptprogramm und einmal in der ds1820.c
und dann im Hauptprogramm aufgerufen verursacht andere Zeiten...
Kann mir niemand weiterhelfen???
Bin grad am verzweifeln! :(
hopper schrieb:> Selber Code einmal direkt im Hauptprogramm und einmal in der ds1820.c> und dann im Hauptprogramm aufgerufen verursacht andere Zeiten...> Kann mir niemand weiterhelfen???> Bin grad am verzweifeln! :(
Dann stell halt mal den kompletten Code ein.
Hast du in ds1820.c ein korrektes F_CPU?
Hab jetzt alles rauskommentiert was nicht wichtig ist. Übriggeblieben
ist folgendes:
1
#define F_CPU 4000000UL
2
3
#include<avr/io.h>
4
#include<util/delay.h>
5
6
#include"ds1820.h"
7
8
intmain(void)
9
{
10
ds1820_init();
11
}
die ds1820.c sieht so aus:
1
#include<avr/io.h>
2
#include<util/delay.h>
3
#include"ds1820.h"
4
5
uint8_tds1820_init(void)
6
{
7
uint8_twert=1;
8
9
DS_DDR|=(1<<DS_BIT);//als ausgang (dieser ist dann low!)
10
_delay_us(485);//485µs warten
11
12
DS_DDR&=~(1<<DS_BIT);//als eingang schalten
13
_delay_us(65);//warten auf DS1820
14
15
wert=DS_PIN&(1<<DS_BIT);//zustand einlesen: 0 wenn präsent, 1 wenn nicht präsent
16
17
_delay_us(420);//warten bis fertig...
18
}
und die ds1820.h so:
1
#ifndef DS1820_H_
2
#define DS1820_H_
3
4
#define DS_DDR DDRB
5
#define DS_PORT PORTB
6
#define DS_PIN PINB
7
#define DS_BIT PB0
8
#endif /* DS1820_H_ */
-Os ist eingeschaltet, die fuses sind: high: 0xD9 low: 0xEC
mehr hab ich nicht!
wie gesagt: wenn ich jetzt den Code der im ds1820.c drinsteht anstelle
des ds1820_init() setze, compile und überprüfe habe ich andere zeiten!
Nö. C lernen könnte helfen.
Besser wärs, das dem Projekt beizubringen, statt es in jedes File zu
schreiben. Oder es zusammen mit den übrigen übergreifenden Definitionen
und Includes in einem zentralen .h File unterzubringen.
hopper schrieb:> nimmt er die nicht aus dem mainfile??? :/
Wenn der Compiler ds1820.c compiliert, dann compiliert er ds1820.c.
Punkt.
Du kannst noch 6 Millionen andere C-Files auf deinem Computer haben. Die
interessieren den Compiler nicht die Bohne. Wenn ds1820.c compiliert
wird, dann wird auch nur ds1820.c compiliert. Nur das, was in diesem
File steht, bzw. über Header Files reinkommt, das zählt. Alles andere
ist uninteressant. Die einzige Ausnahme sind Dinge, die der Compiler per
Aufruf aus der Commandline mitbekommt. Daher ist es auch eine recht gute
Idee, dieses F_CPU nicht auf File-Basis zu vergeben, sondern deiner IDE
aufzutragen, bei jedem Compiler-Aufruf dem Compiler mitzugeben, dass
F_CPU den Wert xyz hat.
In C gibt es keinen 'Projektgedanken'. Jedes C-File steht für sich
alleine und wird auch für sich alleine compiliert.
Vielen Dank euch allen, jetzt funktionierts!!!! :)
Das AVR-Studio5 vermittelt da aber Missverständliches, zumindest für
mich! Immerhin lege ich doch ein neues "Projekt" an...
Kann ich, wie in folgendem Beitrag "define F_CPU in AVR Studio 5, nur wo?"
beschrieben, unter den Projekteigenschaften ein neues Symbol anlegen und
das nimmt er dann für alle c files in dem Projekt?
hopper schrieb:> Das AVR-Studio5 vermittelt da aber Missverständliches, zumindest für> mich! Immerhin lege ich doch ein neues "Projekt" an...
Du bist nicht alt genug um noch die Zeit miterlebt zu haben, in der man
einen Editor und eine Command Line hatte und sonst nichts. Und COmpiler
bzw. Linker selbst aus der Command Line aufgerufen hat, in dem man
Kommandos eingetippt hat.
Und trotzdem hat man auch damals schon C programmiert. Auf Computern,
die nicht mehr als 64kByte Speicher hatten. Manchmal sogar weniger.
An den grundlegenden Prinzipien hat sich nichts verändert. Es wurde
lediglich eine graphische Oberfläche rund um die ganzen Einzelteile
gelegt, damit alles wie aus einem Guss wirkt - die IDE. Verwechsle aber
nicht die IDE mit dem Compiler bzw. den Prinzipien der
Programmiersprache.
* Hinweis: Bei Debug bitte -OS einstellen
* sonst stimmen die Zeiten der _delay_x nicht. (Timing Probleme
)
Mein Senf dazu falls es mit dem Timing nicht klappt.
Ebenso sollte die richtige Frequenz des Quarzes mit F_CPU und in den
Fuses des µC eingestellt sein.
Ansonsten andere Beispiele hier im Forum anschauen dazu.