Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "avr/interrupt.h";
- #include "avr/io.h";
- #define enc0PinDT 3
- #define enc0PinCLK 4
- #define vol_up_pin 0
- #define vol_down_pin 1
- volatile unsigned int tick = 0;
- volatile unsigned long tickTime = 0;
- static boolean pins_on = false;
- static boolean rotating = false;
- static boolean lastTick = false;
- void setup()
- {
- pinMode(enc0PinDT, INPUT);
- pinMode(enc0PinCLK, INPUT);
- pinMode(vol_up_pin, OUTPUT);
- pinMode(vol_down_pin, OUTPUT);
- GIMSK = 0b00100000; // Enable pin change interrupts
- PCMSK = 0b00001000; // Enable pin change interrupt for PB3 and PB4
- sei(); // Turn on interrupts
- }
- void vol(boolean a){
- if (tick%7 == 0) {
- if (a)
- digitalWrite(vol_up_pin, HIGH);
- else
- digitalWrite(vol_down_pin, HIGH);
- pins_on = true;
- }
- }
- void loop()
- {
- unsigned long cMillis = millis();
- if (cMillis - tickTime > 1500 && tickTime != 0 && tick != 0) tick = 0;
- /* /optional */
- if (cMillis - tickTime > 5 && tickTime !=0 && pins_on) { // ontime interval for output pins are both 5ms
- digitalWrite(vol_up_pin, LOW);
- digitalWrite(vol_down_pin, LOW);
- pins_on = false;
- }
- /* \optional */
- while (rotating) {
- delay(1); // debounce the signal by waiting 1 ms
- tickTime = millis();
- int MSB = digitalRead(enc0PinDT); //most significant bit
- int LSB = digitalRead(enc0PinCLK); //least significant bit
- if(MSB == LSB) { //CW
- if (!lastTick) tick = 0;
- tick++;
- vol(true);
- lastTick = 1;
- } else { //CCW
- if (lastTick) tick = 0;
- tick++;
- vol(false);
- lastTick = 0;
- }
- rotating = false;
- }
- }
- ISR(PCINT0_vect)
- {
- rotating = true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement