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 DEPRESS_TIME 1#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) >> (bit)) & 0x01)volatile uint8_t pcIntCurr = 0;volatile uint8_t pcIntLast = 0;volatile uint8_t pcIntMask = 0;volatile uint8_t timer0_ovf = 0;volatile uint8_t time_rot = 0;void doInt();int main() {cbi(DDRB, PCINT2);cbi(DDRB, PCINT3);TIMSK = (1<<TOIE0); // Eable timer overflow for Timer0TCNT0 = 0x00; // Set Timer0 to 0TCCR0B = (1<< CS02) | (1<<CS00); // /1024 prescalerPORTB |= (( 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 (!time_rot) {cbi(PORTD, PD4);cbi(PORTD, PD5);}if (pcIntMask)doInt();}}void doInt() {xbi(PORTD, PD6);if (rbi(pcIntCurr, PCINT2) == 0 && rbi(pcIntCurr, PCINT3) == 0 && rbi(pcIntMask, PCINT2) ) {cbi(PORTD, PD5);sbi(PORTD, PD4);time_rot = 5;} else if (rbi(pcIntCurr, PCINT3) == 0 && rbi(pcIntCurr, PCINT2) == 0 && rbi(pcIntMask, PCINT3) ) {cbi(PORTD, PD4);sbi(PORTD, PD5);time_rot = 5;}pcIntMask = 0;}ISR(TIMER0_OVF_vect) {timer0_ovf++;if (time_rot) {time_rot--;}}ISR(PCINT_vect){pcIntCurr = PINB;pcIntMask = pcIntCurr ^ pcIntLast;pcIntLast = pcIntCurr;}