Autore Topic: [RISOLTO] Interrupt su raspberry  (Letto 3913 volte)

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: Interrupt su raspberry
« Risposta #15 il: 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.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Interrupt su raspberry
« Risposta #16 il: 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.

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.725
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re: Interrupt su raspberry
« Risposta #17 il: 16 Agosto 2013, 09:29:14 »
molto chiaro!
 :)
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.725
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re: Interrupt su raspberry
« Risposta #18 il: 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:
« Ultima modifica: 25 Agosto 2013, 15:24:41 da kicco »
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.725
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interrupt su raspberry
« Risposta #19 il: 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
« Ultima modifica: 24 Agosto 2013, 14:17:19 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.725
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re: [RISOLTO] Interrupt su raspberry
« Risposta #20 il: 24 Agosto 2013, 13:29:05 »
 :)
Solo oggi riesco a risponderti:
Grazie, appena riesco ci provo!
 :ciao:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)