Forum: Mikrocontroller und Digitale Elektronik DS18B20 in Timer Interrupt Routine


von Hannes (Gast)


Lesenswert?

Hallo,

hat schon jemand eine Ansteuerung des DS18B20 mittels Timer Interrupt 
Routinen versucht - d.h. die komplette Buskommunikation sollte über 
Interrupts gehandled werden - damit können andere Interrupts auftreten 
und die Groundloop nicht beeinflußen.
Ich will das in einem PIC umsetzen (vornehmlich in C).

Danke,
Hannes

: Verschoben durch User
von Tim (Gast)


Lesenswert?

Ja, auf einem AVR in C.
Problem sind die wenige µSec langen Impulse.
Stellenweise habe ich da auf _delay_us zurückgreifen müssen
da IRQ exit+enter länger gedauert hätte.
Die Langen werden per Timer und einer kleinen (17 Schritt)
Satemaschine erledigt.
Man muss halt nur öfters den Timer um-konfigurieren.

Mach aber nur alle 10 Sek eine Messung, sonst ist deine
Temperatur 1/2 Grad höher....

von Hannes (Gast)


Lesenswert?

Hm. Das mit den kurzen us Impulsen hört sich wirklich nicht so gut an - 
wobei ich meinen PIC mit 64MHz betreibe (somit intern mit 16MHz).
Hast du deinen Quellcode veröffentlicht?

von Peter D. (peda)


Lesenswert?

Hannes schrieb:
> hat schon jemand eine Ansteuerung des DS18B20 mittels Timer Interrupt
> Routinen versucht

Ja, beim 8051.
Die <15µs mache ich im Interrupt mit Delay. Der Timer macht die 60µs, 
480µs und die 10s Meßzeit.

Der Interrupt muß allerdings die höchste Priorität bekommen, damit er 
alle anderen Interrupts unterbrechen kann. So stört z.B. ein langsamer 
UART-Interrupt nicht.

Für einen AVR ist es daher nicht möglich, 1-wire als Interrupt zu 
machen.

von (prx) A. K. (prx)


Lesenswert?

Peter Dannegger schrieb:
> Die <15µs mache ich im Interrupt mit Delay. Der Timer macht die 60µs,
> 480µs und die 10s Meßzeit.
>
> Für einen AVR ist es daher nicht möglich, 1-wire als Interrupt zu
> machen.

Das kann ich nicht recht nachvollziehen. Man kann beim AVR wie beim 8051 
das einzelne Bit im Interrupt implementieren, mit den 15µs per Delay. 
Der Rest lässt sich auch bei AVRs per Timer abwickeln, wenn 
sichergestellt werden kann, dass der Handler nach maximal 120µs das Bit 
beendet.

Aber hier geht es ausserdem nicht um AVRs sondern PICs. Die haben 2 
Interrupt-Prioritäten.

NB: Ich betreibe 1-Wire Code auf einem 16MHz AVR unter einem RTOS mit 
10kHz RTOS-Timer.

von Tim (Gast)


Lesenswert?

>Hm. Das mit den kurzen us Impulsen hört sich wirklich nicht so gut an -
>wobei ich meinen PIC mit 64MHz betreibe (somit intern mit 16MHz).

Ich habe hier max 6µS delay. Das sind 48 Befehle bei 8Mhz.
Kann man also gerade noch in einem IRQ verkraften.
Und Ja, USART ISRs habe ich auch noch.
Die Statemaschiene hängt am meinem Standard 1Khz Timer daran,
der auch noch so Sachen wie Uhrzeit, Tasten Entprellung,.. macht.
Da man beim 1 Wire Bus das Timing ja entscheiden ist werden
nicht zum 1Khz Tackt passende Aktionen von einem 2 Timer
mit IRQ erledigt. Der gibt aber entweder den Bus frei oder
holt sich den Status vom Bus.

Ich habe fehler Zähler drin und die stehen praktisch immer bei 0.
Ist also sehr gut per IRQ machbar.

Während der Entwicklung war zum optimieren der _delay_us ein Oszi
sehr hilfreich (und auch zum debuggen :-).

> Hast du deinen Quellcode veröffentlicht?

Nope.

von Hannes (Gast)


Lesenswert?

Danke für die Inputs.
Ich werd das dann wahrscheinlich auch mal so versuchen - falls es doch 
Probleme gibt, werd ich das wohl in die Groundloop verfrachten müssen 
und nur die langen Delays per Timer und Statemachine machen.
Danke nochmal!

PS: Falls doch jemand seinen source veröffentlichen will, ich wäre sehr 
daran interessiert! 1:1 kann man das sowieso nicht übernehmen, aber 
Anregungen allemal!

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.