Gambas-it

Gambas3 => Domande tecniche => Topic aperto da: kicco - 09 Agosto 2013, 09:40:47

Titolo: [RISOLTO] Interrupt su raspberry
Inserito da: kicco - 09 Agosto 2013, 09:40:47
 :ciao:
Sto cercando di intercettare la pressione di un pulsante collegato alle porte Gpio di Raspberry.
Ovviamente impiego la libreria wiringPI  -  http://wiringpi.com (http://wiringpi.com)
e la funzione wiringPiISR che dovrebbe produrre un interrupt.
Qualcuno a fatto delle prove?

 :ciao:
Titolo: Re: Interrupt su raspberry
Inserito da: vuott - 09 Agosto 2013, 10:16:49
Cercando su internet certamente troverai esempi in C.
Titolo: Re: Interrupt su raspberry
Inserito da: El Berto - 09 Agosto 2013, 13:28:36
Mi sembra che gli interrupt non siano supportati, l'unica cosa è lavorare in polling.
Titolo: Re: Interrupt su raspberry
Inserito da: kicco - 10 Agosto 2013, 15:30:50
Citazione
l'unica cosa è lavorare in polling.

cioè controllare il pulsante continuamente?
Titolo: Re: Interrupt su raspberry
Inserito da: vuott - 10 Agosto 2013, 16:44:41
Mi sembra che gli interrupt non siano supportati

...eppure in questa pagina sembrerebbe il contrario:

http://wiringpi.com/reference/priority-interrupts-and-threads/
Titolo: Re: Interrupt su raspberry
Inserito da: kicco - 11 Agosto 2013, 13:48:13
 :ciao:
grazie Vuott,
arrivo proprio da quella pagina, ma ahimè quando "scatta" l'interrupt esce un avviso di stack overflow :'(
Sono in buona compagnia perchè altri hanno il medesimo problema.
So che Minisini è al corrente, speravo avesse sistemato la questione o che magari qualcuna avesse escogitato qualche trucco...

Speriamo :-\
 :ciao:
Titolo: Re: Interrupt su raspberry
Inserito da: vuott - 11 Agosto 2013, 16:10:16
arrivo proprio da quella pagina, ma ahimè quando "scatta" l'interrupt esce un avviso di stack overflow :'(
Sono in buona compagnia perchè altri hanno il medesimo problema.
So che Minisini è al corrente,....

Questi "altri", cioè, sono solo programmatori Gambas, oppure è un problema intrinseco alla funzione (e quindi sta accadendo a tutti, anche a quelli che programmano in altri linguaggi) ?
Titolo: Re: Interrupt su raspberry
Inserito da: kicco - 11 Agosto 2013, 17:23:09
Ciao Vuott,
sei stato tu a riportare una discussione sulla MLI e poi ad aggiornarla su mia richiesta  :)
http://www.gambas-it.org/smf/index.php?topic=2546.msg26990#msg26990 (http://www.gambas-it.org/smf/index.php?topic=2546.msg26990#msg26990)
in giro ho trovato altri particolari di questa diatriba dove Minisini diceva che se Gambas era compilato su raspberry il problema non doveva sussistere.
Poi proponeva di riscrivere il componenete i C o di chiedere all'autore della libreria di fare una certa serie di cose...
La libreria di recente è passata alla versione 2 ma non è cambiato niente riguardo questo problema :-\

sempre grazie!!! ;)
 
Titolo: Re: Interrupt su raspberry
Inserito da: vuott - 11 Agosto 2013, 17:31:18
Ciao Vuott,
sei stato tu a riportare una discussione sulla MLI e poi ad aggiornarla su mia richiesta  :)
http://www.gambas-it.org/smf/index.php?topic=2546.msg26990#msg26990 (http://www.gambas-it.org/smf/index.php?topic=2546.msg26990#msg26990)
 
Ah, ho visto... eh, non ricordavo più  :-\ con precisione. 
Titolo: Re: Interrupt su raspberry
Inserito da: kicco - 11 Agosto 2013, 17:55:39
 :)
Titolo: Re: Interrupt su raspberry
Inserito da: El Berto - 12 Agosto 2013, 16:10:27
Mi sembra che gli interrupt non siano supportati

...eppure in questa pagina sembrerebbe il contrario:

http://wiringpi.com/reference/priority-interrupts-and-threads/

Ma infatti c'è un "interrupt_wait", che non ha senso.
Da qualche parte avevo letto che il Raspberry non è progettato per gestire gli interrupt.
Titolo: Re: Interrupt su raspberry
Inserito da: md9327 - 12 Agosto 2013, 17:58:16
Dipende anche dal tipo di processore che è montato sopra.

Ad ogni modo, se non in particolari condizioni, l'suo diretto degli interrupt è sconsigliabile, a meno che non si sappia esattamente cosa si stà facendo.

E' da tener presente che gambas è un linguaggio ad alto livello, e non dispone degli strumenti necessari per la gestione di codice a basso livello, come gli interrupt di sistema.
Titolo: Re: Interrupt su raspberry
Inserito da: kicco - 13 Agosto 2013, 18:00:53
Citazione
Dipende anche dal tipo di processore che è montato sopra.
ARM
Citazione
Ad ogni modo, se non in particolari condizioni, l'suo diretto degli interrupt è sconsigliabile, a meno che non si sappia esattamente cosa si stà facendo.
Convengo, ma se devo monitorare un pulsante (fisico) non posso fermare tutto e fare un ciclo di controllo magari utilizzando un loop che tiene sotto controllo un comando proveniente da una shell che usa i comandi diretti supportati dalla libreria wiringPi! :-\
Titolo: Re: Interrupt su raspberry
Inserito da: md9327 - 14 Agosto 2013, 00:22:01
Puoi usare un timer?
Ripeto, non conoso quell'hardware, per cui stò dando solo delle idee.
A suo tempo, in dos, controllavo le porte seriali tramite interrupt, e potevo controllarne anche più di una contemporaneamente con lo stesso int.
Sò che un timer non è uguale ad un int diretto su una porta, ma ne gestisce uno suo, e se quello che penso è vero, calcolando un tempo di delay sufficiente, puoi usarlo per analizzare la porta del pulsante.
Tieni conto che, trattandosi di un pulsante, gestito manualmente, la velocità e la durata dell'impulso è piuttosto alta. Se poi ci aggiungi un apposito condensatore calcolato correttamente, puoi tenere il segnale in piedi il tempo che serve.
Titolo: Re: Interrupt su raspberry
Inserito da: kicco - 14 Agosto 2013, 10:54:33
Citazione
stò dando solo delle idee.
grazie  :) è quello che mi serve!
 :ciao:
Titolo: Re: Interrupt su raspberry
Inserito da: El Berto - 14 Agosto 2013, 15:24:32
Guarda, io di Linux non ne capisco niente (e più passa il tempo e più lo odio)....

Comunque è tutto relativo a quello che vuoi fare.
La pressione di un pulsante dura pochi millisecondi, e ti ritrovi anche dei rimbalzi.
Poi dipende se lo tieni premuto quanto tempo....

Se hai un hardware che lavora in tempo reale (tipo microcontrollore) ti basta lavorare sul fronte, e non ci sono problemi.
Il Raspberry non lavora in tempo reale (secondo me una delle sue due grandi pecche), quindi in un modo o nell'altro devi necessariamente andare in polling.
Poi dipende dall'uso che ne vuoi fare, se la cosa ti va bene o meno; se poi lavori in polling con un periodo di timeout e lo spacci per interrupt, quello è un altro discorso.

Io volevo fare la lettura di un dato sincronizzato però sul fronte di salita di un segnale esterno proveniente da un GPS (PPS), ma la lettura veniva fatta da 10 a 100ms in ritardi rispetto al fronte, quindi per la gestione in "tempo reale" ho dovuto aggiungere un microcontrollore esterno.
Titolo: Re: Interrupt su raspberry
Inserito da: md9327 - 14 Agosto 2013, 20:00:17
Citazione
Guarda, io di Linux non ne capisco niente (e più passa il tempo e più lo odio)....
Questa affermazione è solo dipendente dalla non conoscenza dello strumento. Secondo me non puoi affermare ciò, in quanto le possiblità non sono nemmeno paragonabili ad altri sistemi chiusi, e dico "chiusi" (con lucchetti e serrature).

