Reti Cellulari
Corso Reti Cellulari — da GSM a 5G | Hands on Stem 📱 Hands on Stem — Mini-corso Reti Cellulari…
🎓 PIC16 — From Zero to Hero · Lezione –01
30 anni a progettare sistemi embedded. 5 anni a insegnarli.
Ecco cosa ho capito — e perché ho costruito questo strumento.
Il primo anno che ho insegnato microcontrollori, ho fatto quello che fanno tutti: ho distribuito la scheda con il PIC, spiegato come installare MPLAB, e dato un’ora per mettere in piedi l’ambiente di sviluppo.
Un’ora dopo, metà della classe stava ancora aspettando che il driver dell’USB si installasse. Un ragazzo aveva il Mac. Un’altra aveva Windows in italiano con i path diversi. Qualcuno aveva scaricato la versione sbagliata. Il programmatore hardware di un banco non funzionava.
Non avevamo ancora scritto una riga di codice.
Quella lezione l’ho finita parlando di architettura Harvard su una lavagna, con metà della classe che seguiva e l’altra metà che cercava di capire perché il PC non riconosceva il PICkit. Non era quello che avevo in mente.
Dopo 30 anni a progettare sistemi embedded — dal firmware per dispositivi medicali ai controller per impianti industriali — so bene che i PIC sono una piattaforma solida, didatticamente eccellente, economica. Non è quello il problema.
Il problema è la distanza tra lo studente e il concetto. E quella distanza, nei corsi tradizionali, è piena di ostacoli che non hanno nulla a che fare con l’elettronica:
🔌
La scheda è in laboratorio. Il laboratorio è aperto tre ore a settimana. Se non capisci qualcosa durante l’esercitazione, non puoi riprovare da solo la sera. L’apprendimento si interrompe.
💻
MPLAB X richiede Java, driver specifici, configurazione del programmatore. Su Windows funziona. Su Mac forse. Su Linux buona fortuna. Prima ancora di compilare “Hello World”, hai già perso un’ora e mezza.
🔬
Anche quando tutto funziona, hai 25 studenti, 8 postazioni e 2 ore. Non è fisica: non tutti riescono a fare esperienza diretta. Qualcuno osserva, qualcuno spinge i tasti, qualcuno aspetta il suo turno.
Nel lavoro professionale, un sistema embedded non si “vede”. Non ha schermo, non ha tastiera. Programmi, carichi il firmware, e osservi il comportamento attraverso un LED, un oscilloscopio, un terminale seriale. La tua testa deve essere capace di immaginare cosa sta succedendo dentro al chip.
Questa capacità — visualizzare mentalmente il flusso di esecuzione — è la differenza tra chi sa fare debug in 10 minuti e chi ci passa mezza giornata. E si costruisce solo in un modo: eseguendo istruzioni una ad una, osservando i registri cambiare, capendo il perché di ogni bit.
«Un buon simulatore non è un sostituto dell’hardware. È qualcosa di meglio: ti permette di fermare il tempo, guardare dentro la CPU, e capire esattamente cosa sta succedendo — cosa che con il chip reale non puoi fare.»
— Prof. D. Bertolino
Esistono già simulatori per PIC. MPLAB ha il suo. Ci sono tool online. Ma nessuno era pensato per la didattica in aula — ovvero per uno studente che apre il browser, inizia a scrivere codice e capisce cosa sta facendo, senza prerequisiti tecnici di installazione.
Ho scritto il WebPicSimulator con obiettivi precisi:
È una domanda legittima. Esistono Arduino, ESP32, STM32 — piattaforme più moderne, più potenti, con ecosistemi enormi. Perché partire dai PIC16 in Assembly?
Risposta breve: perché sono onesti.
Arduino ti nasconde quasi tutto. Scrivi digitalWrite(13, HIGH) e un LED si accende — ma non sai cosa sta succedendo dentro. È perfetto per prototipare in fretta. È pessimo per capire come funziona un microcontrollore.
Il PIC16 in Assembly non ti nasconde niente. Vuoi accendere un LED? Devi sapere cos’è TRISB, cos’è PORTB, come si scrive un bit in un registro. È più faticoso all’inizio. Ma quello che impari è tuo — e vale per qualsiasi piattaforma tu userai dopo.
Ma questo non è un corso per fare prodotti. È un corso per capire come funzionano le macchine.
43 lezioni divise in 8 moduli, da zero assoluto fino alle periferiche avanzate. Ogni lezione ha un obiettivo preciso, codice da eseguire nel simulatore, esercizi e un quiz. La progressione è pensata perché ogni concetto si appoggi su quelli precedenti — niente salti, niente “fidati di me per ora”.
Non serve installare niente. Non serve comprare niente. Non serve un account per iniziare le prime lezioni.
In 30 anni ho visto molte persone imparare a programmare microcontrollori. Quelle che hanno avuto successo non erano necessariamente le più brillanti o le più veloci. Erano quelle che non saltavano i passaggi — che eseguivano ogni esercizio invece di limitarsi a leggerlo, che quando qualcosa non funzionava si chiedevano perché invece di copiare la soluzione.
Usa il simulatore. Fai lo Step. Guarda i registri.
Il codice che capisci vale dieci volte quello che copi.
© Prof. D. Bertolino · PIC16 From Zero to Hero · WebPicSimulator · Lezione –01
🎯 Cosa impari in questa lezione Perché il registro W è il centro di tutto nel PIC16 MOVLW k — caricare una costante in W MOVWF f — copiare W in un registro RAM MOVF f,d — leggere un registro RAM (verso W o verso sé stesso) CLRW — azzerare W CLRF f — azzerare […]
🎯 Cosa impari in questa lezione ADDLW k — somma una costante a W ADDWF f,d — somma W con un registro RAM SUBLW k — sottrae W da una costante (k - W) SUBWF f,d — sottrae W da un registro RAM (f - W) Come funziona il flag C in addizione e sottrazione […]
🎯 Cosa impari in questa lezione Come funzionano AND, OR, XOR bit per bit su 8 bit ANDLW/ANDWF — mascherare (isolare) bit specifici IORLW/IORWF — settare bit specifici a 1 senza toccare gli altri XORLW/XORWF — invertire (toggle) bit specifici I tre pattern fondamentali: mask · set · toggle Perché queste istruzioni modificano solo il […]
🎯 Cosa impari in questa lezione Il concetto di registro a 9 bit (C + 8 bit dati) usato da RLF e RRF RLF f,d — ruota a sinistra attraverso il Carry RRF f,d — ruota a destra attraverso il Carry COMF f,d — complemento a 1 di un registro SWAPF f,d — scambia nibble […]
🎯 Cosa impari in questa lezione La mappa completa degli 8 bit di STATUS e il loro ruolo C, DC, Z — già noti, ora formalizziamo le regole esatte RP0, RP1 — bank switching: come accedere a TRISA, TRISB e OPTION_REG IRP — bank select per l’indirizzamento indiretto TO, PD — i flag di diagnostica: […]
🎯 Cosa impari in questa lezione GOTO k — salto incondizionato a label BTFSC f,b — salta se il bit b di f è 0 (Skip if Clear) BTFSS f,b — salta se il bit b di f è 1 (Skip if Set) DECFSZ f,d — decrementa e salta se zero (loop counter) INCFSZ f,d […]
🎯 Cosa impari in questa lezione Come funziona lo stack hardware del PIC16: 8 livelli × 13 bit, circolare CALL k — chiama una subroutine: salva PC nello stack, salta a k RETURN — ritorna: ripristina PC dallo stack RETLW k — ritorna con un valore in W (lookup table) W come unico canale per […]
🎯 Cosa impari in questa lezione La differenza tra direttiva e istruzione: cosa processa l’assembler vs la CPU ORG — posiziona il codice in memoria a un indirizzo specifico EQU — definisce costanti simboliche (registri, bit, valori) CBLOCK / ENDC — alloca variabili in RAM senza contare indirizzi a mano #DEFINE — alias testuali, utile […]
🎯 Cosa impari in questa lezione Il modello TRIS → PORT: come ogni pin è controllato da due registri PORTA: 5 pin (RA0–RA4), reset all-input, bitmask 5 bit PORTB: 8 pin (RB0–RB7), pull-up interni, interrupt-on-change su RB4–RB7 La peculiarità di RA4: open-drain, non può erogare corrente in uscita Come leggere un pin di input con […]
🎯 Cosa impari in questa lezione Cos’è il rimbalzo meccanico di un pulsante e perché il PIC lo vede come centinaia di pressioni Come calcolare la durata di un loop software in µs a 4 MHz Il pattern delay a doppio loop: formula cicli e come scegliere i valori Debounce per pressione: rileva solo il […]
🎯 Cosa impari in questa lezione Come è fatto un display 7 segmenti (Common Cathode vs Common Anode) Come costruire una lookup table con RETLW e come funziona l’indirizzamento con PCL Il pericolo del boundary di pagina con ADDWF PCL,F Programma completo: contatore 0–9 su singola cifra con reset da pulsante Tecnica del multiplexing: due […]
🎯 Cosa impari in questa lezione Come funziona una matrice LED 4×4: righe come anodi, colonne come catodi Scansione per riga: accendere una riga alla volta con la maschera colonne Conversione logica/catodo con XORLW 0x0F Framebuffer in RAM: 4 byte che rappresentano lo stato della matrice Indirizzamento indiretto: FSR come puntatore, INDF come dereferenziazione Animazione […]
🏁 Questa lezione conclude il Modulo 2 — I/O Digitale. Integra tutto ciò che hai imparato nelle lezioni 11–14 in un sistema funzionante completo. 🎯 Cosa impari in questa lezione Progettare un sistema I/O completo con schema hardware Implementare una FSM a 3 stati: IDLE, RUNNING, PAUSED Integrare debounce, multiplexing e temporizzazione in un loop […]
⏱ Inizio Modulo 3 — Timer. Il modulo introduce il controllo del tempo tramite hardware dedicato, eliminando i loop di delay bloccanti. 🎯 Cosa impari in questa lezione Struttura interna del Timer0: TMR0, prescaler, sorgente di clock Leggere e configurare OPTION_REG (Bank 1) Calcolare il valore di precarica per un dato intervallo di tempo Rilevare […]
🎯 Cosa impari in questa lezione Calcolare la precarica a runtime con COMF+INCF (complemento a 2) Modificare la durata del timer cambiando una variabile in RAM — senza ricompilare Usare Timer0 come counter di impulsi esterni (T0CS=1, RA4/T0CKI) Costruire un frequenzimetro a 16 bit con gate time di 1 secondo Generare un segnale PWM software […]
🎯 Cosa impari in questa lezione Come funziona il meccanismo hardware degli interrupt sul PIC16 Configurare GIE e T0IE in INTCON per abilitare l’interrupt su Timer0 Scrivere una ISR al vettore 0x0004 con RETFIE Salvare e ripristinare W e STATUS con la tecnica SWAPF (senza alterare i flag) Perché MOVF STATUS,W è sbagliato nel prologo […]
🎯 Cosa impari in questa lezione Differenza tra RB0/INT (fronte singolo) e RB4–RB7 IOC (cambio di stato) Configurare INTEDG in OPTION_REG per scegliere fronte salita o discesa Leggere PORTB nella ISR per cancellare il latch IOC e azzerare RBIF Rilevare quale pin è cambiato con XOR tra valore attuale e PORTB_LAST Gestire più sorgenti di […]
🎯 Cosa costruisci in questa lezione Un orologio HH:MM completo su PIC16F84A — nessun RTC esterno Timer0 interrupt come sorgente del secondo con 15 overflow da ~65ms Display a 4 cifre 7 segmenti multiplexato via MUX_DISPLAY nella ISR Pulsante SET_H su RB0/INT (interrupt), SET_M su RB1 (polling + debounce) Routine SPLIT_BCD corretta: sottrazione ripetuta per […]
🎯 Cosa impari in questa lezione Progettare una FSM (Finite State Machine) con stati, transizioni e durate Usare interrupt per eventi asincroni (tick temporale + emergenza) senza bloccare il main Implementare transizioni di priorità: un evento forza uno stato indipendentemente da quello corrente Tabella di salto ADDWF PCL,F per selezionare il comportamento in base allo […]
🎯 Cosa impari in questa lezione Come funziona il Watchdog Timer: counter autonomo che resetta il PIC se non viene azzerato Istruzione CLRWDT: dove e quanto spesso inserirla nel codice Configurare il postscaler WDT con PSA=1 per timeout da 18ms a 2.3s Rilevare la causa del reset leggendo i bit TO e PD di STATUS […]
🎯 Cosa impari in questa lezione I 4 registri SFR in Bank 1 per accedere alla EEPROM: EEADR, EEDATA, EECON1, EECON2 Lettura EEPROM: 3 istruzioni — EEADR ← addr, RD=1, leggi EEDATA La sequenza di sblocco scrittura: 10 passi obbligatori nell’ordine esatto Perché GIE=0 prima di 0x55/0xAA è critico: un interrupt tra i due magic […]
🎯 Cosa impari in questa lezione Integrare tutto il Modulo 4 in un singolo sistema coerente: ISR, debounce, EEPROM, display mux Progettare un menu a parametri: navigazione con un pulsante, modifica con un altro Pattern autosave: un timer countdown in ISR che scade dopo N secondi di inattività e segnala al main di salvare Codifica […]
🎯 Cosa impari in questa lezione Struttura del frame UART: start bit, 8 bit dati (LSB first), stop bit — 104µs a 9600 baud Registri USART del PIC16F628A: TXSTA, RCSTA, SPBRG, TXREG, RCREG Formula SPBRG con BRGH=1: (Fosc ÷ (16 × baud)) − 1 TX con polling su bit TRMT (shift register vuoto) RX con […]
🎯 Cosa impari in questa lezione Come funziona un ADC SAR (Successive Approximation Register) a 10 bit Registri ADCON0 e ADCON1: selezione canale, clock ADC, configurazione pin Tabella PCFG: quanti e quali pin sono analogici o digitali Parametro ADFM: giustificazione destra/sinistra del risultato a 10 bit in 16 bit Tempo di acquisizione Tacq ≥ 20µs […]
🎯 Cosa impari in questa lezione Principio del PWM: frequenza fissa, duty cycle variabile → tensione media variabile Registri del modulo CCP1: CCP1CON, CCPR1L, T2CON, PR2 Formula frequenza: Fpwm = Fosc / (4 × (PR2+1) × prescaler) Duty cycle a 10 bit spalmato su CCPR1L (bit9:2) e CCP1CON bit5:4 (bit1:0) Applicazione: dimmer LED con potenziometro […]
🎯 Cosa impari in questa lezione Principio del bus I²C: 2 fili (SDA + SCL), multi-slave, open-drain + pull-up Condizioni di bus: START, Repeated START, STOP, ACK, NACK Modulo MSSP in I²C Master mode: registri SSPCON, SSPCON2, SSPSTAT, SSPADD Formula baud rate: Fbaud = Fosc / (4 × (SSPADD+1)) Sequenza completa di lettura con Repeated […]
🎯 Cosa impari in questa lezione Differenze tra SPI e I²C: velocità, pin, full-duplex, modalità clock I 4 modi SPI: CPOL (polarità clock) × CPHA (fase campionamento) Configurazione MSSP SPI Master: SSPCON, SSPSTAT, baud rate (Fosc/4, /16, /64) Temporizzazione SPI mode 0,0: dati stabili su fronte di salita SCK Lettura ADC esterno MCP3204 a 12 […]
🎯 Cosa impari in questa lezione Cosa fa un comparatore analogico: confronta due tensioni, output digitale (0 o 1) Registro CMCON: modalità CM2:CM0, bit C1INV/C2INV, lettura C1OUT/C2OUT Le 8 modalità di configurazione del doppio comparatore del PIC16F628A Registro VRCON: tensione di riferimento interna a 32 passi (0–3.5V @ Vdd=5V) Due range VRCON: VRR=1 (basso, passo […]
🎯 Cosa impari in questa lezione Timer1 a 16 bit: range 0–65535, overflow ogni ~65ms a 1MHz Tre modalità Timer1: timer interno (Fosc/4), contatore esterno (RC0/T1CKI), oscillatore LP (cristallo 32kHz) Registro T1CON: TMR1CS, T1SYNC, T1OSCEN, T1CKPS, TMR1ON CCP in Capture mode: salva TMR1 ad ogni fronte su RC2 → misura periodi con risoluzione 1µs CCP […]
🎯 Cosa impari in questa lezione Progetto completo che integra tutto il Modulo 5: ADC multi-canale, UART, logica di soglia Scansione ciclica di 3 canali ADC con conversione in unità fisiche (°C, %, hPa) Aritmetica a 8 bit per conversioni: moltiplicazione per 100 con loop, divisione per sottrazione Formattazione e trasmissione di stringhe ASCII via […]
🎯 Cosa impari in questa lezione Cos’è una macchina a stati finiti: stati, transizioni, azioni di ingresso/uscita Rappresentazione FSM in assembly: variabile di stato + tabella dispatch tramite PCL Tabelle RETLW per output, durate e transizioni: ogni tabella è una funzione pura indicizzata dallo stato FSM semaforo: 4 stati con durate diverse, loop senza IF […]
🎯 Cosa impari in questa lezione Tabella seno a 256 valori in Flash via RETLW: accesso in 4 cicli (1µs), generatore d’onda sinusoidale su DAC R-2R Moltiplicazione 8×8→16 bit: algoritmo shift-and-add, 8 iterazioni, risultato in RES_HI:RES_LO Divisione 16÷8 con resto: algoritmo shift-sottrai, 16 iterazioni, risultato in QUOT e REM Numeri in virgola fissa Q4.4 (1 […]
🎯 Cosa impari in questa lezione FSR (File Select Register) come puntatore a 8 bit + IRP (bit STATUS) per il 9° bit → 512 locazioni indirizzabili INDF: accede alla RAM puntata da FSR — leggere/scrivere INDF equivale a dereferenziare un puntatore C Array in RAM: riempimento, somma e ricerca del massimo con loop FSR/INDF […]
🎯 Cosa impari in questa lezione Costo in cicli di ogni categoria di istruzione PIC16: 1 ciclo per ALU/MOV/bit, 2 per GOTO/CALL/RETURN e per ogni skip preso Profiling con TMR0 come cronometro: leggi TMR0 prima e dopo il codice da misurare, sottrai → cicli esatti ISR a latenza minima: il trick SWAPF salva STATUS senza […]
🎯 Cosa impari in questa lezione Bit-banging: implementare protocolli seriali manipolando direttamente pin GPIO con NOP per il timing — nessuna periferica hardware necessaria 1-Wire: reset (480µs), write-0 (60µs), write-1 (6µs), read-slot (campiona entro 15µs) — tutto con un solo pin open-drain RC0 Sequenza DS18B20: Skip ROM (0xCC) → Convert T (0x44) → attesa 750ms […]
🎯 Cosa costruisci in questa lezione Lettura temperatura DS18B20 con risoluzione 9-bit (0.5°C): sequenza completa Skip ROM → Convert T → attesa 100ms → Read Scratchpad → raw → °C con segno Display 3 digit 7 segmenti comune-anodo con multiplexing software: PORTD = segmenti, PORTC bit2:0 = anodi, 5ms/digit → 60Hz percepito Tabella RETLW per […]
🎯 Cosa costruisci in questa lezione Timer1 come contatore: TMR1CS=1 fa contare TMR1 su ogni fronte di salita di T1CKI (RC0) — non usa il clock interno ma eventi esterni. In 1 secondo il conteggio finale = frequenza in Hz Finestra di misura 1s precisa: Timer0 con prescaler 1:256 genera overflow ogni 65.5ms. ISR conta […]
🎯 Cosa costruisci in questa lezione BME280 via SPI software: sensore Bosch all-in-one che misura temperatura (±1°C), umidità relativa (±3%) e pressione barometrica (±1hPa). Interfaccia SPI con indirizzo read/write nel bit7 del registro Soft reset (0xE0 ← 0xB6), configurazione oversampling ×1 per ogni canale, lettura calibrazione 6 byte per temperatura, burst read 8 byte da […]
🎯 Cosa costruisci in questa lezione PWM software 8 canali: Timer0 interrupt ogni 50µs (TMR0 precaricato a 206). Ogni frame da 20ms ospita 8 impulsi consecutivi, uno per canale. SERVO_N = tick di durata (20=1ms=0°, 30=1.5ms=90°, 40=2ms=180°) ISR a stati: decrementa PULSE_TICK; quando arriva a 0 abbassa il pin, carica il canale successivo via FSR/INDF, […]
🎯 Il progetto finale — tutto il corso in un sistema RAM test al boot: 80 byte da 0x20 a 0x6F verificati con doppio pattern (0xAA e 0x55). Se una cella non si scrive o non si legge correttamente, l’indirizzo che ha fallito appare su PORTD e il sistema si blocca con PORTB=0xFF — visibile […]
Corso Reti Cellulari — da GSM a 5G | Hands on Stem 📱 Hands on Stem — Mini-corso Reti Cellulari…
Corso Reti Wireless — Presentazione | Hands on Stem 📡 Hands on Stem — Corso completo Reti Wireless Da Wi-Fi…
Corso di Sistemi e Reti | Hands on Stem 🌐 Hands on Stem — Corso completo Sistemi e Reti Dai…