Sto trovando difficoltà ad usare gli interrupt, vorrei scatenare un'interrupt sul fronte di discesa di un pin.
Ecco il codice che ho scritto che dovrebbe mostrare un messaggio su un terminale via porta usb/seriale simulata.
Il problema è che funziona in modo abbastanza random, senza fare nulla sembra che l'interrupt viene scatenato in maniera casuale..
- Code: Select all
// Routine chiamata allo scatenarsi dell'interrupt
ISR(PORTC_INT0_vect)
{
printf("VSYNC");
}
// Routine presa da AVR1313
void PORT_ConfigureInterrupt0( PORT_t * port, PORT_INT0LVL_t intLevel, uint8_t pinMask )
{
port->INTCTRL = ( port->INTCTRL & ~PORT_INT0LVL_gm ) | intLevel;
port->INT0MASK = pinMask;
}
#define VSYNC IOPORT_CREATE_PIN(PORTC,2) // definisco VSYNC come la porta PC2
void main()
{
// inizializzo diversi servizi
ioport_init();
sysclk_init();
pmic_init();
irq_initialize_vectors();
cpu_irq_enable(); // abilito gli interrupt globali
board_init();
stdio_usb_init(); // inizializzo usb cdc mappata su stdio
//... altro codice
ioport_set_pin_dir(VSYNC, IOPORT_DIR_INPUT); // imposto VSYNC come input
ioport_set_port_mode(IOPORT_PORTC, 0xFF, IOPORT_MODE_PULLUP); // attivo la pullup su tutta la PORTC
ioport_set_pin_sense_mode(VSYNC, IOPORT_SENSE_FALLING); // ascolto il fronte di discesa su VSYNC
PORT_ConfigureInterrupt0( &PORTC, PORT_INT0LVL_HI_gc, 0xFF); // configuro ed attivo l'interrupt su tutti i pin
}
PS: il micro è un ATXMega32A4U ed utilizzo le librerie ASF 3.5.1