Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.63 KB | None | 0 0
  1. #include <stdint.h>
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4.  
  5. #define MX0_PIN 4
  6. #define MX1_PIN 5
  7. #define MX2_PIN 6
  8. #define MX3_PIN 7
  9. #define DEC_PIN 8
  10. #define INC_PIN 9
  11.  
  12. #define BAUD_RATE  16000000/16/31250-1 // 31250bps  // todo: detect actual baud rate?
  13.  
  14. class Encoder {
  15.   public:
  16.   byte state;
  17.   int  value;
  18.  
  19.   Encoder(){
  20.     state = 0;
  21.     value = 0;
  22.   }
  23.  
  24.   void next(byte tuple){
  25.     if ((state & 0b11) == tuple)
  26.       return;
  27.      
  28.     state = ((state << 2 ) | tuple ) & 0b111111;
  29.    
  30.     switch (state){
  31.       case 0b011100:
  32.       case 0b011110:
  33.       case 0b001110:
  34.         value = max( -64, value - 1 );
  35.         break;
  36.        
  37.       case 0b101100:
  38.       case 0b101101:
  39.       case 0b001101:
  40.         value = min( 63, value + 1 );
  41.         break;
  42.     }
  43.   }
  44.  
  45.   boolean hasUpdate(){
  46.     return value != 0;
  47.   }
  48.  
  49.   byte getUpdate(){
  50.     byte result = value;
  51.     value = 0;
  52.     return result;
  53.   }
  54.  
  55. };
  56.  
  57.  
  58. int main(){
  59.    
  60.   Encoder encs[8];
  61.   byte ctl[8] = {0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70};
  62.  
  63.   pinMode(MX0_PIN, OUTPUT); /* multiplexer switch bits https://www.ti.com/lit/ds/symlink/cd74hc4067.pdf */
  64.   pinMode(MX1_PIN, OUTPUT);
  65.   pinMode(MX2_PIN, OUTPUT);
  66.  
  67.   pinMode(MX3_PIN, OUTPUT);
  68.   digitalWrite(MX3_PIN, 0);
  69.  
  70.   pinMode(INC_PIN, INPUT_PULLUP );
  71.   digitalWrite(INC_PIN, HIGH);
  72.  
  73.   pinMode(DEC_PIN, INPUT_PULLUP );
  74.   digitalWrite(DEC_PIN, HIGH);
  75.  
  76.   unsigned int ubrr = BAUD_RATE;  
  77.  
  78.   /* Set Baudrate  */
  79.   UBRR0H = (ubrr>>8); // Shift the 16bit value ubrr 8 times to the right and transfer the upper 8 bits to UBBR0H register.
  80.   UBRR0L = (ubrr);    // Copy the 16 bit value ubrr to the 8 bit UBBR0L register,Upper 8 bits are truncated  
  81.  
  82.   UCSR0C = 0x06;       /* Set frame format: 8data, 1stop bit  */
  83.   UCSR0B = (1<<TXEN0); /* Enable  transmitter   */
  84.  
  85.  
  86.   byte tx1 = 0xFF;
  87.   byte tx2 = 0xFF;
  88.  
  89.   for(;;){
  90.     for (byte i = 0; i < 8; i++ ){
  91.       digitalWrite( MX0_PIN, i & 1 );
  92.       digitalWrite( MX1_PIN, (i>>1) & 1 );
  93.       digitalWrite( MX2_PIN, (i>>2) & 1 );
  94.  
  95.       byte tuple = ((digitalRead( INC_PIN ) << 1) | digitalRead( DEC_PIN )) ^ 0B11;
  96.      
  97.       encs[i].next( tuple );
  98.  
  99.       if ((UCSR0A & (1<<UDRE0))) {
  100.        
  101.         if (tx1 != 0xFF){ /* has pending byte */
  102.          
  103.           UDR0 = tx1;
  104.           tx1 = tx2;
  105.           tx2 = 0xFf; /* poor man's queue */
  106.  
  107.         } else if (encs[i].hasUpdate()) {
  108.  
  109.           UDR0 = 0xBA; /* hardcoded midi status byte */
  110.           tx1 = ctl[ i ]; /* controller number */
  111.           tx2 = encs[i].getUpdate() & 0x7F; /* increment */
  112.          
  113.         }
  114.       }      
  115.     }
  116.   }
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement