Added start of input management infrastructure.
This commit is contained in:
parent
1f3e31c295
commit
d561b73feb
11
Makefile
11
Makefile
|
@ -8,10 +8,15 @@ flash: build
|
||||||
|
|
||||||
build: gympal.hex
|
build: gympal.hex
|
||||||
|
|
||||||
gympal.hex: src/gympal.c bin
|
gympal.hex: gympal.o control.o
|
||||||
avr-gcc -Wall -Os -DF_CPU=16000000UL -mmcu=atmega328p -c src/gympal.c -o bin/gympal.o
|
avr-gcc -Os -mmcu=atmega328p -o bin/gympal.elf bin/gympal.o bin/control.o
|
||||||
avr-gcc -Os -mmcu=atmega328p -o bin/gympal.elf bin/gympal.o
|
|
||||||
avr-objcopy -O ihex -R .eeprom bin/gympal.elf bin/gympal.hex
|
avr-objcopy -O ihex -R .eeprom bin/gympal.elf bin/gympal.hex
|
||||||
|
|
||||||
|
gympal.o: src/gympal.c bin
|
||||||
|
avr-gcc -Wall -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o bin/gympal.o src/gympal.c
|
||||||
|
|
||||||
|
control.o: src/control.c bin
|
||||||
|
avr-gcc -Wall -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o bin/control.o src/control.c
|
||||||
|
|
||||||
bin:
|
bin:
|
||||||
mkdir bin
|
mkdir bin
|
|
@ -0,0 +1,47 @@
|
||||||
|
#include "control.h"
|
||||||
|
|
||||||
|
volatile uint8_t CTL_INPUT_FLAGS = 0;
|
||||||
|
|
||||||
|
uint8_t readPin(uint8_t inputRegister, uint8_t inputPin) {
|
||||||
|
return (inputRegister & (1 << inputPin)) >> inputPin;
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(PCINT2_vect) {
|
||||||
|
cli();
|
||||||
|
uint8_t rotDt = readPin(PIND, CTL_ROTARY_ENCODER_DT_IN);
|
||||||
|
uint8_t rotClk = readPin(PIND, CTL_ROTARY_ENCODER_CLK_IN);
|
||||||
|
uint8_t buttonA = readPin(PIND, CTL_BUTTON_A_IN);
|
||||||
|
uint8_t buttonB = readPin(PIND, CTL_BUTTON_B_IN);
|
||||||
|
uint8_t buttonC = readPin(PIND, CTL_BUTTON_C_IN);
|
||||||
|
CTL_INPUT_FLAGS = (
|
||||||
|
(rotDt << CTL_ROTARY_ENCODER_DT_FLAG) |
|
||||||
|
(rotClk << CTL_ROTARY_ENCODER_CLK_FLAG) |
|
||||||
|
(buttonA << CTL_BUTTON_A_FLAG) |
|
||||||
|
(buttonB << CTL_BUTTON_B_FLAG) |
|
||||||
|
(buttonC << CTL_BUTTON_C_FLAG)
|
||||||
|
);
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ctl_init() {
|
||||||
|
// Set all control pins as input (0).
|
||||||
|
DDRD &= ~(
|
||||||
|
(1 << CTL_ROTARY_ENCODER_DT) |
|
||||||
|
(1 << CTL_ROTARY_ENCODER_CLK) |
|
||||||
|
(1 << CTL_BUTTON_A) |
|
||||||
|
(1 << CTL_BUTTON_B) |
|
||||||
|
(1 << CTL_BUTTON_C)
|
||||||
|
);
|
||||||
|
// Set up interrupts for handling control pin state changes.
|
||||||
|
// Luckily, all interrupts happen on PCINT[16..23] so we only need one interrupt to handle them all.
|
||||||
|
PCICR |= 1 << PCIE2; // Enable PCINT2_vector interrupts.
|
||||||
|
PCMSK2 |= (// Enable the flag for each input we want to cause interrupts on state change.
|
||||||
|
(1 << CTL_ROTARY_ENCODER_DT_INT) |
|
||||||
|
(1 << CTL_ROTARY_ENCODER_CLK_INT) |
|
||||||
|
(1 << CTL_BUTTON_A_INT) |
|
||||||
|
(1 << CTL_BUTTON_B_INT) |
|
||||||
|
(1 << CTL_BUTTON_C_INT)
|
||||||
|
);
|
||||||
|
// Enable the global interrupt flag.
|
||||||
|
sei();
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
#ifndef CONTROL_H
|
||||||
|
#define CONTROL_H
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
#define CTL_ROTARY_ENCODER_DT PORTD2
|
||||||
|
#define CTL_ROTARY_ENCODER_DT_IN PIND2
|
||||||
|
#define CTL_ROTARY_ENCODER_DT_INT PCINT18
|
||||||
|
#define CTL_ROTARY_ENCODER_DT_FLAG 0
|
||||||
|
|
||||||
|
#define CTL_ROTARY_ENCODER_CLK PORTD3
|
||||||
|
#define CTL_ROTARY_ENCODER_CLK_IN PIND3
|
||||||
|
#define CTL_ROTARY_ENCODER_CLK_INT PCINT19
|
||||||
|
#define CTL_ROTARY_ENCODER_CLK_FLAG 1
|
||||||
|
|
||||||
|
#define CTL_BUTTON_A PORTD5
|
||||||
|
#define CTL_BUTTON_A_IN PIND5
|
||||||
|
#define CTL_BUTTON_A_INT PCINT21
|
||||||
|
#define CTL_BUTTON_A_FLAG 2
|
||||||
|
|
||||||
|
#define CTL_BUTTON_B PORTD6
|
||||||
|
#define CTL_BUTTON_B_IN PIND6
|
||||||
|
#define CTL_BUTTON_B_INT PCINT22
|
||||||
|
#define CTL_BUTTON_B_FLAG 3
|
||||||
|
|
||||||
|
#define CTL_BUTTON_C PORTD7
|
||||||
|
#define CTL_BUTTON_C_IN PIND7
|
||||||
|
#define CTL_BUTTON_C_INT PCINT23
|
||||||
|
#define CTL_BUTTON_C_FLAG 4
|
||||||
|
|
||||||
|
extern volatile uint8_t CTL_INPUT_FLAGS;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes the user control inputs and interrupts.
|
||||||
|
*/
|
||||||
|
void ctl_init();
|
||||||
|
|
||||||
|
#endif
|
35
src/gympal.c
35
src/gympal.c
|
@ -1,33 +1,24 @@
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/interrupt.h>
|
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
|
|
||||||
volatile uint8_t a = 0;
|
#include "control.h"
|
||||||
|
|
||||||
void updatePin12(uint8_t status) {
|
|
||||||
PORTB = status << PORTB4;
|
|
||||||
}
|
|
||||||
|
|
||||||
ISR(PCINT2_vect) {
|
|
||||||
uint8_t value = (PIND & (1 << PIND5)) >> PIND5;
|
|
||||||
PORTB = value << PORTB4;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
PCICR |= 1 << PCIE2;
|
ctl_init();
|
||||||
PCMSK2 |= 1 << PCINT21;
|
// Just for testing the interrupts, we're setting up B4 as an indicator LED.
|
||||||
sei();
|
|
||||||
// Pin 12 == Port B4, aka 4th bit on the B register.
|
|
||||||
// Set pin 12 as output.
|
|
||||||
DDRB |= 1 << PORTB4;
|
DDRB |= 1 << PORTB4;
|
||||||
// Set pin 5 as input.
|
|
||||||
DDRD &= ~(1 << PORTD5);
|
|
||||||
PORTB &= ~(1 << PORTB4);
|
PORTB &= ~(1 << PORTB4);
|
||||||
|
uint8_t led = 0;
|
||||||
while(1) {
|
while(1) {
|
||||||
// updatePin12(ledOn);
|
uint8_t v = (CTL_INPUT_FLAGS & (1 << CTL_BUTTON_B_FLAG)) >> CTL_BUTTON_A_FLAG;
|
||||||
// ledOn = !ledOn;
|
if (led != v) {
|
||||||
// _delay_ms(1000.0);
|
led = v;
|
||||||
// DO NOTHING! rely on interrupt.
|
if (led) {
|
||||||
|
PORTB |= 1 << PORTB4;
|
||||||
|
} else {
|
||||||
|
PORTB &= ~(1 << PORTB4);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
Loading…
Reference in New Issue