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
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....
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?
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.
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.
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.