analogComp, una libreria per gestire il comparatore analogico

[quote author=Michele Menniti link=topic=130533.msg986311#msg986311 date=1352282997] Leo, ti avevo promesso le prove ma ho dovuto mandare il DSO in assistenza per una verifica. Ieri sera sono passato un paio d'ore al lab ed ho implementato nel mio Capacimetro il cambio portata automatico, la prossima volta metto l'autoreset, vorrei saper programmare quanto so maneggiare le logiche TTL/CMOS :) [/quote] Ed io vorrei capirci di elettronica quanto so programmare ;) L'erba del vicino è sempre più verde, mettiamola così XD

basta togliere la siepe e fare un giardino unico :) ;)

Tu mi capisci :wink:

leo72:

BrainBooster: Leo che impedenza in entrata ha il comparatore del 328?

Non lo so, non ho trovato il dato sul datasheet.

Credo non ci sia perche' dipende da quali ingressi si usano.

Testato:

leo72:

BrainBooster: Leo che impedenza in entrata ha il comparatore del 328?

Non lo so, non ho trovato il dato sul datasheet.

Credo non ci sia perche' dipende da quali ingressi si usano.

Ma internamente c'è sempre e comunque un op-amp, questo avrà delle caratteristiche tecniche, no? ;)

certo, ma non potendo accedere direttamente ai pin di ingresso del componente, l'impedenza di ingresso sara' influenzata dai pin e dalla configurazione che usi. Se connetti i pin del componente agli Analogpin avrai una certa impedenza di ingresso, se ci attivi la pullup cambiera', se scegli l'aref come pin sara' ancora diverso Cioe' se anche volendo si puo' indicare il valore richiesto, il componente pero' e' chiuso in una scatola che e' raggiungibile solo attraverso altri componenti. E' un dato inutile da dare secondo me

Ho capito cosa vuoi dire.

Testato, non condivido quello che dici, perchè al massimo l'impedenza di entrata di un opamp usato come comparatore analogico è il punto dipartenza dei calcoli necessari alla progettazione della rete esterna di polarizzazione e delle correnti in gioco no? perchè dici che è un dato inutile?

non sto' dicendo che e' inutile dare questo valore per un OAmp in generale, ma per un Oamp che e' "nascosto" dietro ad altri ingressi diventa un dato fuorviante. Il nostro OA non ha accesso diretto a due pin esterni, ma arriva all'esterno tramite diversi pin, a scelta del programmatore, i quali pin avranno proprie caratteristiche. A questo punto si dovrebbe dare l'impedenza di ingresso di ogni modalita' di connessione, perche' di certo se usi Aref come pin Rispetto ad A0, ci sara' un'impedenza diversa

Tu come la vedi ? (cit.: Quelo) :)

Credo che sia giusto quello che dici, ma alla fine puoi giocare con uno solo dei due ain che può essere connesso ad aref oppure ad uno qualsiasi degli ingressi multiplexati dall'adc (sbaglio Leo?) quindi le impedenze da conoscere sarebbero due. Considerazione collaterale... ma se l'impedenza è diversa a seconda del collegamento,avremo misure differenti usando pin differenti?! c'è grossa crisi (cit.: Quelo) smiley

BrainBooster: Credo che sia giusto quello che dici, ma alla fine puoi giocare con uno solo dei due ain che può essere connesso ad aref oppure ad uno qualsiasi degli ingressi multiplexati dall'adc (sbaglio Leo?) quindi le impedenze da conoscere sarebbero due.

AIN+ si può collegare sia al pin AIN0 che alla tensione interna di riferimento, mentre AIN- si può collegare sia al pin AIN1 sia ad uno degli ingressi analogici (non AREF).

Compilando per ATTiny85

In file included from C:\arduino-1.0.3\hardware\tiny\cores\tiny/Stream.h:24,
                 from C:\arduino-1.0.3\hardware\tiny\cores\tiny/TinyDebugSerial.h:31,
                 from C:\arduino-1.0.3\hardware\tiny\cores\tiny/WProgram.h:18,
                 from C:\arduino-1.0.3\hardware\tiny\cores\tiny/Arduino.h:4,
                 from C:\arduino-1.0.3\libraries\analogComp\/analogComp.h:32,
                 from C:\arduino-1.0.3\libraries\analogComp\analogComp.cpp:7:
C:\arduino-1.0.3\hardware\tiny\cores\tiny/Print.h:37:1: warning: "BIN" redefined
In file included from c:/arduino-1.0.3/hardware/tools/avr/lib/gcc/../../avr/include/avr/iotn85.h:38,
                 from c:/arduino-1.0.3/hardware/tools/avr/lib/gcc/../../avr/include/avr/io.h:284,
                 from c:/arduino-1.0.3/hardware/tools/avr/lib/gcc/../../avr/include/avr/interrupt.h:38,
                 from C:\arduino-1.0.3\hardware\tiny\cores\tiny/WProgram.h:8,
                 from C:\arduino-1.0.3\hardware\tiny\cores\tiny/Arduino.h:4,
                 from C:\arduino-1.0.3\libraries\analogComp\/analogComp.h:32,
                 from C:\arduino-1.0.3\libraries\analogComp\analogComp.cpp:7:
c:/arduino-1.0.3/hardware/tools/avr/lib/gcc/../../avr/include/avr/iotnx5.h:55:1: warning: this is the location of the previous definition
C:\arduino-1.0.3\libraries\analogComp\analogComp.cpp: In member function 'uint8_t analogComp::setOn(uint8_t, uint8_t)':
C:\arduino-1.0.3\libraries\analogComp\analogComp.cpp:57: error: 'DIDR1' was not declared in this scope
C:\arduino-1.0.3\libraries\analogComp\analogComp.cpp: In member function 'void analogComp::setOff()':
C:\arduino-1.0.3\libraries\analogComp\analogComp.cpp:112: error: 'DIDR1' was not declared in this scope
C:\arduino-1.0.3\libraries\analogComp\analogComp.cpp: At global scope:
C:\arduino-1.0.3\libraries\analogComp\analogComp.cpp:159: warning: 'ANALOG_COMP_vect' appears to be a misspelled signal handler

E' previsto un aggiornamento della libreria per correggere questo errore che previene la compilazione?

Ora verifico...

Ho scritto un controllo troppo semplicistico relativamente alla parte in cui provvedo a disattivare gli input digitali sui pin AIN0/1 quando vengono usati come ingressi per il comparatore. Ho corretto mettendo un check più complesso.

Però ho trovato un altro problemino, appena ho terminato la correzione metto online la nuova versione.

EDIT. è online la versione 1.1.0 provala e fammi sapere, non ho potuto verificarla in pratica se sulla Tiny85 funziona (la compilazione comunque va) perché non ho possibilità di farlo.

Ti ringrazio, appena posso la provo sul Tiny85, per il momento ha compilato con successo

Col seguente codice

  analogComparator.setOn(INTERNAL_REFERENCE, A3);
  analogComparator.enableInterrupt(MiaFunzione);

Purtroppo sembra non chiamare MiaFunzione..

flz47655: Col seguente codice

  analogComparator.setOn(INTERNAL_REFERENCE, A3);
  analogComparator.enableInterrupt(MiaFunzione);

Al metodo enableInterrupt devi passare sia la funzione da attivare sia il tipo di confronto: Esempio:

analogComparator.enableInterrupt(MiaFunzione, CHANGE);

Puoi usare anche FALLING o RISING

Se non specificato di default viene passato CHANGE Comunque ho già provato ma sembra non chiamare mai la funzione.. deve esserci qualcos'altro che non va mi sa..

Per capirci qualcosa ho scritto un semplice codice per utilizzare direttamente il comparatore ma… cambiando il pin PB0 e PB1 non viene chiamato l’interrupt con il simulatore di atmel studio, puoi darmi qualche dritta?

#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>

volatile int x = 0;
ISR(ANA_COMP_vect)
{
	x--;
	if (bit_is_set(ACSR, ACO))       	//Check for rising or falling edge
	{
		PORTB |= _BV(PB4);		// Turn led on		
	}
	else
	{
		PORTB &= ~(_BV(PB4));	// Turn led off	
	}		
}
int main(void)
{
	// ACSR (Analog Comparator Setting Register)
	// ACIE (Analog Comparator Interrupt Enable)	
	ACSR |= _BV(ACIE);	
	DDRB |= _BV(PB4);	// PB4 output
	
	sei();				// Enable global interrupt
	
    while(1)
    {														
		x++;		
    }
}

EDIT: Avevo provato analogComp su un device fisico, il problema col mio codice penso sia legato al simulatore che non emula bene la periferica

Maledetto simulatore! Su un device reale il semplice codice funziona ]:D

Il problema nella libreria è l'ISR che è chiamata sui Tiny e su altri micro ANA_COMP_vect mentre nell'ATmega328P ed in altri è chiamata ANALOG_COMP_vect http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html ;)

Se vuoi sistemarla la modifica è immediata

Ciao