Interrupt contemporanei

Dovresti fare una cosa del genere

volatile byte Cycle = 1;

ISR(TIMER1_COMPA_vect)//timer1 interrupt 1Hz toggles pin 13 (LED)
{
  switch (Cycle) {
    case 1:
      PORTD |= (1 << PORTD2); // HIGH
      PORTD &= ~(1 << PORTD4); // LOW
      PORTD |= (1 << PORTD7); // HIGH
      break;

    case 2:
      digitalWrite(7, LOW);
      break;

    case 3:

      digitalWrite(4, HIGH);
      break;

    case 4:
      digitalWrite(2, LOW);
      break;

    case 5:
      digitalWrite(7, HIGH);
      break;


    case 6:
      digitalWrite(4, LOW);
      Cycle = 0;
  }
  Cycle++;
}

Il resto la lascio a te.
Ti conviene definire lo stato di tutti e tre pin in ogni case.

Se anziché PD2, PD4 e PD7 potessi usare PB0(8), PB1(9) e PB2(10) potresti semplificare molto il codice, cioè si semplifica per il micro, ma si complica per il programmatore. Se carichi 100110010011001101 e shifti di 3 a destra nei bit LSB ti ritrovi il codice della sequenza da imporre direttamente alla porta B. Dopo sei volte shift a destra di tre devi ricaricare il valore 100110010011001101.

Più complicato a spiegarlo che a farlo.

Ciao.

Praticamente stai realizzando un inverter trifase finalizzato a alimentatore trifase simile a questo ?

http://www.dmxpassion.altervista.org/pg010.html

Bravo Icio, esattamente in quel modo, ma uso come sorgente un mini impianto idroelettrico in continua :)

In ogni caso ho capito come usare direttamente i registri dell'ATMega, è relativamente molto semplice... ci sarei arrivato comunque da solo a quel sorgente. In ogni caso la problematica principale ancora non l'abbiamo risolta... come funziona la funzionalità busy dell'interfaccia seriale UART? Anche se non fosse implementata in HardwareSerial, come funziona in teoria?

Ho provato a fare dei test... avvio la generazione dei segnali ma nel frattempo invio dei caratteri alla scheda e me li faccio reinviare indietro... non ho notato grossi problemi, nè in ricezione e nè in trasmissione. Devo approfondire i test

MauroTec:
Se anziché PD2, PD4 e PD7 potessi usare PB0(8), PB1(9) e PB2(10) potresti semplificare molto
il codice

Credo abbia scelto quei pin perche gli altri della stessa porta sono PWM.
Forse gli servono.

Manco 2 gg e mi perdo queste discussioni interessanti ;)

Togli tutte quelle digitalWrite dalla ISR così essa verrà eseguita molto più velocemente. Poi sarebbe da capire cos'è che fa il resto del circuito, perché se non hai molte necessità potresti eliminare tutti gli altri interrupt e lasciare solo quello del timer in uso.

PS. tornando un attimo all'inizio del thread, non è che se la CPU sta eseguendo una ISR i segnali degli interrupt in arrivo vengono accodati. Non c'è un buffer. Esistono (come qualcuno ha detto) dei bit che registrano questi interrupt. Alla fine della ISR, viene controllato che non ci sia da eseguire un'altra ISR di un interrupt arrivato nel frattempo. Il problema dei bit è che se arrivano 2 segnali dello STESSO interrupt, il micro registra solo che c'è stato un segnale, non quanti segnali sono arrivati. Per cui 3 INT0 sono registrati sempre con lo stesso bit, per cui la CPU sa solo che c'è da eseguire la relativa ISR. Non che la deve eseguire 3 volte.

Uhm...perfetto, sei stato molto chiaro, ora capisco meglio come funziona, erano questioni che mi ponevo da un po' di tempo. Il problema è che bisogna capire se è possibile accomunare il funzionamento di quella ISR con gli interrupt generati da HardwareSerial. Da quello che si evince devo far si che l'esecuzione della ISR relativa ai PWM venga eseguita il più velocemente possibile, così che ci siano meno possibilità che gli interrupt generati dalla trasmissione/ricezione seriale vengano "scartati" o eseguiti in ritardo a causa dell'esecuzione prolungata della ISR.

Ho fatto un po' di test ma non ho avuto grossi problemi... la ricezione/trasmissione seriale avviene con successo, l'ho testata con una baudrate di 115200, mentre i segnali pwm vengono generati. Invio dei caratteri alla scheda, da cui me li faccio reinviare. Per i segnali è un po' difficile fare dei test, perchè la frequenza è troppo alta ed è impossibile analizzare gli errori del segnale con un semplice oscilloscopio...

I maggiori problemi nella costruzione del tuo inverter per turbina idroelettrica non la incontrerai nel software ma nell'hardware, circuito di controllo spwm, controllo della tensione e corrente di uscita, protezioni, scelta o costruzione dei giusti trasformatori o della reattanza AC trifase etc..

Naah... non per caso studio nell'indirizzo Elettrotecnica ed Automazione (elettronica compresa), e sto studiando per bene il circuito elettronico che sarà pilotato da Arduino. Per le protezioni non ci sono problemi, sto trovando solo qualche difficoltà nel circuito di amplificazione ma ho quasi risolto... l'unica cosa che mi preoccupa ora è solo che il segnale venga generato senza difetti

Va bene ma che te ne fai di 3 onde quadre sfasate? Devi generare 3 sinusoidi!

Certo... c'è il circuito anche per quello :) ho già progettato tutta quella parte, tranne una piccola cosa a cui ancora devo trovare soluzione. In pratica dai pwm genero delle sinusoidi che verranno amplificate ed eventualmente fornite all'avvolgimento primario di qualche trasformatore step up, che mi forniranno una tensione più alta... e poi posso pilotare che voglio :D

Ovviamente con Arduino farò tutta una serie di controlli sulle potenze, sulle tensioni e correnti alternate, controlli all'avvio dell'impianto ed altro...insomma mi voglio divertire non poco :grin:

Insomma in SPwm come ho fatto io. S vuoi possiamo scambiarci qualche informazione quì senza problema

Magari…riesci a trovare risoluzione al mio problema? Come posso amplificare una onda sinusoidale a dei valori determinati di picco?
Sto provando con una configurazione pushpull, ma ho problemi perchè non riesco ad ottenere un’alimentazione duale e comunque non riesco a cambiare il valore di tensione di riferimento dei pin di arduino…