SparkFun Forums 

Where electronics enthusiasts find answers.

Topics pertaining to the Arduino Core & software used with the Artemis module and Artemis development boards.
User avatar
By hachiroku
#216995
Hello,
I was under the assumption that I would reuse libraries and code for Arduino based boards. I guess that isn't the case as I am seeing many compile errors in relation to ISR(TIMER1_OVF_vect). Maybe I have the incorrect library loaded? Any help would be appreciated. Thank you.
Code: Select all
135:4: error: expected constructor, destructor, or type conversion before '(' token
ISR(TIMER1_OVF_vect) // counter overflow/timeout
^
exit status 1
expected constructor, destructor, or type conversion before '(' token
with this being the code
User avatar
By TS-Brandon
#216996
What library are you even using?

As a disclaimer, we can try to advise with code issues but can not fully support them. I can try to help you as best as I can.
User avatar
By hachiroku
#217012
ok...so after some trial and error i realized that the issue wasn't a library issue. i changed my board from sparkfun redboard artimis nano to arduino nano and the code compiles without issue. below is the code i am attempting to compile. this is all new to me so i guess i had the assumption the code was compatible. any guidance would be helpful. if i'm not able to figure this out, i may just end up purchasing an arduino nano and call it a day.
Code: Select all
/* Connect to Android via serial Bluetooth and demonstrate the use of interrupt

A serial Bluetooth module is used to create a connection with an Android app (created with MIT AppInventor).
Every n seconds (where n is a parameter set through the app) a status report is sent to the app.
A simple command structure enables the app to send parameters and values to Arduino and the other way round.

The circuit:
* HC-06 Bluetooth Wireless Serial Port Module (slave) connected as follows:
    VCC <--> 3.3V
    GND <--> GND
    TXD <--> Pin 0 (Rx)
    RXD <--> Pin 1 (Tx)

The Bluetooth module may interfere with PC to Arduino communication: disconnect VCC when programming the board

created 2014 
by Paolo Mosconi
modified 2017 for use with Ethanol Content Analyzer by pabohoney1

This example code is in the public domain.
*/

// Serial Parameters: COM11 9600 8 N 1
// \r or \n to end command line
// Bluetooth is on Pin 0 & 1 @ 9600 speed

// Command structure
// CMD SECONDS=value
// CMD STATUS

// Status message structure
// STATUS ETH|TEMP=value

//Ethanol Global Vars
int inpPin = 8;

volatile uint16_t revTick;    //Ticks per revolution
uint16_t pwm_output  = 0;      //integer for storing PWM value (0-255 value)
int HZ = 0;                  //unsigned 16bit integer for storing HZ input
int ethanol = 0;              //Store ethanol percentage here
float expectedv;              //store expected voltage here - range for typical GM sensors is usually 0.5-4.5v
uint16_t voltage = 0;              //store display millivoltage here (0-5000)
//temperature variables
int duty;                     //Duty cycle (0.0-100.0)
float period;                 //Store period time here (eg.0.0025 s)
float temperature = 0;        //Store fuel temperature here
int fahr = 0;
int cels = 0;
int celstemp = 0;
float fahrtemp = 0;
static long highTime = 0;
static long lowTime = 0;
static long tempPulse;

//BT Global Vars
int maxSeconds = 1; // send status message every maxSeconds

const int ledPin = 13;   // temperature led

volatile int seconds = 0;
volatile boolean statusReport = false;

String inputString = "";
String command = "";
String value = "";
boolean stringComplete = false;

/*
The following timer code is needed to initialize the timer interrupt and set it to fire every .016384 seconds, the slowest timer0 can go
For detailed information see: http://www.instructables.com/id/Arduino-Timer-Interrupts/step1/Prescalers-and-the-Compare-Match-Register/
*/

void setupBTTimer()  //setup timer0
{
  // initialize Timer0 for 61Hz
  TCCR0A = 0;     // set entire TCCR1A register to 0
  TCCR0B = 0;     // same for TCCR1B
  // set compare match register to desired timer count:
  OCR0A = 255;
  // turn on CTC mode:
  TCCR0B |= (1 << WGM12);
  // Set CS10 and CS12 bits for 1024 prescaler:
  TCCR0B |= (1 << CS10);
  TCCR0B |= (1 << CS12);
  // enable timer compare interrupt:
  TIMSK0 |= (1 << OCIE1A);
}


void setupECATimer()   // setup timer1
{
  // initialize timer1 for 1HZ / 1s
  TCCR1A = 0;      // normal mode
  TCCR1B = 132;    // (10000100) Falling edge trigger, Timer = CPU Clock/256, noise cancellation on
  TCCR1C = 0;      // normal mode
  TIMSK1 = 33;     // (00100001) Input capture and overflow interupts enabled
  
  TCNT1 = 0;       // start from 0
}


