fix: Fix IOCB config bits

This commit is contained in:
2024-03-06 11:28:33 +01:00
parent bbcdff189b
commit da5fca12d4
4 changed files with 50 additions and 12 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}