Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdint.h>
- #include <avr/io.h>
- #include <util/delay.h>
- #define MX0_PIN 4
- #define MX1_PIN 5
- #define MX2_PIN 6
- #define MX3_PIN 7
- #define DEC_PIN 8
- #define INC_PIN 9
- #define BAUD_RATE 16000000/16/31250-1 // 31250bps // todo: detect actual baud rate?
- class Encoder {
- public:
- byte state;
- int value;
- Encoder(){
- state = 0;
- value = 0;
- }
- void next(byte tuple){
- if ((state & 0b11) == tuple)
- return;
- state = ((state << 2 ) | tuple ) & 0b111111;
- switch (state){
- case 0b011100:
- case 0b011110:
- case 0b001110:
- value = max( -64, value - 1 );
- break;
- case 0b101100:
- case 0b101101:
- case 0b001101:
- value = min( 63, value + 1 );
- break;
- }
- }
- boolean hasUpdate(){
- return value != 0;
- }
- byte getUpdate(){
- byte result = value;
- value = 0;
- return result;
- }
- };
- int main(){
- Encoder encs[8];
- byte ctl[8] = {0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70};
- pinMode(MX0_PIN, OUTPUT); /* multiplexer switch bits https://www.ti.com/lit/ds/symlink/cd74hc4067.pdf */
- pinMode(MX1_PIN, OUTPUT);
- pinMode(MX2_PIN, OUTPUT);
- pinMode(MX3_PIN, OUTPUT);
- digitalWrite(MX3_PIN, 0);
- pinMode(INC_PIN, INPUT_PULLUP );
- digitalWrite(INC_PIN, HIGH);
- pinMode(DEC_PIN, INPUT_PULLUP );
- digitalWrite(DEC_PIN, HIGH);
- unsigned int ubrr = BAUD_RATE;
- /* Set Baudrate */
- UBRR0H = (ubrr>>8); // Shift the 16bit value ubrr 8 times to the right and transfer the upper 8 bits to UBBR0H register.
- UBRR0L = (ubrr); // Copy the 16 bit value ubrr to the 8 bit UBBR0L register,Upper 8 bits are truncated
- UCSR0C = 0x06; /* Set frame format: 8data, 1stop bit */
- UCSR0B = (1<<TXEN0); /* Enable transmitter */
- byte tx1 = 0xFF;
- byte tx2 = 0xFF;
- for(;;){
- for (byte i = 0; i < 8; i++ ){
- digitalWrite( MX0_PIN, i & 1 );
- digitalWrite( MX1_PIN, (i>>1) & 1 );
- digitalWrite( MX2_PIN, (i>>2) & 1 );
- byte tuple = ((digitalRead( INC_PIN ) << 1) | digitalRead( DEC_PIN )) ^ 0B11;
- encs[i].next( tuple );
- if ((UCSR0A & (1<<UDRE0))) {
- if (tx1 != 0xFF){ /* has pending byte */
- UDR0 = tx1;
- tx1 = tx2;
- tx2 = 0xFf; /* poor man's queue */
- } else if (encs[i].hasUpdate()) {
- UDR0 = 0xBA; /* hardcoded midi status byte */
- tx1 = ctl[ i ]; /* controller number */
- tx2 = encs[i].getUpdate() & 0x7F; /* increment */
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement