Progetto MPLAB X IDE per un timer countdown breve (9 → 0 secondi) utilizzando il microcontrollore PIC16F628A con un singolo display a 7 segmenti e buzzer di allarme.
- ⏰ Timer countdown: Da 9 secondi (0:09) a 0 secondi (0:00) -- 📺 Display singolo (virtual multiplex): 1 display a 7 segmenti, visualizzazione MM:SS tramite alternanza rapida
- 🔔 Allarme sonoro: Buzzer ciclico al termine del countdown
- ⚙️ Avvio automatico: il timer parte all'accensione e si ripete in loop (nessun pulsante richiesto)
- 🔋 Basso consumo: ~50mA a 5V
- 📱 Compatto: Circuito minimale con pochi componenti
- Microcontrollore: PIC16F628A (18-pin DIP)
- Display: 1x Display 7 segmenti Common Cathode
- Buzzer: Buzzer passivo o attivo 5V
- Resistenze: 7x 330-470Ω (una per segmento) + 1 per DP opzionale
- Pulsante: non richiesto (timer auto-start e loop)
- Alimentazione: 5V DC
- IDE: MPLAB X IDE v6.x o superiore
- Compilatore: XC8 v2.x o superiore
- Target: PIC16F628A
- Linguaggio: C (XC8)
# Installare MPLAB X IDE dal sito Microchip
# Installare XC8 Compiler
# Connettere programmatore (PICkit 3/4, ICD3, ecc.)# Aprire MPLAB X IDE
# File > Open Project
# Selezionare la cartella Timer60s.X
# Impostare come Main Project# Fare clic su "Build Project" (martello)
# OPPURE
# Utilizzare il comando make dal terminale
make clean
make all# Collegare il programmatore al PIC16F628A
# Fare clic su "Make and Program Device"
# Verificare la programmazione completata con successo ┌─────────────────┐
RA2 ─┤1 18├─ RA1
RA3 ─┤2 17├─ RA0
RA4 ─┤3 16├─ OSC1
MCLR ─┤4 15├─ OSC2
VSS ─┤5 14├─ VDD (+5V)
RB0 ─┤6 13├─ RB7 (Display 1 - Seg G)
RB1 ─┤7 12├─ RB6 (Display 1 - Seg F)
RB2 ─┤8 11├─ RB5 (Display 1 - Seg E)
RB3 ─┤9 10├─ RB4 (Display 1 - Seg D)
└─────────────────┘
| Componente | Pin PIC | Funzione |
|---|---|---|
| Display 7-seg | RB1-RB7 | Segmenti a..g (via resistenze) |
| Decimal Point (DP) | RA7 | Punto decimale (usato per evidenziare la cifra alta) |
| Buzzer | RA4 | Uscita per buzzer (use transistor for higher current) |
| Pulsante | (none) | Non utilizzato - il timer parte automaticamente |
| Alimentazione | VDD/VSS | +5V/GND |
📖 Documentazione completa: Vedere
docs/circuit_diagram.mdper lo schema dettagliato
- Avvio: All'accensione, il display mostra "0:09" (9 secondi)
- Start Timer: Avvio automatico all'accensione (nessun pulsante richiesto)
- Countdown: Il display mostra il tempo rimanente in formato MM:SS
- Allarme: Al raggiungimento di "00:00", il buzzer suona ciclicamente
- Reset: Al termine del buzzer il timer viene resettato automaticamente a 9 secondi
- Formato:
M:SS(Minuto:Secondi) - Esempi:
0:09= 9 secondi0:05= 5 secondi0:00= Timer scaduto
- Durata Beep: 200ms ON, 200ms OFF
- Ripetizione: Ciclica fino al reset
- Volume: Dipende dal tipo di buzzer utilizzato
Timer60s.X/
├── src/
│ └── main.c # Codice sorgente principale
├── include/ # File header (vuoto)
├── nbproject/ # File configurazione MPLAB X
│ ├── configurations.xml
│ ├── project.xml
│ ├── Makefile-*.mk
│ └── ...
├── docs/ # Documentazione
│ ├── circuit_diagram.md # Schema circuito dettagliato
│ └── pin_configuration.md # Configurazione pin
├── Makefile # Makefile principale
└── README.md # Questo file
void __interrupt() isr(void) {
if (T0IF) { // Timer0 overflow
T0IF = 0;
// TMR0 reloaded with 131, prescaler 1:64 -> overflow ogni 8ms
// Un contatore software accumula 125 overflow -> 1s esatto
// Dopo 1s decrementa 'seconds' e alla scadenza attiva 'buzzer_state'.
}
}Il codice usa un virtual multiplex su un singolo display alternando la visualizzazione rapidamente:
- ~5ms: Mostra decine dei secondi con punto decimale
- ~5ms: Mostra unità dei secondi senza punto decimale
#pragma config FOSC = INTOSCIO // Oscillatore interno 4MHz
#pragma config WDTE = OFF // Watchdog disabilitato
#pragma config PWRTE = ON // Power-up timer abilitato
#pragma config MCLRE = OFF // RA5 come I/O digitale
#pragma config BOREN = ON // Brown-out reset abilitato
#pragma config LVP = OFF // Low voltage programming OFF
#pragma config CPD = OFF // Data protection OFF
#pragma config CP = OFF // Code protection OFF// Nel file main.c, modificare la variabile iniziale:
volatile uint8_t seconds = 120; // Timer da 2 minuti (120 secondi)// Nella funzione handle_buzzer(), modificare i tempi:
if (buzzer_counter < 5) { // 100ms ON (era 200ms)
BUZZER_PIN = 1;
} else if (buzzer_counter < 10) { // 100ms OFF (era 200ms)
BUZZER_PIN = 0;
}Per utilizzare 2 display fisici separati invece del multiplexing:
- Utilizzare pin aggiuntivi per il controllo enable dei display
- Modificare la funzione
display_time()per gestire display simultanei - Aggiungere transistor PNP per il controllo common cathode
| Problema | Possibile Causa | Soluzione |
|---|---|---|
| Display non si accende | Polarità errata o resistenze mancanti | Verificare collegamenti e resistenze |
| Timer non parte | Controllare alimentazione / programmazione del PIC | Verificare VDD/VSS e programmatore |
| Buzzer non suona | Pin RA4 non collegato | Verificare collegamento buzzer |
| Display lampeggia | Frequenza interrupt errata | Verificare configurazione Timer0 |
| Compilazione fallisce | XC8 non installato | Installare compiler XC8 |
// Aggiungere nel main loop per test LED:
PORTA = 0xFF; // Tutti i segmenti accesi
__delay_ms(1000);
PORTA = 0x00; // Tutti i segmenti spenti
__delay_ms(1000);// Nel main(), prima del while loop:
BUZZER_PIN = 1;
__delay_ms(500);
BUZZER_PIN = 0;
__delay_ms(500);Utilizzare il debugger di MPLAB X per monitorare:
seconds(valore attuale del timer)timer_active(stato del timer)buzzer_state(stato del buzzer)
- Aggiungere display LCD 16x2 per visualizzazione migliore
- Implementare controllo volume buzzer con potenziometro
- Aggiungere LED di stato per indicazioni visive
- Utilizzare display a 4 cifre per formato HH:MM
- Implementare timer multipli (1min, 5min, 10min, custom)
- Aggiungere modalità stopwatch (count-up)
- Salvare settings in EEPROM
- Implementare interfaccia seriale per controllo PC
- Controllo via telecomando IR
- Sincronizzazione con RTC esterno
- Modalità sleep per risparmio energetico
- Connettività wireless (ESP8266/ESP32)
Questo progetto è rilasciato sotto licenza MIT. Vedere il file LICENSE per i dettagli.
MIT License
Copyright (c) 2024 Timer60s Project
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
I contributi sono benvenuti! Per contribuire:
- Fork del repository
- Crea un branch per la tua feature (
git checkout -b feature/AmazingFeature) - Commit delle tue modifiche (
git commit -m 'Add some AmazingFeature') - Push al branch (
git push origin feature/AmazingFeature) - Apri una Pull Request
Per supporto, segnalazione bug o richieste di feature:
- 🐛 Issues: GitHub Issues
- 💬 Discussioni: GitHub Discussions
- 📧 Email: support@timer60s.com
- Microchip Technology per PIC16F628A e MPLAB X IDE
- Community PIC per esempi e documentazione
- Contributors per miglioramenti e bug fixes
⭐ Se questo progetto ti è stato utile, lascia una stella su GitHub!