void setup(){
  //start serial connection
  Serial.begin(9600);

  inputString.reserve(50);
  command.reserve(50);
  value.reserve(50);
  
  pinMode(ledPin, OUTPUT); 
  digitalWrite(ledPin, LOW);
  
  cli();          // disable global interrupts
  setupECATimer();
  setupBTTimer();
  sei();          // enable global interrupts
  
  //Serial.print("AT+NAMEArduinoBT");
}

ISR(TIMER0_COMPA_vect)
{
  if (seconds++ >= (maxSeconds * 61)) { //multiply by 61 so that we can essentially get 1 per second
    statusReport = true;
    seconds = 0;
  }
}

ISR(TIMER1_CAPT_vect)    // PULSE DETECTED!  (interrupt automatically triggered, not called by main program)
{
  revTick = ICR1;      // save duration of last revolution
  TCNT1 = 0;       // restart timer for next revolution
}

ISR(TIMER1_OVF_vect)    // counter overflow/timeout
{ revTick = 0; }        // Ticks per second = 0

// interpret and execute command when received
// then report status if flag raised by timer interrupt
void loop(){
  int intValue = 0;
  getfueltemp(inpPin); //read fuel temp from input duty cycle
  
  if (revTick > 0) // Avoid dividing by zero, sample in the HZ
      {HZ = 62200 / revTick;}     // 3456000ticks per minute, 57600 per second 
      else                        // 62200 calibrated for more accuracy
      {HZ = 0;}

    //calculate ethanol percentage
      if (HZ > 50) // Avoid dividing by zero
      {ethanol = HZ-50;}
      else
      {ethanol = 0;}
  
  if (ethanol > 99) // Avoid overflow in PWM
  {ethanol = 99;}

  if (statusReport) {  // Output ethanol% and temp in cels separated by comma
    Serial.print(ethanol);
    Serial.print(",");
    Serial.println(cels);
    statusReport = false;
  }

}

/*
  SerialEvent occurs whenever a new data comes in the
 hardware serial RX.  This routine is run between each
 time loop() runs, so using delay inside loop can delay
 response.  Multiple bytes of data may be available.
 */
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read(); 
    //Serial.write(inChar);
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline or a carriage return, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n' || inChar == '\r') {
      stringComplete = true;
    } 
  }
}

void getfueltemp(int inpPin){ //read fuel temp from input duty cycle
  highTime = 0;
  lowTime = 0;
  
  tempPulse = pulseIn(inpPin,HIGH);
    if(tempPulse>highTime){
    highTime = tempPulse;
    }
  
  tempPulse = pulseIn(inpPin,LOW);
    if(tempPulse>lowTime){
    lowTime = tempPulse;
    }
  
  duty = ((100*(highTime/(double (lowTime+highTime))))); //Calculate duty cycle (integer extra decimal)
  float T = (float(1.0/float(HZ)));             //Calculate total period time
  float period = float(100-duty)*T;             //Calculate the active period time (100-duty)*T
  float temp2 = float(10) * float(period);      //Convert ms to whole number
  temperature = ((40.25 * temp2)-81.25);        //Calculate temperature for display (1ms = -40, 5ms = 80)
  celstemp = int(temperature);
  cels = celstemp;
  fahrtemp = ((temperature*1.8)+32);
  fahr = fahrtemp;
}
User avatar
By SV-Zanshin
#217014
The Artemis Nano and the Arduino Nano are very different boards, the prior uses an Apollo3 microprocessor and the latter an Atmel microprocessor.

All of the interrupt code in that sketch, from the interrupt handler for the conditions "TIMER0_COMPA_vect()" (timer0 compare A) and "TIMER1_CAPT_vect()" and "TIMER1_OVF_vect()" as well as the direct register setting commands such as "TCCR0A", "TCCR0B", "OCR0A", "TIMSK", etc. are specific to the Atmel family and are not defined for the Artemis Nano, as that has completely different timer registers.
I think that it is probably easiest to switch to an Atmel based board for this project, as you'd have to check the Apollo3 datasheet (about 1000 pages!) to get the register information for timers and then check the Arduino Core for the appropriate definitions there.
User avatar
By hachiroku
#217030
thank you for that explanation this is really disappointing as all video's I've watched lead me to believe the code base is compatible. all of this is new to me and this was my first foray into the arduino market. your explanation makes perfect sense. thanks you.
 Topic permissions

You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum