diff --git a/picamp-rotary.X/picamp-rotary.c b/picamp-rotary.X/picamp-rotary.c index 1c8e882..de1e263 100644 --- a/picamp-rotary.X/picamp-rotary.c +++ b/picamp-rotary.X/picamp-rotary.c @@ -1,23 +1,41 @@ // Rotary encoder structs and enums #include "./picamp-rotary.h" + #define PIC16887A #ifdef PIC16887A -void __init_int(void) { +void __init_int(IOCPin RBA, IOCPin RBB) { // Global interrupt enable INTCONbits.GIE = 1; // External interrupt enable INTCONbits.INTE = 1; // Peripheral interrupt enable - // todo(wessel): Add PIR1, PIR2 registers INTCONbits.PEIE = 1; // PORTB Change Interrupt Enable INTCONbits.RBIE = 1; - // todo(wessel): make modulair - IOCBbits.IOCB4 = 1; - IOCBbits.IOCB5 = 1; + switch (RBA) { + case IOCB0: IOCBbits.IOCB0 = 1; break; + case IOCB1: IOCBbits.IOCB1 = 1; break; + case IOCB2: IOCBbits.IOCB2 = 1; break; + case IOCB3: IOCBbits.IOCB3 = 1; break; + case IOCB4: IOCBbits.IOCB4 = 1; break; + case IOCB5: IOCBbits.IOCB5 = 1; break; + case IOCB6: IOCBbits.IOCB6 = 1; break; + case IOCB7: IOCBbits.IOCB7 = 1; break; + } + + switch (RBB) { + case IOCB0: IOCBbits.IOCB0 = 1; break; + case IOCB1: IOCBbits.IOCB1 = 1; break; + case IOCB2: IOCBbits.IOCB2 = 1; break; + case IOCB3: IOCBbits.IOCB3 = 1; break; + case IOCB4: IOCBbits.IOCB4 = 1; break; + case IOCB5: IOCBbits.IOCB5 = 1; break; + case IOCB6: IOCBbits.IOCB6 = 1; break; + case IOCB7: IOCBbits.IOCB7 = 1; break; + } // Set interrupt edge OPTION_REGbits.INTEDG = 0; @@ -37,7 +55,7 @@ void __init_pin(volatile unsigned char* trisA, volatile unsigned char* trisB) { ANSELH = 0; } #elif PIC1829 -void __init_int(void) {} +void __init_int(IOCPin RBA, IOCPin RBB) {} void __init_pin(volatile unsigned char* trisA, volatile unsigned char* trisB) { // Set `trisA` and `trisB` as inputs *trisA = 1; @@ -60,9 +78,9 @@ void __init_pin(volatile unsigned char* trisA, volatile unsigned char* trisB) { * * @return void */ -void init_rotary(volatile unsigned char* trisA, volatile unsigned char* trisB) { +void init_rotary(volatile unsigned char* trisA, volatile unsigned char* trisB, IOCPin RBA, IOCPin RBB) { // Initialize the interrupt - __init_int(); + __init_int(RBA, RBB); // Initialize the pins __init_pin(trisA, trisB); diff --git a/picamp-rotary.X/picamp-rotary.h b/picamp-rotary.X/picamp-rotary.h index 857e0d2..9c71596 100644 --- a/picamp-rotary.X/picamp-rotary.h +++ b/picamp-rotary.X/picamp-rotary.h @@ -8,9 +8,19 @@ // #[declarations:rotary] typedef enum { ROTATE_LEFT = 1, ROTATE_RIGHT = 2 } RotaryEncoderStates; +typedef enum { + IOCB0 = 0, + IOCB1 = 1, + IOCB2 = 2, + IOCB3 = 3, + IOCB4 = 4, + IOCB5 = 5, + IOCB6 = 6, + IOCB7 = 7 +} IOCPin; // #[declarations:functions] void parse_rotary(char REA, char REB, char* counter, char max, char min); -void init_rotary(volatile unsigned char *trisA, volatile unsigned char *trisB); +void init_rotary(volatile unsigned char* trisA, volatile unsigned char* trisB, IOCPin RBA, IOCPin RBB); #endif diff --git a/picamp.X/include/rotary_encoder.h b/picamp.X/include/rotary_encoder.h index cce3d17..9c71596 100644 --- a/picamp.X/include/rotary_encoder.h +++ b/picamp.X/include/rotary_encoder.h @@ -8,9 +8,19 @@ // #[declarations:rotary] typedef enum { ROTATE_LEFT = 1, ROTATE_RIGHT = 2 } RotaryEncoderStates; +typedef enum { + IOCB0 = 0, + IOCB1 = 1, + IOCB2 = 2, + IOCB3 = 3, + IOCB4 = 4, + IOCB5 = 5, + IOCB6 = 6, + IOCB7 = 7 +} IOCPin; // #[declarations:functions] -void parse_rotary(char A, char B, char* counter, char max, char min); -void init_rotary(volatile unsigned char *trisA, volatile unsigned char *trisB); +void parse_rotary(char REA, char REB, char* counter, char max, char min); +void init_rotary(volatile unsigned char* trisA, volatile unsigned char* trisB, IOCPin RBA, IOCPin RBB); #endif diff --git a/picamp.X/src/main.c b/picamp.X/src/main.c index c0a4fe4..279ab17 100644 --- a/picamp.X/src/main.c +++ b/picamp.X/src/main.c @@ -60,7 +60,7 @@ void pic_init(void) { // T0INT_ENABLED, RBINT_ENABLED, FALLING_EDGE }; // init_int(int_config); - init_rotary(TRISBbits.TRISB4, TRISBbits.TRISB5); + init_rotary(TRISBbits.TRISB4, TRISBbits.TRISB5, IOCB4, IOCB5); init_pot(ADC_AN07, TRISEbits.TRISE2); }