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?
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.
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.
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?
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.
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!
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).
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.
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.
@ 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!
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"
Hast du eine UART frei? Von Atmel gibts ne Appnote wie mann das komplette 1-W timing per UART lösen kann. Cheers
@ 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ß
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.