Buongiorno a tutti e buona Pasqua!
Da giorni non vengo a capo ad un problema con questo codice.
Nel loop faccio contare inizialmente da 1 a 90, poi decrementando di uno ad ogni estrazione. Il ciclo gira continuamente, tramite PinChangeInterrupt lo faccio saltare alla routine che memorizza il punto in cui è stato fermato dalla pressione del pulsante; al ritorno dall'interrupt (uscita dalla funzione estrai() ) termina il ciclo, quindi legge il corrispondente numero estratto e decrementa di uno i dumeri da estrarre ancora.
dopo ogni estrazione vengono visualizzati via seriale il numero estratto, i numeri rimanenti e i numeri presenti ancora da estrarre.
Sempra funzionare tutto, ma ogni tanto "perde un colpo" e salta un numero. Perché?
Colpa del mio codice, scritto sbagliato? Limite del ATMega328P? Processore difettoso?
Io sto impazzendo!!! Qualcuno mi dia un lume! Grazie anticipatamente!!!
KMZ
//
// SuperEnalotto:
// estrae casualmente alla pressione del pulsante
// un numero tra 1 e 90 eliminandolo, fino ad
// estrarre tutti e 90 i numeri
//
#include "PinChangeInterrupt.h"
#define PULSANTE 7
volatile int i, estratto, numero, transit=0, biglie = 90, tabellone[91];
void setup() {
Serial.begin(9600); // Setup comunicazione Seriale - può avere errori con l'interrupt abilitato
pinMode(PULSANTE, INPUT);
digitalWrite(PULSANTE, HIGH); // Abilita il pull-up interno
delay(100);
for (i = 1; i < 91; i++) {
tabellone[i] = i; // riempie il tabellone in RAM
}
delay(100);
attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(PULSANTE), estrai, FALLING); // Abilita l'interrupt sul PULSANTE
}
///////////////////////////////////////////////////////////
void loop() {
while (biglie > 0) {
for (numero = 1; numero < (biglie + 1); numero++) {
__asm__ __volatile__ ("nop\n\t"); // se devi fare qualcosa, fai niente
}
if (transit != 0) {
//disablePinChangeInterrupt(digitalPinToPinChangeInterrupt(PULSANTE));
delay(100);
estratto = tabellone[transit];
tabellone[transit] = tabellone[biglie];
tabellone[biglie] = 0;
biglie--;
transit = 0;
if (estratto < 10) Serial.print("0");
Serial.print(estratto);
Serial.print(" estratto\t");
if (biglie < 10) Serial.print("0");
Serial.print(biglie);
Serial.println(" biglie\n");
for (i = 1; i < 91; i = i + 10) {
Serial.print(tabellone[i]);
Serial.print(" ");
Serial.print(tabellone[i + 1]);
Serial.print(" ");
Serial.print(tabellone[i + 2]);
Serial.print(" ");
Serial.print(tabellone[i + 3]);
Serial.print(" ");
Serial.print(tabellone[i + 4]);
Serial.print("\t");
Serial.print(tabellone[i + 5]);
Serial.print(" ");
Serial.print(tabellone[i + 6]);
Serial.print(" ");
Serial.print(tabellone[i + 7]);
Serial.print(" ");
Serial.print(tabellone[i + 8]);
Serial.print(" ");
Serial.println(tabellone[i + 9]);
}
delay(100);
enablePinChangeInterrupt(digitalPinToPinChangeInterrupt(PULSANTE)); // riattiva l'interrupt
}
}
Serial.print("FINITI!!!");
while(1);
}
void estrai() {
disablePinChangeInterrupt(digitalPinToPinChangeInterrupt(PULSANTE)); // disattiva momentaneamente l'interrupt
transit = numero;
}
