Forum: Mikrocontroller und Digitale Elektronik µC LPC1769 entlasten mit 1-Wire Master


von oi (Gast)


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?

von Peter D. (peda)


Lesenswert?

Wenn der MC keine 2 I2C-Busse hat, hast Du damit das Problem nur noch 
verschlimmert.
Bzw. ein Bus wird als SW-I2C-Master gemacht, der andere als 
HW-I2C-Interrupt. Der Interrupt wird dann nicht durch den anderen 
verlangsamt.

von io (Gast)


Lesenswert?

Sorry,
der ADC wird über SPI und nicht I²C ausgelesen!

von Jim M. (turboj)


Lesenswert?

io schrieb:
> der ADC wird über SPI und nicht I²C ausgelesen!

Das ändert beim LPC176x aber einiges. Die SSP Einheiten (für SPI) können 
zum Beispiel auch DMA.

von io (Gast)


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?

von Peter D. (peda)


Lesenswert?

io schrieb:
> Das eigentliche Problem
> ist doch, dass der Einlesevorgang des Tempsensors nicht unterbrochen
> werden darf, bzw durch Interrupts gestört wird.

Kritisch ist nur der 15µs Slot, den kann man unter Interuptsperre 
machen, falls der ADC-Interrupt nicht deutlich kürzer ist (<5µs).
Bzw. beim DS2482 macht der alle Timings selber.

von io (Gast)


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!

von Peter D. (peda)


Lesenswert?

Man kann 1-Wire auch über die UART machen. Das Timing erfolgt dann über 
die Baudrate, d.h. die CPU hat nichts kritisches zu machen.
Allerdings muß dazu der TXD-Pin als open-drain konfigurierbar sein bzw. 
man braucht ein open-drain Gatter (74HCT1G125).

von temp (Gast)


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.

von Peter D. (peda)


Angehängte Dateien:

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.

von io (Gast)


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!

von temp (Gast)


Lesenswert?

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

Hatte ich hier vor ca. 4 Jahren schon mal reingestellt:

Beitrag "DS18x20 unter FreeRTOS und LPCXpresso 1769"

von LTC1043 (Gast)


Lesenswert?

Hast du eine UART frei?

Von Atmel gibts ne Appnote wie mann das komplette 1-W timing per UART 
lösen kann.

Cheers

von io (Gast)


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ß

von Peter D. (peda)


Lesenswert?

io schrieb:
> Am besten würde mir aber ehrlich gesagt die Idee mit dem DS2482
> gefallen

Dann sollte das I2C auch ein Interrupthandler sein, ansonsten verwartest 
Du ja wieder alles in der Mainloop.

von oi (Gast)


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.

von Peter D. (peda)


Lesenswert?

oi schrieb:
> Was mir noch nicht ganz klar ist, ist, wie denn signalisiert wird, dass
> eine Konvertierung des DS18B20 beendet ist

Z.B. durch einen Timerinterrupt >=750ms.

von oi (Gast)


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.

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.