Ciao
Sto cercando di creare un cronometro visualizzato su 6 display a 7 segmenti comandati da una decodifica BCD/7segmenti in multiplexing.
Per dare il clock di incremento del tempo ho usato la libreria leOS in modo tale che ogni 10 microsecondi incrementi una variabile, più precisamente la variabile dei centesimi di secondo.
Ho realizzato il circuito che funziona perfettamente, però l'incremento dei microsecondi è sballato e non di pochissimo;
per verificare nel programma ho inserito la funzione millis() nel void comandato da leOS in modo da vedere se effettivamente c'è questo errore; facendo questa prova ha effettivamente verificato che c'è un errore nella tempistica, infatti l'incremento non è sempre costante e non è quello che ho impostato su leOS!
Cosa può essere secondo voi??
di seguito vi riporto il programma in questione:
#include <leOS.h>
leOS schedulatore;
int massa_csec = 2;
int massa_dsec = 3;
int massa_sec1 = 4;
int massa_sec2 = 5;
int massa_min1 = 6;
int massa_min2 = 7;int a = 8;
int b = 9;
int c = 10;
int d = 11;int numeri_a[10]={LOW,HIGH,LOW,HIGH,LOW,HIGH,LOW,HIGH,LOW,HIGH}; //array per comunicare con decodifica BCD to 7 segment
int numeri_b[10]={LOW,LOW,HIGH,HIGH,LOW,LOW,HIGH,HIGH,LOW,LOW};
int numeri_c[10]={LOW,LOW,LOW,LOW,HIGH,HIGH,HIGH,HIGH,LOW,LOW};
int numeri_d[10]={LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,HIGH,HIGH};
int num_csec =0;// centesimi di secondo
int num_dsec =0;// decimi di secondo
int num_sec1 =0;// secondi
int num_sec2 =0;// secondi
int num_min1 =0;// minuti
int num_min2 =0;// minutivoid setup(){
pinMode(massa_csec, OUTPUT);
pinMode(massa_dsec, OUTPUT);
pinMode(massa_sec1, OUTPUT);
pinMode(massa_sec2, OUTPUT);
pinMode(massa_min1, OUTPUT);
pinMode(massa_min2, OUTPUT);pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);digitalWrite(massa_csec, HIGH); // situazioni iniziale per multiplexing
digitalWrite(massa_dsec, HIGH);
digitalWrite(massa_sec1, HIGH);
digitalWrite(massa_sec2, HIGH);
digitalWrite(massa_min1, HIGH);
digitalWrite(massa_min2, HIGH);Serial.begin(9600);
Serial.println("Cronometro");
schedulatore.begin();
schedulatore.addTask(incrementa, 10);}
void loop(){
if(num_csec>9){
num_csec=0;
num_dsec=num_dsec++;
}
if(num_dsec>9){
num_dsec=0;
num_sec1=num_sec1++;
}
if(num_sec1>9){
num_sec1=0;
num_sec2=num_sec2++;
}
if(num_sec2>5){
num_sec2=0;
num_min1=num_min1++;
}
if(num_min1>9){
num_min1=0;
num_min2=num_min2++;
}
if(num_min2>9){
num_min2=0;
}}
void incrementa(){
Serial.println(millis());
num_csec=num_csec++; //incremento centesimi di secondo
digitalWrite(massa_min2, HIGH); //comandi decodifica in multiplexing per 6 display!
digitalWrite(a, numeri_a[num_csec]);
digitalWrite(b, numeri_b[num_csec]);
digitalWrite(c, numeri_c[num_csec]);
digitalWrite(d, numeri_d[num_csec]);
digitalWrite(massa_csec, LOW);
delay(1);
digitalWrite(massa_csec, HIGH);
digitalWrite(a, numeri_a[num_dsec]);
digitalWrite(b, numeri_b[num_dsec]);
digitalWrite(c, numeri_c[num_dsec]);
digitalWrite(d, numeri_d[num_dsec]);
digitalWrite(massa_dsec, LOW);
delay(1);
digitalWrite(massa_dsec, HIGH);
digitalWrite(a, numeri_a[num_sec1]);
digitalWrite(b, numeri_b[num_sec1]);
digitalWrite(c, numeri_c[num_sec1]);
digitalWrite(d, numeri_d[num_sec1]);
digitalWrite(massa_sec1, LOW);
delay(1);
digitalWrite(massa_sec1, HIGH);
digitalWrite(a, numeri_a[num_sec2]);
digitalWrite(b, numeri_b[num_sec2]);
digitalWrite(c, numeri_c[num_sec2]);
digitalWrite(d, numeri_d[num_sec2]);
digitalWrite(massa_sec2, LOW);
delay(1);
digitalWrite(massa_sec2, HIGH);
digitalWrite(a, numeri_a[num_min1]);
digitalWrite(b, numeri_b[num_min1]);
digitalWrite(c, numeri_c[num_min1]);
digitalWrite(d, numeri_d[num_min1]);
digitalWrite(massa_min1, LOW);
delay(1);
digitalWrite(massa_min1, HIGH);
digitalWrite(a, numeri_a[num_min2]);
digitalWrite(b, numeri_b[num_min2]);
digitalWrite(c, numeri_c[num_min2]);
digitalWrite(d, numeri_d[num_min2]);
digitalWrite(massa_min2, LOW);
delay(1);
}