Ad ogni modo, come ho scritto, non conosco nè l'ahrdware che stai utilizzando, nè il processore. Questa mia non conoscenza non mi permette di formulare suggerimenti idonei.
L'unche cose che posso fornirti sono prelevate dalla mia vecchia esperienza con quel tipo di programmazione, a basso livello, e direttamente dell'hardware.
Questa cosa non è più possibile con windoz, in quanto il controllo diretto c'è l'ha lui, e tu puoi solo accedervi tramite librerie, che però sono condizionate dalle logiche interne del sistema operativo.
Su linux, volendo, hai la possibilità di crearti i tuoi driver personali e personalizzati, anche se la cosa può risultare difficoltosa di primo acchitto.
Comunque, nel tuo caso, stiamo affrontando due logiche alquanto contrastanti. Da una parte hai un hardware che, per quanto limitato sia, fornisce delle caratteristiche di un certo tipo, che sono accessibili costruendoci sopra dei driver a basso livello. Dall'altra hai un linguaggio ad alto livello, che si appoggia tra le altre cose a librerie di medio livello esterne, le quali poi vanno a chiamare funzioni del sistema operativo.
Cercare di pilotare direttamente l'hardware, partendo da questa situazione, credo sia alquanto complicato.

Riguardo invece ai sistemi con cui gestire quello che vuoi fare, tralasciando per il momento tutta la parte sopra, e in base alle mie esperienze, penso che i due esempi che ti ho fatto siano una base di partenza su cui sperimentare.
Sò bene che ci sono particolari condizioni, probabilmente complicate da gestire, ma da qualche parte penso devi partire.

Ricordo che lo Z80 gestiva un solo interrupt per tutto (mi pare sul registro 80 o 8, non ricordo). Il processore scatenava (tramite il software di base che alzava l'int) l'int e si posizionava su un indirizzo preciso. Da qui partiva l'analisi di cosa aveva attivato l'int e, tramite una serie di if, andavi ad eseguire le relative operazioni.
Parlando di timer o di polling, lo stesso processore deve lavorare in polling, analizzando in loop tutte le porte di accesso, scatenando di conseguenza (sempre dipendente dal sistema operativo) il relativo codice.
Dato che tu stai operando su un livello di software molto alto, e non avendo a disposizione altro, l'unica alternativa che vedo valida è quella del timer, magari anche tarato al millisecondo.
Sul discorso dei rimbalzi, è normale che ci siano, in quanto si opera tramite un mezzo meccanico, e per cui soggetto a questo. In questo caso viene un sistema di anti-rimbalzo e di analisi dei falsi positivi, un pò come funziona la logica di controllo dei pulsanti del mouse (click o doppio click). In java, per esempio, non esiste un evento double-click, ma l'oggetto mouse ti fornisce un contatore di click che puoi analizzare per sapere se l'utente ha fatto click o doppio click, e anche quale dei tasti ha premuto.

Se, invece, scopri che il processore fornisce un qualche sistema di interrupt o altro, allora puoi intraprendere un'altra logica.
Titolo: Re: Interrupt su raspberry
Inserito da: kicco - 16 Agosto 2013, 09:29:14
molto chiaro!
 :)
Titolo: Re: Interrupt su raspberry
Inserito da: kicco - 22 Agosto 2013, 09:47:27
Al fine, giusto per completare la questione, ho risolto in maniera poco ortodossa ma funzionale:
Ho impiegato come mi era stato suggerito un timer che ogni 500ms esegue una shell con i comandi diretti della libreria LibwiringPi (link all'inizio ella discussione)
Con un IF controllo l'eventuale cambio di stato della variabile.
Codice: gambas [Seleziona]

Public Sub Timer2_Timer()
 Dim a1 As String
 
  Shell "gpio read 4" To a1
     In1 = Val(a1)
    
     If In1 = 1 Then
     SUONO1_ON
     Endif
    
End



Questo sperando che nelle prossime versione della libreria il problema di gestione dell'intettupt diventi compatibile con Gambas
Se qualcuno ha idee migliori faccia un fischio
 :)  :ciao:
Titolo: Re: Interrupt su raspberry
Inserito da: vuott - 22 Agosto 2013, 20:30:18
Se qualcuno ha idee ...


Prova senza Timer ponendo in osservazione il processo gestito con Process:
Codice: gambas [Seleziona]

Private pr As Process


Public Sub quelcheè()

  pr =   Shell "gpio read 4" For Read As "gpio"

End


' Se v'è qualcosa da leggere in "pr", scatta questa procedura:
Public Sub gpio_Read()

  Dim b As Byte

    Read #pr, b

    If b = 1 Then SUONO1_ON

End
:-X
Titolo: Re: [RISOLTO] Interrupt su raspberry
Inserito da: kicco - 24 Agosto 2013, 13:29:05
 :)
Solo oggi riesco a risponderti:
Grazie, appena riesco ci provo!
 :ciao: