🇮🇹 IT 🇬🇧 EN

🔄 Servo G90 360 in assembly AVR
Da fermo a rotazione con r17

Per principianti assoluti e per avanzati. Il segreto è tutto nel valore di r17.
📦 per principianti

Metafora dell'armadio

Immagina un armadio con tanti cassetti. Ogni cassetto ha 8 compartimenti.
Nel nostro caso: indirizzo 4 (DDRB) e indirizzo 5 (PORTB) sono due cassetti vicini.

Ogni compartimento corrisponde a un pin fisico del microcontrollore.
Il compartimento numero 5 (bit 5) corrisponde al pin fisico D13 (quello con il LED integrato su Arduino).

Cassetto DDRB (indirizzo 4):
Ogni interruttore decide se il pin può "parlare" (OUTPUT) o solo "ascoltare" (INPUT).
Se metti 1 nel compartimento 5 del cassetto 4 → pin D13 diventa OUTPUT.

Cassetto PORTB (indirizzo 5):
Ogni interruttore manda corrente (5V) o no (0V) al pin.
Se metti 1 nel compartimento 5 del cassetto 5 → pin D13 va a 5V (LED acceso).
Se metti 0 → pin D13 va a 0V (LED spento).

Ecco perché funziona:

; Set Bit in registro 4, bit 5 → compartimento 5 del cassetto 4 = 1 (D13 OUTPUT) sbi 4,5 ; Set Bit in registro 5, bit 5 → compartimento 5 del cassetto 5 = 1 (D13 = 5V, LED ON) sbi 5,5 ; Clear Bit in registro 5, bit 5 → compartimento 5 del cassetto 5 = 0 (D13 = 0V, LED OFF) cbi 5,5
🚪 Questo non è magia

È solo aprire e chiudere interruttori in cassetti. Stesso identico principio vale per qualsiasi periferica programmabile: schede audio, centraline auto, altri microcontrollori.

🎥 Video: G90 360 in azione

Servo G90 360 pilotato in puro assembly, senza IDE, senza librerie, direttamente dal browser.

🎯 Il codice per servo G90 360

; Marrone GND, Rosso +5V, Giallo PWM su D13 .org 0 ; parte dall'inizio (vettore reset) rjmp init .org 0x68 ; salta tabella interrupt, continua da qui init: sbi 4,5 ; DDRB bit5 = 1 (pin D13 OUTPUT) loop: sbi 5,5 ; inizio impulso rcall wait1 ; pausa (decisa da r17) cbi 5,5 ; fine impulso rcall wait1 ; pausa (stessa durata) rjmp loop wait1: ldi r17, 31 ; <-- QUESTO VALORE DECIDE IL COMPORTAMENTO wait: dec r16 brne wait dec r17 brne wait ret

📌 Il valore di r17 determina la durata dell'impulso. 31 = 1.5ms = servo fermo al centro.

passo 1

🔌 Collegamenti

Servo G90 360Arduino
Marrone (GND)GND
Rosso (+5V)5V
Giallo (segnale PWM)D13 (pin 13)

Come caricare il codice:
Vai su costycnc.it/avr1/compiler.html, incolla il codice, clicca "Assemble" e poi "Connect".

passo 2

🎮 Come si comporta il servo

Un servo G90 360 (rotazione continua) interpreta la durata dell'impulso come comando:

Valore r17Durata impulsoComportamento
25-301.0-1.4 msGira in un senso (es. orario)
311.5 msFERMO al centro
32-371.6-2.0 msGira nell'altro senso (es. antiorario)

Più il valore si allontana da 31, più veloce gira.

🧮 Perché r17=31 dà 1.5ms?

Con clock 16MHz, 31 × 512 cicli ≈ 15.872 cicli ≈ 0.99ms. Con due chiamate e il codice di contorno, si ottengono circa 1.5ms e 18.5ms.

⏳ Perché r16 non inizializzato funziona?

All'accensione, tutti i registri generali (r16 compreso) valgono 0. La prima volta dec r16 → 0-1 = 255, poi 254... fino a 0. Funziona, ma in programmi complessi è meglio inizializzare con ldi r16, 0.

passo 3

📋 Istruzioni usate

IstruzioneSignificato (spiegato semplice)
.org N"indirizzo da dove comincia il codice" (es. .org 0 = parte dall'inizio, .org 0x68 = salta la tabella interrupt)
rjmp label"salta a label" (vai avanti o indietro nel codice)
sbi a,b"set bit b nel registro a" (compartimento b del cassetto a = 1)
cbi a,b"clear bit b nel registro a" (compartimento b del cassetto a = 0)
rcall label"chiama la subroutine label" (vai lì, fai quello che c'è, poi torna)
ret"torna indietro" (dopo un rcall)
ldi r,val"carica il valore val nel registro r" (es. ldi r17,31 = r17=31)
dec r"decrementa il registro r" (r = r - 1)
brne label"se l'ultima operazione non ha dato zero, salta a label" (altrimenti continua)
🎛️ avanzati

Stesso principio ovunque

Se capisci questo, hai capito come funziona qualsiasi periferica programmabile.

Esempio 1: Scheda audio Realtek
Il driver scrive bit in registri specifici per alzare/abbassare volume. Stessa cosa.

Esempio 2: Automobile e OBD2
La centralina (ECU) ha centinaia di registri. Velocità, giri, temperatura sono numeri in registri.

Esempio 3: Altri microcontrollori
STM32, ESP32, PIC: cambiano i nomi, ma il principio è identico.

📝 Verifica

Domanda: Cosa succede se cambio r17 da 31 a 28?

Mostra risposta

Impulso più corto (1.3-1.4ms). Il servo gira in un senso. Più piccolo è r17, più veloce.