Interrupt esterno per simil-kernel

Ho un quesito. Il progetto Uzebox è una specie di mini-console ad 8 bit. Questa gestisce il codice del giochino inserito dall'utente tramite un software interno che gira in stile Kernel mediante interrupt esterno....

Ecco, questa parte più tecnica mi è un po' ostica.... Cosa usare per attivare questa specie di kernel con un interrupt esterno regolare?

te lo devi scrivere il tuo kernel, gli interrupt sono "letti" a livello hardware e eseguono una funzione software, cosa e come lo facciano sta a te. Arduino mette a disposizione 2 interrupt, ma l'atmega in realtà ha interrupt per ogni pin tranne 2 se non erro, leggi il manuale del tuo atmega

Mi sono espresso male. Non intendevo come scrivere il kernel, ma come attivare una serie di funzioni in base a qualche evento.

Poi, rileggendo lo sketch demo dello shield LCD 3310 ed analizzando il codice di Uzebox ho notato che si fa ricorso a dei Timer interni che però non ho trovato nella documentazione presente sul sito di Arduino.
Tutta una serie di istruzioni del tipo

TCCR2A &= ~((1<<WGM21) | (1<<WGM20));
TCCR2B &= ~(1<<WGM22);
TCCR2B = (1<<CS22)|(1<<CS21);      
  
ASSR |=(0<<AS2);

TCCR2A =0;

e simili che non ho trovato.
Nel reference c’è solo attach/detachInterrupt…

la documentazione su quelle cose non le trovi sul sito arduino, son cose più “insider” che trovi sul datasheet dell’atmega (il microcontrollore usato dall’arduino)
anche attach/detachInterrupt su arduino sono solo su 2 pin, in realtà l’atmega li supporta su tutti i pin :slight_smile:

Mi inserisco in questa discussione anche se non posso essere molto di aiuto.

Intanto quel codice TCCR2A ... ecc, mi sembra di averlo visto di recente durante la lettura della doc di avr-libc, porva un pò a vedere http://arduino.cc/en/Reference/HomePage in basso a destra dove dice the arduino language is based ...

In merito alla limitazione a 2 interrupt di arduino, sono interessato a capirne di più. Mi pare di aver capito che ci sono due vettori di interrupt, ma quasi tutti pin possono essere impostati per scatenare un'interrupt in particolare Pin Changed.

Il mio interesse è motivato dal fatto che voglio realizzare un controllore di precisione con encoder in quadrataura con il quale comandare un motore DC.

Una cosa interessante che in questi giorni ho scoperto è l'esistenza di un serie di micro Atmel extended chiamata Xmega, questi pare abbiano 6 o più pin "Event", oltre ai normali interrupt.

i datasheet che spiegano le varie cose li trovate quì: http://www.atmel.com/dyn/products/product_card.asp?PN=ATmega328P

per gli interrupt qualcosa trovi quì, devo postare il codice funzionante fatto bene ma adesso non sono a casa: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1288131711

occhio a usare i timer interni, alcune funzioni arduino ne fanno uso e devi tenere conto degli effetti collaterali

La mia idea è questa. Ho sviluppato 4 giochini che fanno uso del mio shield Nokia 3310 LCD. Si tratta di un mangia-pillole, di un mini shoot'em up, di una replica dello Snake e di una specie di Invaders.

Per farli funzionare uso una matrice che fa le veci di un buffer video in cui scrivo e leggo i caratteri da mandare poi all'LCD. In questa maniera posso usare pseudo-funzioni di lettura/scrittura dei caratteri, un po' come si faceva con le PEEK/POKE dei vecchi BASIC Commodore ::)

Volevo ottimizzare la gestione di questo buffer rendendolo quasi "automatico". Usando un po' le idee alla base del TellyMate, pensavo di mandare la gestione della matrice che mantiene il buffer in background e farla renderizzare da un interrupt che periodicamente la invia al display LCD. Volevo poi introdurre un paio di funzioni chiamate proprio Peek e Poke per semplificare la lettura/scrittura dei caratteri nel buffer.

Usando un interrupt potevo quindi semplificare molto il mio codice perché non ero costretto a chiamare manualmente la funzione di ridisegno dell'immagine ogni qual volta modifico qualcosa nel buffer.

La mia idea è questa. Ho sviluppato 4 giochini che fanno uso del mio shield Nokia 3310 LCD. Si tratta di un mangia-pillole, di un mini shoot'em up, di una replica dello Snake e di una specie di Invaders.

Per farli funzionare uso una matrice che fa le veci di un buffer video in cui scrivo e leggo i caratteri da mandare poi all'LCD. In questa maniera posso usare pseudo-funzioni di lettura/scrittura dei caratteri, un po' come si faceva con le PEEK/POKE dei vecchi BASIC Commodore ::)

Volevo ottimizzare la gestione di questo buffer rendendolo quasi "automatico". Usando un po' le idee alla base del TellyMate, pensavo di mandare la gestione della matrice che mantiene il buffer in background e farla renderizzare da un interrupt che periodicamente la invia al display LCD. Volevo poi introdurre un paio di funzioni chiamate proprio Peek e Poke per semplificare la lettura/scrittura dei caratteri nel buffer.

Usando un interrupt potevo quindi semplificare molto il mio codice perché non ero costretto a chiamare manualmente la funzione di ridisegno dell'immagine ogni qual volta modifico qualcosa nel buffer.

P.S.: 3 dei giochini li potete vedere in questi video.

Uhm... penso che il FlexiTimer2 possa fare al caso mio ;)

Questa da dove sbuca fuori, serve anche a me. :)

Ho "razzolato" nel Playground. Carino, vero, quel FlexyTimer2? :)