Problemi con libreria freqCounter

Voglio fare un banco di prova per motori elettrici e ho cominciato a svilupparlo su un Arduino UNO , il sistema legge 3 temperature , tensione , corrente e giri motore. Sull'ultima voce mi nasce il problema , dopo vari tentativi misurando la lunghezza dell'impulso ho scoperto questa libreria : http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/ ed il gioco è stato semplice e preciso , siccome le cose semplice non mi piacciono ho aggiunto al banco di prova un motore freno e devo leggere anche i dati forniti dal freno , quindi , tensione , corrente e temperatura. Ora gli ingressi di arduino uno non sono sufficienti a meno usare un multiplex esterno. Ho pensato di passare ad un mega e lo comprato , ma ho scoperto che la libreria non funziona , c'è modo di modificarla o ne esiste un'altra compatibile con il mega , l'alternativa sarebbe mettere un convertitore frequenza/tensione ma arrivato a questo punto mi dispiacerebbe molto.

CIao IMEr

potresti tentare il porting..

Ossia ?

CIao IMer

ossia, se la libreria è opensource, non dovrebbe essere troppo complicato riscriverla per funzionare anche sul mega... ovvio se hai già qualche esperienza coi registri e la programmazione in generale

Appunto io non ho esperienza sulle librerie se qualcuno mi spiega come fare potrei fare un po di esperienza. :)

Ciao IMer

prima di tutto proverei il codice così comè... se non va allora prendi i sorgenti e sappi che la parte in C non cambia, bisognerà modificare sicuramente tutti i registri, poichhè il mega ne ha di più(in teoria gli stessi ripetuti più volte) datasheet alla mano vedi a quali registri atmega328p corrispondono ai registri atmega644(se non erro). se hai problemi posta un pezzetto di codice e ti mostro come iniziare :-)

Credo di avere capito il concetto , per fare un esempio : ora sto utilizzando la libreria FreqPeriod e usa i seguenti pin per arduino uno :

Vector Program Addres Source Interrupt Definition 5 0x004 PCINT1 Pin Change INterrupt Request 1 6 0x005 PCINT2 Pin Change INterrupt Request 2 7 0x006 WDT Watchdog Time-out Interrupt

Per passare ad arduino mega devo invece usare:

Vector Program Addres Source Interrupt Definition 11 0x014 PCINT1 Pin Change INterrupt Request 1 12 0x006 PCINT2 Pin Change INterrupt Request 2 13 0x018 WDT Watchdog Time-out Interrupt

Fino a questo punto il ragionamento é corretto ? No le 2 librerie non vanno con il mega Grazie mille per la tua disponibilita

Ciao IMer

ok, in questo caso, poiché i registri hanno lo stesso nome non sono da modificare. però magari i registri del mega sono più grandi, e quindi bisogna modificare le assegnazioni di conseguenza...

Ora io ho collegato i pin riferiti all’uno ossia 5/6/7 se il compilatore li riconosce e mi li indirizza 11/12/13 potrebbe essere questo il problema del mancato funzionamento.
Se non fosse questo il problema di quale registri parli , di quelli per definire le porte ?

Ciao IMer

correzione nel file della libreria c’é questa istruzione :

pinMode(5,OUTPUT);

quindi non puo funzionare sul mega perché non é indirizzata correttamente , giusto ?

/*
FreqPeriod
Counter1 unit capturing analog comparator event measuring period length of analog signal on input AIN1
AIN0 set to VCC/2 by resistors
pin5 used as output for comparator feedback
Analog comparator interrupt service is used to calculate period length
Timer1 overflow interrupt service used to count overflow events

Martin Nawrath KHM LAB3
Kunsthochschule für Medien Köln
Academy of Media Arts
http://www.khm.de
http://interface.khm.de/index.php/labor/experimente/

History:
June 2010 - V0.0
*/

#include <FreqPeriod.h>
#include <wiring.h>
#include <pins_arduino.h>

volatile unsigned char FreqPeriod::f_capt;
volatile unsigned int FreqPeriod::capta;
volatile unsigned long int FreqPeriod::captd;
volatile int FreqPeriod:: ocnt;

