INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Serial buffer
10.06.2015, 18:22
Beitrag #17
RE: Serial buffer
(28.04.2015 19:46)Bitklopfer schrieb:  @Laura,
..ähm bevor ich nun eine ersonnene Lösung zum Besten gebe würde ich mal gerne wissen was der Ursprung der Daten ist bzw. welchen Wertebereich die abdecken müßen ?
lg
bk

Hallo,

mein Stand ist aktuell der Folgende: Ich generiere jede ms ein Timerinterrupt der eine Flag setzt. Im Hauptprogramm wird wenn die Flag gesetzt ist, ein byte aus dem serial buffer gelesen und als Stellgröße für eine PWM benutzt. Sinkt der Speicherstand des serial buffers auf unter die Hälfte der verfügbaren 64 bytes, so fordere ich Matlab an, bis auf 64 bytes aufzufüllen.

Code:
void loop()
{
  static int lastupdate = 0;
  
  if (flag == true)
  {
    val = Serial.read();
    analogWrite(10, val);
    lastupdate ++;
    flag = false;
  }
  
  if ((Serial.available() < 32) && (lastupdate > 20))
      {
      Serial.write(64-Serial.available());
      lastupdate = 0;
      }
}

Der Wert, den der Arduino auf die serielle Schnittstelle schreibt entspricht der Anzahl an bytes, die Matlab daraufhin sendet.

Leider kommen nur teilweise die richtigen Werte dabei rum, teilweise irgendetwas Undefiniertes. Ich vermute, das kommt daher, dass ich Daten verliere wenn der 1ms Interrupt auslöst, während seriell Daten übertragen werden. Wie löst man eine solche Problematik elegant?

Zum Wertebereich: 0 bis 255.
Serielle Schnittstelle aktuell mit 8 Datenbits, 1 Stopbit bei 115200 Baudrate konfiguriert. Andere Baudraten verändern das Ergebnis nicht.

Danke und Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2015, 19:34
Beitrag #18
RE: Serial buffer
Hi,
ich verstehe immer noch nicht, welches Problem Du zu lösen versuchst.
...aber erstmal egal.
Der Interrupt ist wahrscheinlich nicht Schuld, wenn die Routine tatsächlich nur ein Flag setzt.
Zeig doch mal den ganzen Sketch, dann kann man vielleicht was sagen.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2015, 19:59
Beitrag #19
RE: Serial buffer
(10.06.2015 19:34)Thorsten Pferdekämper schrieb:  Hi,
ich verstehe immer noch nicht, welches Problem Du zu lösen versuchst.
...aber erstmal egal.
Der Interrupt ist wahrscheinlich nicht Schuld, wenn die Routine tatsächlich nur ein Flag setzt.
Zeig doch mal den ganzen Sketch, dann kann man vielleicht was sagen.
Gruß,
Thorsten

Das Problem ist folgendes: Ich habe 200 000 Werte in Matlab, die ich so an den Arduino geben möchte, dass dieser genau jede Millisekunde einen neuen Wert als Stellgröße für eine PWM benutzt. Das ist alles.

Sobald dies mit Kabel funktioniert möchte ich dieses durch zwei Xbee Module ersetzen, wobei der Empfänger direkt auf RX0 und TX0 per Shield gesetzt wird, sodass 1 zu 1 das USB Kabel ersetzt wird und im Code nichts geändert werden muss

Den vollständigen Sketch poste ich morgen, vorweg: Die ISR setzt nur die flag sonst nichts.

Grüße und schönen Abend
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2015, 20:56
Beitrag #20
RE: Serial buffer
(10.06.2015 19:59)Laura schrieb:  Das Problem ist folgendes: Ich habe 200 000 Werte in Matlab, die ich so an den Arduino geben möchte, dass dieser genau jede Millisekunde einen neuen Wert als Stellgröße für eine PWM benutzt. Das ist alles.
Da stellt sich mir die Frage, wie sinnvoll das ist. Auf einem Uno hat PWM normalerweise eine Frequenz von 490Hz bzw. 980Hz (auf Pin 5 und 6). D.h. Du setzt im Prinzip die neuen Werte schneller, als das System darauf reagiert.
Was genau hast Du damit vor?

Dann noch zu der Sache mit dem Flag und der ISR: Warum machst Du das eigentlich so kompliziert und verwendest nicht einfach die millis()? Merke Dir einfach den Stand der millis() und setze den PWM-Wert immer dann, wenn sich die millis() geändert haben. Das gibt Dir auch einen Takt von 1ms, ohne dass Du einen eigenen Timer etc. brauchst.

Zitat:Leider kommen nur teilweise die richtigen Werte dabei rum, teilweise irgendetwas Undefiniertes.
Woran merkst Du das?
Wie kann es "etwas undefiniertes" sein, wenn Du doch den ganzen Wertebereich benutzt?

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2015, 21:04 (Dieser Beitrag wurde zuletzt bearbeitet: 10.06.2015 21:06 von Laura.)
Beitrag #21
RE: Serial buffer
(10.06.2015 20:56)Thorsten Pferdekämper schrieb:  
(10.06.2015 19:59)Laura schrieb:  Das Problem ist folgendes: Ich habe 200 000 Werte in Matlab, die ich so an den Arduino geben möchte, dass dieser genau jede Millisekunde einen neuen Wert als Stellgröße für eine PWM benutzt. Das ist alles.
Da stellt sich mir die Frage, wie sinnvoll das ist. Auf einem Uno hat PWM normalerweise eine Frequenz von 490Hz bzw. 980Hz (auf Pin 5 und 6). D.h. Du setzt im Prinzip die neuen Werte schneller, als das System darauf reagiert.
Was genau hast Du damit vor?

Dann noch zu der Sache mit dem Flag und der ISR: Warum machst Du das eigentlich so kompliziert und verwendest nicht einfach die millis()? Merke Dir einfach den Stand der millis() und setze den PWM-Wert immer dann, wenn sich die millis() geändert haben. Das gibt Dir auch einen Takt von 1ms, ohne dass Du einen eigenen Timer etc. brauchst.

Zitat:Leider kommen nur teilweise die richtigen Werte dabei rum, teilweise irgendetwas Undefiniertes.
Woran merkst Du das?
Wie kann es "etwas undefiniertes" sein, wenn Du doch den ganzen Wertebereich benutzt?

Weil millis() abfragen den Wert ändert wenn mindestens eine Millisekunde vergangen ist und nicht genau eine Millisekunde wenn ich deinen vorschlag richtig verstehe. Zur PWM Frequenz: Ich benutze einen Mega 2560 und habe den Timer manipuliert, sodass sich eine PWM Frequenz von 30kHz ergibt. Mein Oszilloskop hat das bestätigt. Undefiniert war vielleicht der falsche Begriff. Es kommen falsche Werte an.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2015, 21:07
Beitrag #22
RE: Serial buffer
(10.06.2015 21:04)Laura schrieb:  Weil millis() abfragen den Wert ändert wenn mindestens eine Millisekunde vergangen ist und nicht genau eine Millisekunde wenn ich deinen vorschlag richtig verstehe.
Ja, aber Du machst auch nichts anderes. Du setzt in der Interrupt-Routine das Flag und fragst es zyklisch ab. Das kann dann auch etwas später sein. Ich denke, das ist nicht prinzipiell anders als bei den millis().

Zitat:Zur PWM Frequenz? Ich benutze einen Mega 2560 und habe den Timer manipuliert, sodass sich eine PWM Frequenz von 30kHz ergibt. Mein Oszilloskop hat das bestätigt.
Ah, dann wird's schon sinnvoller. Wobei ich mich immer noch frage, was da gesteuert werden soll.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2015, 21:14
Beitrag #23
RE: Serial buffer
(10.06.2015 21:07)Thorsten Pferdekämper schrieb:  
(10.06.2015 21:04)Laura schrieb:  Weil millis() abfragen den Wert ändert wenn mindestens eine Millisekunde vergangen ist und nicht genau eine Millisekunde wenn ich deinen vorschlag richtig verstehe.
Ja, aber Du machst auch nichts anderes. Du setzt in der Interrupt-Routine das Flag und fragst es zyklisch ab. Das kann dann auch etwas später sein. Ich denke, das ist nicht prinzipiell anders als bei den millis().

Zitat:Zur PWM Frequenz? Ich benutze einen Mega 2560 und habe den Timer manipuliert, sodass sich eine PWM Frequenz von 30kHz ergibt. Mein Oszilloskop hat das bestätigt.
Ah, dann wird's schon sinnvoller. Wobei ich mich immer noch frage, was da gesteuert werden soll.

Bezüglich millis() hast du recht, daran habe ich so noch nicht gedacht. Gesteuert werden soll damit nichts, das PWM Signal wird durch einen Tiefpass zum Pseudoanalogsignal, welches den Analogauagang eines Messgerätes simuliert um für nachgelagerte Entwicklung nicht jedesmal einen vollständigen Messaufbau aufbauen zu müssen, sondern alte Messreihen abspielen zu können.

Grüße
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.06.2015, 05:57
Beitrag #24
RE: Serial buffer
(10.06.2015 21:14)Laura schrieb:  
(10.06.2015 21:07)Thorsten Pferdekämper schrieb:  
(10.06.2015 21:04)Laura schrieb:  Weil millis() abfragen den Wert ändert wenn mindestens eine Millisekunde vergangen ist und nicht genau eine Millisekunde wenn ich deinen vorschlag richtig verstehe.
Ja, aber Du machst auch nichts anderes. Du setzt in der Interrupt-Routine das Flag und fragst es zyklisch ab. Das kann dann auch etwas später sein. Ich denke, das ist nicht prinzipiell anders als bei den millis().

Zitat:Zur PWM Frequenz? Ich benutze einen Mega 2560 und habe den Timer manipuliert, sodass sich eine PWM Frequenz von 30kHz ergibt. Mein Oszilloskop hat das bestätigt.
Ah, dann wird's schon sinnvoller. Wobei ich mich immer noch frage, was da gesteuert werden soll.

Bezüglich millis() hast du recht, daran habe ich so noch nicht gedacht. Gesteuert werden soll damit nichts, das PWM Signal wird durch einen Tiefpass zum Pseudoanalogsignal, welches den Analogauagang eines Messgerätes simuliert um für nachgelagerte Entwicklung nicht jedesmal einen vollständigen Messaufbau aufbauen zu müssen, sondern alte Messreihen abspielen zu können.

Grüße

...das man euch Newbees hier auch immer alles erst mal aus der Nase ziehen muß
Angry
Also wenn ich Analogwerte generieren will die auch noch mit Messtechnik zu haben dann nehme ich ganz bestimmt kein PWM Signal dazu sondern greife zu einem D/A Wandler und hänge den an den I2C Bus und die gibt es für wenig Geld mit 8, 10, 12 Bit Auflösung....höhere Auflösungen werden dann schon etwas teurer.

Aber wenn du schon an dem Timer was verändert hast stellt sich die Frage ob du auch weist welchen Timer du da erwischt hast da der 2560 an der Stelle einiges zu bieten hat:

Peripheral Features <== Auszug Atmel Datenblatt ATmega2560
– Two 8-bit Timer/Counters with Separate Prescaler and Compare Mode
– Four 16-bit Timer/Counter with Separate Prescaler, Compare- and Capture Mode
– Real Time Counter with Separate Oscillator
– Four 8-bit PWM Channels
– Six/Twelve PWM Channels with Programmable Resolution from 2 to 16 Bits

Wenn du da mal rein theoretisch einen 16 Bit Timer erwischt hast und den nur mit 8 Bit Daten bespassen tust dann kann da schon was seltsames bei rauskommen...Big Grin

lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Ausgabe Serial Monitor zu viele Byt`s Hannes 0 95 12.11.2016 20:29
Letzter Beitrag: Hannes
  Speicher sparen bei serial.print?? DL1AKP 3 193 02.09.2016 13:32
Letzter Beitrag: hotsystems
  Serial Monitor ASCII 1 schreiben BennIY 11 579 01.08.2016 16:42
Letzter Beitrag: Mathias
  Serial.write Mathias 6 383 29.07.2016 17:06
Letzter Beitrag: Mathias
  Serial Monitor Rudi 5 629 02.06.2016 11:37
Letzter Beitrag: Bitklopfer
  Serial.printeln, Stellen verschwinden Mathias 6 256 27.05.2016 17:44
Letzter Beitrag: Mathias
  Kommunikation Serial Monitor --> Arduino BennIY 7 354 24.05.2016 07:48
Letzter Beitrag: hotsystems
  Serial Monitor Eingabe über Code Maxi290997 4 519 12.05.2016 18:57
Letzter Beitrag: SkobyMobil
  Buffer reservieren im SRAM vom DUE arduinopeter 1 299 28.03.2016 10:16
Letzter Beitrag: rkuehle
  SPI Buffer empfangen BennIY 5 708 17.03.2016 13:35
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste