Forum: Mikrocontroller und Digitale Elektronik DS1820 timing problem


von hopper (Gast)


Angehängte Dateien:

Lesenswert?

Hallo habe folgenden code zur initialisierung geschrieben:
1
uint8_t ds1820_init(void)
2
  {
3
    uint8_t wert = 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... :(

von (prx) A. K. (prx)


Lesenswert?

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.

: Bearbeitet durch User
von hopper (Gast)


Lesenswert?

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...

von Pete K. (pete77)


Lesenswert?

Ist Dein F_CPU vielleicht auf 8 Mhz eingestellt? Optimierung -O2 oder 
-Os aktiviert?

von Karl H. (kbuchegg)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
1
Das Flugzeug schwimmt mit dem Messer durch die Autobahn.
nichts auszusetzen. Grammatikalisch.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

>     DS_PORT &= ~(1<<DS_BIT);
>     _delay_us(485);
>     DS_PORT |= (1<<DS_BIT);
> schreibe dann funktioniert alles!

kontrollier nochmal deinen Pullup-Widerstand.

von hopper (Gast)


Lesenswert?

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..!

von hopper (Gast)


Lesenswert?

Karl Heinz schrieb:
> kontrollier nochmal deinen Pullup-Widerstand.

genau 4,68kOhm von DQ nach +4,5V

von hopper (Gast)


Lesenswert?

wenn ich folgenden Code direkt ins Hauptprogramm schreibe dann stimmen 
die Zeiten.
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);

wenn ich es so schreibe:
1
uint8_t ds1820_init(void)
2
{
3
    DS_DDR |=(1<<DS_BIT);
4
    DS_PORT |= (1<<DS_BIT);
5
    _delay_ms(5);
6
    
7
    DS_PORT &= ~(1<<DS_BIT);
8
    _delay_us(485);
9
    DS_PORT |= (1<<DS_BIT);
10
}

und dann im Hauptprogramm mit ds1820_init() aufrufe stimmts wieder 
nicht!!

passt da was mit dem include nicht??

von Steffen (Gast)


Lesenswert?

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".

von hopper (Gast)


Lesenswert?

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! :(

von (prx) A. K. (prx)


Lesenswert?

Dann zeig mal beide Programme. Komplett.

von Karl H. (kbuchegg)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

Optimierung eingeschaltet? Irgendwelche "unwichtigen" Warnungen 
ignoriert?

von hopper (Gast)


Lesenswert?

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
int main(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_t ds1820_init(void)
6
  {
7
    uint8_t wert = 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!

von (prx) A. K. (prx)


Lesenswert?

hopper schrieb:

> die ds1820.c sieht so aus:
> #include <avr/io.h>
> #include <util/delay.h>

Treffer. Da fehlt F_CPU.

von hopper (Gast)


Lesenswert?

nimmt er die nicht aus dem mainfile??? :/

von (prx) A. K. (prx)


Lesenswert?

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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von hopper (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

* 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.

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.