simon
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedenteProssima revisioneEntrambe le parti successive la revisione | ||
simon [2020/02/14 16:15] – [Software] admin | simon [2020/09/26 14:05] – [Assemblaggio] admin | ||
---|---|---|---|
Linea 386: | Linea 386: | ||
// variabili volatile modificate dalla ISR del watchdog | // variabili volatile modificate dalla ISR del watchdog | ||
volatile uint8_t nrot = 8; // quante volte si mischia il seed nella ISR | volatile uint8_t nrot = 8; // quante volte si mischia il seed nella ISR | ||
- | // usando il valore del timer | + | // usando il valore del timer |
volatile uint16_t time; // conteggio incrementato dall' | volatile uint16_t time; // conteggio incrementato dall' | ||
- | | + | |
- | // l'auto power-off dopo 64s (time = 4000) | + | // l'auto power-off dopo 64s (time = 4000) |
// FUNZIONI | // FUNZIONI | ||
Linea 559: | Linea 559: | ||
// cambia la modalità di funzionamento del timer che passa da normal | // cambia la modalità di funzionamento del timer che passa da normal | ||
// a PWM phase correct (WGM0[2: | // a PWM phase correct (WGM0[2: | ||
- | // a 0xFF (poi il valore massimo diventerà quello del reistro OCR0A | + | // a 0xFF (nella funzione play() |
- | // nella funzione play() per cambiare | + | // registro OCR0A per modificare |
// Si imposta il compare output mode del waveform generator in modo | // Si imposta il compare output mode del waveform generator in modo | ||
// che il pin del buzzer PB1/OC0B (COM0B[1: | // che il pin del buzzer PB1/OC0B (COM0B[1: | ||
// match col valore del registro OCR0B mentre conta in su e alto | // match col valore del registro OCR0B mentre conta in su e alto | ||
// mentre conta in giù (OCR0B è impostato nella funzione play() come | // mentre conta in giù (OCR0B è impostato nella funzione play() come | ||
- | // OCR0A) | + | // OCR0A) |
- | // NB il segnale PWM è presente solo se il pin è impostato come usicta | + | // NB il segnale PWM è presente solo se il pin è impostato come uscita |
// (pag 68) quindi il buzzer non suona finche non si chiama play() | // (pag 68) quindi il buzzer non suona finche non si chiama play() | ||
TCCR0A = (1 << COM0B1) | (0 << COM0B0) | (0 << WGM01) | TCCR0A = (1 << COM0B1) | (0 << COM0B0) | (0 << WGM01) | ||
Linea 572: | Linea 572: | ||
// LETTURA O RESET DELL' | // LETTURA O RESET DELL' | ||
- | // maxLvl viene scritto/letto negato (operatore ~) perché il valore | + | // maxLvl viene scritto |
- | // contenuto inizialmente nella EEPROM è sempre 0xFF (255 e non zero) | + | // valore di default della EEPROM è sempre 0xFF (255 e non zero) |
// (uint8_t*) 0 è un puntatore a un byte che parte dall' | // (uint8_t*) 0 è un puntatore a un byte che parte dall' | ||
maxLvl = ~eeprom_read_byte((uint8_t*) 0); | maxLvl = ~eeprom_read_byte((uint8_t*) 0); | ||
Linea 584: | Linea 584: | ||
// non premuti sono al livello alto (pull-up) quindi controlliamo | // non premuti sono al livello alto (pull-up) quindi controlliamo | ||
// se PB3 (LED rosso) è premuto e nel caso resettiamo l'high score | // se PB3 (LED rosso) è premuto e nel caso resettiamo l'high score | ||
- | case 0b00010101: // PB3 premuto dopo il reset | + | case 0b00010101: // PB3 premuto dopo il reset -> azzera high-score |
eeprom_write_byte((uint8_t*) 0, 255); // scrive 255 -> livello 0 | eeprom_write_byte((uint8_t*) 0, 255); // scrive 255 -> livello 0 | ||
maxLvl = 0; | maxLvl = 0; | ||
Linea 619: | Linea 619: | ||
// finché non si preme un bottone | // finché non si preme un bottone | ||
while (!pressed) { | while (!pressed) { | ||
- | | + | |
for (uint8_t i = 0; i < 4; i++) { | for (uint8_t i = 0; i < 4; i++) { | ||
- | | + | |
- | // buttons & maschera -> bit a 1 solo per il pin/ | + | // buttons & maschera -> bit a 1 solo per il pin/ |
- | // PINB ha tutti i bit a 1 (resistenze di pull-up attivate | + | // PINB ha tutti i bit a 1 (resistenze di pull-up attivate |
- | // nella funzione play) tranne quello del pulsante premuto | + | // nella funzione play) tranne quello del pulsante premuto |
- | // l' | + | // l' |
- | // il pulsante i è premuto, poi viene complementata | + | // il pulsante i è premuto, poi viene complementata |
if (!(PINB & buttons[i] & 0b00011101)) { | if (!(PINB & buttons[i] & 0b00011101)) { | ||
// DEBOUNCE | // DEBOUNCE | ||
// se sono passati 16ms (tempo max per eventuali rimbalzi o | // se sono passati 16ms (tempo max per eventuali rimbalzi o | ||
- | | + | |
if (time > 1 || i != lastKey) { | if (time > 1 || i != lastKey) { | ||
// accendi il LED i e registra la pressione del tasto | // accendi il LED i e registra la pressione del tasto | ||
- | | + | |
pressed = true; | pressed = true; | ||
- | | + | |
uint8_t correct = simple_random4(); | uint8_t correct = simple_random4(); | ||
// se si è premuto il pulsante sbagliato | // se si è premuto il pulsante sbagliato | ||
- | | + | |
- | // accendi il LED giusto tante volte pari al livello raggiunto | + | // accendi il LED giusto tante volte pari al livello raggiunto |
for (uint8_t j = 0; j < lvl; j++) { | for (uint8_t j = 0; j < lvl; j++) { | ||
_delay_loop_2(65536); | _delay_loop_2(65536); | ||
Linea 645: | Linea 645: | ||
} | } | ||
_delay_loop_2(65536); | _delay_loop_2(65536); | ||
- | | + | |
gameOver(); | gameOver(); | ||
} | } | ||
- | | + | |
time = 0; // azzera time | time = 0; // azzera time | ||
lastKey = i; // memorizzo l' | lastKey = i; // memorizzo l' | ||
break; // esce dal ciclo for e smette di controllare se è | break; // esce dal ciclo for e smette di controllare se è | ||
- | // premuto un pulsante; passa al LED successivo | + | // premuto un pulsante; passa al LED successivo |
- | | + | |
} | } | ||
time = 0; // azzera il conteggio per poweroff e debouncing | time = 0; // azzera il conteggio per poweroff e debouncing | ||
} | } | ||
} | } | ||
- | | + | |
if (time > 4000) { | if (time > 4000) { | ||
sleepNow(); | sleepNow(); | ||
Linea 719: | Linea 719: | ||
* spazzolare la scheda per togliere il photoresist e facilitare la saldatura | * spazzolare la scheda per togliere il photoresist e facilitare la saldatura | ||
* forare con punta da 0.8mm | * forare con punta da 0.8mm | ||
- | * come saldare (vedi immagine) | + | * come saldare (vedi immagine) |
* montare i LED rispettando la polarità | * montare i LED rispettando la polarità | ||
* montare lo zoccolo nel verso giusto | * montare lo zoccolo nel verso giusto |
simon.txt · Ultima modifica: 2023/10/27 18:02 da admin