DS1820 timing problem

Gast #3430044
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... :(
Angehängte Dateien:
#3430048
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.
Gast #3430052
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...
#3430055
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?
#3430063
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.
Gast #3430070
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..!
Gast #3430093
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??
Gast #3430126
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!
#3430137
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.
#3430173
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.
Gast #3430385
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren