Rev 17 | 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 Timer0
TCNT0 = 0x00; // Set Timer0 to 0
TCCR0B = (1<< CS01) | (1<<CS00); // /1024 prescaler
PORTB |= (( 1 << PCINT2 ) | ( 1 << PCINT3 )); //turn on pullups
PCMSK |= (( 1 << PCINT2 ) | ( 1 << PCINT3 )); //enable encoder pins interrupt sources
sei();
GIMSK |= ( 1 << PCIE ); //enable pin change interupts
DDRD |= ( 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++;
xbi(PORTD, PD6);
if (time_rot) {
time_rot--;
}
}
ISR(PCINT_vect)
{
pcIntCurr = PINB;
pcIntMask = pcIntCurr ^ pcIntLast;
pcIntLast = pcIntCurr;
}