µC LPC1769 entlasten mit 1-Wire Master

Gast #4191383
Lesenswert?

Hey,
ich verwende momentan den LPC1769, der momentan im kHz-Bereich einen ADC 
ausliest. Jetzt möchte ich alle paar Sekunden zusätzlich einen DS18B20 
Temperatursensor auslesen, ohne dabei das Einlesen des ADCs unterbrechen 
zu müssen. Zunächst wollte ich den LPC als 1-Wire-Master nutzen und die 
1-Wire Schnittstelle auf diesen implementieren. Bei den Timings ist mir 
allerdings aufgefallen, dass das Resetten, konvertieren und einlesen im 
Vergleich zum Auslesen des ADCs sehr lange dauert, ich aber andererseits 
für das Einhalten der 1-Wire-Timings während des Einlesevorgangs des 
DS18B20 nicht weitere Aufgaben abfrühstücken kann.
Um den Mikrocontroller zu entlasten wollte ich jetzt den DS2482 
1-Wire-Master einsetzen. Klappt die Idee, nach dem Auslesen des ADCs 
über I²C an den 1-Wire-Master eine Konvertierung der Temperaturmessdaten 
zu starten, anschließend wieder ein paar ADC Werte einzulesen, um danach 
erst die Werte vom Temperatursensor einzulesen?
Gast #4191448
Lesenswert?

Ich nutze die SSP Schnittstelle mit DMA, allerdings momentan nur die 
Funktion an sich, und nicht die Vorteile, da ich nichts parallel dazu 
mache! Muss mir aber gerade mal klarmachen, wie ich das Einlesen des 
Temperatursensors darin einbette:

Einlesen über SSP mit DMA durch Interrupt ausgelöst -> Daten werden in 
buffer abgespeichert und ich kann parallel dazu den Einlesevorgang des 
Temperatursensors veranlassen, aber was dann? Das eigentliche Problem 
ist doch, dass der Einlesevorgang des Tempsensors nicht unterbrochen 
werden darf, bzw durch Interrupts gestört wird. Dann kann ich aber a) 
die Daten des ADCs nicht verarbeiten und b) weitere Daten nicht 
einlesen. Kann gut sein, dass mir einige Vorteile von DMA noch nicht 
bekannt sind, vielleicht kannst du mir vielleicht grob sagen, wie das 
grobe Konzept aussehen könnte?
Gast #4191522
Lesenswert?

Deshalb die Idee, das vom DS2482 übernehmen zu lassen und nur durch den 
LPC das Resetten, konvertieren und einlesen der konvertierten Daten 
einzuleiten.
Habe mir das so vorgestellt:

1) Interrupt ADC-DRDY-Pin -> 1. ADC Wert wird eingelesen -> während mit 
Hilfe von DMA eingelesen wird, Reset über I²C an DS2482 veranlassen
2) Interrupt ADC-DRDY-Pin -> (1+x)ter ADC Wert wird eingelesen -> 
Convert über I²C an DS2482 veranlassen
3) Interrupt ADC-DRDY-Pin -> (1+x+y)ter ADC Wert wird eingelesen -> 
Daten aus DS2482 einlesen

x,y dann je nachdem, wie lange dieser Vorgang dauert, kann aber dann 
auch im Sekundenbereich liegen, weil die Temperaturmessdaten nicht so 
hochfrequent eingelesen werden müssen!
Gast #4191844
Lesenswert?

Ich mache beim LPC1769 das komplette Timing für Onewire in einem relativ 
hoch priorisierten Timerinterrupt. Das geht deutlich besser als mit 
delays. Code-Schnipsel könnte ich zur Verfügung stellen, für ein 
Kochrezept fehlt mir aber die Zeit.
#4191876
Lesenswert?

temp schrieb:
> Ich mache beim LPC1769 das komplette Timing für Onewire in einem relativ
> hoch priorisierten Timerinterrupt.

Ich hab das auch mal beim 8051 gemacht.
Nur der Low-Puls (1.8µs) bzw. das Lesen (5.7µs) erfolgt über Delay im 
Interrupt.

Für den AVR konnte ich das leider nicht mehr verwenden, da der keine 
Prioritäten hat. Jeder andere Interrupt hätte also das Timing zerstört.
Angehängte Dateien:
Gast #4192714
Lesenswert?

@ temp: Code-Schnipsel wären super, danke im voraus!

@ peda: Ich hab schon angefangen mit der Implementierung, verwende 
ebenfalls Timerinterrupts! Schaue mir mal deinen Code an, bedankt!

Vielleicht bekomme ich das auch ohne den DS2482 hin.
Wenn nicht: Wäre meine Idee denn von oben möglich, oder übersehe ich 
etwas? Mit Hilfe der maximintegrated application notes, wo die 
Implementierung schon beschrieben wird, müsste ich das ganze ja nur dann 
auf LPCopen übertragen!
Gast #4193995
Lesenswert?

@ temp: Danke, schaue da mal rein!
@ LTC1043: Ja, habe ich. Werd mich dann mal was einlesen, ob das 
vielleicht ebenfalls eine gute Alternative wäre!

Am besten würde mir aber ehrlich gesagt die Idee mit dem DS2482 
gefallen, kann mir da noch jm sagen, ob meine Vorgehensweise zu 
realisieren wäre? Dennoch werde ich mich jetzt mal mit den von euch 
vorgeschlagenen Ideen beschäftigen

Gruß
Gast #4198905
Lesenswert?

Das ermöglicht der LPC1769!

Was mir noch nicht ganz klar ist, ist, wie denn signalisiert wird, dass 
eine Konvertierung des DS18B20 beendet ist und ich den Chip auslesen 
kann. Bei meinem ADC wird das beispielsweise durch einen I/O-Pin 
signalisiert, so dass ich über den Einlesevorgang mittels I/O-Interrupt 
starten kann.
Gast #4198968
Lesenswert?

Okay, dann hab ich mir das doch richtig gedacht. Inwiefern benötige ich 
dann einen I²C Interrupt Handler?

Wenn ich den Timer Interrupt Handler als state machine aufbaue, sollte 
das doch funktionieren. Ich definiere verschiedene States, so dass ich 
dann für einen vollständigen Lesezugriff (also reset, etc. inklusive) 
mehrmals in meinen Interrupt Handler springe und je nachdem verschiedene 
Befehle ausführe. So kann ich problemlos weitere Tasks während der 
Wartezeit in meinem Mikrocontroller erledigen.

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