Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void pcint_isr_func(volatile u8t * PINx, u8t & changed_bits, u8t offset){
- u8t registerBit = 0;
- bool callable = false;
- for( ; registerBit < sizeof(changed_bits)*8; ++registerBit){
- if(is_bit_on(changed_bits, registerBit)){
- break;
- }
- }
- u8t pcint_no = registerBit+offset;
- switch (pc_int_isr_vect[pcint_no].edge) {
- case ANY_EDGE:
- callable = true;
- break;
- case RISING:
- if (*PINx & bitValue(registerBit)) {
- callable = true;
- }
- break;
- case LOW_LEVEL:
- case FALLING:
- if (*PINx & (1<<registerBit) == 0 ) {
- callable = true;
- }
- break;
- default:
- return;
- }
- if(callable){
- if( nullptr != pc_int_isr_vect[pcint_no].user_cb){
- pc_int_isr_vect[pcint_no].user_cb(registerBit+offset);
- }
- else if(nullptr != pc_int_isr_vect[pcint_no].context) {
- SystemEventHandler::call_int_callback(pc_int_isr_vect[pcint_no].context, pcint_no);
- }
- }
- }
- volatile u8t port_b_history = PINB; // start whith pulled-up pins ;
- ISR(PCINT0_vect){
- u8t changed_bits = PINB ^ port_b_history;
- port_b_history = PINB;
- pcint_isr_func(&port_b_history, changed_bits, 0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement