Newsgroup: it.hobby.elettronica.digitale
Titolo: ritardo letale in routine

nella routine principale leggo un pulsante che incrementa una variabile che 
poi viene mostrata sul display,ma siccome nelle stessa routine c'č anche la 
lettura di un sensore questa crea un delay che mi ritarda la lettura della 
variabile,che eliminando la lettura del sensore č molto piů veloce,come 
posso fare? 

 posso fare? 
Dipende da come devi interrogare il sensore e da quanto "raffinata" vuoi 
fare la soluzione...
Se finche leggi il sensore devi aspettare del tempo (aspetti che 
risponda a una tua richiesta, aspetti una conversione ADC, ecc) allora è 
il caso di fare qualcos'altro in questo tempo, come ad esempio la 
gestione di quel pulsante e relativa variabile.
Ora le scelte sono più di una, tra cui:
- usi un piccolo RTOS (Real Time Operating System) e metti la lettura 
del sensore su un task a parte.
Probabilmente la più corretta, ma di gran lunga più complessa e 
dispendiosa in termini di risorse;
- fai una piccola macchina a stati, il che è probabilmente più grezzo ma 
più sbrigativo... io di solito faccio qualcosa di simile.
In pratica fai si che la funzione che legge il sensore ritorna subito il 
controllo al resto del programma nei momenti in cui sai che c'è da 
aspettare, memorizzando il suo "stato" in una variabile statica: alla 
successiva chiamata la funzione guarda quella variabile e in base al suo 
valore sa dove era rimasta e può quindi proseguire il suo lavoro.
La spiegazione è molto campata in aria perchè dipende molto da come devi 
interrogare il sensore... in casi particolari potrebbe essere necessario 
sfruttare un interrupt se la risposta dal sensore va presa "al volo".
Se dai qualche ulteriore dettaglio magari ti posso fare un esempio più 
concreto.
...:::Zmaster:::...


si ecco la routine semplificata:
Start:
BUTTON portb.4,1,10,5,B2,1,setminuti     'legge lo stato del pin4 e 
incrementa i minuti
OWOut DQ, 1, [$CC, $44]                        'inizia la conversione 
temperatura sul ds1820
waitloop:
OWIn DQ, 4, [count_remain]                        ' controllo se conversione 
ultimata
IF count_remain = 0 Then waitloop
OWOut DQ, 1, [$CC, $BE]                         ' leggi la temperatura
OWIn DQ, 0, [temperature.LOWBYTE, temperature.HIGHBYTE, Skip 4, 
count_remain, count_per_c]
gosub gettime                                                    'legge i 
minuti dal ds1302
gosub display                                                  'mostra 
temperatura e ora
setminuti:
min=min+1
gosub settime                                 'setta i minuti sul ds1302
goto Start 

> si ecco la routine semplificata:
o_O ma che linguaggio è? simil-BASIC?
comunque nel caso specifico, se quell'istruzione BUTTON controlla lo 
stato del pin senza bloccare nulla, fai prima a fare così (ho tolto i 
commenti che mandavano il testo a caporiga:
Start:
OWOut DQ, 1, [$CC, $44]
waitloop:
BUTTON portb.4,1,10,5,B2,1,setminuti
OWIn DQ, 4, [count_remain]
ultimata
IF count_remain = 0 Then waitloop
OWOut DQ, 1, [$CC, $BE]
OWIn DQ, 0, [temperature.LOWBYTE, temperature.HIGHBYTE, Skip 4, 
count_remain, count_per_c]
gosub gettime
minuti dal ds1302
gosub display
setminuti:
min=min+1
gosub settime
goto Start
...:::Zmaster:::...