ho un circuito che mi restituisce una differenza di potenziale tra due terminali compresa tra -2.5 e 2.5v
per evitare circuiti strani con op amp, perdita di precisione ed infine per imparare qualcosa di nuovo pensavo di usare un ATtiny85 in modalita differenziale.
partendo dalla teoria: è corretto lo schema presente qui per un adc completamente differenziale è corretto?(p129 del datasheet mostra solo l'adc single-ended)
non capisco se possa andare bene anche per segnali DC vista la propensione dei condensatori a bloccare la componente continua.
la differenza di potenziale massima di un attiny con adc differenziale di quanto sarebbe? nel mio caso non è un problema (i -2.5 in uscita dal circuito equivalgono a GND dell attiny) ma nel caso reciclassi il tutto non sarebbe male saperlo.
passando alla pratica, come accedo e come modifico i vari registri?
mi basta digitare il nome del registro preso dal datasheet e farci sopra un po di matematica con gli operatori bitwise?
un ultima domanda, questo attiny dovrebbe solo effettuare le letture, vorrei poi passare questi dati ad un atmega 328, e se possibile vorrei usare anche il secondo canale differenziale, il che mi lascia con un solo pin libero.
senza che io debba farmi un programmatore HV esiste un sistema di comunicazione che sia bidirezionale e usi un solo pin? la velocita di trasferimento non sarebbe importante, 200Bps probabilmente sarebbero piu che sufficienti.
se non c'e nulla di fattibile poco importa, sacrifichero il secondo canale per implementare l'i2c
Ti svelo un segreto: i "normali int" sono rappresentati in complemento a due ;).
Prova questo:
uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
uint8_t high = ADCH; // unlocks both
int result = (high << 8) | low; // combine the two
Non ti preoccupare del bit di segno, è parte integrante dei due byte e viene trattato come gli altri bit.
Sì, uint8_t è uguale a byte, usa quest'ultimo se preferisci. Più pulito? Non c'è niente di "sporco", quei due registri sono proprio predisposti per essere letti in quel modo, vedi datasheet.
intendevo dire, visto che l'int di arduino funziona in complemento a due, cosa devo fare del bit di segno restituito dall adc?
ADCW non credo lo sposti da solo all ultimo posto, quindi devo farlo io.
ieri non sapevo la soluzione, oggi l'ho trovata
se il numero ottenuto è negativo, mi basta mettere ADCW in un int ed settare i sei bit piu significativi della variabile ad 1, mentre se è positivo è gia computabile come int
dopo il successo nel leggere i valori volevo provare ad attivare la modalita ADC noise reduction, come spiegato nel capitolo 17.7 del datasheet.
ho prodotto questo codice:
#include <TinyWireS.h>
byte i=1;
void setup() {
TinyWireS.begin(8);
TinyWireS.onRequest(requestEvent);
pinMode(1,OUTPUT);
}
void loop()
{
}
void requestEvent()
{
int tot,N;
ADMUX= B10010110;
ADCSRB |= B10000000; //atticva la modalita bipolare
tot =0;
ADCSRA|=B10001110; //attiva linterrupt dell adc
digitalWrite(1,HIGH);
delay(1000);
digitalWrite(1,LOW);
delay(1000);
digitalWrite(1,HIGH);
SREG |= B10000000; // abilitazione interrupt globali
MCUCR &= B11100111; //setta la modalita adc noise reduction
MCUCR |= B00001000;
MCUCR |= B00100000; //entra in sleep
digitalWrite(1,LOW);
tot=ADCW;
TinyWireS.send(tot & 0xFF); //invio solo il primo byte
TinyWireS.send(tot>>8); //invio solo il secondo byte
}
ISR(ADC_vect)
{
}
per il debug ho messo un led sul pin 6 dell integrato (pin digitale 1 per l'ide) e una sequenza di acceso-spento per sapere quando stava per entrare in sleep.
il problema è che non trasmette piu dati sull bus i2c, ed il led si mette a lampeggiare a caso (e non per un secondo) appena do alimentazione, dopo pochi secondi smette per riprendere poi alla richiesta del master su i2c, lo fa per due volte e poi basta, spegne il led e non fa nulla.
credo che entri ed esca a caso dallo sleep, ma oltre a non riuscire a spiegarmi questo non riesco nemmeno a spiegarmi il perche della frequenza di lampeggio (~10 hz).
lasciamo stare, mentre spulciavo piu a fondo il datasheet ho visto la sezione 21.7, e ho scoperto che la modalita noise reduction fa guadagnare 0.5LSB, praticamente nulla.