IR Receiver

Dopo aver acquistato due di questi piccoli telecomandi IR: http://www.sparkfun.com/products/10280 ho deciso di fare un piccolo progettino, una banalità, 8 led a scorrimento. Tramite il telecomando posso decidere la direzione e la velocità, il problema adesso è uno. Ho seguito il codice esempio presente sul sito della sparkfun: http://www.sparkfun.com/datasheets/Components/General/Cheapo_IR_Control.pde

Ma mi sono accorto che questo codice mi blocca l'eseguzione per attendere il bit di inzio per la ricezione del dato dal telecomando. Non c'è un'altro modo per ricevere il dato evitando che si blocchi il loop?

P.S. Come ricevitore uso il TSOP382.

Per come è strutturato quel codice, no. Dovresti modificarlo.

leo72:
Per come è strutturato quel codice, no. Dovresti modificarlo.

Ho provato a inserire un timeout di 100 ms qui:

  while(pulseIn(irPin, LOW) < start_bit); //Wait for a start bit

Però poi sta parecchio tempo negli altri while per leggere il dato.

Qualche consiglio?

Potrei risolvere con un timer interrupt. Qualcuno sa aiutarmi con i timer interrupt su ATTiny85?

Piccolo up! :)

no, meglio un iterrupt di “change” o di “rising” (dipende da cosa devi fare), in pratica misuri il tempo tra un cambio di stato e l’altro

lesto: no, meglio un iterrupt di "change" o di "rising" (dipende da cosa devi fare), in pratica misuri il tempo tra un cambio di stato e l'altro

Cosa cambia fra i due tipi?

Comunque, semplicemente devo riconoscere quando mi arriva un dato IR senza che il programma sia fermo su un ciclo while che aspetta di ricevere lo start bit.

Xfox:

lesto: no, meglio un iterrupt di "change" o di "rising" (dipende da cosa devi fare), in pratica misuri il tempo tra un cambio di stato e l'altro

Cosa cambia fra i due tipi? Comunque, semplicemente devo riconoscere quando mi arriva un dato IR senza che il programma sia fermo su un ciclo while che aspetta di ricevere lo start bit.

Devi usare come ingresso del segnale un pin di interrupt. devi impostare l'interrupt in modo che reagisca ad un evento di rising (passaggio da LOW ad HIGH), falling (passaggio da HIGH a LOW) o change (HIGH->LOW o LOW-HIGH). In questo modo non devi tenere alcun while; quando arriva uno dei segnali previsti si attiva la procedura di interrupt e viene eseguito il codice che metti nella relativa routine.

menniti:

Xfox:

lesto: no, meglio un iterrupt di "change" o di "rising" (dipende da cosa devi fare), in pratica misuri il tempo tra un cambio di stato e l'altro

Cosa cambia fra i due tipi? Comunque, semplicemente devo riconoscere quando mi arriva un dato IR senza che il programma sia fermo su un ciclo while che aspetta di ricevere lo start bit.

Devi usare come ingresso del segnale un pin di interrupt. devi impostare l'interrupt in modo che reagisca ad un evento di rising (passaggio da LOW ad HIGH), falling (passaggio da HIGH a LOW) o change (HIGH->LOW o LOW-HIGH). In questo modo non devi tenere alcun while; quando arriva uno dei segnali previsti si attiva la procedura di interrupt e viene eseguito il codice che metti nella relativa routine.

Tutto chiaro, adesso una domanda un pochino più complessa. Come si gestiscono gli interrupt hardware su un ATTiny85? (Innanzi tutto ce ne sono? Perchè a quanto ho capito non tutti i controllori hanno degli interrupt hardware)

Certo che ci sono, sono interrupt generati dalle periferiche del micro. In genere è più giusto chiamarli interrupt esterni perché generati da qualcosa che sta al di fuori del micro. Un cambio di stato su un pin è un interrupt esterno. Si usano come sull’Arduino ma hai bisogno prima di apposite librerie per poter lavorare con i Tiny.
http://www.gioblu.com/tutorials/programmazione/214

Figo il telecomando! Ma l'hai ordinato proprio da sparkfun o c'è qualche rivenditore europeo che lo vende?

xelendilx: Figo il telecomando! Ma l'hai ordinato proprio da sparkfun o c'è qualche rivenditore europeo che lo vende?

Prova a vedere sul sito di Watterott (Germania), hanno praticamente tutto Sparkfun, credo possano prendere su ordinazione anche ciò che non hanno, però compri in Europa con 10 euro di spese trasporto e niente dogana. Seri e veloci!

menniti: Prova a vedere sul sito di Watterott (Germania), hanno praticamente tutto Sparkfun, credo possano prendere su ordinazione anche ciò che non hanno, però compri in Europa con 10 euro di spese trasporto e niente dogana. Seri e veloci!

Avevo visto ma mi sa che non ce l'hanno! Mi sa che devo solo vedere se si può ordinare XD

xelendilx:

menniti: Prova a vedere sul sito di Watterott (Germania), hanno praticamente tutto Sparkfun, credo possano prendere su ordinazione anche ciò che non hanno, però compri in Europa con 10 euro di spese trasporto e niente dogana. Seri e veloci!

Avevo visto ma mi sa che non ce l'hanno! Mi sa che devo solo vedere se si può ordinare XD

Ricordo che Uwe (ma non vorrei sbagliarmi) mi pare dicesse che c'era proprio la possibilità di scrivergli, prova a fare una richiesta generica, del tipo: "avete modo di ordinare materiale sparkfun non presente sul vostro sito?", così non ti impegni e ottieni risposta.

Ho scaricato la libreria e sono arrivato a questo: http://code.google.com/p/arduino-tiny/source/browse/trunk/libraries/PinChangeInterruptSimple/keywords.txt Qualcuno mi spiega come interpretare questo file che c'è praticamente in tutte le librerie? :)

Non lo devi interpretare tu. Serve all'IDE per sapere quali parole della tua libreria sono da riservare e da evidenziare durante la scrittura del codice.

leo72: Non lo devi interpretare tu. Serve all'IDE per sapere quali parole della tua libreria sono da riservare e da evidenziare durante la scrittura del codice.

E come faccio a sapere come funziona una libreria?

devi guardare il file .h o, nel caso di classi, il file .cpp

O leggere il file README allegato. Oppure visitare il sito dello sviluppatore e vedere se c'è un help. Oppure capirlo dagli esempi allegati.

Non sempre le librerie sono documentate come si deve e spesso si va un po' "a naso" facendo affidamento sulle proprie conoscenze per leggere ed interpretare il sorgente (sant'Open Source aiutaci tu).

leo72: O leggere il file README allegato. Oppure visitare il sito dello sviluppatore e vedere se c'è un help. Oppure capirlo dagli esempi allegati.

Non sempre le librerie sono documentate come si deve e spesso si va un po' "a naso" facendo affidamento sulle proprie conoscenze per leggere ed interpretare il sorgente (sant'Open Source aiutaci tu).

http://code.google.com/p/arduino-tiny/source/browse/trunk/libraries/PinChangeInterrupt/readme.txt Nel read me non c'è scritto niente sul funzionamento!