Cronometro in [C]

di il
3 risposte

Cronometro in [C]

Ciao, a tutti! sto facendo un primo programmino in linguaggio "C". però ho un problema su una funzione non saprei come risolverlo, vi chiedere gentilmente se mi dareste un cosiglio di come sistemare il codice.

queste è la funzione:

void incrementoConteggio() {// questa funzione la devo far richiamare dal timer
    while (mills <= 86400000) { // ciclo per l'avvanzare del tempo
        /**int fosc = 8; // frequenza oscillatore 
        int ft = fosc / 4; // frequenza timer
        mills = 1 / (ft * 1000); // periodo timer in millesimi di secondi
        */mills++;
        if (mills == 10) {
            mills = 0;
            cents++; // avanzo 1 centesimo
        }
        if (cents == 10) {
            cents = 0;
            decs++; // avanzo di 1 decimo
        }
        if (decs == 10) {
            decs = 0;
            sec++; // avanzo di 1 secondo
        }
        if (sec == 60) {
            sec = 0;
            min++; // avanzo di 1 minuto
        }
        if (min == 60) {
            min = 0;
            ore++; // avanzo di 1 ora
        }
        if (ore == 24) {
            Azzera(); // azzero il tempo perchè sono passate 24 ore
        }
        visualizzaTempo();
    }
}
void Azzera() { // funzione per azzera il cronometro
    sec = 0;
    min = 0;
    ore = 0;
    decs = 0;
    cents = 0;
    mills = 0;
}

void visualizzaTempo() { // funzione per visualizzare il tempo
    printf("%02d : %02d : %02d : %02d : %02d : %02d \n", ore, min, sec,
            decs, cents, mills);
}
questo è il risultato visualizzato a schermo:

00 : 03 : 27 : 07 : 07 : 00 
00 : 03 : 27 : 07 : 07 : 01 
00 : 03 : 27 : 07 : 07 : 02 
00 : 03 : 27 : 07 : 07 : 03 
00 : 03 : 27 : 07 : 07 : 04 
00 : 03 : 27 : 07 : 07 : 05 
00 : 03 : 27 : 07 : 07 : 06 
00 : 03 : 27 : 07 : 07 : 07 
00 : 03 : 27 : 07 : 07 : 08 
00 : 03 : 27 : 07 : 07 : 09 
l'incrementazione è giusta ma io vorrei che il risultato non ripetesse cosi tante volte ma che scrivesse
ad esempio:

00 : 03 : 27 : 07 : 07 : 00 
ma che però ogni millisecondo che incrementa si modifichi. senza che ripeta la scritta tante volte quante sono i millisecondi.


il programma è un cronometro che dovrebbe misuare i millisecondi reali. spero sia giusto anche il resto del programma:

#include <stdio.h>
#include <stdlib.h>
//#include <unistd.h> 
/*#define BTN1    RD0    // pulsante 1
#define BTN2    RD1    // pulsante 2
#define BTN3    RD2    // pulsante 3
#define PIE1    RAE1       // interupt timer                 
#define INTCON  RAE2       // tutti interupt*/



int sec = 0; // contatore dei secondi
int min = 0; // contatore dei minuti
int ore = 0; // contatore dei ore

int decs = 0; // contatore dei decimi di secondo
int cents = 0; // contatore dei centesimi secondo
int mills = 0; // contatore dei millesimi secondo
/*void avvioTempo() { // funzione per avviare il tempo nel cronometro
   // inserisco il codice che abilita l'interrupt del timer   
   PIE1 = 0b00000001; 
   INTCON = 0b01000000;
}

void stoppaTempo() { // funzione per fermare il tempo nel cronometro
     // inserisco il codice che disabilita l'interrupt del timer
    PIE1 = 0b00000000; 
    INTCON = 0b01000001;
    visualizzaTempo(); // visualizzo il tempo
}

void Riavvio() { // funzione per riavviare da capo il cronometro
    stoppaTempo(); //stoppo il tempo
    Azzera(); //azzero il tempo
    avvioTempo(); // avvio il tempo
}
*/

