Pages: [1]   Go Down
Author Topic: DMXSimple lib & VirtulWire funktioniert nicht  (Read 366 times)
0 Members and 1 Guest are viewing this topic.
Hamburg
Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
// 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);
    }
}
« Last Edit: March 07, 2013, 04:58:57 pm by da2001 » Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 108
Posts: 5144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: