Pagina 1 di 1

Lettura porta parallela

MessaggioInviato: 18 set 2007, 15:48
da cip
Salve,
ho realizzato una scheda di conversione adc per porta parallela, con un adc0808.
Tutto funziona regolarmente se faccio letture singole della porta.
Se invece leggo di continuo, cioè seleziono uno dei canali dell'adc 0808 (che funziona in free running), il programma si blocca.
Utilizzo il compilatore Borland C++ Builder 6.0 con librerie Ntport per l'accesso alla porta parallela.

La stessa scheda ed il relaztivo programma di gestione invece funzionano regolarmente anche in free running in ambiente dos con compilatore Turbo C++ 3.1 della Borland.

Quale può essere il problema ?

Grazie e Ciao.

Re: Lettura porta parallela

MessaggioInviato: 18 set 2007, 16:09
da Paolino
Dato che sotto DOS la scheda lavora, mi sbilancerei nell'affermare che probabilmente le librerie di accesso alla parallela hanno vincoli. C'è un readme.txt o qualcosa di analogo? Hai provato a ridurre il periodo di campionamento?

Ciao.

Paolo.

Re: Lettura porta parallela

MessaggioInviato: 18 set 2007, 16:27
da cip
Nel programma dos, appena ho selezionato un canale, entro in un ciclo while durante il quale leggo in continuazione la porta parallela.
Per uscire dal ciclo while, ad esempio quando voglio cambiare canale o uscire dal programma, interrogo (dentro al ciclo) il buffer della tastiera (kbhit) per vedere se è stato premuto un tasto.
Nel caso vado poi a vedere che tasto è stato premuto (è una sottospecie di interrupt diciamo).

Nel programma win32 invece io seleziono un canale con un radio button e poi entro in un ciclo while uguale a quello precedente. Il problema è che a questo punto il programma non riesce più ad accorgersi se io premo un altro radio button o voglio chiudere il programma o qualsiasi altra cosa.
In effetti potrei selezionare un canale col radio button e campionare la parallela ogni tot millisecondi, in questo modo è probabile che il programma abbia il tempo di "sentire" un evento fra una lettura e l'altra.

Provo a fare qualche esperimento con i tuoi consigli.

Grazie e Ciao.

Re: Lettura porta parallela

MessaggioInviato: 18 set 2007, 16:40
da Paolino
Sono curioso: poi fammi sapere come è andata. In bocca al lupo, :D
Ciao.

Paolo.

Re: Lettura porta parallela

MessaggioInviato: 28 set 2007, 21:35
da posta10100
E' dovuto a come viene gestita l'interfaccia grafica.
Generalmente tutte le operazioni di ridisegno della grafica e di ascolto degli input vengono fatte nei momenti di idle del processore.
Un ciclo while però non consente al processore di andare in idle e quindi di interagire con l'utente.

Sempre se ho ragione potresti fare un fork quando avvii la lettura. Il programma principale resta in attesa degli input mentre il figlio lavora con la parallela.
Quando l'utente interviene allora fermi e distruggi il programma figlio e ne crei uno nuovo.

Questa soluzione non è delle più semplici ma è la prima che mi è venuta in mente.... oppure potresti provare a inserire ogni n cicli while uno sleep da qualche millisecondo...

Intanto prova a verificare se il tuo processo impegna al 100% il processore quando parte il campionamento. Se è così molto probabilmente la causa è quella che ti dicevo prima.

Re: Lettura porta parallela

MessaggioInviato: 1 ott 2007, 15:40
da cip
Ottimi consigli, grazie.
Credo che proverò con la soluzione di inserire uno sleep ogni "qualche" ciclo while.
Ciao.

Re: Lettura porta parallela

MessaggioInviato: 3 ott 2007, 11:56
da cip
Grazie ai vostri consigli ho risolto il problema.

Praticamente ho utilizzato il componente Timer del compilatore. (Ho provato con Sleep ma non funzionava facendo lo stesso problema di prima).
Quando entro in lettura (attraverso un pulstante) sull'evento onclick del pulsante leggo la parallela la prima volta e stampo il risultato della lettura, poi attivo il Timer mettendo Enabled in true (il Timer è settato per 100 ms).

Sull'evento OnTimer del Timer (cioè quando sono trascorsi i 100 ms) rileggo la parallela e riattivo il Timer.

Grazie e ciao.