Error-Messages

Hi,
ich habe hier ein Programm, welches mir Error-Messages ausspuckt, die ich nicht verstehe und bei denen googeln auch nicht wirklich hilfreich war.

Das Programm sollte jede Millisekunde eine ISR ausführen, die 3 Analog-Values (Leistung einzelner Phasen eines Dreiphasenmotors, bitte nicht beachten, muss selbst noch schauen ob das so wirklich geht) einliest.

Außerhalb der ISR wird eine weitere Analog-Value von einem Potentiometer eingelesen, welche ein Servo-Steuerungssignal steuert (Servos lassen sich ja gleich wie 3-Phasenmotor-Controller ansteuern, der Teil funktioniert) und nach einer Drittel Sekunde soll der Interrupt disabled werden und währenddessen die gerechnete Value auf ein OLED-Display geschrieben und über Serial Monitor ausgegeben werden.

Beim Kompilieren ist nun diese Fehlermeldung hier gekommen:

Arduino: 1.8.10 (Windows 8), Board: "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

libraries\Servo\avr\Servo.cpp.o (symbol from plugin): In function `ServoCount':

(.text+0x0): multiple definition of `__vector_32'

sketch\301019_MS1_withISR_v0.1.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here

c:/users/pc1/desktop/arduino-1.8.10/hardware/tools/avr/bin/../lib/gcc/avr/7.3.0/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions

collect2.exe: error: ld returned 1 exit status

Multiple libraries were found for "Adafruit_GFX.h"
 Used: C:\Users\pc1\Documents\Arduino\libraries\Adafruit_GFX_Library
Multiple libraries were found for "Servo.h"
 Used: C:\Users\pc1\Desktop\arduino-1.8.10\libraries\Servo
Multiple libraries were found for "Adafruit_SSD1306.h"
 Used: C:\Users\pc1\Documents\Arduino\libraries\Adafruit_SSD1306
Multiple libraries were found for "Wire.h"
 Used: C:\Users\pc1\Desktop\arduino-1.8.10\hardware\arduino\avr\libraries\Wire
Multiple libraries were found for "SPI.h"
 Used: C:\Users\pc1\Desktop\arduino-1.8.10\hardware\arduino\avr\libraries\SPI
exit status 1
Error compiling for board Arduino/Genuino Mega or Mega 2560.

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

(Ich hab schon "verbose output during compilation" enabled, gibt nicht mehr Hinweise auf den Fehler)

Ich versteh schon, das Zeug mit Multiple libraries ist nicht wirklich relevant. Nur das Zeug darüber sagt mir absolut nichts.

Bitte um Hilfe. Danke!

Edit:
(Nach Nachfrage von Tommy56 hier noch der Code in der Nachricht):

// author: Num10
// date: 30.10.19
// filename: 301019_MS1_withISR_v0.1.ino
/*
 * Pin A0 for Ctrl-Poti Input
 * Pin 3 for Ctrl-Servo-signal-Output
 * 
 * Pin A1 for Phase 1 Input
 * Pin A2 for Phase 2 Input
 * Pin A3 for Phase 3 Input
 * 
 * Pins SCL and SDA for OLED Display... yep, need that thing
 * 
 */

#include <Servo.h>

#include "Adafruit_SSD1306.h"
#include "Adafruit_GFX.h"
#include <Wire.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);


#define Ctrl_in A0
#define Ctrl_out 3

#define Phase_1 A1
#define Phase_2 A2
#define Phase_3 A3

Servo motor;


unsigned long startTime = 0;


unsigned int readCnt = 0;
float Padd = 0;
float Pges = 0;

void setup() {
  Serial.begin(115200);
  
  display.begin(SSD1306_SWITCHCAPVCC,0x3C);
  display.setTextSize(1);
  display.setTextColor(WHITE);

  motor.attach(Ctrl_out);
  
  noInterrupts();
  TCCR3A = 0;
  TCCR3B = 0;
  TCNT3 = 0;
  OCR3A = 16000;
  TCCR3B |= (1 << WGM32);
  TCCR3B |= (1 << CS30);
  TIMSK3 |= (1 << OCIE3A);
  interrupts();
}

