Rev 12 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include <stdint.h>#include <avr/pgmspace.h>#include <avr/io.h>#include <avr/interrupt.h>#include <avr/wdt.h>#define F_CPU 12000000#include <util/delay.h>#define sbi(sfr, bit) ((sfr) |= _BV(bit)) // Set bit#define cbi(sfr, bit) ((sfr) &= ~(_BV(bit))) // Clear bit#define xbi(sfr, bit) ((sfr) ^= _BV(bit)) // Flip bit//#define rbi(sfr, bit) ((sfr) ^= _BV(bit)) // Flip bit#define rbi(sfr, bit) (((sfr) >> (bit)) & 0x01)volatile uint8_t pcIntTrig = 0;volatile uint8_t pcIntCurr = 0;volatile uint8_t pcIntLast = 0;volatile uint8_t pcIntMask = 0;volatile uint8_t pcIntChg = 0;volatile uint8_t enc_dir=0;volatile uint8_t enc_last=0;volatile uint8_t enc_now=0;void doInt();int main() {cbi(DDRB, PCINT2);cbi(DDRB, PCINT3);PORTB |= (( 1 << PCINT2 ) | ( 1 << PCINT3 )); //turn on pullupsPCMSK |= (( 1 << PCINT2 ) | ( 1 << PCINT3 )); //enable encoder pins interrupt sourcessei();GIMSK |= ( 1 << PCIE ); //enable pin change interuptsDDRD |= ( 1 << PD4 );DDRD |= ( 1 << PD5 );DDRD |= ( 1 << PD6 );sbi(PORTD, PD6);_delay_ms(1000);cbi(PORTD, PD6);for (;;) {if (pcIntTrig == 1) {pcIntTrig = 0;// doInt();}}}void doInt() {if ((pcIntMask &= PCMSK) == 0)return;uint8_t biti;uint8_t i = 0;for (i=0; i<8; i++) {biti = 0x01 << i;if (biti & PCMSK) {pcIntChg |= (1 << i);}}xbi(PORTD, PD6);if (rbi(pcIntCurr, PCINT2) == 0 && rbi(pcIntCurr, PCINT3) == 0 && rbi(pcIntMask, PCINT2) ) {cbi(PORTD, PD5);sbi(PORTD, PD4);_delay_us(200);cbi(PORTD, PD4);} else if (rbi(pcIntCurr, PCINT3) == 0 && rbi(pcIntCurr, PCINT2) == 0 && rbi(pcIntMask, PCINT3) ) {cbi(PORTD, PD4);sbi(PORTD, PD5);_delay_us(500);cbi(PORTD, PD5);}}ISR(PCINT_vect){pcIntCurr = PINB;pcIntMask = pcIntCurr ^ pcIntLast;pcIntLast = pcIntCurr;pcIntTrig = 1;doInt();}