Go Down

Topic: DMXSimple lib & VirtulWire funktioniert nicht (Read 426 times) previous topic - next topic

da2001

Mar 07, 2013, 10:54 pm Last Edit: Mar 07, 2013, 10:58 pm by da2001 Reason: 1
Guten Abend,

nun sitz ich hier seit Stunden und suche nach Fehlern und plötzlich stelle ich fest, dass es ein generelles Problem zwischen den beiden Libs gibt.
Irgendwie verträgt sich dort was nicht.
Soblad ich eine funktion von SimpleDMX öffne, kann VirtualWire keine Daten mehr empfangen. z.B. DmxSimple.maxChannel(6); im Setup.

Edit: Gerade gesehen. DmxSimple nutzt TIMER2, VirtualWire TIMER1. Liegt es daran? Gibt es eine Lösung dazu?

Ich verwende folgende Libs:
VirtualWire 1.6
https://github.com/kuon/arduino/tree/master/libraries/VirtualWire

DMXSimple V3
https://code.google.com/p/tinkerit/downloads/detail?name=DmxSimple_v3.zip&can=2&q=

Das Sketch ist das reguläre von Virtual Wire:

Code: [Select]
// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@open.com.au)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $
#include <DmxSimple.h>
#include <VirtualWire.h>

void setup()
{
 DmxSimple.maxChannel(6);
   Serial.begin(9600); // Debugging only
   Serial.println("setup");

   // Initialise the IO and ISR
   vw_set_ptt_inverted(true); // Required for DR3100
   vw_setup(2000); // Bits per sec

   vw_rx_start();       // Start the receiver PLL running
}

void loop()
{
   uint8_t buf[VW_MAX_MESSAGE_LEN];
   uint8_t buflen = VW_MAX_MESSAGE_LEN;

   if (vw_get_message(buf, &buflen)) // Non-blocking
   {
int i;

       digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Got: ");

for (i = 0; i < buflen; i++)
{
   Serial.print(buf[i], HEX);
   Serial.print(" ");
}
Serial.println("");
       digitalWrite(13, false);
   }
}

pylon

Quote
Gerade gesehen. DmxSimple nutzt TIMER2, VirtualWire TIMER1. Liegt es daran? Gibt es eine Lösung dazu?


Nein, daran liegt es nicht, denn das sind ja zwei verschiedene Timer. Würden beiden den selben Timer benützen, wäre das Problem klar, aber so musst Du etwas weiter suchen.

Ich sehe das Problem in der Art und Weise, wie die DMX-Bibliothek ihre Daten verschickt. Sie verwendet dazu einen Timer-Interrupt, welcher die Bits mittels NOOP-Loop als Warteschleife verschickt. Das wäre nicht so schlimm, aber die Bibliothek schaltet während des ganzen Versands die Interrupts ab, was dem VirtualWire-Code die Timing-Grundlage entzieht. Während die VirtualWire-Bibliothek extra viel Aufwand treibt, genau dies zu vermeiden, verschwendet die DMX-Bibliothek massenhaft Prozessor-Leistung für ein verkrüppeltes Shiften der Bits.

Ich bin kein DMX-Experte, aber Du müsstest die DMX-Bibliothek ziemlich heftig umschreiben, damit die restliche Software auf dem Arduino noch funktioniert. Mit grosser Wahrscheinlichkeit wird auch das interne Time-Keeping des Arduinos (millis() bzw. micros()) darunter leiden und ungenau werden.
Also: entweder die DMX-Bibliothek massiv verbesssern oder eine Alternative suchen.

Go Up