mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 Echtzeitproblem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Walt N. (belayason)


Bewertung
0 lesenswert
nicht lesenswert
Guten Morge Leute!

Mit meinem STM32F411RE NUCLEO Board habe ich mein Projekt gestartet. 
Jede Peripherie die ich für die Umsetzung benötige habe ich erfolgreich 
unter Kontrolle! Nun hat sich ein kleines Zeitproblem eingestellt, da 
ich meine Werte nicht Gleichzeitig über 3 Schnittstellen bekomme(2* 
SPI,1*i2c).

 Um die beste genauigkeit zu erzielen wäre eine gleichzeitige 
Ansteuerung der Schnittstellen nötig. Ich könnte natürlich mehrere µC 
auf meiner Prototypen Platine plazieren und die Schnittstellen somit 
gleichzeitig auf verschiedenen µC's laufen lassen . Ist natürlich nicht 
die besonders elegante Lösung....


Wie sieht es aus mit multi core µC's aus? Sind diese genau für diesen 
Zweck da? Dennoch erscheint mir es irgendwie ein bisschen 
überdimensioniert, wie sieht der Programmieraufwand aus wenn ich mich 
jetzt als fortgeschrittener Programmierer der STM32 µC Welt bezeichnen 
würde :O?

 In freeRTOS habe ich mich eingelesen und festgestellt das man es nicht 
mal auf die schnelle lernt. Hat hier jemand vielleicht einen Tipp wie 
ich mich da am besten reinarbeite? Sonst schonmal im vorraus danke für 
die Hilfe!

von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
Walt N. schrieb:
> da
> ich meine Werte nicht Gleichzeitig über 3 Schnittstellen bekomme

Was bedeuetet für dich "Gleichzeitig"?

Wenn dir 1ms und kleiner "gleichzeitig" genug ist, dann sollte es doch 
auch so gehen...sonst hol dir die Daten per DMA, da erfolgt die 
Ansteuerung "gleichzeitig".

von Stephan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
"Gleichzeitig" ist natürlich ein (zeitlich) dehnbarer Begriff bei nur 
einem Core...
Wie hattest Du Dir vorgestellt, dass das funktioniert?

(Free)RTOS löst das Problem auch nicht wenn nur eine Recheneinheit da 
ist...
VG, Stephan

von Walt N. (belayason)


Bewertung
0 lesenswert
nicht lesenswert
Stephan schrieb:
> "Gleichzeitig" ist natürlich ein (zeitlich) dehnbarer Begriff bei nur
> einem Core...
> Wie hattest Du Dir vorgestellt, dass das funktioniert?

Zum meinem bedauern musste ich festellen dass ich mein Signal 
kontinuierlich senden muss, nur ein gesendetes Signal reicht leider 
nicht aus um es auf Empfängerseite mit nötigem Erfolg zu entschlüsseln.

von Walt N. (belayason)


Bewertung
0 lesenswert
nicht lesenswert
Adam P. schrieb:
> Was bedeuetet für dich "Gleichzeitig"?

Damit meine ich eigentlich das ich meine Signale Kontinuierlich ohne 
Unterbrechung senden muss.

von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
Walt N. schrieb:
> Zum meinem bedauern musste ich festellen dass ich mein Signal
> kontinuierlich senden muss, nur ein gesendetes Signal reicht leider
> nicht aus um es auf Empfängerseite mit nötigem Erfolg zu entschlüsseln.

- Was für ein Signal?
- Entschlüsseln?

Also wenn dir deine SPI / I²C Peripherie auf eine Anfrage nicht 
antwortet,
dann hast du wohl ein anderes Problem...

Leider verstehe ich jetzt noch weniger, nach diesem Beitrag von dir :-/

Zu wenig Infos und etwas verwirrend.

"Kontinuierlich": Ist auch (zeitlich) nicht direkt spezifiziert.

Oder läuft dein µC in sich zu langsam (Taktfrequenz), dass du nicht 
hinterher kommst?

: Bearbeitet durch User
von Irgend W. (Firma: egal) (irgendwer)


Bewertung
0 lesenswert
nicht lesenswert
Walt N. schrieb:
> da
> ich meine Werte nicht Gleichzeitig über 3 Schnittstellen bekomme(2*
> SPI,1*i2c).

Die Übertragung selbst dürfte kein größeres Problem sein, die drei 
Hardwareeinheiten arbeiten ja eigenständig und wenn man die DMA-Kanäle 
richtig gewählt hat auch nahezu unabhängig voneinander (auf Teilen des 
Bus sind sie aber auch wieder nacheinander).
Aber du wirst es nicht schaffen alle drei wirklich "Zeitgleich" zu 
starten, dass sind nunmal drei Kommandos die nur nacheinander ausgeführt 
werden können. Selbst mit mehreren Core ist es arg schwierig die 
Taktgenau gleichzeitig dieses Kommando ausführen zu lassen. Spätestens 
beim Speicherzugriff müssen auch die sich wieder schön der Reihen nach 
anstellen.
Du solltest vielleicht nochmal dein Konzept überdenken oder aber in 
Richtung FPGA überlegen, die können sowas eher.

von Walt N. (belayason)


Bewertung
0 lesenswert
nicht lesenswert
Adam P. schrieb:
> - Was für ein Signal?
> - Entschlüsseln?

Meine I2C/SPI Verbindung funktioniert einwandfrei! Ich sende eine Signal 
über Ultraschall. Damit muss meine SPI Schnittstelle ohne unterbrechung 
senden. Dazwischen befindet sich natürlich noch ein bisschen Elektronik 
und aufgrund analoger Aktoren muss ich mein Signal ohne unterbrechung 
senden.

von Stephan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Walt N. schrieb:
> Zum meinem bedauern musste ich festellen dass ich mein Signal
> kontinuierlich senden muss

Wobei jetzt GLEICHZEITIG und KONTINUIERLICH Begriffe aus 
unterschiedlichen Domänen sind...

Wenn ich Dich trotzdem zu verstehen versuche:
Du willst von einem System (1x Core) GEICHZEITIG über 2 Interfaces 
(SPI/I2C) Daten rausschicken... (die Empfängerseite mal ganz aussen 
vor).
Das wird nicht funktionieren, wenn Du mit GLEICHZEITG tatsächlich ein dt 
von 0 vorgibst...

von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
Walt N. schrieb:
> aufgrund analoger Aktoren muss ich mein Signal ohne unterbrechung
> senden.


Dann nimm DMA mit double Buffer.
Der sendet dir dann "ohne" µC Last die ganze Zeit,
lediglich die Neuinitialisierung nach jedem DMA Block muss dann kurz im 
Interrupt stattfinden (in dieser Zeit versendet er ja den zweiten Buffer 
/ keine Unterbrechung)

: Bearbeitet durch User
von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Walt N. schrieb:
> Wie sieht es aus mit multi core µC's aus? Sind diese genau für diesen
> Zweck da?

Nein eher nicht. Die Kerne teilen sich gewisse Ressourcen deswegen hast 
du da noch weniger unter Kontrolle, wann genau was passiert.

Möglicherweise ist noch nicht klar, was du machen willst. Es könnte die 
synchrone Übertragung von Daten auf unterschiedlichen Schnittstellen 
sein oder auch die parallele kontinuierliche Übertragung (aber nicht 
zwingend Synchron).

Höre mal mit den Geheimnissen auf und lege die Karten offen auf den 
Tisch. Was hast du vor zu erreichen und wozu ist das gut?

> Meine I2C/SPI Verbindung funktioniert einwandfrei!

Und doch wohl nicht so, wie du es brauchst. Deswegen ist dieser Hinweis 
vollkommen wertlos. Wenn wir wüssten, was du brauchst und eine 
Vorstellung von deinem bestehenden Lösungsansatz haben, der angeblich 
"einwandfrei" funktioniert, könnten wir Dir vielleicht hilfreiche Tipps 
geben.

Aber so sagst du nur: Ich habe alles richtig aber aber es geht nicht. 
Sagt mir nicht, was ich falsch gemacht habe, denn es ist ja alles 
richtig. Hä?

: Bearbeitet durch User
von Walt N. (belayason)


Bewertung
0 lesenswert
nicht lesenswert
Adam P. schrieb:
> Dann nimm DMA

Ok das probiere ich mal! Danke

von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
Stefan ⛄ F. schrieb:
> Höre mal mit den Geheimnissen auf und lege die Karten offen auf den
> Tisch.

-->

Walt N. schrieb:
> Adam P. schrieb:
>> Dann nimm DMA
>
> Ok das probiere ich mal! Danke

Da hat meine Klaskugel heute wohl einen guten Tag :-D

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Adam P. schrieb:
> Da hat meine Klaskugel heute wohl einen guten Tag

Ja, vermute ich auch. Wir müssen abwarten, was der TO dazu sagt.

von Walt N. (belayason)


Bewertung
0 lesenswert
nicht lesenswert
Was ich machen möchte ist ein Phasenmoduliertes Signal über einen DAC 
(MCP4922) an einen Piezo schicken der mir dann ein Ultraschallsignal 
erzeugt. Daher muss ich aber nun eine statische Wertetabelle erzeugen um 
den DMA modus zu nutzen? Oder kann ich die während dem DMA auch ändern?

von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
Walt N. schrieb:
> Oder kann ich die während dem DMA auch ändern?

Kannst du auch...je nachdem wie lange du dafür brauchst.

von John Doe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Walt N. schrieb:
> Was ich machen möchte ist ein Phasenmoduliertes Signal über einen DAC
> (MCP4922) an einen Piezo schicken der mir dann ein Ultraschallsignal
> erzeugt. Daher muss ich aber nun eine statische Wertetabelle erzeugen um
> den DMA modus zu nutzen? Oder kann ich die während dem DMA auch ändern?

Natürlich.

von Volle (Gast)


Bewertung
0 lesenswert
nicht lesenswert
SPI und I^2C  sind aus Core Sicht ja langsame Ereignisse
mit DMA, Interrupts, Timer kann man sehr viele Dinge parallel machen.

nur eine geht gar nicht: busy waiting

Multicore macht die Sache übrigens nicht einfacher da man auch noch die 
Cores synchronisieren muss

von Jan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Zeig doch mal, wie deine I2C Kommunikation funktioniert. "Funktioniert" 
ist erstmal nicht viel wert, denn es gibt unterschiedliche Ansätze wie 
es funktionieren kann.

Wenn du etwas blockierend schickst, was in vielen Tutorials der erste 
und schnellste Schritt zum ersten Erfolg ist, kannst du in der Zeit eben 
nix anderes machen, der µC wartet.

Es gibt aber viele Methoden, Sachen quasiparallel zu machen.

Komplett analog kann das Ganze ja eh nicht sein, weil dein ADC ja auch 
nur diskrete Werte zu diskreten Zeitpunkten bekommt. Klar 
mittelt/interpoliert der das dann, aber erstmal kannst du nichts 
wirklich kontinuierlich erzeugen. Die Frage ist, welcher Minimalabstand 
zwischen den neuen Werten erlaubt ist und ab wann es Probleme im 
Ultraschall gibt.

Glaube mir, du möchtest keinen Multicore.

von Max M. (maxi123456)


Bewertung
0 lesenswert
nicht lesenswert
Ich wette zu 99% benötigst du für deinen Anwendungsfall garantiert kein 
besseres Echtzeit.

Beschreibe dein Vorhaben doch mal genauer.

: Bearbeitet durch User
von NichtWichtig (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Walt N. schrieb:
> Adam P. schrieb:
>> - Was für ein Signal?
>> - Entschlüsseln?
>
> Meine I2C/SPI Verbindung funktioniert einwandfrei! Ich sende eine Signal
> über Ultraschall. Damit muss meine SPI Schnittstelle ohne unterbrechung
> senden. Dazwischen befindet sich natürlich noch ein bisschen Elektronik
> und aufgrund analoger Aktoren muss ich mein Signal ohne unterbrechung
> senden.

Für Audioanwendungen wird gewöhnlich der I2S Bus, mit 192KS wäre US 
vermutlich kontinuierlich machbar.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
NichtWichtig schrieb:
> Für Audioanwendungen wird gewöhnlich der I2S Bus, mit 192KS wäre US
> vermutlich kontinuierlich machbar.

Was bedeutet "US"?

von Stefan S. (chiefeinherjar)


Bewertung
0 lesenswert
nicht lesenswert
Stefan ⛄ F. schrieb:
> NichtWichtig schrieb:
>> Für Audioanwendungen wird gewöhnlich der I2S Bus, mit 192KS wäre US
>> vermutlich kontinuierlich machbar.
>
> Was bedeutet "US"?

Ultraschall.
Siehe

Walt N. schrieb:
> Was ich machen möchte ist ein Phasenmoduliertes Signal über einen DAC
> (MCP4922) an einen Piezo schicken der mir dann ein Ultraschallsignal
> erzeugt.

von Walt N. (belayason)


Bewertung
0 lesenswert
nicht lesenswert
Wie erstelle ich mein Chipselect Signal wenn ich die SPI Schnittstelle 
im DMA Modus benutze? Der MCP4922 übernimmt die Daten nur wenn ich mit 
dem Chipselect Signal. In der
void HAL_SPI_TxCpltCallback (SPI_HandleTypeDef * hspi)
 Funktion kann ich nach der Übertragung mein Chipselect Signal wieder 
auf HIGH schalten. Aber wo ziehe ich das CS Signal am besten auf LOW?

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht lesenswert
Walt N. schrieb:
> Aber wo ziehe ich das CS Signal am besten auf LOW?

Ich würde mal sagen, direkt vor dem Start der DMA Übertragung.

von Walt N. (belayason)


Bewertung
0 lesenswert
nicht lesenswert
Stefan ⛄ F. schrieb:
> Ich würde mal sagen, direkt vor dem Start der DMA Übertragung.

Wenn ich mit meiner DMA Übertragung eine Wertetabelle übertrage kann ich 
ja nicht nach jeden 16 bit ( wie es das Datenblatt vom MCP4922 verlangt) 
das Chipselect Signal dazwischen schalten. Der überträgt ja die Ganze 
Wertetabelle auf einmal.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Stefan ⛄ F. schrieb:
> Ich würde mal sagen, direkt vor dem Start der DMA Übertragung.

Walt N. schrieb:
> Wenn ich mit meiner DMA Übertragung eine Wertetabelle übertrage kann ich
> ja nicht nach jeden 16 bit ( wie es das Datenblatt vom MCP4922 verlangt)
> das Chipselect Signal dazwischen schalten. Der überträgt ja die Ganze
> Wertetabelle auf einmal.

Kannst du nicht und sollst du nicht. Warum willst du es denn tun?

von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
Stefan ⛄ F. schrieb:
> Kannst du nicht und sollst du nicht. Warum willst du es denn tun?

Sieht im Datenblatt irgendwie echt danach aus :-/

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Adam P. schrieb:
> Sieht im Datenblatt irgendwie echt danach aus

Was steht wo in welchem Datenblatt? Zitiere es bitte.

Wenn dein Peripherie-Chip alle 16 bit so einen Impuls braucht, dann 
taugt er nicht für DMA.

: Bearbeitet durch User
von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
MCP4902/4912/4922 Datenblatt
Seite 23:

"The write command is initiated by driving the CS pin
low, followed by clocking the four Configuration bits and
the 12 data bits into the SDI pin on the rising edge of
SCK. The CS pin is then raised, causing the data to be
latched into the selected DAC’s input registers."

"Any clocks past the 16th clock will be ignored."

: Bearbeitet durch User
von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Ja Kacke, dann geht DMA halt nicht.

von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
Stefan ⛄ F. schrieb:
> Ja Kacke, dann geht DMA halt nicht.

Oder zumindest halt nur für die 2 Byte :-)
Da weiß ich aber nicht ob sich das zeitlich überhaupt lohnt...

von Walt N. (belayason)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Stefan ⛄ F. schrieb:
> Warum willst du es denn tun?

Ich erzeuge mit dem mcp4922 ein 40Khz Signal und an ihn sende ich 
entweder 0x3fff oder 0x3000 mit der SPI Schnittstelle. Nach 20 
Schwingungen kommt ein Phasenwechsel (0x3fff, 0x3000 ...0x3fff, 0x3000 
(Phasenwechsel), 0x3000, 0x3fff). Dadurch wird meine Wertetabelle 
ziemlich groß obwohl die Werte sich eigentlich die ganze Zeit 
wiederholen, aber dadurch das ich nun DMA benutze muss ich sie halt so 
in den speicher schreiben. Und im Anhang der write command für meinen 
DAC, an dem CS Signal komme ich nicht dran vorbei.

: Bearbeitet durch User
von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Da wäre ein Wandler mit I²S Schnittstelle wohl besser geeignet gewesen. 
DMA scheint mir hier inzwischen sinnlos. Ich würde die Kommunikation mit 
einem Timer-Interrupt machen und dafür sorgen, dass dieser niemals 
gestört (unterbrochen) wird.

von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
Stefan ⛄ F. schrieb:
> Ich würde die Kommunikation mit einem Timer-Interrupt machen

Seh ich das dann richtig...?

Walt N. schrieb:
> entweder 0x3fff oder 0x3000

1Hz hat dann 2 Zustände (Werte).

40kHz => T=25µs
Also 1 Wert alle 12,5µs

Meinst dass alles passt zeitlich in dieses Zeitfenster?

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Adam P. schrieb:
> Meinst dass alles passt zeitlich in dieses Zeitfenster?

Wenn du ein Rechteck-Signal mit 40kHz ausgeben willst, dann brauchst du 
80.000 Werte pro Sekunde, also Intervalle von 12,5 Mikrosekunden.

Aber Rechteck-Signale gibt es in der Natur nicht, dein Signal wird durch 
die Übertragungsstrecke mit mehreren Oberwellen stark verzerrt. Ich 
hoffe, du hast das bedacht.

von Walt N. (belayason)


Bewertung
0 lesenswert
nicht lesenswert
Adam P. schrieb:
> Meinst dass alles passt zeitlich in dieses Zeitfenster?

Dafür muss halt die Schnittstelle schnell genug sein. Mit SPI habe ich 
es hinbekommen. Wegen der slew rate vom DAC sieht es nach einem 
Trapezsignal aus. Ist aber auch noch ok.

von Volle (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wenn das CS Signal vom SPI erzeugt wird  und nicht als DIO kann man 
i.d.R es auch über DMA erzeugen. ( Ich hab zumindest noch kein µC 
gesehen bei dem das nicht geht)

Sonst muss man einen Interrupt verwenden der vom SPI ausgelöst wird wenn 
sein Sendebuffer leer ist.  Der Interrupt kann Daten direkt in die 
Senderegister schreiben oder den DMA neu aufsetzen. Und auch Pins 
setzten.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
@Volle: Guter Hinweis!

Ich habe gerade mal ins Datenblatt des STM32F303 geschaut, der scheint 
das zu können. Man kann die Größe des Frames auf 4 bis 16 bit einstellen 
und die NSS Einheit erzeugt automatisch Impulse alle n Bits.

Interessant, das Feature kannte ich noch nicht.

Dann ist mein Kommentar

> Ja Kacke, dann geht DMA halt nicht.

wohl nicht richtig gewesen.

: Bearbeitet durch User
von Walt N. (belayason)


Bewertung
0 lesenswert
nicht lesenswert
Dann verusche ich mich mal da dran!

von Walt N. (belayason)


Bewertung
0 lesenswert
nicht lesenswert
Adam P. schrieb:
> lediglich die Neuinitialisierung nach jedem DMA Block muss dann kurz im
> Interrupt stattfinden

Das bedeutet ich muss die Funktion HAL_SPI_Transmit(); nochmal in void 
HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) ausführen?

von void (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Walt N. schrieb:
> mcp4922 ein 40Khz Signal und an ihn sende ich entweder 0x3fff oder
> 0x3000

Das bedeutet, du erzeugst mit dem DAC ein binäres Signal bestehend aus 
den beiden Spannungswerten
1.  Vref * 4095/4096 ~= Vref * 100% = Vref
2.  Vref * 0/4096 = Vref * 0% = 0V

Warum benötigst du für diese Aufgabe einen DAC?
Das kann ein Portpin von deinem uC doch auch. Ein passend gesetzter 
Timerausgang erzeugt dir auch so ein PWM Signal mit 50% duty und den 
Phasenwechsel bekommst du, wenn du den Timerausgang invertierst.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.