leggere pin digitale pwm con un altro arduino

sto per fare questa prova:
ho un arduino con un sensore che fa variare il segnale pwm su un pin digitale
vorrei leggere questo valore con un altro arduino.
credo che sia il modo più veloce e accurato che non usare la seriale.

sono costretto a fare questo perchè il sensore è un oscillatore dove nello scketch vengono modificati i timer di arduino, quindi non lo posso utilizzare per il resto della logica e elettronica collegata.

basta che collego il pin digitale(del primo arduino) ad un pin digitale (del secondo arduino) e metto la massa in comune?
prima di bruciare tutto chiedo consiglio :slight_smile:

Si si puoi farlo così, per leggerlo puoi usare la pulseIn oppure gli interrupt

Usa pulseIn() per leggere la PWM ma sappi che un PWM di 255 o PWM di 0 ti genera un segnale continuo percui devi evitare questi due valori.
Alternativa: perché non usi l' interfaccia I2C? puoi trrasmettere piú dati con maggior precisione visto che il PWM ti da solo 8 Bit.
Ciao Uwe

grazie delle risp.
secondo te uwefed posso utilizzare i2c anche con i timer modificati?
quindi i2c è più veloce del segnale di un pin, o meglio trasmettere in i2c è più veloce di leggere un pin?
che indirizzo ha arduino in i2c? forse glielo posso settare come altri dispositivi

Ho dato un'occhiata alla lib Wire, mi pare che usi gli interrupt basati sul modulo hardware I2C,, quindi niente timer.
Ma quali timer hai modificato? E perché?

Puoi dare qualsiasi indirizzo al Arduino slave. Basta dare un indirizzo quando initializzi l'interfaccia I2C.
Sí é piú veloce.
ciao Uwe

grazie mille leo72
il codice è quello dell'oscillatore per atmega

//! Macro that clears all Timer/Counter1 interrupt flags.
#define CLEAR_ALL_TIMER1_INT_FLAGS    (TIFR1 = TIFR1)

int pinLed = 13;                 // LED connected to digital pin 13
int pinFreq = 5;

void setup()
{
  pinMode(pinLed, OUTPUT);      // sets the digital pin as output
  pinMode(pinFreq, INPUT);
  pinMode(8, OUTPUT);

  Serial.begin(57600);        // connect to the serial port

  // hardware counter setup ( refer atmega168.pdf chapter 16-bit counter1)
  TCCR1A=0;                   // reset timer/counter1 control register A
  TCCR1B=0;                   // reset timer/counter1 control register A
  TCNT1=0;                    // counter value = 0
  // set timer/counter1 hardware as counter , counts events on pin T1 ( arduino pin 5)
  // normal mode, wgm10 .. wgm13 = 0
  sbi (TCCR1B ,CS10);         // External clock source on T1 pin. Clock on rising edge.
  sbi (TCCR1B ,CS11);
  sbi (TCCR1B ,CS12);

  // timer2 setup / is used for frequency measurement gatetime generation
  // timer 2 presaler set to 256 / timer 2 clock = 16Mhz / 256 = 62500 Hz
  cbi (TCCR2B ,CS20);
  sbi (TCCR2B ,CS21);
  sbi (TCCR2B ,CS22);

  //set timer2 to CTC Mode
  cbi (TCCR2A ,WGM20);
  sbi (TCCR2A ,WGM21);
  cbi (TCCR2B ,WGM22);
  OCR2A = 124;                  // CTC at top of OCR2A / timer2 interrupt when coun value reaches OCR2A value

  // interrupt control

  sbi (TIMSK2,OCIE2A);          // enable Timer2 Interrupt

}

la scorsa volta ho provato a mettere un rtc i2c e mi si è fuso, avevamo detto forse perchè tra i componenti cè un impedenza.

Vedo che imposti il timer 1 come contatore di eventi sul pin 5 e poi il timer 2 come temporizzatore.
Però questo non c'entra con l'RTC esterno, al max non riuscivi a comunicarci. Come hai fatto a fonderlo? Il bus I2C usa i pin A4 e A5, servono poi due R di pull-up per il bus: 1K5 o 2K2 vanno bene. Altri componenti non servono. Forse c'era qualche corto circuito?

scusate

forse perchè tra i componenti cè un impedenza

volevo dire c'è un'induttanza.
comunque forse sarà stato un cortocircuito.
ma non vorrei riprovare. era un rtc già pronto, cioè con le sue resistenze e quarzo, era solo da mettere sui piedini di arduino.

alla fine farò un atmega per l'oscillatore , collegato in i2c con l'altro atmega e tutto il resto del circuito.
mi sembra la soluzione migliore.
oppure: posso portare delle istruzioni (che vanno nel loop) su un altro timer non influenzato dalle precedenti impostazioni?

stefanosky:
oppure: posso portare delle istruzioni (che vanno nel loop) su un altro timer non influenzato dalle precedenti impostazioni?

Negli interrupt è sempre bene che non ci siano istruzioni complesse. E poi i timer sugli Atmega sono solo 3, di cui lo 0 (l'unico che ti resta libero) viene usato per le funzioni temporali di Arduino (delay e millis) e per tutti gli eventi ad esse correlate.

Forse avevi un RTC che doveva essere alimentato con 3,3V e lo hai alimentato con 5V?
Ciao Uwe