Forum: Mikrocontroller und Digitale Elektronik 1-Wire mit _delay_us: Kann das gut gehen, wie lang ist _delay_us wirklich?


von Jens N. (midibrain)


Angehängte Dateien:

Lesenswert?

Guten Abend,

versuche gerade mit einem Dallas 1820 zu reden und habe damit keinen 
Erfolg.
Die Timeslots werden dabei mit _delay_us(xx) generiert und ich frage 
mich langsam ob das überhaupt zu Ziel führt.
Ein Interrupt im µs-Bereich ist zu schnell, unter C und GCC ist der 
Atmega dann nur noch in der ISR und hängt da fest.
Vielleicht ist ja auch etwas ganz anderes an meinem Ansatz falsch, hab 
mal die .c & .h angehangen.

Atmega32, GCC, Geany, AvrDude, DS1820(nicht 18x20!) werden verwendet.

Jens

: Verschoben durch Moderator
von Jens N. (midibrain)


Lesenswert?

P.S.: Versuche den RomCode auszulesen bekomme aber nur 8x255

von Helmut -. (dc3yc)


Lesenswert?

Ich habe gerade vor einer Woche die Lib von Falk Brunner ausprobiert und 
sie ging! Siehe: 
Beitrag "Re: Onewire + DS18x20 Library"
Da ist alles dabei, was man braucht.
Habe sie als Grundlage für einen WS2000-Wetterstationssensor 
hergenommen.
Hast du die CPU-Frequenz richtig definiert?
#define F_CPU 16000000UL

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Um die Ausgangsfrage zu beantworten: die Delay-Funktionen funktionieren 
mit Assemblerschleifen, nicht mit Interrupts, und sind auf einen 
CPU-Zyklus genau.

Oliver

von 900ss (900ss)


Lesenswert?

Jens N. schrieb:
> versuche gerade mit einem Dallas 1820 zu reden

Wenn du dir dabei soviel Mühe gegeben hast wie bei der Auswahl der 
Rubrik hier im Forum (Markt), dann wundert mich nichts. ;)

von Jens N. (midibrain)


Lesenswert?

Abend,

die F_CPU ist definiert.
Vor dem Zugriff auf den 1820 schalte ich die Interrupts mit cli() aus.
Die Lib von Falk Brunner ist leider in cpp, das kann und verstehe ich 
nicht,
eigentlich schade, hätte auch gern mal ein Bier mit Falk getrunken...

von Jens N. (midibrain)


Lesenswert?

Ja, Rubrik Markt ist natürlich falsch, kann das wer verschieben?

von 900ss (900ss)


Lesenswert?

Hast du das hier beachtet, steht als Note in der Beschreibung der 
Funktion delay_us:

In order for these functions to work as intended, compiler optimizations 
must be enabled, and the delay time must be an expression that is a 
known constant at compile-time. If these requirements are not met, the 
resulting delay will be much longer (and basically unpredictable), and 
applications that otherwise do not use floating-point calculations will 
experience severe code bloat by the floating-point library routines 
linked into the application.

Ach ja, die delay Funktionen funktionieren in der Regel sehr genau.

: Bearbeitet durch User
von Jens N. (midibrain)


Lesenswert?

Hey,

die Optimierung ist an und ich übergebe an _delay_us() nur Zahlenwerte 
also weder eine Variable noch sonst irgentwas.

Die _delay-Funktion geht bei mir auch sonst, allerdings habe ich damit 
noch nie ein so genaues Timing herstellen müssen.
Ich dachte der GCC verfälscht da vielleicht etwas und man weis es nicht, 
so wie er ja wohl auch durch das speichern vom Statusregister vor ISRs 
die Interruptzeit verlängert ohne das man das sieht, mann muss es halt 
wissen.

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Jens N. schrieb:
> Die Lib von Falk Brunner ist leider in cpp,

du bist ja richtiges talent - vielleicht doch besser briefmarken 
sammeln?
der code ist mehr in c als alles andere!

von Achim M. (minifloat)


Lesenswert?

Jens N. schrieb:
> Die Timeslots werden dabei mit _delay_us(xx) generiert und ich frage
> mich langsam ob das überhaupt zu Ziel führt.

Hast du einen UART oder eine SPI frei?
Da dann Pullup an RX/MISO und TX/MOSI über Schottky an RX/MISO. Das 
Verfahren ist in einer AppNote von Dallas/Maxim beschrieben, wie auch 
Falk hier 
Beitrag "Re: Onewire + DS18x20 Library" 
schrieb.

Damit bist du dann komplett ohne Delays unterwegs. Die Statemachine für 
komplette Transfers (und Trigger für das Umschalten der Baudrate für den 
'langen' Reset) müsste in der bisherigen Implementierung eh schon 
vorhanden sein.

mfg mf

: Bearbeitet durch User
von Jens N. (midibrain)


Lesenswert?

Hallo,

ja, SPI hätte ich abgesehen vom ISP noch frei, der USART muss nur 
empfangen.

Aber es muss doch auch einfacher gehen und bei einer Temperaturwandlung 
einmal in der Minute stört es mich auch nicht wenn der Controller mal im 
Delay hängt.

von Helmut -. (dc3yc)


Lesenswert?

Jens N. schrieb:
> Die Lib von Falk Brunner ist leider in cpp, das kann und verstehe ich
> nicht,

Wenn ich das schaffe, die Lib nach C zu portieren, kannst du es auch 
schaffen. Ich habe da kein c++ drin gefunden. Oh doch, ich glaub, ich 
hab's durch "c=c+1" ersetzt ;-).

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Jens N. schrieb:
> Die Lib von Falk Brunner ist leider in cpp, das kann und verstehe ich
> nicht,
> eigentlich schade, hätte auch gern mal ein Bier mit Falk getrunken...

Da is nix in C++, nur olles C. Einzig und allein die Anwendung ist als 
Arduinocode geschrieben, aber auch dort ist praktisch kein C++ drin.

Ja, die Dateien haben die Endung .cpp, es sind aber normale C-Dateien. 
Warum? Weil ich keine Ahnung von C++ und Arduino hatte und meine 
normalen .c Dateien nicht korrekt compiliert wurden. Also hab ich sie in 
.cpp umbenannt. Heute bin ich etwas schlauer und weiß, wie man .c 
Dateien in ein C++ Projekt einbindet.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Jens N. schrieb:
> Vor dem Zugriff auf den 1820 schalte ich die Interrupts mit cli() aus.

Das is zwar prinzipiell richtig, aber nicht nötig, denn das machen die 
Funktionen schon selber.

von Achim M. (minifloat)


Lesenswert?

Jens N. schrieb:
> Aber es muss doch auch einfacher gehen

Gibt es überhaupt Mikrocontroller mit nativer 1-wire Schnittstelle?

Sonst eben so, in aufsteigender Reihenfolge der Einfachheit und 
Berücksichtigung, dass SPI noch frei:
* (DS28E18 1-wire to SPI/I²C Bridge) Quark, ist falsch herum... 
rolleyes
* LM74 SPI temperature sensor
* NTC mit Pullup (umrechnen)
* LM35 analog temperature sensor(10mV/°C)

mfg mf

: Bearbeitet durch User
von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Achim M. schrieb:
> Gibt es überhaupt Mikrocontroller mit nativer 1-wire Schnittstelle?

Ja! alle neuen ATtiny haben UART mit one-wire half-duplex Operation z.B. 
ATtiny412.

Allerdings kann man auch mit jeder! UART im asynchron mode one-wire 
simulieren, dazu wird die Baudrate so gewählt, dass das Start/Stop Bit 
ins Protokoll Timing passt!
Nur muss man, wenn kein OC IO-Port vorhanden ist, die Tx/Rx Ports extern 
"zusammenlegen".

von Achim M. (minifloat)


Lesenswert?

Apollo M. schrieb:
> Allerdings kann man auch mit jeder! UART im asynchron mode one-wire
> simulieren

[Loriot]Ach![/Loriot]

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?


von Oliver S. (oliverso)


Lesenswert?

Jens N. schrieb:
> versuche gerade mit einem Dallas 1820 zu reden und habe damit keinen
> Erfolg.

Da du allerdings doch nicht der erste bist, der so etwas versucht, hilft 
vielleicht das hier weiter:

https://www.informatik.htw-dresden.de/~beck/Atmel/USBDS1820/

Oliver

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial/Assembler_und_Inline-Assembler&action=edit&section=6

Man muss nur in der .h Datei das hier einfügen.

#ifdef __cplusplus
    extern "C" {
#endif

... Dateiinhalt

// Abschluss der Funktionsdeklaration in C++, z.B. für Arduino
#ifdef __cplusplus
    }
#endif

Dann kann man die .cpp Dateien wieder in .c umbenennen und sie 
compilieren auch in der Arduino-IDE sauber. Oder man benutzt sie dann 
als normale C-Dateien in anderen IDEs bzw. Compilern.

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.