void FreqPeriod::begin(){

#if defined (AVR_ATmega168) || defined (AVR_ATmega48) || defined (AVR_ATmega88) || defined (AVR_ATmega328P) || (AVR_ATmega1280)

pinMode(5,OUTPUT);

TCCR1A =0;
TCCR1B =0;

ADCSRB &= ~(1<<ACME);
ACSR &= ~(1<<ACD) ; // Analog Comparator disable off
// ACSR |= (1<<ACBG); // Analog Comparator Bandgap reference on
ACSR |= (1<<ACIE); // Analog Comparator Interrupt enable
ACSR |= (1<<ACIC);

ACSR &= ~(1<<ACIS0); // comparator detection edge
ACSR |= (1<<ACIS1); // comparator detection edge

// CS12 CS11 CS10 Description
// 0 0 0 No clock source (Timer/Counter stopped).
// 0 0 1 clkI/O/1 (No prescaling)
// 0 1 0 clkI/O/8 (From prescaler)
// 0 1 1 clkI/O/64 (From prescaler)
// 1 0 0 clkI/O/256 (From prescaler)

TCCR1B |= (1<<CS10); // set prescaler to 16 MHz
TCCR1B &= ~(0<<CS11);
TCCR1B &= ~(0<<CS12);

TCCR1B |= (1<<ICNC1); // input noise canceler on
TCCR1B &= ~(1<<ICES1); // input capture edge select =0

DIDR1 |= (1<< AIN0D); // disable digital input buffer AIN0/1
DIDR1 |= (1<< AIN1D);

TIMSK1 |= (1<<TOIE1); // Timer/Counter1, Overflow Interrupt Enable

// TIMSK0 &= ~(1<<TOIE0); // Timer/Counter0, Overflow Interrupt disable

#endif

}
//***************************************************************************
unsigned long int FreqPeriod::getPeriod() {
unsigned long int rr= 0;
if ( FreqPeriod::f_capt){
FreqPeriod::f_capt=0;
rr= FreqPeriod::captd;
}
return(rr);
}

//***************************************************************************
// Timer1 Overflow Interrupt Service
ISR(TIMER1_OVF_vect ) {
FreqPeriod:: ocnt++; // count number of timer1 overflows
}
//***************************************************************************
// Analog Comparator Interrupt Service
ISR(ANALOG_COMP_vect ) {

if (!(ACSR & (1<<ACIS0))) { // comparator falling edge
digitalWrite(5,0); // reduce comparator threshold level on AIN0
ACSR |= (1<<ACIS0); // next comparator detection on rising edge

// compute period length timer1 capture value , account timer1 numer of overflows
FreqPeriod::captd= ICR1 + FreqPeriod:: ocnt* 0x10000;

// compute period difference
FreqPeriod::captd=FreqPeriod::captd-FreqPeriod::capta;

FreqPeriod::capta=ICR1; // store capture value
FreqPeriod:: ocnt=0; // reset number of timer1 overflows
FreqPeriod::f_capt=1; // measure ready flag
}
else {
ACSR &= ~(1<<ACIS0); // next comparator detection on falling edge
digitalWrite(5,1); // elevate comparator threshold level on AIN0
}
}

cosa modifico qua dentro ???

Ciao IMer

#if defined (AVR_ATmega168) || defined (AVR_ATmega48) || defined (AVR_ATmega88) || defined (AVR_ATmega328P) || (AVR_ATmega1280)

da qu’ sembra che debba funzionare alche sul mega: (AVR_ATmega1280)
ora sono in uni, quando arrivo a casa do un’occhiata

SI ma il mega usa il 2560 , dovrebbe aver piu memoria ma stessa piedinatura ?

Grazie ancora per la tua disponibilita

Ciao IMer

yep esistono entrambe le versioni, tu hai la 2560?

si usa il 2560

Ciao IMer

ho dato un'occhiata, 1280 e 2560 hanno lo stesso datasheet, quindi nessuna differenza! cambia

#if defined (__AVR_ATmega168__) || defined (__AVR_ATmega48__) || defined (__AVR_ATmega88__) || defined (__AVR_ATmega328P__) || (__AVR_ATmega1280__)

in

#if defined (__AVR_ATmega168__) || defined (__AVR_ATmega48__) || defined (__AVR_ATmega88__) || defined (__AVR_ATmega328P__) || (__AVR_ATmega1280__) || (__AVR_ATmega2560__)

e tutto dovrebbe funzionare ;D

