Il 0% ha trovato utile questo documento (0 voti)
20 visualizzazioni

Robotica

robotica

Caricato da

yari.mannelli
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato ODT, PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
20 visualizzazioni

Robotica

robotica

Caricato da

yari.mannelli
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato ODT, PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 4

#### Timer 0

- **Modalità di funzionamento:**
- PWM (Pulse Width Modulation) su pin 5 e 6.
- Contatore di sistema (usato per millis() e delay()).
- **Configurazione tipica:**
- Frequenza di clock: 16 MHz.
- Risoluzione: 8 bit.

#### Timer 1
- **Modalità di funzionamento:**
- PWM su pin 9 e 10.
- Contatore a 16 bit.
- Modalità di generazione di impulsi di output PWM.
- Modalità di conteggio del tempo.
- **Configurazione tipica:**
- Frequenza di clock: 16 MHz.
- Risoluzione: 16 bit.

#### Timer 2
- **Modalità di funzionamento:**
- PWM su pin 3 e 11.
- Contatore a 8 bit.
- Modalità di generazione di impulsi di output PWM.
- Modalità di conteggio del tempo.
- **Configurazione tipica:**
- Frequenza di clock: 16 MHz.
- Risoluzione: 8 bit.

### Impostazioni comuni per la configurazione dei timer


- **Impostazione del timer:**
- Scegliere la modalità di funzionamento desiderata (ad esempio, PWM, conteggio del tempo).
- Impostare il prescaler per definire la frequenza di clock del timer.
- **Configurazione dei registri:**
- Utilizzare i registri specifici per il timer (come `TCCR0A`, `TCCR0B`, `OCR0A` per Timer 0)
per configurare la modalità e altre impostazioni.
– Impostare i registri DDRx per configurare i pin associati per il funzionamento del PWM.

### Schema di Port Manipulation

#### 1. Definizione dei Registri

- **`DDRx`**: Registro di direzione del pin (Data Direction Register). Un bit impostato su `1`
rende il pin corrispondente un output, mentre un bit impostato su `0` lo rende un input.

- **`PORTx`**: Registro di output del pin. Se un pin è configurato come output, il valore di questo
registro determina se il pin è HIGH (`1`) o LOW (`0`).

**`PINx`**: Registro di input del pin. Utilizzato per leggere lo stato del pin.
#### 2. Utilizzo dei Registri

// Impostare il pin 5 come output

DDRB |= (1 << DDB5);

// Impostare il pin 2 come input

DDRD &= ~(1 << DDD2);

// Scrivere HIGH sul pin 5

PORTB |= (1 << PORTB5);

// Scrivere LOW sul pin 5

PORTB &= ~(1 << PORTB5);

// Leggere lo stato del pin 2

if (PIND & (1 << PIND2)) {


// Il pin 2 è HIGH
} else {
// Il pin 2 è LOW
}
### Schema di Programmazione degli Interrupt

#### 1. Dichiarazione e Configurazione degli Interrupt

- **`attachInterrupt()`**: Questa funzione imposta il gestore interrupt per un pin specifico.

attachInterrupt(digitalPinToInterrupt(pin), interruptFunction, mode);

- `pin`: Il numero del pin al quale associare l'interrupt.


- `interruptFunction`: Il nome della funzione che deve essere chiamata quando si verifica
l'interrupt.
- `mode`: Il tipo di evento che attiverà l'interrupt (`CHANGE`, `RISING`, `FALLING`).

#### 2. Gestore Interrupt (Interrupt Service Routine, ISR)

- **Gestore Interrupt**: È una funzione dedicata che viene eseguita quando si verifica l'evento di
interrupt specificato. Deve essere veloce e non bloccante.

void interruptFunction() {
// Codice da eseguire quando si verifica l'interrupt
}

#### 3. Esempio di Utilizzo Completo

// Dichiarazione delle variabili globali

volatile bool buttonPressed = false;

// Funzione di gestione dell'interrupt


void handleInterrupt() {
buttonPressed = true;
}

void setup() {
// Configurazione del pin 2 come input per il pulsante
pinMode(2, INPUT);

// Configurazione dell'interrupt sul pin 2 (fronte di salita)


attachInterrupt(digitalPinToInterrupt(2), handleInterrupt, RISING);

Serial.begin(9600);
}

void loop() {
// Esempio di utilizzo dell'interrupt
if (buttonPressed) {
Serial.println("Interrupt attivato!");
// Aggiungi qui le azioni da eseguire quando si verifica l'interrupt
buttonPressed = false; // Reimposta la variabile per gestire nuovi interrupt
}
// Altre operazioni da eseguire nel loop principale
}
### Spiegazione

- **`volatile`**: È una parola chiave utilizzata per dichiarare una variabile globale che può essere
modificata all'interno di un interrupt. Assicura che il compilatore non ottimizzi l'accesso alla
variabile.

- **`attachInterrupt()`**: Viene utilizzata nel setup per collegare il gestore interrupt


`handleInterrupt()` al pin 2 (che corrisponde all'interrupt 0 su Arduino Uno) con il fronte di salita
(`RISING`), il che significa che l'interrupt verrà attivato quando il pin passerà da LOW a HIGH.

- **`handleInterrupt()`**: È il gestore interrupt dedicato che viene eseguito quando si verifica


l'evento di interrupt sul pin 2. Nell'esempio, impostiamo la variabile `buttonPressed` su `true` per
indicare che l'interrupt è stato attivato.

- Nel loop principale (`loop()`), verifichiamo continuamente lo stato della variabile `buttonPressed`.
Quando questa variabile diventa `true`, eseguiamo delle azioni (nel nostro caso, stampiamo un
messaggio sulla console seriale) e reimpostiamo la variabile a `false` per prepararci a gestire nuovi
interrupt.

- Assicurarsi di definire correttamente il tipo di evento (`mode`) che attiverà l'interrupt


(`CHANGE`, `RISING`, `FALLING`) in base alle esigenze dell'applicazione.

Potrebbero piacerti anche