void loop() {
  speedCtrl();
  
  if(millis() - startTime >= 333){
    noInterrupts();
    calcPges();
    writeToDispl();
    
    startTime = millis();
    interrupts();
    }
}

void speedCtrl(){
  int val = analogRead(Ctrl_in);
  map (val, 0, 1023, 40, 170);
  motor.write(val);
}

void calcPges(){
  Pges = Padd / readCnt;
  readCnt = 0;
  Padd = 0;
}

void writeToDispl(){
  Serial.print("Power = ");
  Serial.print(Pges, 3);
  Serial.print("\n\n");

  display.clearDisplay();
  display.setCursor(0,0);
  display.print("Power =");
  display.print(Pges, 3);
  display.display();
}

ISR(TIMER3_COMPA_vect){
  Padd += ( analogRead(Phase_1) * 4.623938933340653 ) 
        + ( analogRead(Phase_2) * 4.623938933340653 ) 
        + ( analogRead(Phase_3) * 4.623938933340653 );
  readCnt++;       
}

Edit2:
So, bin nem Verdacht nachgegangen, dass die Servo Library was damit zu tun hat.
Hab erstmal versucht alle Servofunktionen auskommentiert (include blieb drin) und raus kam genau die gleiche Meldung.
Hab dann auch das include Statement auskommentiert und es hat ohne Probleme kompiliert.
Hab dann den "Knob" Example-Sketch ausprobiert und siehe da, auch kein Problem.
Ich schaus mir nochmal genauer an, aber ich glaube bei den Funktionen hab ich keinen Fehler gemacht, oder?

301019_MS1_withISR_v0.1.ino (1.93 KB)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *). So ist er auch auf portablen Geräten lesbar.
Das kannst Du auch noch nachträglich ändern.

Die Multiplen Libs solltest Du aufräumen.

Gruß Tommy

Tommy56:
Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *). So ist er auch auf portablen Geräten lesbar.
Das kannst Du auch noch nachträglich ändern.

Die Multiplen Libs solltest Du aufräumen.

Gruß Tommy

Wurde gemacht.

Ja, sollte ich... :confused:

Edit: Ja, würde ich ja aufräumen, nur gibt es außer der Servo.h im Arduino Ordner keine Andere. Das Gleiche gilt für alle anderen Libraries die da aufgelistet sind. Keine Ahnung wie das möglich ist.

Die Servo.h wird sich mit Deiner ISR(TIMER3_COMPA_vect) beißen.

Wieso machst Du das eigentlich im Interrupt? Die 3 analogRead kannst Du doch problemlos im loop auslesen.
Außerdem sperrst Du die Interrupts für ziemlich lange Zeit für die Displayausgabe.
Interrupts helfen selten Probleme zu lösen, wenn man nicht genau weiß, was man tut. Dann sind sie meist das Problem :wink:

Gruß Tommy

Edit: Welcher Prozessor? alle 1 ms halte ich auf AVR für sehr sportlich

Tommy56:
Die Servo.h wird sich mit Deiner ISR(TIMER3_COMPA_vect) beißen.

Wieso machst Du das eigentlich im Interrupt? Die 3 analogRead kannst Du doch problemlos im loop auslesen.
Außerdem sperrst Du die Interrupts für ziemlich lange Zeit für die Displayausgabe.
Interrupts helfen selten Probleme zu lösen, wenn man nicht genau weiß, was man tut. Dann sind sie meist das Problem :wink:

Gruß Tommy

Edit: Welcher Prozessor? alle 1 ms halte ich auf AVR für sehr sportlich

Glaub nicht dass sich das beißt. Meines Wissens nach nutzt die Servo Library nicht Timer3, sondern Timer1, nicht? Hab jedenfalls schon versucht stattdessen den Timer4 zu nutzen, hat aber keinen Unterschied gemacht.
Ja, könnte man schon anders machen, ich brauch aber eine sehr genaue Abtastrate :confused:

Ist der Mega, also AtMega2560. Ist schon klar, sollte aber eigentlich ja funktionieren.

LG

Da sagt die Lib aber was anderes:

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define _useTimer5
#define _useTimer1
#define _useTimer3
#define _useTimer4
typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t;

Gruß Tommy

Tommy56:
Da sagt die Lib aber was anderes:

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)

#define _useTimer5
#define _useTimer1
#define _useTimer3
#define _useTimer4
typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t;




Gruß Tommy

I stand corrected!

Gut, aber da kommen für mich 2 Fragen auf:

  1. Wie nutzt der jeden einzelnen 16Bit-Timer für die Servo Library?
  2. "In what order?" - Wie in, da wird die Compare-Value für das 50Hz Signal auf die Timer aufgeteilt und die müssen einer nach dem Anderen zählen, dass das 50Hz Signal rauskommt? Oder versteh ich das falsch?

Aja und äh, wie mach ich das dann? Soll ich die Servo Library sausen lassen und selbst mit Timern ein variables 50Hz Signal erzeugen?

LG und Danke

Damit habe ich mich noch nicht beschäftigt. Da musst Du mal in der cpp schauen, was die da so machen.
Evtl. könnte man den Timer 3 auch versuchen auszublenden.
Das sind aber Sachen, da musst Du wohl selbst ran und in die Tiefe gehen.

Gruß Tommy

Tommy56:
Damit habe ich mich noch nicht beschäftigt. Da musst Du mal in der cpp schauen, was die da so machen.
Evtl. könnte man den Timer 3 auch versuchen auszublenden.
Das sind aber Sachen, da musst Du wohl selbst ran und in die Tiefe gehen.

Gruß Tommy

Hmm, tja, werd ich machen müssen...
Danke für deine Hilfe jedenfalls

Welche Timer ( bzw. wie viele ) die Servo-Lib tatsächlich nutzt, hängt davon ab, wieviel Servoobjekte man erzeugt. Allerdings werden offensichtlich die Interruptvectoren bereits definiert ( __vector_32 ist der Timer/Counter3 Capture Event Vektor ). Lt Fehlermeldung wird der sowohl in der Servo.cpp.o als auch in der .o Datei des Sketches definiert. Deshalb meckert der Linker.

Du solltest aber auf jeden Fall mal deine Multiple Libraries bereinigen. Offensichtlich stimmt was mit deiner Installation nicht.

Völlig ohne tieferen Einblick, nur aus dem Bauch heraus, könnte man den Timer 3 evtl. so ausblenden:

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define _useTimer5
#define _useTimer1
#define _useTimer4
typedef enum { _timer5, _timer1, _timer4, _Nbr_16timers } timer16_Sequence_t;

Einfach mal probieren.

Gruß Tommy

Tommy56:
Völlig ohne tieferen Einblick, nur aus dem Bauch heraus, könnte man den Timer 3 evtl. so ausblenden:

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)

#define _useTimer5
#define _useTimer1
#define _useTimer4
typedef enum { _timer5, _timer1, _timer4, _Nbr_16timers } timer16_Sequence_t;




Einfach mal probieren.

Gruß Tommy

Hmm, klingt schon interessant, aber ganz ehrlich, ich moecht nicht wirklich in den Header files rumstochern :confused:

Ich hab jetzt mal versucht ein 50Hz Signal mit Mode15 zu erzeugen, krieg aber einfach keinen Output... kannst du mir hier helfen? OC5B sollte Pin 39 sein, da kommt aber nix raus.

// author: Num10
// date: 30.10.19
// filename: 301019_50HzwithTimer_Test.ino
/*
 * The signal should be on Pin 39
 */

void setup() {
  
  TCCR5A = 0;
  TCCR5B = 0;
  TCNT5 = 0;
  TCCR5A |= (1 << WGM50) | (1 << WGM51) | (1 << COM5A1) | (1 << COM5A0);
  TCCR5B |= (1 << WGM52) | (1 << WGM53);
  OCR5A = 40000;
  OCR5B = 2000;
  TCCR5B |= (1 << CS51);

  }

void loop() {
  
}
[\code]

ToastyBread:
Hmm, klingt schon interessant, aber ganz ehrlich, ich moecht nicht wirklich in den Header files rumstochern :confused:

Warum nicht? Das sind auch nur Textdateien.

Gruß Tommy

Tommy56:
Warum nicht? Das sind auch nur Textdateien.

Gruß Tommy

  1. Es sind Textdateien die alle anderen meiner Programme auch nutzen

  2. Klar, ich kann einfach Kopien davon machen, umbenennen und in den Ordner meines Sketches reinkopieren... hab ich auch gemacht, das File verändert und nochmal zu kompilieren versucht... jetzt haben die Funktionen keine Referenz mehr, bzw. .attach, .write usw. findet es nicht mehr.

Naja, deshalb eben :confused:

LG

Dann hast Du es falsch gemacht. #include <...> ---> #include "..." ?

Gruß Tommy

Tommy56:
Dann hast Du es falsch gemacht. #include <...> ---> #include "..." ?

Gruß Tommy

So gut kenn ich mich schon noch aus, hab ich gemacht. Hab Servo.h auch in Servotampered.h umbenannt und mir wurde gesagt, (weil ich den Ordnernamen des cpp aus Versehen geändert hab) 'avr/Servotimers.h not found'.

LG

Die "..." auch in den Libs (zumindest den geänderten/umbenannten und deren Aufrufen?

Gruß Tommy

Edit: Ich hätte es kurz in der normalen Lib geändert, geschaut obs geht und dann zurückgeändert.
Wenn es geht, kann man sich die Arbeit mit der Kopie machen, wenn nicht, war es nur ein geringer Aufwand.

Schon versucht, nein, nicht möglich.
Hab alles geändert, dass es auf die richtigen h files hinzeigt.
LG

Hi

Ich beachte dann doch Mal den Motor.
Der wird, wenn Er durchgehend Spannung bekommt, auch durchgehend Strom nehmen.Durch die Induktivität der Wicklungen aber nicht phasengleich, sondern verschoben.
Möchtest Du die Leistung dieses Motor bestimmen, oder die Leistung einer beliebigen Last?
Ersteres sollte mit Abschätzungen des Phasenwinkel und etwas Try&Error recht genau abzubilden sein.
Letzteres - also beliebige Last, induktiv/kapazitiv/schaltende Elektroniken (aka EVGs) - Da wirst Du möglichst viele Messpunkte auf Spannung UND Strom brauchen - hier sehe ich das Problem, daß diese Messpunkte GLEICHZEITIG ermittelt werden müssen - sonst kannst Du Dir den ganzen Aufriss auch sparen, wenn die Spannung von 'dann irgendwann' mit dem Strom von 'jetzt oder gleich' verrechnet werden soll.

Der Motor verhält sich in der nächsten Vollwelle nicht viel anders, als in den Vollwellen zuvor - hier könnte man die komplette Welle 'nach und nach' abtasten - sowohl Strom wie Spannung - und daraus recht präzise berechnen, was der Motor wirklich nimmt.

Bei selber aktiven Komponenten hast Du diese Zeit nicht - Da müssen die Messpunkte Strom und Spannung genau aufeinander passen.

MfG

ToastyBread:
Schon versucht, nein, nicht möglich.
Hab alles geändert, dass es auf die richtigen h files hinzeigt.
LG

Ok, dann geht es so wohl nicht.

Gruß Tommy