Arduino Uno - Fehler in der Programmierung

Hallo zusammen,

ich bin habe noch kaum erfahrung mit dem Arduino, habe jedoch ein paar Programme geschrieben. Bis jetzt auch immer ohne große komlikationen.

Jetzt habe ich mein erstes größeres Projekt angefangen. Ich wollte es gerade zum ersten mal kompilieren und dann taucht bei diesem programm code →

#include <EEPROM.h>

#include <lib_dmx.h>




byte ValueChannel1;
byte ValueChannel2;
byte ValueChannel3;
byte ValueChannel4;
byte ValueChannel5;
byte ValueChannel6;
byte ValueChannel7;
byte ValueChannel8;

int ChannelWert1 = 0;
int ChannelWert2 = 0;
int ChannelWert3 = 0;
int ChannelWert4 = 0;
int ChannelWert5 = 0;
int ChannelWert6 = 0;
int ChannelWert7 = 0;
int ChannelWert8 = 0;

int PushRead = 0;
int Push = 0;
int counter = 0;

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxEncoder
int encoderPin1 = 2;
int encoderPin2 = 3;
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
long lastencoderValue = 0;
int lastMSB = 0;
int lastLSB = 0;
int encoderValueAlt1 = 0;
int encoderValueAlt2 = 0;
int encoderValueAlt3 = 0;
int encoderValueAlt4 = 0;
int encoderValueAlt5 = 0;
int encoderValueAlt6 = 0;
int encoderValueAlt7 = 0;
int encoderValueAlt8 = 0;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxEncoder

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDMX
#define    DMX512     (0)    // (250 kbaud - 2 to 512 channels) Standard USITT DMX-512
#define    DMX1024    (1)    // (500 kbaud - 2 to 1024 channels) Completely non standard - TESTED ok
#define    DMX2048    (2)    // (1000 kbaud - 2 to 2048 channels) called by manufacturers DMX1000K, DMX 4x or DMX 1M ???

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDMX

void setup() {
  
  Serial.begin(250000);
  //read EeProm Values
  ValueChannel1 = EEPROM.read(0);
  ValueChannel2 = EEPROM.read(1);
  ValueChannel3 = EEPROM.read(2);
  ValueChannel4 = EEPROM.read(3);
  ValueChannel5 = EEPROM.read(4);
  ValueChannel6 = EEPROM.read(5);
  ValueChannel7 = EEPROM.read(6);
  ValueChannel8 = EEPROM.read(7);

  //wriet EeProm Values to ChannelWert
  ValueChannel1 = ChannelWert1;
  ValueChannel2 = ChannelWert2;
  ValueChannel3 = ChannelWert3;
  ValueChannel4 = ChannelWert4;
  ValueChannel5 = ChannelWert5;
  ValueChannel6 = ChannelWert6;
  ValueChannel7 = ChannelWert7;
  ValueChannel8 = ChannelWert8;

  //Pin for Push
  pinMode(13 ,INPUT);

  //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxEncoder
  pinMode(encoderPin1, INPUT); 
  pinMode(encoderPin2, INPUT);
  digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  digitalWrite(encoderPin2, HIGH); //turn pullup resistor on
  attachInterrupt(0, updateEncoder, CHANGE); 
  attachInterrupt(1, updateEncoder, CHANGE);
  //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxEncoder

  //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDMX
  ArduinoDmx0.set_control_pin(4);    // Arduino output pin for MAX485 input/output control (connect to MAX485 pins 2-3) 
  ArduinoDmx0.set_rx_address(1);      // change starting adress here
  ArduinoDmx0.set_rx_channels(512);     // number of rx channels
  ArduinoDmx0.init_rx(DMX512);        // starts universe 0 as rx, NEW Parameter DMX mode
  pinMode(5, OUTPUT);
  
  digitalWrite(5, LOW);
  delay (300);
  digitalWrite(5,LOW);
  delay (300);  
    digitalWrite(5, HIGH);
  delay (300);
  digitalWrite(5,LOW);
  // 2 blinks for on
  //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDMX
}

void updateEncoder(){
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

   if (encoderValue == 513){
       encoderValue --;
     }

   if (encoderValue == 1){
      encoderValue ++;
    }
     
    if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
    if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;  
      
  
  lastEncoded = encoded; //store this value for next time
  
}
  
void loop(){

  PushRead = digitalRead(13);
  
  if (PushRead = HIGH){
    counter = 1;
    Push = 1;
    delay(500);
  }

  if ((PushRead = HIGH) && (counter = 1)){
      counter = 2;
      Push = 2;
      delay(500);
  }

    if ((PushRead = HIGH) && (counter = 2)){
      counter = 3;
      Push = 3;
      delay(500);
  }
    if ((PushRead = HIGH) && (counter = 3)){
      counter = 4;
      Push = 4;
      delay(500);
  }
    if ((PushRead = HIGH) && (counter = 4)){
      counter = 5;
      Push = 5;
      delay(500);
  }

    if ((PushRead = HIGH) && (counter = 5)){
      counter = 6;
      Push = 6;
      delay(500);
  }

    if ((PushRead = HIGH) && (counter = 6)){
      counter = 7;
      Push = 7;
      delay(500);
  }

    if ((PushRead = HIGH) && (counter = 7)){
      counter = 8;
      Push = 8;
      delay(500);
  }

    if ((PushRead = HIGH) && (counter = 8)){
      counter = 1;
      Push = 1;
      delay(500);
  }
 
  
  if (encoderValue != encoderValueAlt1 && Push ==1){
    encoderValue = ChannelWert1;
  }

  if (Push = 1){
    encoderValue = encoderValueAlt1;
    Serial.write(ChannelWert1);
  }

    if (encoderValue != encoderValueAlt2 && Push ==2){
    encoderValue = ChannelWert2;
  }

  if (Push = 2){
    encoderValue = encoderValueAlt2;
    Serial.write(ChannelWert2);
  }

   if (encoderValue != encoderValueAlt3 && Push ==3){
    encoderValue = ChannelWert3;
  }

  if (Push = 3){
    encoderValue = encoderValueAlt3;
    Serial.write(ChannelWert3);
  }

   if (encoderValue != encoderValueAlt4 && Push ==4){
    encoderValue = ChannelWert4;
  }

  if (Push = 4){
    encoderValue = encoderValueAlt4;
    Serial.write(ChannelWert4);
  }

   if (encoderValue != encoderValueAlt5 && Push ==5){
    encoderValue = ChannelWert5;
  }

  if (Push = 5){
    encoderValue = encoderValueAlt5;
    Serial.write(ChannelWert5);
  }

  
   if (encoderValue != encoderValueAlt6 && Push ==6){
    encoderValue = ChannelWert6;
  }

  if (Push = 6){
    encoderValue = encoderValueAlt6;
    Serial.write(ChannelWert6);
  }

  
   if (encoderValue != encoderValueAlt7 && Push ==7){
    encoderValue = ChannelWert7;
  }

  if (Push = 7){
    encoderValue = encoderValueAlt7;
    Serial.write(ChannelWert7);
  }

  
   if (encoderValue != encoderValueAlt8 && Push ==8){
    encoderValue = ChannelWert8;
  }

  if (Push = 8){
    encoderValue = encoderValueAlt8;
    Serial.write(ChannelWert8);
  }
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDMX
 //write values from dmx channels 1-4 universe 0 to arduino pwm pins 2-5
  analogWrite(5, ArduinoDmx0.RxBuffer[1]);  //buffers 0 indexed
  analogWrite(6, ArduinoDmx0.RxBuffer[1]);
  analogWrite(9, ArduinoDmx0.RxBuffer[1]);
  analogWrite(10, ArduinoDmx0.RxBuffer[1]);
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDMX
}

Dieser Fehler auf:

Arduino: 1.6.7 (Windows 10), Board: "Arduino/Genuino Uno"

C:\Users\Michael\AppData\Local\Temp\build6a85db9b4f12eb7c2b27f1b8cb27d6c9.tmp/core\core.a(HardwareSerial0.cpp.o): In function `__vector_18':

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial0.cpp:48: multiple definition of `__vector_18'

libraries\Dmx\lib_dmx.cpp.o:C:\Users\Michael\Documents\Arduino\libraries\Dmx/lib_dmx.cpp:225: first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Fehler beim Kompilieren.

  Dieser Report hätte mehr Informationen mit
  "Ausführliche Ausgabe während der Kompilierung"
  aktiviert in Datei > Einstellungen.

Kann mir jemand helfen?? Mein Englisch ist leider nicht sooo super deswegen muss ich euch hier nerven.

Danke im Vorraus.

Gruß

Michael

Hallo,

naja, die letzten Zeilen sind deutsch, solltest du ernst nehmen. Ich vermute du nutzt die Libs falsch und bringst dann irgendwas damit durcheinander. Kannst ja mal in die Lib Datei schauen, Pfad zeigt er dir an und die letzte Nummer ist die Zeilennummer darin. Dann siehste erstmal was der Code dort erwartet und haben möchte.

HardwareSerial0.cpp:48 lib_dmx.cpp:225

Ansonsten, Code immer weiter abspecken und testen bis man den Fehler hat.

Der Fehler kommt vom Linker (erkennt man an dem "collect2.exe" "ld returned 1" Teil). Das kann bedeuten dass was mit der Library selbst nicht stimmt.

Oder es ist die IDE-Version. Mit der Version 1.6.7 hat es schon öfter Problem mit den Libraries gegeben.

Hallo,

ganz ehrlich, hab noch keine ernsthaften Probleme mit der 1.6.7 gehabt. Lag am Ende immer am eigenen Code. Und vieles sind einfach nur sinnvolle Warnungen und keine Fehler. Er sollte die komplette Ausgabe einschalten. Dann weis man bestimmt mehr.

Okay,

Also wenn ich die komplette Ausgabe ausgewählt habe zeigt er mir genau das gleiche an.

Ich habe nun die DMX library mal rausgenommen und in ein eigenes Programm geschrieben.

Die DMX library alleine geht. Die Eeprom library alleine geht.

Nur zusammen machen die so einen Fehler.

Was hat das zu bedeuten.

Danke!

Gruß Michael

Wozu brauchst du die EEProm-Library überhaupt? Ich sehe nur Lese-Befehle, keine Schreib-Befehle für das EEProm.

Das Programm ist nicht fertig. Wenn ich die seriellen befehle weg nehme geht es einwandfrei. Ich verschicke die daten jetzt über i2c damit gehts nämlich.

Gruß Michael

prinzenroll27: Das Programm ist nicht fertig. Wenn ich die seriellen befehle weg nehme geht es einwandfrei. Ich verschicke die daten jetzt über i2c damit gehts nämlich.

Gruß Michael

Welche "seriellen Befehle" meinst du?

Serial.write

Und

Serial.Begin

prinzenroll27: Serial.write

Und

Serial.Begin

Wenn du "Serial" nicht für Eingaben und ständige Augaben auf dem Monitor brauchst, solltest du es bei einem laufenden Sketch immer ausschalten. Oft wird es noch zum Debuggen genutzt, kann aber danach wieder abgeschaltet (auskommentiert) werden. In vielen Fällen bremst diese Funktion auch den Programmlauf.

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial0.cpp:48: multiple definition of `__vector_18'

libraries\Dmx\lib_dmx.cpp.o:C:\Users\Michael\Documents\Arduino\libraries\Dmx/lib_dmx.cpp:225: first defined here

Die Fehlermeldung zeigt, dass HardwareSerial und die Dmx library sich beissen.

Da würde ich schonmal ausprobieren, bei welcher IDE ( ab 1.0.x ) das noch ging.

Serial rausschmeissen ist sicher nicht die optimale Lösung.