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)