Im working on porting my code that I originally wrote to run on an avr to run on the arduino due. Its code I wrote for my CNC and I have 6 inputs (from limit switches) that I want to setup as pin change interrupts. I also have registers for setting up timer 3 (TC1 CH0) for pulsing the step input to the stepper drivers.
My problem is it doesn't get past the setup. I put print statements in and it seems to be getting stuck here.
//ENABLE INTERRUPTS FOR THE FOLLOWING PINS
REG_PIOA_IER |= ((0x01 << Z_OVERTRAVELPROX) | (0x01 << Z_UNDERTRAVELPROX));
REG_PIOB_IER |= (0x01 << X_OVERTRAVELPROX);
REG_PIOC_IER |= (0x01 << X_UNDERTRAVELPROX);
REG_PIOD_IER |= ((0x01 << Y_OVERTRAVELPROX) | (0x01 << Y_UNDERTRAVELPROX));
complete setup routine with defines
//OUTPUTS
#define X_STEP 16 //0x10 //PORTF0, X axis "STEP" Control Bit, PORTA P16, PIN A0
#define X_DIR 24 //0x1000000 //PORTF1, X Axis "DIRECTION" Control Bit, PORTA P24, PIN A1
#define X_EN 6 //0x40 //PORTD7, X Axis "ENABLE" Control Bit, PORTC P6, PIN D38
#define Y_STEP 3 //0x8 //PORTF6, Y axis "STEP" Control Bit, PORTA P3, PIN A6
#define Y_DIR 2 //0x4 //PORTF7, Y Axis "DIRECTION" Control Bit, PORTA P2, PIN A7
#define Y_EN 23 //0x800000 //PORTF2, Y Axis "ENABLE" Control Bit, PORTA P23, PIN A2
#define Z_STEP 17 //0x20000 //PORTL3, Z axis "STEP" Control Bit, PORTC P17, PIN D46
#define Z_DIR 15 //0x8000 //PORTL1, Z Axis "DIRECTION" Control Bit, PORTC P15, PIN D48
#define Z_EN 17 //0x20000 //PORTK0, Z Axis "ENABLE" Control Bit, PORTB P17, PIN A8
#define SPINDLE_PWM 1 //PWM signal to spindle speed control, ???
//INPUTS
#define X_OVERTRAVELPROX 25 //X Axis under travel prox input, PORTB P25, PIN D2
#define X_UNDERTRAVELPROX 28 //X Axis over travel prox input, PORTC P28, PIN D3
#define Y_OVERTRAVELPROX 5 //Y Axis under travel prox input, PORTD P5, PIN D15
#define Y_UNDERTRAVELPROX 4 //Y Axis over travel prox input, PORTD P4, PIN D14
#define Z_OVERTRAVELPROX 10 //Z Axis under travel prox input, PORTA P10, PIN D19
#define Z_UNDERTRAVELPROX 11 //Z Axis over travel prox input, PORTA P11, PIN D18
void setup() {
Serial.begin(19200);
Serial.println("CNC_v17");
//SET THE FOLLOWING PINS AS GPIO (ALLOW THEM TO BE USED AS INPUT/OUTPUT)
REG_PIOA_PER |= ((0x01 << X_STEP) | (0x01 << X_DIR) | (0x01 << Y_STEP) | (0x01 << Y_DIR) | (0x01 << Y_EN) | (0x01 << Z_OVERTRAVELPROX) | (0x01 << Z_UNDERTRAVELPROX));
REG_PIOB_PER |= ((0x01 << Z_EN) | (0x01 << X_OVERTRAVELPROX));
REG_PIOC_PER |= ((0x01 << X_EN) | (0x01 << Z_STEP) | (0x01 << Z_DIR) | (0x01 << X_UNDERTRAVELPROX));
REG_PIOD_PER |= ((0x01 << Y_OVERTRAVELPROX) | (0x01 << Y_UNDERTRAVELPROX));
//SET THE FOLLOWING PINS AS OUTPUT
REG_PIOA_OER |= ((0x01 << X_STEP) | (0x01 << X_DIR) | (0x01 << Y_STEP) | (0x01 << Y_DIR) | (0x01 << Y_EN));
REG_PIOB_OER |= (0x01 << Z_EN);
REG_PIOC_OER |= ((0x01 << X_EN) | (0x01 << Z_STEP) | (0x01 << Z_DIR));
//SET THE FOLLOWING PINS AS INPUT
REG_PIOA_ODR |= ((0x01 << Z_OVERTRAVELPROX) | (0x01 << Z_UNDERTRAVELPROX));
REG_PIOB_ODR |= (0x01 << X_OVERTRAVELPROX);
REG_PIOC_ODR |= (0x01 << X_UNDERTRAVELPROX);
REG_PIOD_ODR |= ((0x01 << Y_OVERTRAVELPROX) | (0x01 << Y_UNDERTRAVELPROX));
//ENABLE THE INTERNAL PULL-UP FOR THE FOLLOWING PINS
REG_PIOA_PUER |= ((0x01 << X_STEP) | (0x01 << X_DIR) | (0x01 << Y_STEP) | (0x01 << Y_DIR));
REG_PIOC_PUER |= ((0x01 << Z_STEP) | (0x01 << Z_DIR));
//DISABLE THE INTERNAL PULL-UP FOR THE FOLLOWING PINS
REG_PIOA_PUDR |= ((0x01 << Y_EN) | (0x01 << Z_OVERTRAVELPROX) | (0x01 << Z_UNDERTRAVELPROX));
REG_PIOB_PUDR |= ((0x01 << Z_EN) | (0x01 << X_OVERTRAVELPROX));
REG_PIOC_PUDR |= ((0x01 << X_EN) | (0x01 << X_UNDERTRAVELPROX));
REG_PIOD_PUDR |= ((0x01 << Y_OVERTRAVELPROX) | (0x01 << Y_UNDERTRAVELPROX));
//ENALBE AND SET INTERRUPT PRIORITY ON PORT A
pmc_enable_periph_clk(PIOA_IRQn);
NVIC_DisableIRQ(PIOA_IRQn);
NVIC_ClearPendingIRQ(PIOA_IRQn);
NVIC_SetPriority(PIOA_IRQn, 1);
NVIC_EnableIRQ(PIOA_IRQn);
//ENALBE AND SET INTERRUPT PRIORITY ON PORT B
pmc_enable_periph_clk(PIOB_IRQn);
NVIC_DisableIRQ(PIOB_IRQn);
NVIC_ClearPendingIRQ(PIOB_IRQn);
NVIC_SetPriority(PIOB_IRQn, 1);
NVIC_EnableIRQ(PIOB_IRQn);
//ENALBE AND SET INTERRUPT PRIORITY ON PORT C
pmc_enable_periph_clk(PIOC_IRQn);
NVIC_DisableIRQ(PIOC_IRQn);
NVIC_ClearPendingIRQ(PIOC_IRQn);
NVIC_SetPriority(PIOC_IRQn, 1);
NVIC_EnableIRQ(PIOC_IRQn);
//ENALBE AND SET INTERRUPT PRIORITY ON PORT D
pmc_enable_periph_clk(PIOD_IRQn);
NVIC_DisableIRQ(PIOD_IRQn);
NVIC_ClearPendingIRQ(PIOD_IRQn);
NVIC_SetPriority(PIOD_IRQn, 1);
NVIC_EnableIRQ(PIOD_IRQn);
//SET THE FOLLOWING PINS FOR PIN CHANGE INTERRUPT
REG_PIOA_AIMDR |= ((0x01 << Z_OVERTRAVELPROX) | (0x01 << Z_UNDERTRAVELPROX));
REG_PIOB_AIMDR |= (0x01 << X_OVERTRAVELPROX);
REG_PIOC_AIMDR |= (0x01 << X_UNDERTRAVELPROX);
REG_PIOD_AIMDR |= ((0x01 << Y_OVERTRAVELPROX) | (0x01 << Y_UNDERTRAVELPROX));
//ENABLE INTERRUPTS FOR THE FOLLOWING PINS
REG_PIOA_IER |= ((0x01 << Z_OVERTRAVELPROX) | (0x01 << Z_UNDERTRAVELPROX));
REG_PIOB_IER |= (0x01 << X_OVERTRAVELPROX);
REG_PIOC_IER |= (0x01 << X_UNDERTRAVELPROX);
REG_PIOD_IER |= ((0x01 << Y_OVERTRAVELPROX) | (0x01 << Y_UNDERTRAVELPROX));
//ENALBE INTERRUPT PRIORITY FOR TIMER 3
pmc_enable_periph_clk(TC3_IRQn);
NVIC_DisableIRQ(TC3_IRQn);
//SET BITS 14 AND 15 OF TIMER COUNTER MODE REGISTER FOR TC1 CH0
//BIT 14 = WAVESEL: Waveform Selection #2 UP_RC
//BIT 15 = WAVE: Wareform Mode Enable
REG_TC1_CMR0 = 0xC000;
//SET BITS 0 AND 2 OF TIMER COUNTER CONFIGURE REGISTER FOR TC1 CH0
//BIT 0 = ENABLE CLOCK
//BIT 2 = SOFTWARE TRIGGER
REG_TC1_CCR0 = 0x05;
//SET BIT 4 OF TIMER COUNTER INTERRUPT ENABLE REGISTER FOR TC1 CH0
//BIT 4 = CPCS: RC Compare Interrupt Enable
REG_TC1_IER0 = 0x10;
//THE FOLLOWING DISABLES ANY OTHER INTERRUPTS FOR TC1 CH0 THAT MIGHT BE ENABLED
REG_TC1_IDR0 = 0xEF;
//1ms = 1000Hz, 5ms = 200Hz
REG_TC1_RC0 = 200;
//ENABLE AND SET INTERRUPT PRIORITY FOR TIMER 3
NVIC_ClearPendingIRQ(TC3_IRQn);
NVIC_SetPriority(TC3_IRQn, 0);
NVIC_EnableIRQ(TC3_IRQn);
clearStack();
Serial.println("SETUP COMPLETE");
}
Any help would be appreciated
Also are there individual functions for each pin that is setup as an interrupt or just one for each port.