main:

int main(int argc, char** argv) {
 /* if(!BTN1){
         avvioTempo(); // se premo il primo pulsante
         sleep(2); // ritardo per antirimbalzo
     }
     if(!BTN2){
         stoppaTempo();// se premo il secondo pulsante
         sleep(2); // ritardo per antirimbalzo
     } 
     if(!BTN3){
         Riavvio();// se premo il terzo pulsante
         sleep(2); // ritardo per antirimbalzo
     } */
      incrementoConteggio();
   
    return (EXIT_SUCCESS);

}

il resto del programma ve lo scritto in modo molto sgangerato ma il codice ha un suo ordine cronologico, e lo messo commentato apposta perchè ora volevo provare la funzione incrementaConteggio(). ma ve lo posta in modo tale ke mi diate un giudizio sul programmino.

il programma lo scritto usanto MPLAB® X IDE. perhè deve girare su un microcontrollore (il PIC16F690 ) montanto su una apposita scheda elettronica e uttilizzando il pickkit2 come programmatore.

3 Risposte

  • Re: Cronometro in [C]

    Innanzitutto una nota stilistica: solitamente dopo i secondi si mostra un unico campo decimale che contiene i decimi, i centesimi O i millesimi (più frequentemente); nel tuo caso, se la tua risoluzione arriva a definire i millisecondi allora dopo i secondi mi aspetterei che tu esprima un campo da 000 a 999.
    Tornando al tuo problema: il mio suggerimento è quello di tenerti traccia del tempo visualizzato, ad ogni visualizzazione, in modo che quando richiami la funzione visualizzaTempo() questa al suo interno decida se visualizzare o meno il tempo (chiaramente quando lo visualizza poi si aggiorna l'ultimo tempo visualizzato).
    Spero di esserti stato d'aiuto.
  • Re: Cronometro in [C]

    Innanzitutto una nota stilistica: solitamente dopo i secondi si mostra un unico campo decimale che contiene i decimi, i centesimi O i millesimi (più frequentemente); nel tuo caso, se la tua risoluzione arriva a definire i millisecondi allora dopo i secondi mi aspetterei che tu esprima un campo da 000 a 999.
    Tornando al tuo problema: il mio suggerimento è quello di tenerti traccia del tempo visualizzato, ad ogni visualizzazione, in modo che quando richiami la funzione visualizzaTempo() questa al suo interno decida se visualizzare o meno il tempo (chiaramente quando lo visualizza poi si aggiorna l'ultimo tempo visualizzato).
    Spero di esserti stato d'aiuto.
    grazie,
    1) x la nosta stilistica: ma intendi che devo visualizzare o i decimi o centesimi o i millesimi? perchè io vorrei visuallizzare tutte e 3 per far vedere bene il tempo. quindi credo che non cambiero il codice di visualizzazione del tempo.
    2) x il problema: il tuo suggerimento mi interessa solo che non c'è lo ben chiaro. non saprei come fare. più che altro vorrei che visualizzasse sempre il tempo ma che continua ad aggiornarsi.
  • Re: Cronometro in [C]

    1) x la nosta stilistica: ma intendi che devo visualizzare o i decimi o centesimi o i millesimi? perchè io vorrei visuallizzare tutte e 3 per far vedere bene il tempo. quindi credo che non cambiero il codice di visualizzazione del tempo.
    La mia era solo una nota stilistica.
    2) x il problema: il tuo suggerimento mi interessa solo che non c'è lo ben chiaro. non saprei come fare. più che altro vorrei che visualizzasse sempre il tempo ma che continua ad aggiornarsi.
    La tua funzione visualizzaTempo() viene richiamata ogni msec se non ho capito male; devi solo fare in modo che stampi ogni 10 chiamate, o ogni 100, o ogni 1000 (in questo caso ogni sec).
Devi accedere o registrarti per scrivere nel forum
3 risposte