Triple Interrupt on Arduino Uno(Nano)

Arduino specifieke Software
Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Triple Interrupt on Arduino Uno(Nano)

Berichtdoor Gij Kieken » 16 Jan 2017, 20:18

Ik heb een stukje code geschreven om drie signalen Interrupt driven te kunnen loggen via een Arduino Nano(Atmega328)en te versturen middels een setje
HC-12 tranceivers. Elke seconde verzend ik die signalen.
De bedoeling is om de code nog aan te passen in de zin van ,ik wil een techniek inbouwen met pointers waarbij een array gevuld wordt om zo meer signalen
tussen iedere seconde te loggen en dan te versturen als de buffer vol is, (maar dit is nog toekomst).
De code werkte met INT0 en INT & SoftwareSerial (twee signalen dus).
Nu loop ik tegen het feit aan dat als wanneer ik een PinChangeInterrupt (digital Input4 in mijn geval)gebruik deze in conflict komt met de SoftwareSerial library. Dit omdat die library ook gebruik maakt van PCINT2_vect.
Ik heb zitten pluizen in de .cpp van de SoftwareSerial library maar dat is is meer dan twee bruggen te ver voor mij.
De oplossing ,maar dit is dan weer symptoon bestrijding,geen gebruik maken van SoftwareSerial ofwel een mega gebruiken.
In beide gevallen leer ik weer niets bij.
De vraag is kan de SoftwareSerial library ingekrompen worden zodat ze een aantal vectoren niet meer gebruikt.Mijn derde interrupt kan ik verplaatsen naar
PORT B of C indien nodig.(later misschien nog een vierde interrup)t.
De library komt hier vandaan,
SoftwareSerial.cpp (formerly NewSoftSerial.cpp) -
Multi-instance software serial library for Arduino/Wiring
-- Interrupt-driven receive and other improvements by ladyada
(http://ladyada.net)
-- Tuning, circular buffer, derivation from class Print/Stream,
multi-instance support, porting to 8MHz processors,
various optimizations, PROGMEM delay tables, inverse logic and
direct port writing by Mikal Hart (http://www.arduiniana.org)
-- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com)
-- 20MHz processor support by Garrett Mace (http://www.macetech.com)
-- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/)

De foutmelding:
SoftwareSerial\SoftwareSerial.cpp.o: In function '__vector_5':
C:\Program Files (x86)\Arduino\libraries\SoftwareSerial/SoftwareSerial.cpp:319: multiple definition of '__vector-5'
Triple_Interrupt_Logger.cpp.o:C:\Program Files (x86)\Aarduino/Triple_Interrupt_Logger.ino:59: first defined here


De code,
cpp code
/*
@ HC-12 send lapTime and Rpm of rearwheel & engine.
@ Speed of Rear wheel measured with reedcontact 0--3.000 Rpm.
@ NO reedcontact hardware debounced.
@ 1 puls per revolution max(3000rpm/60sec) 50Hz.
@ Calculate frequency by measuring pulses on CHANGE event.
@ Rpm of engine measured with interface on sparkplug.
@ Lap count measured with reedcontact
@ int0 (digitalpin 2)highest priority is used for Lap count.
@ int1 (digitalpin 3)lower priority is used for speed of Wheel.
@ PinChangeInt on digitalpin 4 lowest priority used for rpm of engine.
@ Digital pin 4 (PCINT20) PD4(Port D4)(PCMSK2/PCIF2/PCIE2).
@ Setup the appropriate registers, DDR Data Direction Register 0=input,1=output
@ DDRD(4), PORTD &= ~(1<<4), this makes digital pin 4 an input and leaves all other bits untouched.
@ PCICR Pin Change Interrupt Control Register, when set enables pin cchange interrupts.
@ PCICR = _BV(PCIE2), refers to converts a bit number into a byte value.
@ PCMSK2 |=bit(PCINT20), want DI4 to function as interrupt.
@
*/

#define DEBUG // uncomment this line for debug purposes

//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(5, 6); // RX, TX
#include <TimerOne.h>
#define field_separator "," // used for .csv file
volatile int revWheel=0; // rpm of rear wheel
volatile int revEngine=0; // rpm of engine
volatile byte lapCount = 0;
volatile unsigned long lapTime = 0;
unsigned long prevLaptime = 0;
const byte enginePin = 4; // digital Input 4 is rpm of engine
const byte ledPin = 13; // build in ledPin

void setup() {
Serial.begin(9600);
//mySerial.begin(9600);
pinMode(enginePin,INPUT); // same as PORTD &= ~(1<<4)
pinMode(ledPin, OUTPUT); // to switch off the Led
attachInterrupt(0,isrLap,RISING); // attach interrupt Lap count
attachInterrupt(1,isrRpm,CHANGE); // attach interrupt Rpm
Timer1.initialize(1000000); // sample time 1sec
Timer1.attachInterrupt(plot); // attach plot routine
PCICR = _BV(PCIE2); // enable pin change interrupt for digital pins D0--D7
PCMSK2 |=bit(PCINT20); // same as PCMSK2=16, bit4 of Port D
}

void isrLap() // interrupt service routine Lap counter
{
lapTime=millis();
lapCount++;
}

void isrRpm() // interrupt service routine Speed rear wheel
{
revWheel++;
} // last curley bracket initiates a Return

ISR(PCINT2_vect) // handle pin change interrupt for D4
{
revEngine++;
}

void plot()
{
detachInterrupt(0); // detaches the interrupt 0
detachInterrupt(1); // detaches the interrupt 1
/*
mySerial.print(revWheel);
mySerial.print(field_separator);
mySerial.print(lapCount); // Here comes the Lap numbers
mySerial.print(field_separator);
mySerial.print(lapTime);
mySerial.print(field_separator);
mySerial.println(revEngine);
*/
#ifdef DEBUG
Serial.print(revWheel);
Serial.print(field_separator);
Serial.print(lapCount); // Here comes the Lap numbers
Serial.print(field_separator);
Serial.print(lapTime);
Serial.print(field_separator);
Serial.println(revEngine);
#endif
lapTime=0; // Reset lapTime
revWheel=0; // Rpm rear wheel
revEngine=0; // Rpm engine
attachInterrupt(0,isrLap,RISING);
attachInterrupt(1,isrRpm,CHANGE);
}

void loop()
{
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Triple Interrupt on Arduino Uno(Nano)

Berichtdoor nicoverduin » 16 Jan 2017, 20:59

Ik heb mij verder niet verdiept in de SoftwareSerial lib maar er is natuurlijk ook een andere benadering mogelijk door uit te gaan van een multiplexer waar je de interrupt generatoren aan hangt. Chippies hiervoor kosten geen drol. Maar het moet natuurlijk wel passen. Of je zou een zooi OR poorten kunnen gebruiken (QUAD input bijv). Die hang je aan de datapinnen die de interrupt kunnen genereren op de input. De uitgang hang je aan een van beide interrupt vectoren. Of het werkt? Denk het wel... maar moet nog wel bewezen worden.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Triple Interrupt on Arduino Uno(Nano)

Berichtdoor Gij Kieken » 16 Jan 2017, 21:31

Ja dat kan maar moet dan terug code schrijven om uit te maken waar de interrupt vandaan kwam.
De opzet was makkelijker gewoonweg drie Interrupt pinnen,maar ah ja,,,,
Nog een optie is om pinnen 0&1 te gebruiken voor de HC-12, maar moet dan nog proberen als dat niet te ambetant doet als je wil communiceren over Usb.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Triple Interrupt on Arduino Uno(Nano)

Berichtdoor Koepel » 16 Jan 2017, 22:07


Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Triple Interrupt on Arduino Uno(Nano)

Berichtdoor Gij Kieken » 16 Jan 2017, 22:21

Hey, koepel dit is nuttige info.Ondertussen was ik al bezig snuffelen in AltSoftSerial.

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Triple Interrupt on Arduino Uno(Nano)

Berichtdoor Gij Kieken » 16 Jan 2017, 22:46

Nico, Koepel
Het werkt ogenschijnlijk met de AltSoft Library.
Nu nog proberen de input frequenties wat op te voeren en kijken naar het resultaat.
Volgende is om pointers te gebruiken om een array te vullen om meer info te verzamelen.
Bedankt,

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: MiltonHudge en 13 gasten