void initPorts(void) { #ifdef __MSP430_HAS_PORT1_R__ GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P1, GPIO_ALL); #endif #ifdef __MSP430_HAS_PORT2_R__ GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P2, GPIO_ALL); #endif #ifdef __MSP430_HAS_PORT3_R__ GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P3, GPIO_ALL); #endif #ifdef __MSP430_HAS_PORT4_R__ GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P4, GPIO_ALL); #endif #ifdef __MSP430_HAS_PORT5_R__ GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P5, GPIO_ALL); #endif #ifdef __MSP430_HAS_PORT6_R__ GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P6, GPIO_ALL); #endif #ifdef __MSP430_HAS_PORT7_R__ GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P7, GPIO_ALL); #endif #ifdef __MSP430_HAS_PORT8_R__ GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P8, GPIO_ALL); #endif #ifdef __MSP430_HAS_PORT9_R__ GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P9, GPIO_ALL); #endif #ifdef __MSP430_HAS_PORTJ_R__ GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_PJ, GPIO_ALL); #endif #ifdef __MSP430FR4133 // Unlock pins (required for FRAM devices) PMM_unlockLPM5(); #endif #ifdef __MSP430FR5969 // Unlock pins (required for FRAM devices) PMM_unlockLPM5(); #endif }
void activate_GPIO_config(void){ /*Scope: Run after configured GPIO to activate the config*/ // Disable the GPIO power-on default high-impedance mode to activate // previously configured port settings PMM_unlockLPM5(); //PM5CTL0 &= ~LOCKLPM5; }
/**********************************************************************//** * @brief Initializes the System * * @param none * * @return none *************************************************************************/ void SystemInit(void) { // Set the DCO to 8MHz (it's also the device's power-on setting). Do not change this frequency! // It impacts the cap touch scan window. CS_setDCOFreq(__MSP430_BASEADDRESS_CS__, CS_DCORSEL_0, CS_DCOFSEL_6); // Configure clock source and clock dividers. After this the clock configuration will be as follows: // ACLK=LFXT1/1=32,768Hz; SMCLK=DCOCLK/1=8MHz; and MCLK=DCOCLK/1=8MHz. CS_clockSignalInit(__MSP430_BASEADDRESS_CS__, CS_ACLK, CS_LFXTCLK_SELECT, CS_CLOCK_DIVIDER_1); CS_clockSignalInit(__MSP430_BASEADDRESS_CS__, CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1); CS_clockSignalInit(__MSP430_BASEADDRESS_CS__, CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1); // Set all GPIO to output low to minimize current draw by eliminating floating pins. GPIO_setOutputLowOnPin(GPIO_PORT_PA, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 | GPIO_PIN8 | GPIO_PIN9 | GPIO_PIN10 | GPIO_PIN11 | GPIO_PIN12 | GPIO_PIN13 | GPIO_PIN14 | GPIO_PIN15); GPIO_setOutputLowOnPin(GPIO_PORT_PB, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 | GPIO_PIN8 | GPIO_PIN9 | GPIO_PIN10 | GPIO_PIN11 | GPIO_PIN12 | GPIO_PIN13 | GPIO_PIN14 | GPIO_PIN15); GPIO_setOutputLowOnPin(GPIO_PORT_PJ, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN6 | GPIO_PIN7 | GPIO_PIN8 | GPIO_PIN9 | GPIO_PIN10 | GPIO_PIN11 | GPIO_PIN12 | GPIO_PIN13 | GPIO_PIN14 | GPIO_PIN15); GPIO_setAsOutputPin(GPIO_PORT_PA, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 | GPIO_PIN8 | GPIO_PIN9 | GPIO_PIN10 | GPIO_PIN11 | GPIO_PIN12 | GPIO_PIN13 | GPIO_PIN14 | GPIO_PIN15); GPIO_setAsOutputPin(GPIO_PORT_PB, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 | GPIO_PIN8 | GPIO_PIN9 | GPIO_PIN10 | GPIO_PIN11 | GPIO_PIN12 | GPIO_PIN13 | GPIO_PIN14 | GPIO_PIN15); GPIO_setAsOutputPin(GPIO_PORT_PJ, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN6 | GPIO_PIN7 | GPIO_PIN8 | GPIO_PIN9 | GPIO_PIN10 | GPIO_PIN11 | GPIO_PIN12 | GPIO_PIN13 | GPIO_PIN14 | GPIO_PIN15); // Configure the left button (S2) connected to P4.6. For this enable the internal pull-up resistor and // setup the pin interrupt to trigger on rising edges. GPIO_setAsInputPinWithPullUpresistor(GPIO_PORT_P4, GPIO_PIN5); GPIO_interruptEdgeSelect(GPIO_PORT_P4, GPIO_PIN5, GPIO_LOW_TO_HIGH_TRANSITION); GPIO_clearInterruptFlag(GPIO_PORT_P4, GPIO_PIN5); GPIO_enableInterrupt(GPIO_PORT_P4, GPIO_PIN5); // Configure the right button (S3) connected to P1.1. For this enable the internal pull-up resistor and // setup the pin interrupt to trigger on rising edges. GPIO_setAsInputPinWithPullUpresistor(GPIO_PORT_P1, GPIO_PIN1); GPIO_interruptEdgeSelect(GPIO_PORT_P1, GPIO_PIN1, GPIO_LOW_TO_HIGH_TRANSITION); GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1); GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1); // CapSense Setup. GPIO pins P1.3-1.5 and P3.4-3.6 are used for capacitive touch so let's // switch them to inputs. // GPIO_setAsInputPin(GPIO_PORT_P1, GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5); GPIO_setAsInputPin(GPIO_PORT_P3, GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6); // Enable LFXT functionality on PJ.4 and PJ.5. For this we only need to configure PJ.4 to // LFXIN and the port module logic takes care of the rest. GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_PJ, GPIO_PIN4, GPIO_PRIMARY_MODULE_FUNCTION); // Disable the GPIO power-on default high-impedance mode to activate previously configured port settings PMM_unlockLPM5(__MSP430_BASEADDRESS_PMM_FRAM__); // Perform the required LFXT startup procedure now that all of the port pins are configured. CS_setExternalClockSource(__MSP430_BASEADDRESS_CS__, 32768, 0); CS_LFXTStart(__MSP430_BASEADDRESS_CS__, CS_LFXT_DRIVE0); // Initialize LCD driver and the context for the LCD Sharp96x96_LCDInit(); TA0_enableVCOMToggle(); GrContextInit(&sContext, &g_sharp96x96LCD); GrContextForegroundSet(&sContext, ClrBlack); GrContextBackgroundSet(&sContext, ClrWhite); onLED(); //blink LED1 }
void unusedPinsConfiguration(void) { GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P1, allPins); GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P2, allPins); GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P3, allPins); GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P4, allPins); GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_PJ, allPins); PMM_unlockLPM5(); }
int main(void) { //Default MCLK = 1MHz unsigned int i = 0; unsigned char dialValue = 0x01; WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer initialiseLedDial(); // Disable the GPIO power-on default high-impedance mode // to activate previously configured port settings PMM_unlockLPM5(); unsigned int S,j,k=1; //S=1; while(1) { S=GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN3); if(S==0) k=-k; //dialValue = dialValue * 0x02; //if(0x00 == dialValue) // dialValue = 0x01; //Set value if(k==1) { for(j=0;j<8;j++) { setLedDial(dialValue); dialValue=dialValue<<1; //Refresh display (10 times for each position) for(i = 0; i < 10; i++) refreshLedDial(); } dialValue = 0x01; } else { dialValue=0x80; for(j=0;j<8;j++) { setLedDial(dialValue); dialValue=dialValue>>1; //Refresh display (10 times for each position) for(i = 0; i < 10; i++) refreshLedDial(); } dialValue = 0x01; } } }
static void prvSetupHardware( void ) { /* Stop Watchdog timer. */ WDT_A_hold( __MSP430_BASEADDRESS_WDT_A__ ); /* Set all GPIO pins to output and low. */ GPIO_setOutputLowOnPin( GPIO_PORT_P1, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 ); GPIO_setOutputLowOnPin( GPIO_PORT_P2, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 ); GPIO_setOutputLowOnPin( GPIO_PORT_P3, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 ); GPIO_setOutputLowOnPin( GPIO_PORT_P4, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 ); GPIO_setOutputLowOnPin( GPIO_PORT_PJ, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 | GPIO_PIN8 | GPIO_PIN9 | GPIO_PIN10 | GPIO_PIN11 | GPIO_PIN12 | GPIO_PIN13 | GPIO_PIN14 | GPIO_PIN15 ); GPIO_setAsOutputPin( GPIO_PORT_P1, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 ); GPIO_setAsOutputPin( GPIO_PORT_P2, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 ); GPIO_setAsOutputPin( GPIO_PORT_P3, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 ); GPIO_setAsOutputPin( GPIO_PORT_P4, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 ); GPIO_setAsOutputPin( GPIO_PORT_PJ, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7 | GPIO_PIN8 | GPIO_PIN9 | GPIO_PIN10 | GPIO_PIN11 | GPIO_PIN12 | GPIO_PIN13 | GPIO_PIN14 | GPIO_PIN15 ); /* Configure P2.0 - UCA0TXD and P2.1 - UCA0RXD. */ GPIO_setOutputLowOnPin( GPIO_PORT_P2, GPIO_PIN0 ); GPIO_setAsOutputPin( GPIO_PORT_P2, GPIO_PIN0 ); GPIO_setAsPeripheralModuleFunctionInputPin( GPIO_PORT_P2, GPIO_PIN1, GPIO_SECONDARY_MODULE_FUNCTION ); GPIO_setAsPeripheralModuleFunctionOutputPin( GPIO_PORT_P2, GPIO_PIN0, GPIO_SECONDARY_MODULE_FUNCTION ); /* Set PJ.4 and PJ.5 for LFXT. */ GPIO_setAsPeripheralModuleFunctionInputPin( GPIO_PORT_PJ, GPIO_PIN4 + GPIO_PIN5, GPIO_PRIMARY_MODULE_FUNCTION ); /* Set DCO frequency to 8 MHz. */ CS_setDCOFreq( CS_DCORSEL_0, CS_DCOFSEL_6 ); /* Set external clock frequency to 32.768 KHz. */ CS_setExternalClockSource( 32768, 0 ); /* Set ACLK = LFXT. */ CS_initClockSignal( CS_ACLK, CS_LFXTCLK_SELECT, CS_CLOCK_DIVIDER_1 ); /* Set SMCLK = DCO with frequency divider of 1. */ CS_initClockSignal( CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1 ); /* Set MCLK = DCO with frequency divider of 1. */ CS_initClockSignal( CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1 ); /* Start XT1 with no time out. */ CS_turnOnLFXT( CS_LFXT_DRIVE_0 ); /* Disable the GPIO power-on default high-impedance mode. */ PMM_unlockLPM5(); }
int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer // Disable the GPIO power-on default high-impedance mode // to activate previously configured port settings PMM_unlockLPM5(); //bools for running control logic for each switch bool running = false; bool running2 = false; //initialise systems init(); __enable_interrupt(); //stores data returned from colour sensor struct colour detectedColour; //stores MM decision from comparator enum mmColours detectedMM; //initialise counts to 0 numOfMMs.red = 0; numOfMMs.orange = 0; numOfMMs.yellow = 0; numOfMMs.brown = 0; numOfMMs.green = 0; numOfMMs.blue = 0; //number of mms sorted in current batch int mmSorted = 0; //main loop while(1) { //switch 2 has interrupted if (SW2_interruptFlag_) { //ignore input from button for 0.1s __delay_cycles(100000); SW2_interruptFlag_ = false; //start sorting running = true; } //switch 1 has interrupted else if (SW1_interruptFlag_) { SW1_interruptFlag_ = false; //update LCD with next value running2 = true; } if (running2) { //display next mm count on the LCD showNextCount(); updateLCDWithCount(numOfMMs); running2 = false; } while (running) { //wait for an mm to enter seperator __delay_cycles(500000); //move seperator to colour sensor changeServoADutyCycle(0x32); //wait for mm to enter detection chamber __delay_cycles(300000); //run sensor detectedColour = runSensor(); //compare sensor reading to calibration data detectedMM = decideColour(detectedColour); //increse count for detected MM by 1 incrementCount(detectedMM); //run sorter moveSorter(detectedMM); __delay_cycles(1000000); //move seperator to exit changeServoADutyCycle(0x50); //wait for mm to drop __delay_cycles(700000); //move seperator to entrance changeServoADutyCycle(0x20); //reset servo b changeServoBDutyCycle(0x20); __delay_cycles(1000000); //sorted one more from current batch mmSorted++; if (mmSorted == 1) { running = false; mmSorted = 0; updateLCDWithCount(numOfMMs); } //stop if the button is pressed if (SW2_interruptFlag_) { __delay_cycles(100000); SW2_interruptFlag_ = false; running = false; mmSorted = 0; updateLCDWithCount(numOfMMs); } } } }