void initLCD() { //No commands for 40ms OpenTimer2( T2_PS_1_256 | T2_ON, delay( 40 ) ); //Start Reset mPORTAClearBits( 1 << 3 ); mPORTASetPinsDigitalOut( 1 << 3 ); //Prep mPMPOpen( PMP_ON | PMP_TTL | PMP_READ_WRITE_EN | PMP_WRITE_POL_LO | PMP_READ_POL_LO, PMP_MODE_MASTER1 | PMP_WAIT_BEG_4 | PMP_WAIT_MID_15 | PMP_WAIT_END_4, PMP_PEN_0, PMP_INT_OFF ); //Wake Up! while( !mT2GetIntFlag() ); CloseTimer2(); mT2ClearIntFlag(); //End Reset mPORTASetBits( 1 << 3 ); //No Commands for 39us OpenTimer2( T2_PS_1_256 | T2_ON, delay( 40 ) ); //Wake Up! while( !mT2GetIntFlag() ); CloseTimer2(); mT2ClearIntFlag(); lcdCommand(LCD_ON); //Best boot 5-1-05 lcdCommand(0xA3); //LCD Bias (A2 A3) - First Choice lcdCommand(0x2F); //Turn on internal power control lcdCommand(0x26); //Pseudo-Contrast 7 = dark 6 = OK - First Choice lcdCommand(0x81); //Set contrast lcdCommand(40);//The Contrast (30 to 54 - Recommeneded) lcdCommand(0xC8); //Flip screen on the horizontal to match with the vertical software invertion lcdClear(); }
/********************************************************************* * Function: void InitSymbolTimer() * * PreCondition: none * * Input: none * * Output: none * * Side Effects: TMR0 for PIC18 is configured for calculating * the correct symbol times. TMR2/3 for PIC24/dsPIC * is configured for calculating the correct symbol * times * * Overview: This function will configure the UART for use at * in 8 bits, 1 stop, no flowcontrol mode * * Note: The timer interrupt is enabled causing the timer * roll over calculations. Interrupts are required * to be enabled in order to extend the timer to * 4 bytes in PIC18. PIC24/dsPIC version do not * enable or require interrupts ********************************************************************/ void InitSymbolTimer() { #if defined(__18CXX) TMR_CON = 0b00000000 | CLOCK_DIVIDER_SETTING; TMR_IP = 1; TMR_IF = 0; TMR_IE = 1; TMR_ON = 1; timerExtension1 = 0; timerExtension2 = 0; #elif defined(__dsPIC30F__) || defined(__dsPIC33F__) || defined(__PIC24F__) || defined(__PIC24FK__) || defined(__PIC24H__) T2CON = 0b0000000000001000 | CLOCK_DIVIDER_SETTING; T2CONbits.TON = 1; #elif defined(__PIC32MX__) #if defined (SECOND_PROTOTYPE) //Timer 3 freed for ADC rjk CloseTimer4(); WriteTimer4(0x00); WriteTimer5(0x00); WritePeriod5(0xFFFF); OpenTimer4((T4_ON|T4_32BIT_MODE_ON|CLOCK_DIVIDER_SETTING),0xFFFFFFFF); #else CloseTimer2(); WriteTimer2(0x00); WriteTimer3(0x00); WritePeriod3(0xFFFF); OpenTimer2((T2_ON|T2_32BIT_MODE_ON|CLOCK_DIVIDER_SETTING),0xFFFFFFFF); #endif #else #error "Symbol timer implementation required for stack usage." #endif }
extern void timerStop(timer * pTimer) { switch(pTimer->m_TimerNumber) { case 1: CloseTimer1(); break; case 2: CloseTimer2(); break; case 3: CloseTimer3(); break; case 4: CloseTimer4(); break; case 5: CloseTimer5(); break; } }
/**************************************************************************** Function PWM_end Parameters None. Returns None Description Disables the PWM sub-system. Notes Simply releases the lines and disables the timer Author Max Dunne, 2011.11.14 ****************************************************************************/ void PWM_end(void) { CloseTimer2(); CloseOC1(); CloseOC2(); CloseOC3(); CloseOC4(); CloseOC5(); usedChannels=0; }
void closeTimer(int timer) { switch(timer) { case 1: CloseTimer1(); break; case 2: CloseTimer2(); break; case 3: CloseTimer3(); break; case 4: CloseTimer4(); break; } }
// This thread is responsible for all the code not involving the TFT Display, it handled discharging and charging the capacitor and calculating the // capacitance of the capacitor. static PT_THREAD(protothread_cap(struct pt *pt)){ PT_BEGIN(pt); while(1){ // Discharge Capacitor // Set pin as output mPORTBSetPinsDigitalOut(BIT_3); // Drive RB3 low so capacitor can discharge into the pin mPORTBClearBits(BIT_3); // Yield until discharge is complete PT_YIELD_TIME_msec(2); // 2ms is given for the capacitor to discharge and for the display to update if needed Comp1Setup(); // Charge Capacitor // Set RB3 as an input to detect capacitor's current charge mPORTBSetPinsDigitalIn(BIT_3); // Set up the timer for charging the capcitor capTimerSetup(); // Set up the input capture to capture when the capacitor voltage reaches the reference voltage IC1setup(); // Yield while waiting for event from comparator PT_YIELD_UNTIL(pt, charged); CloseTimer2(); // Reset thread wait variable charged = 0; // Calculate capacitance in nF capacitance = (((charge_time*-1)/1000000)/(log(1-(VREF / VDD)) * RESISTOR))*1000000000; CMP1Close(); PT_YIELD_TIME_msec(20); } PT_END(pt); }
/********************************************************************* * Function: void InitSymbolTimer() * * PreCondition: none * * Input: none * * Output: none * * Side Effects: TMR0 for PIC18 is configured for calculating * the correct symbol times. TMR2/3 for PIC24/dsPIC * is configured for calculating the correct symbol * times * * Overview: This function will configure the UART for use at * in 8 bits, 1 stop, no flowcontrol mode * * Note: The timer interrupt is enabled causing the timer * roll over calculations. Interrupts are required * to be enabled in order to extend the timer to * 4 bytes in PIC18. PIC24/dsPIC version do not * enable or require interrupts ********************************************************************/ void InitSymbolTimer() { #if defined(__18CXX) T0CON = 0b00000000 | CLOCK_DIVIDER_SETTING; INTCON2bits.TMR0IP = 1; INTCONbits.TMR0IF = 0; INTCONbits.TMR0IE = 1; T0CONbits.TMR0ON = 1; timerExtension1 = 0; timerExtension2 = 0; #elif defined(__dsPIC30F__) || defined(__dsPIC33F__) || defined(__PIC24F__) || defined(__PIC24FK__) || defined(__PIC24H__) T2CON = 0b0000000000001000 | CLOCK_DIVIDER_SETTING; T2CONbits.TON = 1; #elif defined(__PIC32MX__) CloseTimer2(); WriteTimer2(0x00); WriteTimer3(0x00); WritePeriod3(0xFFFF); OpenTimer2((T2_ON|T2_32BIT_MODE_ON|CLOCK_DIVIDER_SETTING),0xFFFFFFFF); #else #error "Symbol timer implementation required for stack usage." #endif }
void ClearExternalIO(void) { int i; // GS I2C Start i2c_disable(); i2c_slave_disable(); // GS I2C End if (SerialConsole != 1) SerialClose(1); if (SerialConsole != 2) SerialClose(2); if (SerialConsole != 3) SerialClose(3); if (SerialConsole != 4) SerialClose(4); // stop the sound SoundPlay = 0; CloseTimer2(); #ifdef OLIMEX CloseOC1(); #else CloseOC2(); #endif inttbl[NBRPINS + 2].intp = NULL; // disable the tick interrupt for (i = 1; i < NBRPINS + 1; i++) { inttbl[i].intp = NULL; // disable all interrupts #ifdef OLIMEX #ifdef OLIMEX_DUINOMITE_EMEGA if (ExtCurrentConfig[i] != EXT_CONSOLE_RESERVED && i != 35 ) { // don't reset the serial console #else if (ExtCurrentConfig[i] != EXT_CONSOLE_RESERVED && i != 21 ) { // don't reset the serial console #endif #else if (ExtCurrentConfig[i] != EXT_CONSOLE_RESERVED) { // don't reset the serial console #endif ExtCfg(i, EXT_NOT_CONFIG); // all set to unconfigured ExtSet(i, 0); // all outputs (when set) default to low } } InterruptReturn = NULL; } /**************************************************************************************************************************** Initialise the I/O pins *****************************************************************************************************************************/ void initExtIO(void) { int i; for (i = 1; i < NBRPINS + 1; i++) { ExtCfg(i, EXT_NOT_CONFIG); // all set to unconfigured ExtSet(i, 0); // all outputs (when set) default to low } #ifndef OLIMEX CNCONbits.ON = 1; // turn on Change Notification module CNPUEbits.CNPUE1 = 1; // turn on the pullup for pin C13 also called CN1 #endif ExtCurrentConfig[0] = EXT_DIG_IN; // and show that we can read from it P_LED_TRIS = P_OUTPUT; // make the LED pin an output ExtSet(0, 0); // and turn it off #ifdef OLIMEX #ifdef OLIMEX_DUINOMITE_EMEGA ExtCurrentConfig[35] = EXT_ANA_IN; #else ExtCurrentConfig[21] = EXT_ANA_IN; #endif #endif // setup the analog (ADC) function AD1CON1 = 0x00E0; // automatic conversion after sampling AD1CSSL = 0; // no scanning required AD1CON2 = 0; // use MUXA, use AVdd & AVss as Vref+/- AD1CON3 = 0x203; //0x1F3F; // Tsamp = 32 x Tad; AD1CON1bits.ADON = 1; // turn on the ADC } /**************************************************************************************************************************** Configure an I/O pin Returns true if all is OK *****************************************************************************************************************************/ int ExtCfg(int pin, int cfg) { int tris, ana, oc; if (pin < 0 || pin > NBRPINS) return false; // initial sanity check // make sure that interrupts are disabled in case we are changing from an interrupt input #ifdef OLIMEX // if (pin == 5) ConfigINT2(EXT_INT_PRI_2 | RISING_EDGE_INT | EXT_INT_DISABLE); // if (pin == 6) ConfigINT3(EXT_INT_PRI_2 | RISING_EDGE_INT | EXT_INT_DISABLE); #ifdef OLIMEX_DUINOMITE_EMEGA #else if (pin == 7) ConfigINT4(EXT_INT_PRI_2 | RISING_EDGE_INT | EXT_INT_DISABLE); #endif #else if (pin == 11) ConfigINT1(EXT_INT_PRI_2 | RISING_EDGE_INT | EXT_INT_DISABLE); if (pin == 12) ConfigINT2(EXT_INT_PRI_2 | RISING_EDGE_INT | EXT_INT_DISABLE); if (pin == 13) ConfigINT3(EXT_INT_PRI_2 | RISING_EDGE_INT | EXT_INT_DISABLE); if (pin == 14) ConfigINT4(EXT_INT_PRI_2 | RISING_EDGE_INT | EXT_INT_DISABLE); #endif inttbl[pin].intp = NULL; // also disable a software interrupt on this pin switch (cfg) { case EXT_NOT_CONFIG: // #ifdef OLIMEX // if (pin == 5) {P_E5_TRIS = 1; P_E5_OC = 1;} // if (pin == 6) {P_E6_TRIS = 1; P_E6_OC = 1;} // if (pin == 11) {P_E11_TRIS = 1; P_E11_OC = 1;} // if (pin == 12) {P_E12_TRIS = 1; P_E12_OC = 1;} // #endif tris = 1; ana = 1; oc = 1; break; case EXT_ANA_IN: // #ifdef OLIMEX if (pin > 6 && pin < 19) return false; // if (pin == 5) {P_E5_TRIS = 1; P_E5_OC = 1;} // if (pin == 6) {P_E6_TRIS = 1; P_E6_OC = 1;} // #else // if (pin > 10) return false; // #endif tris = 1; ana = 0; oc = 1; break; case EXT_FREQ_IN: // same as counting, so fall through case EXT_PER_IN: // same as counting, so fall through case EXT_CNT_IN: // #ifdef OLIMEX // #else // if (pin == 11) { // INT1Count = INT1Value = 0; // ConfigINT1(EXT_INT_PRI_2 | RISING_EDGE_INT | EXT_INT_ENABLE); // tris = 1; ana = 1; oc = 1; // break; // } // #endif // #ifdef OLIMEX // if (pin == 5) { // P_E5_TRIS = 1; // P_E5_OC = 1; // #else // if (pin == 12) { // #endif // INT2Count = INT2Value = 0; // ConfigINT2(EXT_INT_PRI_2 | RISING_EDGE_INT | EXT_INT_ENABLE); // tris = 1; ana = 1; oc = 1; // break; // } // #ifdef OLIMEX // if (pin == 6) { // P_E6_TRIS = 1; // P_E6_OC = 1; // #else // if (pin == 13) { // #endif // INT3Count = INT3Value = 0; // ConfigINT3(EXT_INT_PRI_2 | RISING_EDGE_INT | EXT_INT_ENABLE); // tris = 1; ana = 1; oc = 1; // break; // } #ifdef OLIMEX_DUINOMITE_EMEGA break; #else #ifdef OLIMEX if (pin == 7) { #else if (pin == 14) { #endif INT4Count = INT4Value = 0; ConfigINT4(EXT_INT_PRI_2 | RISING_EDGE_INT | EXT_INT_ENABLE); tris = 1; ana = 1; oc = 1; break; } return false; // not an interrupt enabled pin #endif case EXT_INT_LO: // same as digital input, so fall through case EXT_INT_HI: // same as digital input, so fall through case EXT_DIG_IN: #ifdef OLIMEX // if (pin == 5) {P_E5_TRIS = 1; P_E5_OC = 1;} // if (pin == 6) {P_E6_TRIS = 1; P_E6_OC = 1;} // if (pin == 11) {P_E11_TRIS = 1; P_E11_OC = 1;} // if (pin == 12) {P_E12_TRIS = 1; P_E12_OC = 1;} #endif tris = 1; ana = 1; oc = 1; break; case EXT_DIG_OUT: #ifdef OLIMEX // if (pin == 11) {P_E11_TRIS = 1; P_E11_OC = 1;} //return false; // if (pin == 5) {P_E5_TRIS = 1; P_E5_OC = 1;} // if (pin == 6) {P_E6_TRIS = 1; P_E6_OC = 1;} // if (pin == 12) {P_E12_TRIS = 1; P_E12_OC = 1;} #endif tris = 0; ana = 1; oc = 0; break; case EXT_OC_OUT: #ifdef OLIMEX // if (pin == 11) {P_E11_TRIS = 1; P_E11_OC = 1;} //return false; // if (pin == 5) {P_E5_TRIS = 1; P_E5_OC = 1;} // if (pin == 6) {P_E6_TRIS = 1; P_E6_OC = 1;} // if (pin == 12) {P_E12_TRIS = 1; P_E12_OC = 1;} #else if (pin < 11) return false; #endif tris = 0; ana = 1; oc = 1; break; case EXT_COM_RESERVED: case EXT_CONSOLE_RESERVED: ExtCurrentConfig[pin] = cfg; // don't do anything except set the config type #ifdef OLIMEX // if (pin == 5) {P_E5_TRIS = 1; P_E5_OC = 1; P_E5_ANALOG = 1;} // if (pin == 6) {P_E6_TRIS = 1; P_E6_OC = 1; P_E6_ANALOG = 1;} // if (pin == 11) {P_E11_TRIS = 1; P_E11_OC = 1;} // if (pin == 12) {P_E12_TRIS = 1; P_E12_OC = 1;} #endif return true; default: return false; } ExtCurrentConfig[pin] = cfg; // set the TRIS and analog characteristics switch (pin) { case 1: P_E1_TRIS = tris; P_E1_OC = oc; P_E1_ANALOG = ana; break; case 2: P_E2_TRIS = tris; P_E2_OC = oc; P_E2_ANALOG = ana; break; case 3: P_E3_TRIS = tris; P_E3_OC = oc; P_E3_ANALOG = ana; break; case 4: P_E4_TRIS = tris; P_E4_OC = oc; P_E4_ANALOG = ana; break; case 5: P_E5_TRIS = tris; P_E5_OC = oc; P_E5_ANALOG = ana; break; case 6: P_E6_TRIS = tris; P_E6_OC = oc; P_E6_ANALOG = ana; break; #ifdef OLIMEX #ifdef OLIMEX_DUINOMITE_EMEGA case 7: P_E7_TRIS = tris; P_E7_OC = oc; P_E7_ANALOG = ana; break; case 8: P_E8_TRIS = tris; P_E8_OC = oc; break; case 9: P_E9_TRIS = tris; P_E9_OC = oc; break; case 10: P_E10_TRIS = tris; P_E10_OC = oc; break; #else case 7: P_E7_TRIS = tris; P_E7_OC = oc; break; case 8: if (!S.SDEnable) { P_E8_TRIS = tris; P_E8_OC = oc;} break; case 9: if (!S.SDEnable) { P_E9_TRIS = tris; P_E9_OC = oc;} break; case 10: if (!S.SDEnable) { P_E10_TRIS = tris; P_E10_OC = oc;} break; #endif #else case 7: P_E7_TRIS = tris; P_E7_OC = oc; P_E7_ANALOG = ana; break; case 8: P_E8_TRIS = tris; P_E8_OC = oc; P_E8_ANALOG = ana; break; case 9: P_E9_TRIS = tris; P_E9_OC = oc; P_E9_ANALOG = ana; break; case 10: P_E10_TRIS = tris; P_E10_OC = oc; P_E10_ANALOG = ana; break; #endif case 11: P_E11_TRIS = tris; P_E11_OC = oc; break; case 12: P_E12_TRIS = tris; P_E12_OC = oc; break; case 13: P_E13_TRIS = tris; P_E13_OC = oc; break; case 14: P_E14_TRIS = tris; P_E14_OC = oc; break; case 15: P_E15_TRIS = tris; P_E15_OC = oc; break; case 16: P_E16_TRIS = tris; P_E16_OC = oc; break; case 17: P_E17_TRIS = tris; P_E17_OC = oc; break; case 18: P_E18_TRIS = tris; P_E18_OC = oc; break; #ifdef OLIMEX // SPP + #ifdef OLIMEX_DUINOMITE_EMEGA // edit for DuinoMite eMega case 19: P_E19_TRIS = tris; P_E19_OC = oc; break; case 20: P_E20_TRIS = tris; P_E20_OC = oc; break; case 21: P_E21_TRIS = tris; P_E21_OC = oc; break; case 22: P_E22_TRIS = tris; P_E22_OC = oc; break; case 23: P_E23_TRIS = tris; P_E23_OC = oc; break; case 24: P_E24_TRIS = tris; P_E24_OC = oc; break; case 25: P_E25_TRIS = tris; P_E25_OC = oc; break; case 26: P_E26_TRIS = tris; P_E26_OC = oc; break; case 27: P_E27_TRIS = tris; P_E27_OC = oc; break; case 28: P_E28_TRIS = tris; P_E28_OC = oc; break; case 29: P_E29_TRIS = tris; P_E29_OC = oc; break; case 30: P_E30_TRIS = tris; P_E30_OC = oc; break; case 31: P_E31_TRIS = tris; P_E31_OC = oc; P_E31_ANALOG = ana; break; case 32: P_E32_TRIS = tris; P_E32_OC = oc; P_E31_ANALOG = ana; break; case 33: P_E33_TRIS = tris; P_E33_OC = oc; break; case 34: P_E34_TRIS = tris; P_E34_OC = oc; break; case 35: P_E35_TRIS = tris; P_E35_OC = oc; P_E31_ANALOG = ana; break; case 36: P_E36_TRIS = tris; P_E36_OC = oc; break; case 37: P_E37_TRIS = tris; P_E37_OC = oc; break; case 38: P_E38_TRIS = tris; P_E38_OC = oc; break; case 39: P_E39_TRIS = tris; P_E39_OC = oc; break; #else // original by Geoff Graham for DuinoMite Mega case 19: //if (!S.VideoMode) { P_E19_TRIS = tris; P_E19_OC = oc; P_E19_ANALOG = ana;//} break; case 20: if (!S.VideoMode || P_VGA_COMP) {P_E20_TRIS = tris; P_E20_OC = oc; P_E20_ANALOG = ana;} break; case 21: P_E21_TRIS = tris; P_E21_OC = oc; P_E21_ANALOG = ana; break; case 22: P_E22_TRIS = tris; P_E22_OC = oc; break; case 23: P_E23_TRIS = tris; P_E23_OC = oc; break; #endif // SPP - #else case 19: P_E19_TRIS = tris; P_E19_OC = oc; break; case 20: P_E20_TRIS = tris; P_E20_OC = oc; break; #endif #ifdef UBW32 case 21: P_E21_TRIS = tris; P_E21_OC = oc; break; case 22: P_E22_TRIS = tris; P_E22_OC = oc; break; case 23: P_E23_TRIS = tris; P_E23_OC = oc; break; case 24: P_E24_TRIS = tris; P_E24_OC = oc; break; case 25: P_E25_TRIS = tris; P_E25_OC = oc; break; case 26: P_E26_TRIS = tris; P_E26_OC = oc; break; case 27: P_E27_TRIS = tris; P_E27_OC = oc; break; case 28: P_E28_TRIS = tris; P_E28_OC = oc; break; case 29: P_E29_TRIS = tris; P_E29_OC = oc; break; case 30: P_E30_TRIS = tris; P_E30_OC = oc; break; case 31: P_E31_TRIS = tris; P_E31_OC = oc; break; case 32: P_E32_TRIS = tris; P_E32_OC = oc; break; case 33: P_E33_TRIS = tris; P_E33_OC = oc; break; case 34: P_E34_TRIS = tris; P_E34_OC = oc; break; case 35: P_E35_TRIS = tris; P_E35_OC = oc; break; case 36: P_E36_TRIS = tris; P_E36_OC = oc; break; case 37: P_E37_TRIS = tris; P_E37_OC = oc; break; case 38: P_E38_TRIS = tris; P_E38_OC = oc; break; case 39: P_E39_TRIS = tris; P_E39_OC = oc; break; case 40: P_E40_TRIS = tris; P_E40_OC = oc; break; case 41: P_E41_TRIS = tris; P_E41_OC = oc; break; case 42: P_E42_TRIS = tris; P_E42_OC = oc; break; case 43: P_E43_TRIS = tris; P_E43_OC = oc; break; case 44: P_E44_TRIS = tris; P_E44_OC = oc; break; case 45: P_E45_TRIS = tris; P_E45_OC = oc; break; case 46: P_E46_TRIS = tris; P_E46_OC = oc; break; case 47: P_E47_TRIS = tris; P_E47_OC = oc; break; case 48: P_E48_TRIS = tris; P_E48_OC = oc; break; case 49: P_E49_TRIS = tris; P_E49_OC = oc; break; case 50: P_E50_TRIS = tris; P_E50_OC = oc; break; #endif } if (cfg == EXT_NOT_CONFIG) ExtSet(pin, 0); // set the default output to low return true; } /**************************************************************************************************************************** Set the output of a digital I/O pin Returns true if all is OK *****************************************************************************************************************************/ int ExtSet(int pin, int val){ val = (val != 0); // non zero is on INTDisableInterrupts(); // setting an output bit is NOT atomic and a bit set operation // in an interrupt could result in this set corrupting the output switch (pin) { #ifdef UBW32 case 0: P_LED_OUT = !val; break; // this is the LED - the UBW32 wired them upside down !! #else case 0: P_LED_OUT = val; break; // this is the LED #endif case 1: P_E1_OUT = val; break; case 2: P_E2_OUT = val; break; case 3: P_E3_OUT = val; break; case 4: P_E4_OUT = val; break; case 5: P_E5_OUT = val; break; case 6: P_E6_OUT = val; break; case 7: P_E7_OUT = val; break; #ifdef OLIMEX #ifdef OLIMEX_DUINOMITE_EMEGA case 8: P_E8_OUT = val; break; case 9: P_E9_OUT = val; break; case 10: P_E10_OUT = val; break; #else case 8: if (!S.SDEnable) P_E8_OUT = val; break; case 9: if (!S.SDEnable) P_E9_OUT = val; break; case 10: if (!S.SDEnable) P_E10_OUT = val; break; #endif #else case 8: P_E8_OUT = val; break; case 9: P_E9_OUT = val; break; case 10: P_E10_OUT = val; break; #endif case 11: P_E11_OUT = val; break; case 12: P_E12_OUT = val; break; case 13: P_E13_OUT = val; break; case 14: P_E14_OUT = val; break; case 15: P_E15_OUT = val; break; case 16: P_E16_OUT = val; break; case 17: P_E17_OUT = val; break; case 18: P_E18_OUT = val; break; #ifdef OLIMEX #ifdef OLIMEX_DUINOMITE_EMEGA case 19: P_E19_OUT = val; break; case 20: P_E20_OUT = val; break; #else case 19: P_E19_OUT = val; break; case 20: if (!S.VideoMode || P_VGA_COMP) P_E20_OUT = val; break; case 22: P_E22_OUT = val ; break; case 23: P_E23_OUT = val ; break; #endif #else case 19: P_E19_OUT = val; break; case 20: P_E20_OUT = val; break; #endif #if defined UBW32 || defined OLIMEX_DUINOMITE_EMEGA case 21: P_E21_OUT = val; break; case 22: P_E22_OUT = val; break; case 23: P_E23_OUT = val; break; case 24: P_E24_OUT = val; break; case 25: P_E25_OUT = val; break; case 26: P_E26_OUT = val; break; case 27: P_E27_OUT = val; break; case 28: P_E28_OUT = val; break; case 29: P_E29_OUT = val; break; case 30: P_E30_OUT = val; break; case 31: P_E31_OUT = val; break; case 32: P_E32_OUT = val; break; case 33: P_E33_OUT = val; break; case 34: P_E34_OUT = val; break; case 35: P_E35_OUT = val; break; case 36: P_E36_OUT = val; break; case 37: P_E37_OUT = val; break; case 38: P_E38_OUT = val; break; case 39: P_E39_OUT = val; break; #endif #ifdef UBW32 case 40: P_E40_OUT = val; break; case 41: P_E41_OUT = val; break; case 42: P_E42_OUT = val; break; case 43: P_E43_OUT = val; break; case 44: P_E44_OUT = val; break; case 45: P_E45_OUT = val; break; case 46: P_E46_OUT = val; break; case 47: P_E47_OUT = val; break; case 48: P_E48_OUT = val; break; case 49: P_E49_OUT = val; break; case 50: P_E50_OUT = val; break; #endif default: INTEnableInterrupts(); return false; } INTEnableInterrupts(); return true; }
static void stopTimerRTT() { CloseTimer2(); }
static void stopPWM() { CloseTimer2(); OC1CONbits.OCM = 0; // PWM output disabled }
*****************************************************************************************************************/void __ISR( _TIMER_4_VECTOR, ipl1) T4Interrupt(void) { /////////////////////////// count up timers ///////////////////////////////////// //if(ExtCurrentConfig[11] == EXT_PER_IN) INT1Count++; // if we are measuring period increment the count if(ExtCurrentConfig[5] == EXT_PER_IN) INT2Count++; if(ExtCurrentConfig[6] == EXT_PER_IN) INT3Count++; if(ExtCurrentConfig[7] == EXT_PER_IN) INT4Count++; mSecTimer++; // used by the TIMER function TickTimer++; // used in the interrupt tick PauseTimer++; // used by the PAUSE command IntPauseTimer++; // used by the PAUSE command inside an interrupt InkeyTimer++; // used to delay on an escape character if(++CursorTimer > CURSOR_OFF + CURSOR_ON) CursorTimer = 0; // used to control cursor blink rate // GS I2C Start if (I2C_Timer) { if (--I2C_Timer == 0) { I2C_Status |= I2C_Status_Timeout; mI2C1MSetIntFlag(); } } if (I2C_Status & I2C_Status_MasterCmd) { if (!(I2C1STAT & _I2C1STAT_S_MASK)) { I2C_Status &= ~I2C_Status_MasterCmd; I2C_State = I2C_State_Start; I2C1CONSET =_I2C1CON_SEN_MASK; } } // GS I2C End #ifdef MAXIMITE if(SDActivityLED) { P_SD_LED_SET_HI; SDActivityLED--; } else P_SD_LED_SET_LO; #endif if(SD_CD) SDCardRemoved = true; // check if the sound has expired if(SoundPlay > 0) { // if we are still playing the sound SoundPlay--; if(SoundPlay == 0) { CloseTimer2(); #ifdef MAXIMITE CloseOC2(); #endif #ifdef OLIMEX CloseOC1(); #endif } } //////////////////////////////// keep track of the date and time //////////////////////////////// ////////////////////////////////// this code runs once a second ///////////////////////////////// if(++SecondsTimer >= 1000) { SecondsTimer = 0; // reset every second if(S.ScreenSave){ //if screen saver is enabled count it down if(ScreenSaveTime >0) ScreenSaveTime--; else mT3IntEnable(0); // turn off video int } //if(ExtCurrentConfig[11] == EXT_FREQ_IN) { INT1Value = INT1Count; INT1Count = 0; } if(ExtCurrentConfig[5] == EXT_FREQ_IN) { INT2Value = INT2Count; INT2Count = 0; } if(ExtCurrentConfig[6] == EXT_FREQ_IN) { INT3Value = INT3Count; INT3Count = 0; } if(ExtCurrentConfig[7] == EXT_FREQ_IN) { INT4Value = INT4Count; INT4Count = 0; } #ifdef MAXMITE if(++second >= 60) { // keep track of the time and date second = 0 ; if(++minute >= 60) { minute = 0; if(++hour >= 24) { hour = 0; if(++day > DaysInMonth[month + ((month == 2 && (year % 4) == 0)?1:0)]) { day = 1; if(++month > 12) { month = 1; year++; } } } } } #endif } // Clear the interrupt flag mT4ClearIntFlag(); //return; }
int main(int argc, char** argv) { /*Configuring POSC with PLL, with goal FOSC = 80 MHZ */ // Configure PLL prescaler, PLL postscaler, PLL divisor // Fin = 8 Mhz, 8 * (40/2/2) = 80 PLLFBD = 18; // M=40 // change to 38 for POSC 80 Mhz - this worked only on a single MCU for uknown reason CLKDIVbits.PLLPOST = 0; // N2=2 CLKDIVbits.PLLPRE = 0; // N1=2 // Initiate Clock Switch to Primary Oscillator with PLL (NOSC=0b011) //__builtin_write_OSCCONH(0x03); // tune FRC OSCTUN = 23; // 23 * 0.375 = 8.625 % -> 7.37 Mhz * 1.08625 = 8.005Mhz // Initiate Clock Switch to external oscillator NOSC=0b011 (alternative use FRC with PLL (NOSC=0b01) __builtin_write_OSCCONH(0b011); __builtin_write_OSCCONL(OSCCON | 0x01); // Wait for Clock switch to occur while (OSCCONbits.COSC!= 0b011); // Wait for PLL to lock while (OSCCONbits.LOCK!= 1); // local variables in main function int status = 0; int i = 0; int ax = 0, ay = 0, az = 0; int statusProxi[8]; int slowLoopControl = 0; UINT16 timerVal = 0; float timeElapsed = 0.0; //extern UINT8 pwmMotor; extern UINT16 speakerAmp_ref; extern UINT16 speakerFreq_ref; extern UINT8 proxyStandby; UINT16 dummy = 0x0000; setUpPorts(); delay_t1(50); PWMInit(); delay_t1(50); ctlPeltier = 0; PeltierVoltageSet(ctlPeltier); FanCooler(0); diagLED_r[0] = 100; diagLED_r[1] = 0; diagLED_r[2] = 0; LedUser(diagLED_r[0], diagLED_r[1],diagLED_r[2]); // Speaker initialization - set to 0,1 spi1Init(2, 0); speakerAmp_ref = 0; speakerAmp_ref_old = 10; speakerFreq_ref = 1; speakerFreq_ref_old = 10; int count = 0; UINT16 inBuff[2] = {0}; UINT16 outBuff[2] = {0}; while (speakerAmp_ref != speakerAmp_ref_old) { if (count > 5 ) { // Error ! //LedUser(100, 0, 0); break; } inBuff[0] = (speakerAmp_ref & 0x0FFF) | 0x1000; chipSelect(slaveVib); status = spi1TransferWord(inBuff[0], outBuff); chipDeselect(slaveVib); chipSelect(slaveVib); status = spi1TransferWord(inBuff[0], &speakerAmp_ref_old); chipDeselect(slaveVib); count++; } count = 0; while (speakerFreq_ref != speakerFreq_ref_old) { if (count > 5 ) { // Error ! //LedUser(0, 100, 0); break; } inBuff[0] = (speakerFreq_ref & 0x0FFF) | 0x2000; chipSelect(slaveVib); status = spi1TransferWord(inBuff[0], outBuff); chipDeselect(slaveVib); chipSelect(slaveVib); status = spi1TransferWord(inBuff[0], &speakerFreq_ref_old); chipDeselect(slaveVib); count++; } accPin = aSlaveR; accPeriod = 1.0 / ACC_RATE * 1000000.0; // in us; for ACC_RATE = 3200 Hz it should equal 312.5 us status = adxl345Init(accPin); ax = status; delay_t1(5); /* Init FFT coefficients */ TwidFactorInit(LOG2_FFT_BUFF, &Twiddles_array[0],0); delta_freq = (float)ACC_RATE / FFT_BUFF; // read 100 values to calculate bias int m; int n = 0; for (m = 0; m < 100; m++) { status = readAccXYZ(accPin, &ax, &ay, &az); if (status <= 0) { // } else { ax_b_l += ax; ay_b_l += ay; az_b_l += az; n++; } delay_t1(1); } ax_b_l /= n; ay_b_l /= n; az_b_l /= n; _SI2C2IE = 0; _SI2C2IF = 0; // Proximity sensors initalization I2C1MasterInit(); status = VCNL4000Init(); // Cooler temperature sensors initalization status = adt7420Init(0, ADT74_I2C_ADD_mainBoard); delay_t1(1); muxCh = I2C1ChSelect(1, 6); status = adt7420Init(0, ADT74_I2C_ADD_flexPCB); // Temperature sensors initialization statusTemp[0] = adt7320Init(tSlaveF, ADT_CONT_MODE | ADT_16_BIT); delay_t1(5); statusTemp[1] = adt7320Init(tSlaveR, ADT_CONT_MODE | ADT_16_BIT); delay_t1(5); statusTemp[2] = adt7320Init(tSlaveB, ADT_CONT_MODE | ADT_16_BIT); delay_t1(5); statusTemp[3] = adt7320Init(tSlaveL, ADT_CONT_MODE | ADT_16_BIT); delay_t1(5); // Temperature estimation initialization for (i = 0; i < 50; i++) { adt7320ReadTemp(tSlaveF, &temp_f); delay_t1(1); adt7320ReadTemp(tSlaveL, &temp_l); delay_t1(1); adt7320ReadTemp(tSlaveB, &temp_b); delay_t1(1); adt7320ReadTemp(tSlaveR, &temp_r); delay_t1(1); } tempBridge[0] = temp_f; tempBridge[1] = temp_r; tempBridge[2] = temp_b; tempBridge[3] = temp_l; if (statusTemp[0] != 1) temp_f = -1; if (statusTemp[1] != 1) temp_r = -1; if (statusTemp[2] != 1) temp_b = -1; if (statusTemp[3] != 1) temp_l = -1; // CASU ring average temperature temp_casu = 0; tempNum = 0; tempSensors = 0; for (i = 0; i < 4; i++) { if (statusTemp[i] == 1 && tempBridge[i] > 20 && tempBridge[i] < 60) { tempNum++; temp_casu += tempBridge[i]; tempSensors++; } } if (tempNum > 0) temp_casu /= tempNum; else temp_casu = -1; temp_casu1 = temp_casu; temp_wax = temp_casu; temp_wax1 = temp_casu; temp_model = temp_wax; temp_old[0] = temp_f; temp_old[1] = temp_r; temp_old[2] = temp_b; temp_old[3] = temp_l; temp_old[4] = temp_flexPCB; temp_old[5] = temp_pcb; temp_old[6] = temp_casu; temp_old[7] = temp_wax; for (i = 0; i < 4; i++) { uref_m[i] = temp_wax; } // Configure i2c2 as a slave device and interrupt priority 5 I2C2SlaveInit(I2C2_CASU_ADD, BB_I2C_INT_PRIORITY); // delay for 2 sec for(i = 0; i < 4; i ++) { delay_t1(500); ClrWdt(); } while (i2cStarted == 0) { delay_t1(200); ClrWdt(); } dma0Init(); dma1Init(); CloseTimer4(); ConfigIntTimer4(T4_INT_ON | TEMP_LOOP_PRIORITY); OpenTimer4(T4_ON | T4_PS_1_256, ticks_from_ms(2000, 256)); CloseTimer5(); ConfigIntTimer5(T5_INT_ON | FFT_LOOP_PRIORITY); OpenTimer5(T5_ON | T5_PS_1_256, ticks_from_ms(1000, 256)); diagLED_r[0] = 0; diagLED_r[1] = 0; diagLED_r[2] = 0; LedUser(diagLED_r[0], diagLED_r[1],diagLED_r[2]); start_acc_acquisition(); while(1) { ConfigIntTimer2(T2_INT_OFF); // Disable timer interrupt IFS0bits.T2IF = 0; // Clear interrupt flag OpenTimer2(T2_ON | T2_PS_1_256, 65535); // Configure timer if (!proxyStandby) { statusProxi[0] = I2C1ChSelect(1, 2); // Front proxy_f = VCNL4000ReadProxi(); delay_t1(1); statusProxi[1] = I2C1ChSelect(1, 4); // Back right proxy_br = VCNL4000ReadProxi(); delay_t1(1); statusProxi[2] = I2C1ChSelect(1, 3); // Front right proxy_fr = VCNL4000ReadProxi(); delay_t1(1); statusProxi[3] = I2C1ChSelect(1, 5); // Back proxy_b = VCNL4000ReadProxi(); delay_t1(1); statusProxi[4] = I2C1ChSelect(1, 0); // Back left proxy_bl = VCNL4000ReadProxi(); delay_t1(1); statusProxi[5] = I2C1ChSelect(1, 1); // Front left proxy_fl = VCNL4000ReadProxi(); delay_t1(1); } else { proxy_f = 0; // Front proxy_br = 0; // Back right proxy_fr = 0; // Front right proxy_b = 0; // Back proxy_bl = 0; // Back left proxy_fl = 0; // Front left } if (timer4_flag == 1) { // every 2 seconds CloseTimer4(); ConfigIntTimer4(T4_INT_ON | TEMP_LOOP_PRIORITY); timer4_flag = 0; if (dma_spi2_started == 0) { OpenTimer4(T4_ON | T4_PS_1_256, ticks_from_ms(2000, 256)); skip_temp_filter++; tempLoop(); } else { OpenTimer4(T4_ON | T4_PS_1_256, ticks_from_ms(50, 256)); } } if (dma_spi2_done == 1) { fftLoop(); dma_spi2_done = 0; } if ((timer5_flag == 1) || (new_vibration_reference == 1)) { // every 1 seconds CloseTimer5(); ConfigIntTimer5(T5_INT_ON | FFT_LOOP_PRIORITY); OpenTimer5(T5_ON | T5_PS_1_256, ticks_from_ms(1000, 256)); timer5_flag = 0; if (new_vibration_reference == 1) { //if(1){ CloseTimer3(); dma0Stop(); dma1Stop(); spi2Init(2, 0); dma0Init(); dma1Init(); chipDeselect(aSlaveR); IFS0bits.DMA0IF = 0; delay_t1(30); // transient response } new_vibration_reference = 0; start_acc_acquisition(); } // Cooler fan control if (fanCtlOn == 1) { if (temp_pcb >= 25 && fanCooler == FAN_COOLER_OFF) fanCooler = FAN_COOLER_ON; else if (temp_pcb <= 24 && fanCooler == FAN_COOLER_ON) fanCooler = FAN_COOLER_OFF; // In case of I2C1 fail turn on the fan if ((proxy_f == 0xFFFF) && (proxy_fr == 0xFFFF) && (proxy_br == 0xFFFF) && (proxy_b == 0xFFFF) && (proxy_bl == 0xFFFF) && (proxy_fl == 0xFFFF)) fanCooler = FAN_COOLER_ON; } else if (fanCtlOn == 2) fanCooler = FAN_COOLER_ON; else fanCooler = FAN_COOLER_OFF; //TEST // temp_f = temp_model; // if (temp_ref < 30) { // temp_r = smc_parameters[0] * 10; // } // else { // temp_r = smc_parameters[0] / 2.0 * 10.0; // } // temp_r = alpha*10; // temp_b = sigma_m * 10; // temp_l = sigma * 10; //temp_flexPCB = temp_ref_ramp; /* proxy_f = dma_spi2_started; proxy_fl = dma_spi2_done; proxy_bl = new_vibration_reference; proxy_b = timer5_flag; proxy_br = timer4_flag; */ int dummy_filt = 0; for (i = 0; i < 8; i++) { if (index_filter[i] > 0){ dummy_filt++; } } if (dummy_filt > 0) { filtered_glitch = dummy_filt; //for (i = 0; i< 8; index_filter[i++] = 0); } else { filtered_glitch = 0; } updateMeasurements(); timerVal = ReadTimer2(); CloseTimer2(); timeElapsed = ms_from_ticks(timerVal, 256); //if (timeElapsed < MAIN_LOOP_DUR) // delay_t1(MAIN_LOOP_DUR - timeElapsed); ClrWdt(); //Clear watchdog timer } // end while(1) return (EXIT_SUCCESS); }
void stopServos(){ CloseTimer2(); }
void hardwareInit(){ // Configure the device for maximum performance but do not change the PBDIV // Given the options, this function will change the flash wait states, RAM // wait state and enable prefetch cache but will not change the PBDIV. // The PBDIV value is already set via the pragma FPBDIV option above.. SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE); SYSTEMConfigPerformance(80000000); (_TRISF5)=INPUT; // for the reset sw ATX_DISENABLE(); CloseTimer2(); Pic32_Bowler_HAL_Init(); Bowler_Init(); clearPrint(); println_I("\n\n\nStarting PIC initialization"); FlashGetMac(MyMAC.v); DelayMs(2000);//This si to prevent runaway during programming // enable driven to 3.3v on uart 1 mPORTDOpenDrainClose(BIT_3); mPORTFOpenDrainClose(BIT_5); char macStr[13]; for (i=0;i<6;i++){ macStr[j++]=GetHighNib(MyMAC.v[i]); macStr[j++]=GetLowNib(MyMAC.v[i]); } macStr[12]=0; println_I("MAC address is ="); print_I(macStr); char * dev = "BowlerDevice"; println_I(dev); //This Method calls INTEnableSystemMultiVectoredInt(); usb_CDC_Serial_Init(dev,macStr,0x04D8,0x0001); addNamespaceToList((NAMESPACE_LIST *)getBcsCartesianNamespace()); addNamespaceToList((NAMESPACE_LIST *)getBcsPidNamespace()); ATX_ENABLE(); // Turn on ATX Supply, Must be called before talking to the Encoders!! println_I("Starting Encoders"); initializeEncoders();// Power supply must be turned on first println_I("Starting Heater"); initializeHeater(); println_I("Starting Servos"); initServos(); #if !defined(NO_PID) println_I("Starting PID"); initPIDLocal(); #endif initializeCartesianController(); DelayMs(100); if( GetPIDCalibrateionState(linkToHWIndex(0))!=CALIBRARTION_DONE&& GetPIDCalibrateionState(linkToHWIndex(1))!=CALIBRARTION_DONE&& GetPIDCalibrateionState(linkToHWIndex(2))!=CALIBRARTION_DONE ){ for(i=0;i<numPidMotors;i++){ SetPIDEnabled(i,true) ; } println_I("Running calibration for kinematics axis"); runPidHysterisisCalibration(linkToHWIndex(0)); runPidHysterisisCalibration(linkToHWIndex(1)); runPidHysterisisCalibration(linkToHWIndex(2)); DelayMs(100);//wait for ISR to fire and update all values for(i=0;i<3;i++){ setPIDConstants(linkToHWIndex(i),.2,.1,0); } OnPidConfigure(0); }else{ println_W("Axis are already calibrated"); } pid.MsTime=getMs(); //startHomingLinks(); disableSerialComs(true) ; (_TRISB0)=1; SetColor(1,1,1); HEATER_2_TRIS = OUTPUT; //HEATER_1_TRIS = OUTPUT; // Causes one of the axies to crawl downward in bursts when enabled and on... //HEATER_0_TRIS = OUTPUT; // causes device to twitc. These are touched by the USB stack somehow..... and as the reset button }