Se funziona ti devo una birra , se passi sul Lago Maggiore fatti sentire , adesso mangio e poi ci provo.

Ciao IMer

La birra te la offro lo stesso per l'impegno ma non riesco neppure a compilare la lista dei errori è la seguente: FreqCounter\FreqCounter.cpp.o: In function __vector_7': D:\Programmi\arduino-0021\libraries\FreqCounter/FreqCounter.cpp:102: multiple definition ofvector_7' FreqCounter\Copia di FreqCounter.cpp.o:D:\Programmi\arduino-0021\libraries\FreqCounter/Copia di FreqCounter.cpp:102: first defined here FreqCounter\FreqCounter.cpp.o: In function `vector_7': D:\Programmi\arduino-0021\libraries\FreqCounter/FreqCounter.cpp:102: multiple definition of FreqCounter::f_tics' FreqCounter\Copia di FreqCounter.cpp.o:D:\Programmi\arduino-0021\libraries\FreqCounter/Copia di FreqCounter.cpp:102: first defined here FreqCounter\FreqCounter.cpp.o: In functionvector_7': D:\Programmi\arduino-0021\libraries\FreqCounter/FreqCounter.cpp:102: multiple definition of FreqCounter::f_period' FreqCounter\Copia di FreqCounter.cpp.o:D:\Programmi\arduino-0021\libraries\FreqCounter/Copia di FreqCounter.cpp:102: first defined here FreqCounter\FreqCounter.cpp.o: In functionvector_7': D:\Programmi\arduino-0021\libraries\FreqCounter/FreqCounter.cpp:102: multiple definition of FreqCounter::f_comp' FreqCounter\Copia di FreqCounter.cpp.o:D:\Programmi\arduino-0021\libraries\FreqCounter/Copia di FreqCounter.cpp:102: first defined here FreqCounter\FreqCounter.cpp.o: In functionvector_7': D:\Programmi\arduino-0021\libraries\FreqCounter/FreqCounter.cpp:102: multiple definition of FreqCounter::f_ready' FreqCounter\Copia di FreqCounter.cpp.o:D:\Programmi\arduino-0021\libraries\FreqCounter/Copia di FreqCounter.cpp:102: first defined here FreqCounter\FreqCounter.cpp.o: In functionvector_7': D:\Programmi\arduino-0021\libraries\FreqCounter/FreqCounter.cpp:102: multiple definition of FreqCounter::f_mlt' FreqCounter\Copia di FreqCounter.cpp.o:D:\Programmi\arduino-0021\libraries\FreqCounter/Copia di FreqCounter.cpp:102: first defined here FreqCounter\FreqCounter.cpp.o: In function__vector_7': D:\Programmi\arduino-0021\libraries\FreqCounter/FreqCounter.cpp:102: multiple definition of FreqCounter::f_freq' FreqCounter\Copia di FreqCounter.cpp.o:D:\Programmi\arduino-0021\libraries\FreqCounter/Copia di FreqCounter.cpp:102: first defined here FreqCounter\FreqCounter.cpp.o: In functionFreqCounter::start(int)': D:\Programmi\arduino-0021\libraries\FreqCounter/FreqCounter.cpp:46: multiple definition of `FreqCounter::start(int)' FreqCounter\Copia di FreqCounter.cpp.o:D:\Programmi\arduino-0021\libraries\FreqCounter/Copia di FreqCounter.cpp:46: first defined here

CIao IMer

l'errore non sta nel codice, ma nel fatto che hai fatto una copia della classe originale."Copia di FreqCounter.cpp" è un piccolo sbatti della programmazione lineare e (come in questo caso) ad oggetti. A quanto pare sta compilando sia la copia che l'originale e quindi va in casino!!

Consiglio pratico: la copia lasciala intatta e mettila in un'altra cartella fuori dal quelle di arduino così non crea macelli, e modifica direttamente il file "FreqCounter.cpp"

dovrebbe andare :P

Adesso compila , ma arduino se impallato e non riesco più a caricaci sopra nulla , continua a lampeggiare il led del pin 13 e il tx della seriale e non c'è modo di bloccare il tutto.

CIao IMer

tieni premuto reset fino a quando non clicchi su “upload” per il nuovo codice…
strano.
hai il codice completo della libreria? riesci a passarmelo?