Go Down

Topic: conflicting timer issue in libaries? (Read 479 times) previous topic - next topic

gaggenau

hi im working on a dmxtester device.
i want to use a single potentiometer to set both channel and dmxvalue .a button to change between set channel mode and dmxvalue mode.
to display the channel and dmx output value I want to use the nootropicdesign digitshield wich is a four digit 7 segemt display shield.

i have now start writing the code but when im compiling the sketch i get a strange error message:

DigitShield/DigitShield.cpp.o: In function `__vector_9':
/Users/GET/Documents/Arduino/libraries/DigitShield/DigitShield.cpp:286: multiple definition of `__vector_9'
DmxSimple/DmxSimple.cpp.o:/Users/GET/Documents/Arduino/libraries/DmxSimple/DmxSimple.cpp:141: first defined here

it seems like the error has to do with the libraries im using. could it be a timer issue?
any ideas how to solve it?

the code :
Code: [Select]


#include <DmxSimple.h>


#include <DigitShield.h>

int sensorPin = A0;    // select the input pin for the potentiometer

int DmxValue = 0;  // variable to store the value coming from the sensor
int buttonState = 0;         // variable for reading the pushbutton status
int ChannelValue=0;
int RawValue1=0;
int RawValue2=0;
const int buttonPin = 7;

void setup() {
    DmxSimple.usePin(6);
    DigitShield.begin();
   pinMode(buttonPin, INPUT);


}

void loop() {
    if (buttonState == HIGH) {     
    // set Dmx channel   
    RawValue1 = analogRead(sensorPin);
    ChannelValue = map(RawValue1, 0, 1023, 1, 512);   
    DigitShield.setValue(ChannelValue);
  }
  else {
    // Set DMX value
  RawValue2 = analogRead(sensorPin);
      DmxValue = map(RawValue2, 0, 1023, 0, 255);   
    DigitShield.setValue(DmxValue);
  }
 
   
  DmxSimple.write(ChannelValue, DmxValue);
                 
}

MarkT

Do you have sourcecode for the libraries?  Look for ISR routines for the same interrupt vector - if they both define an interrupt routine for the same interrupt that would clash.
[ I won't respond to messages, use the forum please ]

gaggenau

with help from Michael at nootropic design who made the digitshield and its library i solve the timer issue. the segment shield is now using timer1 instead of timer2.

here is the code that needs to be change in the digitshield library:

Code: [Select]
   // TIMER1                                                                                             
  // Disable the timer overflow interrupt                                                               
  TIMSK1 &= ~(1 << TOIE1);                                                                             
                                                                                                       
  // Set timer1 to normal mode                                                                         
  TCCR1A &= ~((1 << WGM11) | (1 << WGM10));                                                             
  TCCR1B &= ~((1 << WGM13) | (1 << WGM12));                                                             
                                                                                                       
  // Disable compare match interrupt                                                                   
  TIMSK1 &= ~(1 << OCIE1A);                                                                             
  TIMSK1 &= ~(1 << OCIE1B);                                                                             
                                                                                                       
  // Prescalar is clock divided by 128                                                                 
  TCCR1B &= ~(1 << CS12);                                                                               
  TCCR1B &= ~(1 << CS11);                                                                               
  TCCR1B |= (1 << CS10);
 
    // Start the counting at 0                                                                           
  TCNT1 = 0;                                                                                           
                                                                                                       
  // Enable the timer2 overflow interrupt                                                               
  TIMSK1 |= (1 << TOIE1);


the overflow ISR need to be change to this:
Code: [Select]
  ISR(TIMER1_OVF_vect) {                                                                                 
  TCNT1 = 0;                                                                                           
  for(int i=0;i<nDigitShields;i++) {                                                                   
    digitShields[i]->isr();                                                                             
  }                                                                                                     
}



the DmxTester uses a button,slider potentiometer, Nootropic design digitshield , and a sn75176 for the rs232 ttl to rs485 conversion.
and here is the code:
Code: [Select]
/*
This code was made by Gustaf Gagge with help to change to timer 1
in the digitshield library from Michael  at Nootropic design who also wrote the digitshield library.

modify the digitshield libary with this in the initialization part
file to modify: DigitShield.cpp

   // TIMER1                                                                                             
  // Disable the timer overflow interrupt                                                               
  TIMSK1 &= ~(1 << TOIE1);                                                                             
                                                                                                       
  // Set timer1 to normal mode                                                                         
  TCCR1A &= ~((1 << WGM11) | (1 << WGM10));                                                             
  TCCR1B &= ~((1 << WGM13) | (1 << WGM12));                                                             
                                                                                                       
  // Disable compare match interrupt                                                                   
  TIMSK1 &= ~(1 << OCIE1A);                                                                             
  TIMSK1 &= ~(1 << OCIE1B);                                                                             
                                                                                                       
  // Prescalar is clock divided by 128                                                                 
  TCCR1B &= ~(1 << CS12);                                                                               
  TCCR1B &= ~(1 << CS11);                                                                               
  TCCR1B |= (1 << CS10);
 
    // Start the counting at 0                                                                           
  TCNT1 = 0;                                                                                           
                                                                                                       
  // Enable the timer2 overflow interrupt                                                               
  TIMSK1 |= (1 << TOIE1);
 
 
  the overflow ISR need to be change to this:
 
  ISR(TIMER1_OVF_vect) {                                                                                 
  TCNT1 = 0;                                                                                           
  for(int i=0;i<nDigitShields;i++) {                                                                   
    digitShields[i]->isr();                                                                             
  }                                                                                                     
}
*/

#include <DigitShield.h>

#include <DmxSimple.h>



int sensorPin = A0;    // select the input pin for the potentiometer

int DmxValue = 0;  // variable to store the value coming from the sensor
int ChannelValue=0;
int RawValue1=0;
int RawValue2=0;
const int buttonPin = 7;

void setup() {
    DmxSimple.usePin(6);// as standard the DmxSimple uses D3 but for this we need D7
    DigitShield.begin();
   pinMode(buttonPin, INPUT);
   digitalWrite(buttonPin, HIGH);


}

void loop() {
  int val = digitalRead(buttonPin);
    if (val == LOW) {     
    // set Dmx channel   
    RawValue1 = analogRead(sensorPin);
    ChannelValue = map(RawValue1, 0, 1023, 1, 512);   
    DigitShield.setValue(ChannelValue);
  }
  else {
    // Set DMX value
  RawValue2 = analogRead(sensorPin);
      DmxValue = map(RawValue2, 0, 1023, 0, 255);   
    DigitShield.setValue(DmxValue);
  }
 
   
  DmxSimple.write(ChannelValue, DmxValue);
                 
}

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy