PCINT: perche il mio programma non funziona??

Dov'è che sbaglio?

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))      //clear bit in sfr
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= ~_BV(bit))      //clear bit in sfr

#define Port_D2_Pin2 2         //PCINT18
#define Port_D3_Pin3 3         //PCINT19


volatile long unsigned eventTime=0;
volatile long unsigned previousEventTime=0;
volatile long unsigned timeSinceLastEvent=0;
volatile byte port_B_status=0;
volatile byte port_C_status=0;
volatile byte port_D_status=0;
volatile byte eventFlag =0;

void setup(){
  
Serial.begin(9600);
Serial.println("ARDUINO PCINT TOOS");

pinMode(Port_D2_Pin2, INPUT);         //Set port in Pull Up Mode
digitalWrite (Port_D2_Pin2, HIGH);      //pull-up mode enabled

pinMode(Port_D3_Pin3, INPUT);         //Set port in Pull Up Mode
digitalWrite (Port_D3_Pin3, HIGH);      //pull-up mode enabled


sbi(PCICR, PCIE2);  //Enable PCINT Interrupt For port D

sbi(PCMSK2, PCINT18);   //mask for Pin 2
sbi(PCMSK2, PCINT19);   //mask for Pin 3


}


void loop(){

if (eventFlag ==1 && (eventTime-previousEventTime>100)){

   timeSinceLastEvent = eventTime - previousEventTime;
   previousEventTime = eventTime;

   Serial.print(timeSinceLastEvent);
   Serial.println(" mS");
   Serial.println(port_D_status, BIN);

   eventFlag = 0;
   }  
}

//------[IRS ZONE]-------------------



//PORT D INTERRUPT MANAGER
ISR (PCINT2_vect)
{
 port_D_status = PIND;
 eventTime = millis();
 eventFlag = 1;
}

Due domande: leggo funzioni e parole che non ricordo tra quelle base, e non leggo inclusioni di librerie. Sono io che sbaglio? Seconda domanda: cosa signifixa "non funziona"? Può essere un "non compila e non so risolvere l'errore" (nel caso k'errore sarebbe gradito), un "non fa quello che voglio, ma fa ....", un "non fa nulla". Questo aiuterebbe chi sa, tra cui non mi annovero, ad aiutare. Inoltre mi permetto di dare un suggerimento generale: separa il programma il più possibile eseguendone solo una parte, vedendo e risolvendo in modo più facile gli errori eventualmente presenti. Se poi infarcisci il tutto di debug (Serial.println ("") messi nei punti giusti) fai anche meglio, poi li toglierai. Infine mi chiedo cksa vuoi fare?

Silente: Due domande: leggo funzioni e parole che non ricordo tra quelle base, e non leggo inclusioni di librerie. Sono io che sbaglio?

SI ... ... sono semplicemente nomi di registri e di porte interne alla MCU che il compilatore conosce perfettamente e che, per usare i quali, NON necessita di alcuna libreria.

Se ti interessa puoi fare riferimento al datasheet del ATmega328P e ... troverai il tutto. ;)

Guglielmo

>pinkfloyd11: ... senza star ad impazzire con chiamate a basso livello, per la gestione degli interrupt classici e di quelli relativi al pin-change, ti consiglio l'ottima libreria EnableInterrupt ... prova a dargli un occhiata ;)

Guglielmo

pinkfloyd11: Dov'è che sbaglio?

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))      //clear bit in sfr
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= ~_BV(bit))      //clear bit in sfr

Ciao pinkfloyd11, probabilmente visto il tempo passato avrai già risolto. Se così non fosse vorrei farti notare che probabilmente il codice corretto da inserire per il settaggio dei registri risulta il seguente:

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))      //clear bit in sfr
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))      //set bit in sfr

@Diego67, in base al regolamento punto 16.9 non si devono riaprire topic più vecchi di 9/12 mesi al massimo