int main (void) { // _DOZE = 0; _RCDIV = 0; //pin mapping PinMapping(); //Initialize the outputs OutputInit(); // Set up the timer TimerInit(); _system_flags.uart_hi_speed = 1; if (_system_flags.uart_hi_speed) { // divisor=8 for 460800bps initUART(8); } else { initUART(34); } //Initialize the system SYSTEMInit(); ADCinit(); //Initialize the button processes BtnInit(); //Initialize the system flags FLAGInit(); // variable to hold number of times we've passed the 50 msec counter without completing a UART receive char receivedCtr=0; while (1) { // check continuity to PIC if(uartDataAvailable_receive ) { // set a flag if we're inside a receive packet // then, in 50msec timer, if we've not received anything after ~150-200msec, // clear it and tell uart_getPacket to reset state _system_flags.PacketisBeingReceived=1; uart_getPacket(0); uartDataAvailable_receive = 0; } if(_system_flags.TwelveBitflag) { if(_system_flags.EndofFrameflag) { // if stopped, and all data already pushed out, turn off HTPA if(_system_flags.Stopflag) { while (TX_Sent_Counter!=TX_ToSend_Counter); TurnOffHTPA(); IEC0bits.U1TXIE = 1; // re-enable UART TX ISR _system_flags.Standbyflag=1; _system_flags.RefreshStatusflag = 1; _system_flags.Stopflag = 0; } _system_flags.EndofFrameflag = 0; } } if (ms_flag)// 1ms loop { BtnProcessEvents(); // Button debounce processing StateMachine(); if((_button_press.SW1DBB)&&(!_system_flags.SW1released)) { SleepCounter = SLEEPTIME; LaserOutlat = ~LaserOutlat; LaserCounter=10; ButtonTimer = 3; _system_flags.SW1released = 1; } if( _system_flags.PacketisReadyforParse) { _system_flags.PacketisBeingReceived=0; receivedCtr=0; _system_flags.PacketisReadyforParse = 0; ParsingRXMsg(); } if (TimeBase50ms()) //increment and check for 50ms software timer { if (_system_flags.PacketisBeingReceived) { // increment counter receivedCtr++; if (receivedCtr>2) { receivedCtr=0; // reset uart_getPacket _system_flags.PacketisBeingReceived=0; uart_getPacket(1); } } }//end of 50ms interval if (TimeBase100ms()) //increment and check for 100ms software timer { // if we're in standby, and the change UART flag has been set, change it if (state==STATE_STANDBY) { if (_system_flags.ChangeUARTSpeed) { if (_system_flags.PacketisBeingReceived) { uart_getPacket(1); } _system_flags.ChangeUARTSpeed=0; // simply toggle UART speed if we get this command if (_system_flags.uart_hi_speed==1) { _system_flags.uart_hi_speed=0; initUART(34); } else { _system_flags.uart_hi_speed=1; initUART(8); } FLAGInit(); SYSTEMInit(); } } }//end of 100ms if (TimeBase250ms()) //increment and check for 250ms software timer { LED1BlinkingCounter++; if(LED1BlinkingCounter == 1) { LED2lat = 1;//green off LED1lat = 1; // red is off } // blink at double speed if in high speed mode if(LED1BlinkingCounter > (10-(5*_system_flags.uart_hi_speed))) { if(state ==STATE_STREAM ) { LED2lat = 0; // green flashing during streaming LED1lat = 1; // red is off } if(state ==STATE_STANDBY ) { LED1lat = 0; // red flashing during standby LED2lat = 1; // green is off } LED1BlinkingCounter = 0; } if((!_button_press.SW1DBB)&&(_system_flags.SW1released)) { _system_flags.SW1released = 0; SleepCounter = SLEEPTIME; } if((ButtonTimer==0)&&(_system_flags.SW1released)&&(!_system_flags.InSleepWake)) { if((_button_press.SW1DBB)) { if(state==STATE_STREAM) { TurnOffHTPA(); } // nuclear option, reset firmware and start over with clean plate. asm ("reset"); } } } if (TimeBase1s()) //increment and check for 1000ms software timer { if (LaserCounter!=0) LaserCounter--; if (LaserCounter==0) { LaserOutlat = 0; } if(ButtonTimer>0) { ButtonTimer=ButtonTimer-1; } _system_flags.InSleepWake=0; if(state == STATE_STANDBY) { if(SleepCounter>0) { SleepCounter=SleepCounter-1; } if((SleepCounter==0)) { // sleep flag will call state=SLEEP above _system_flags.Sleepflag = 1; _system_flags.RefreshStatusflag=1; } }//stand by mode }//End of TimeBase1s if (TimeBase1h()) { }//end of 1 hour base ms_flag = 0; }// End of msflag 1 ms }// End of while (1) } //End of main()
int main(void) { // Start from displaying of PIC24 banners _display_state = DISP_HELLO; // Setup PortA IOs as digital AD1PCFG = 0xffff; //IO Mapping for PIC24FJ64GA004 #ifdef __PIC24FJ64GA004__ //Defined by MPLAB when using 24FJ64GA004 device ioMap(); lockIO(); #endif // Setup SPI to communicate to EEPROM SPIMPolInit(); // Setup EEPROM IOs EEPROMInit(); // Setup the UART UART2Init(); // Setup the timer TimerInit(); // Setup the LCD mLCDInit(); // Setup debounce processing BtnInit(); // Setup the ADC ADCInit(); // Setup the banner processing BannerStart(); // Setup the RTCC RTCCInit(); while (1) { LCDProcessEvents(); ADCProcessEvents(); if (TimerIsOverflowEvent()){ // Button debounce processing BtnProcessEvents(); // State dependent processing switch (_display_state) { // Show Microchip banners case DISP_HELLO: BannerProcessEvents(); break; // Show clock case DISP_CLOCK: TBannerProcessEvents(); break; // Show voltage and temperature case DISP_VOLTAGE: VBannerProcessEvents(); break; default: _display_state = DISP_HELLO; }// End of switch (_display_state)... // If S6 is pressed show the next example if (BtnIsPressed(4)) { // Change state and clear display if(!TBannerIsSetup()){ _display_state++; if(_display_state > DISP_MAX) _display_state = 0; // Initialize state switch (_display_state) { // Microchip banners case DISP_HELLO: BannerInit(); break; // Clock case DISP_CLOCK: TBannerInit(); break; // Voltage and temperature case DISP_VOLTAGE: VBannerInit(); break; default: _display_state = 0; }// End of switch (_display_state)... mLCDClear(); }else TBannerNext(); // wait for button released while (BtnIsPressed(4)){ BtnProcessEvents(); } }// End of if (BtnIsPressed(4)){... if(_display_state == DISP_CLOCK){ if (BtnIsPressed(1)){ TBannerSetup(); // wait for button released while (BtnIsPressed(1)) BtnProcessEvents(); }// End of if (BtnIsPressed(1 ... if(TBannerIsSetup()){ if (BtnIsPressed(2)) { TBannerChangeField(1); // wait for button released while (BtnIsPressed(2)) BtnProcessEvents(); }// End of if (BtnIsPressed(2)){... if (BtnIsPressed(3)) { // wait for button released TBannerChangeField(0); while (BtnIsPressed(3)) BtnProcessEvents(); }// End of if (BtnIsPressed(3)){... }// End of if(TBannerIsSetup( ... }// End of if(_display_state == DISP_SET_CLOCK ... if(_display_state == DISP_VOLTAGE){ if (BtnIsPressed(2)){ ADCSetFromMemory(); // wait for button released while (BtnIsPressed(2)){ BtnProcessEvents(); } }// End of if (BtnIsPressed(2 ... if (BtnIsPressed(3)){ ADCStoreTemperature(); // wait for button released while (BtnIsPressed(3)){ BtnProcessEvents(); } }// End of if (BtnIsPressed(3)){... }// End of if(_display_state ... }// End of if (TimerIsOverflowEvent()... }// End of while(1)... }// End of main()...