Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    Qbasic & timing

    Ciao a tutti,
    sto scrivendo un piccolo programma di acquisizione dati che dovrà girare su un vecchio 486 e quindi in dos.
    L'unico linguaggio che conosco (e anche poco) è il Qbasic.
    Il programma legge i dati da una scheda di acquisizione dati collegata alla seriale.
    Una volta che ha letto i dati li rappresenda a video e salva in un file solamente il valore di un solo canale analogico mettendo pure la data e l'ora.
    Il tutto viene ripetuto ogni secondo in LOOP temporizzando con il comando SLEEP 1.

    Noto purtroppo, anche dal file, che a volte il loop si ferma per un secondo di troppo e non capisco dove ho sbagliato..

    Incollo di seguito il breve listato del programma e un pezzettino di file log generato.

    Ciao, Alberto

    OPEN "COM1:9600,N,8,1,rs,cs0,ds0" FOR RANDOM AS #10 ' apro la porta seriale
    nomefile$ = "log.txt" 'assegno il nome al file .txt
    OPEN nomefile$ FOR APPEND AS #20 'apro il file in scrittura progressiva
    DO
    i$ = INKEY$
    IF i$ = CHR$(27) THEN END ' se viene premuto "ESC" termina il programma

    CLS
    PRINT "Press ESC to exit..."
    a$ = "255"
    PRINT #10, "**" + CHR$(VAL(a$)) + "#"; 'invio i dati sulla seriale

    digital$ = INPUT$(1, #10) 'leggo gli ingressi digitali
    ad1$ = INPUT$(1, #10) 'leggo l'ingresso analogico 1
    ad2$ = INPUT$(1, #10) 'leggo l'ingresso analogico 2

    PRINT "Ingressi ="; ASC(digital$) 'mostro il valore
    PRINT "Convertitore A/D 1 ="; ASC(ad1$) 'mostro il valore
    valore = (ASC(ad1$))
    PRINT "Il valore nella variabile valore Š="; valore
    valvolt = valore * 5 / 255
    PRINT "Il risultato in Volt quindi Š di "; valvolt
    valkw = valvolt * 400
    PRINT "I volt letti x la costante che Š 400 = "; valkw
    PRINT "Convertitore A/D 2 ="; ASC(ad2$)
    PRINT TIME$
    PRINT #20, DATE$, TIME$, valkw 'scrivo sul file i dati

    SLEEP 1 'temporizzo l'intero ciclo ogni secondo

    LOOP WHILE i$ = ""
    CLOSE #10
    CLOSE #20
    END




    log.txt
    02-23-2009 21:30:38 39.21569
    02-23-2009 21:30:39 39.21569
    02-23-2009 21:30:41 39.21569
    02-23-2009 21:30:42 39.21569

    ....

    02-23-2009 21:34:36 86.27451
    02-23-2009 21:34:37 94.11765
    02-23-2009 21:34:39 78.43137

  2. #2
    Secondo me il problema non è che salta un secondo, ma che oltre al secondo "canonico" atteso dalla SLEEP devi considerare che c'è il tempo aggiuntivo della lettura dalla seriale, per cui ogni ciclo dura 1 secondo e qualcosina. Ora, tutti questi "qualcosina" man mano si sommano, e producono il ritardo che vedi nel log.
    Una soluzione sarebbe calcolare la durata dell'esecuzione del ciclo fino alla sleep tramite la funzione TIMER, e attendere giusto quanto manca per arrivare ad 1 secondo; questo può essere fatto con un loop che termina quando la TIMER ha raggiunto il valore che aveva all'inizio del ciclo più 1.
    Esempio
    codice:
    DO
        t = TIMER + 1
    
        REM tutto il codice...
        
        REM Attende quanto manca perché il ciclo duri esattamente un secondo
        DO
        LOOP UNTIL TIMER >= t
    LOOP WHILE i$ = ""
    P.S.: QBasic... quanti ricordi...
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Il Qbasic, wow
    Invece dello SLEEP, potresti usare il WAIT

    Sospende l'esecuzione del programma e attende l'invio di una stringa di bit
    specifica da una porta di input.

    WAIT numeroporta%, espressione-AND% [,espressione-XOR%]

    ■ numeroporta% Il numero della porta di input.
    ■ espressione-AND% Un'espressione intera che WAIT unisce con la stringa
    di bit specifica tramite un operatore AND. Se il
    risultato è diverso da zero, WAIT sospende il con-
    trollo dei nuovi dati che arrivano alla porta.
    ■ espressione-XOR% Viene usata per attivare e disattivare i bit
    presenti in linea prima di eseguire l'operazione AND.
    Esempio:
    'Legge l'indirizzo &H20 della porta dell'interrupt controller.
    'Premere un tasto per continuare.
    WAIT &H20, 1
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  4. #4
    Originariamente inviato da Samuele_70
    Il Qbasic, wow
    Qui c'è mezzo forum che rivede la sua infanzia...
    Invece dello SLEEP, potresti usare il WAIT
    Non vorrei che interferisse con la OPEN... :master: ma non ricordo molto bene...
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Originariamente inviato da MItaly
    Qui c'è mezzo forum che rivede la sua infanzia...
    e si, come passa il tempo
    Non vorrei che interferisse con la OPEN... :master: ma non ricordo molto bene...
    Onestamente non saprei :master:, forse l'autore del post può fare questa prova, e dirci se funziona
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  6. #6
    Ciao a tutti,
    vi ringrazio di essere intervenuti in questo post e mi fa piacere avervi fatto ricordare i bei tempi
    Ho provato la soluzione di MItaly, ma il problema persiste.
    Anche aumentando il tempo a 10 secondi ogni 1 o due minuti (senza alcuna regolo o logica...per me) perde un secondo.
    Non è la fine del mondo, ma sarebbe stato bello avere un log di acquisizione preciso.
    Evidentemente a volte viene perso del tempo nell'acquisizione e quindi ecco il ritardo..
    Boh..pazienza...
    Ora apro un altro post con un altro quesito

    Ciao,
    Alberto

  7. #7
    Originariamente inviato da ita124
    Ciao a tutti,
    vi ringrazio di essere intervenuti in questo post e mi fa piacere avervi fatto ricordare i bei tempi
    Ho provato la soluzione di MItaly, ma il problema persiste.
    Puoi postare il codice che usi dopo aver integrato la mia proposta?
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Ciao,
    scusami ma sono stato fuori sede...

    Ecco il codice:

    CLS
    PRINT "Il programma legge la tensione sullo shunt da 250 ohm"
    PRINT "L'escurzione di tensione sar… quindi compresa fra 1 e 5v"
    INPUT "OGNI QUANTI SECONDI VUOI VENGA FATTO IL CAMPIONAMENTO "; tempo%
    OPEN "COM1:9600,N,8,1,rs,cs0,ds0" FOR RANDOM AS #10 ' apro la porta seriale
    nomefile$ = "log.txt" 'assegno il nome al file .txt

    OPEN nomefile$ FOR APPEND AS #20 'apro il file in scrittura progressiva
    DO
    t = TIMER + tempo%

    REM tutto il codice...
    i$ = INKEY$
    IF i$ = CHR$(27) THEN END ' se viene premuto "ESC" termina il programma

    CLS
    PRINT "CAMPIONAMENTO OGNI "; tempo%; "SECONDI"
    PRINT "Sto salvando i dati sul file log.txt"

    A$ = "255"
    PRINT #10, "**" + CHR$(VAL(A$)) + "#"; 'invio i dati sulla seriale

    digital$ = INPUT$(1, #10) 'leggo gli ingressi digitali
    ad1$ = INPUT$(1, #10) 'leggo l'ingresso analogico 1
    ad2$ = INPUT$(1, #10) 'leggo l'ingresso analogico 2

    REM PRINT "Ingressi ="; ASC(digital$) 'mostro il valore
    REM PRINT "Convertitore A/D 1 ="; ASC(ad1$) 'mostro il valore
    valore = (ASC(ad1$))
    REM PRINT "Il valore nella variabile valore Š="; valore
    valvolt = valore * 5 / 255
    PRINT ""
    PRINT "La tensione letta Š di volt: "; valvolt
    mA = valvolt / 250 * 1000
    PRINT "Pari a "; mA; "mA"
    kW = mA * .25 * 400
    PRINT "La potenza letta Š di kW: "; kW
    REM PRINT "Convertitore A/D 2 ="; ASC(ad2$)
    PRINT TIME$
    PRINT ""
    PRINT "Press ESC to exit..."
    PRINT #20, DATE$, TIME$, mA 'scrivo sul file i dati




    REM Attende quanto manca perchŠ il ciclo duri esattamente un secondo
    DO
    LOOP UNTIL TIMER >= t

    LOOP WHILE i$ = ""


    CLOSE #10
    CLOSE #20

    END

  9. #9
    Ma adesso i "salti" nel log sono più distanziati rispetto a prima? Puoi cambiare la linea
    codice:
    PRINT #20, DATE$, TIME$, mA 'scrivo sul file i dati
    in
    codice:
    PRINT #20, DATE$, TIME$, mA, TIMER 'scrivo sul file i dati
    e postare un log che comprenda almeno due "salti"?
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    03-14-2009 09:44:02 .8627451 35041.75
    03-14-2009 09:44:03 1.333333 35042.79
    03-14-2009 09:44:04 1.333333 35043.83
    03-14-2009 09:44:05 1.72549 35044.88
    03-14-2009 09:44:06 1.019608 35045.92
    03-14-2009 09:44:07 1.568627 35046.96
    03-14-2009 09:44:08 1.490196 35048.01
    03-14-2009 09:44:09 1.098039 35049.05
    03-14-2009 09:44:10 1.803922 35050.09
    03-14-2009 09:44:11 1.176471 35051.14
    03-14-2009 09:44:12 1.411765 35052.18
    03-14-2009 09:44:13 1.72549 35053.23
    03-14-2009 09:44:14 1.019608 35054.27
    03-14-2009 09:44:15 1.803922 35055.31
    03-14-2009 09:44:16 1.254902 35056.36
    03-14-2009 09:44:17 1.333333 35057.4
    03-14-2009 09:44:18 1.803922 35058.44
    03-14-2009 09:44:19 1.098039 35059.49
    03-14-2009 09:44:21 1.568627 35060.53 SALTO
    03-14-2009 09:44:22 1.490196 35061.57
    03-14-2009 09:44:23 1.176471 35062.62
    03-14-2009 09:44:24 1.882353 35063.66
    03-14-2009 09:44:25 1.176471 35064.7
    03-14-2009 09:44:26 1.490196 35065.75
    03-14-2009 09:44:27 1.647059 35066.79
    03-14-2009 09:44:28 1.098039 35067.84
    03-14-2009 09:44:29 1.803922 35068.88
    03-14-2009 09:44:30 1.333333 35069.92
    03-14-2009 09:44:31 1.254902 35070.97
    03-14-2009 09:44:32 1.882353 35072.01
    03-14-2009 09:44:33 1.098039 35073.05
    03-14-2009 09:44:34 1.647059 35074.1
    03-14-2009 09:44:35 1.490196 35075.14
    03-14-2009 09:44:36 1.176471 35076.18
    03-14-2009 09:44:37 1.882353 35077.23
    03-14-2009 09:44:38 1.098039 35078.27
    03-14-2009 09:44:39 1.72549 35079.31
    03-14-2009 09:44:40 1.333333 35080.36
    03-14-2009 09:44:41 1.411765 35081.4
    03-14-2009 09:44:42 1.72549 35082.45
    03-14-2009 09:44:43 1.098039 35083.49
    03-14-2009 09:44:45 1.882353 35084.53 SALTO
    03-14-2009 09:44:46 1.098039 35085.58
    03-14-2009 09:44:47 1.72549 35086.62
    03-14-2009 09:44:48 1.490196 35087.66
    03-14-2009 09:44:49 1.176471 35088.71
    03-14-2009 09:44:50 1.882353 35089.75
    03-14-2009 09:44:51 1.176471 35090.79
    03-14-2009 09:44:52 1.490196 35091.84
    03-14-2009 09:44:53 1.72549 35092.88
    03-14-2009 09:44:54 1.098039 35093.92
    03-14-2009 09:44:55 1.803922 35094.97
    03-14-2009 09:44:56 1.333333 35096.01
    03-14-2009 09:44:57 1.254902 35097.06
    03-14-2009 09:44:58 1.803922 35098.1
    03-14-2009 09:44:59 1.098039 35099.14
    03-14-2009 09:45:00 1.72549 35100.19
    03-14-2009 09:45:01 1.411765 35101.23
    03-14-2009 09:45:02 1.254902 35102.27
    03-14-2009 09:45:03 1.803922 35103.32
    03-14-2009 09:45:04 1.098039 35104.36
    03-14-2009 09:45:05 1.803922 35105.4
    03-14-2009 09:45:06 1.333333 35106.45
    03-14-2009 09:45:07 1.333333 35107.49
    03-14-2009 09:45:09 1.803922 35108.54 SALTO
    03-14-2009 09:45:10 1.098039 35109.58
    03-14-2009 09:45:11 1.803922 35110.62

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.