void i2c_sendbyte(uint8 tms) { uint8 i,sdat; sdat=tms; for (i=0;i<8;i++) { if (sdat&0x80) { Sda_High(); } else { Sda_Low(); } delays(15); Scl_High(); delays(15); Scl_Low(); sdat<<=1; } Sdac_High(); delays(15); Scl_High(); delays(15); if (Sda) ack=1; else ack=0; Scl_Low(); delays(10); }
void i2c_start() { Sda_High(); delays(15); Scl_High(); delays(15); Sda_Low(); delays(15); Scl_Low(); delays(15); }
void i2c_ack() { delays(15); if (ack==0) Sda_Low(); if (ack==1) Sda_High(); delays(15); Scl_High(); delays(15); Scl_Low(); delays(15); }
virtual void Execute( puzzler::ILog *log, const puzzler::CircuitTimingInput *input, puzzler::CircuitTimingOutput *output ) const override { log->LogVerbose("Starting timing analysis"); std::map<unsigned,unsigned> histogram; std::vector<unsigned> delays(input->flipFlopCount,0); auto timing_analysis = [&](unsigned i) { delays[i]=delay(input->wires.at(i), input); }; tbb::parallel_for<unsigned>(0, input->flipFlopCount, timing_analysis); for (unsigned i = 0; i < input->flipFlopCount; i++) { histogram[delays[i]]++; } log->LogVerbose("Finished timing analysis, converting histogram"); std::vector<uint32_t> res(histogram.rbegin()->first+1, 0); for(unsigned i=0; i<res.size(); i++){ if(histogram.find(i)!=histogram.end()){ res.at(i)=histogram.at(i); } log->LogInfo(" histogram[%u] = %u", i, res[i]); } output->criticalPathHistogram=res; log->LogVerbose("Finished converting histogram"); }
/* * Simply a function that prints out a standard welcome message on startup. */ void welcome(void){ Lcd_Clear(); Lcd_Set_Cursor(1,1); Lcd_Write_String(w0); Lcd_Set_Cursor(2,1); Lcd_Write_String(w1); delays(2); }
void i2c_read() { iic_Pull(); i2c_stop(); i2c_start(); i2c_sendbyte(0xa9); //addr if (ack) i2c_stop(); else { rdat1=i2c_recbyte(); //dat1 ack=0; i2c_ack(); delays(20); rdat2=i2c_recbyte(); //dat2 ack=1; i2c_ack(); delays(20); } delays(100); i2c_stop(); i2c_start(); i2c_sendbyte(0xa8); //addr if (ack) i2c_stop(); else { // i2c_sendbyte(g_u8LedTxDAT1); // if(ack) // i2c_stop(); // else // { // i2c_sendbyte(g_u8LedTxDAT2); // ack=1; // i2c_ack(); // delays(20); // } i2c_sendbyte(g_u8LedTxDAT1); ack=1; i2c_ack(); delays(20); } }
void main(void) { void LCD_disp(int x,int y); void welcome(void); TRISD = 0x00; Lcd_Init(); welcome(); //welcome screen while(1){ LCD_disp(1,2); delays(2); LCD_disp(0,3); delays(2); } }
uint8 i2c_recbyte() { uint8 i,dat; dat=0; Sdac_High(); for (i=0;i<8;i++) { Scl_Low(); delays(15); Scl_High(); delays(15); dat<<=1; if (Sda) dat|=0x01; delays(15); } Scl_Low(); delays(10); return(dat); }
/*Function creates an initiation sequence when motor turns on*/ void on_setup(void){ /*MOTOR ON MESSAGE*/ LCD_title(t4); //Giddy up delays(1); //Display run-time message LCD_title(t6); //"Running" //If motor is set on while on factory, defaults to manual mode if (menu_ref_1=1){ menu_ref_1=0; } }
//#pragma code highPriorityInterruptAddress=0x0008 //void high_interrupt(void) //{ // _asm GOTO highPriorityIsr _endasm //} // //#pragma code void main(void){ //Default TRISD = 0x00; //set port D signals to output menu_ref_1=1; menu_ref_2=0; /*zone of disgust*/ values[MAXSPEED]=100; //Max speed values[PIDGAINS]=100; //PID Gains values[MAXYAW]=100; //Max Yaw values[IRSAMPE]=10; //ir_samp_e; values[IRSAMPR]=20; //ir_samp_r; values[IRRAW]=60; //ir_raw values[IRAVG]=10; //ir_avg; /*****************/ setupSerial(); Lcd_Init(); ADC_setup(); Button_Setup(); welcome(); LCD_disp(menu_ref_1, menu_ref_2); RUN=0; while(1){ //NORMAL OPERATION while(RUN==0){ if(PORTDbits.RD0 == 0) { mode_button = 1; } if(PORTDbits.RD1 == 0) { motor_button = 1; } if (mode_button==1){ //Mode change sequence checkMode(menu); menu_ref_2=0; //Default menu ref, should only be SPEED delayms(200); mode_button=0; LCD_disp(menu_ref_1, menu_ref_2); } delayms(200); //Used to prevent double tapping //possibly new function switchChannels(0); joy_x = doADC(); switchChannels(1); joy_y = doADC(); if(menu_ref_1==MANUAL) //IF IN MANUAL { if(joy_x<=LEFT){ //User pushes right joystick left if(values[menu_ref_2]>0){ values[menu_ref_2]=values[menu_ref_2]-5; //decrement value by 5% GLOBAL_MAX_SPEED = values[menu_ref_2]; sendMaxSpeed(); } LCD_disp(menu_ref_1, menu_ref_2); delayms(200); //Delay to prevent flickering, and also to prevent 100-0 increments } else if (joy_x>=RIGHT){ //User pushes right joystick right if(values[menu_ref_2]<100){ values[menu_ref_2]=values[menu_ref_2]+5; //increment value by 5% GLOBAL_MAX_SPEED = values[menu_ref_2]; sendMaxSpeed(); } LCD_disp(menu_ref_1, menu_ref_2); delayms(200); } } else if(menu_ref_1==FACTORY){ //IF IN FACTORY MODE if (joy_y>=UP){ //User pushes left joystick UP //Circular selection if(menu_ref_2==0){ menu_ref_2=4; } else{ menu_ref_2--; //switched the order of this to prevent overflow } LCD_disp(menu_ref_1, menu_ref_2); delayms(250); //Arbitrary delay of 250 milliseconds } else if (joy_y<=DOWN){ //User pushes left joystick DOWN menu_ref_2++; //Circular selection if(menu_ref_2>=7){ menu_ref_2=1; } LCD_disp(menu_ref_1, menu_ref_2); delayms(250); } else if (joy_x<=LEFT){ //User pushes right joystick left if(values[menu_ref_2]>0){ values[menu_ref_2]=values[menu_ref_2]-5; //decrement value by 5% } LCD_disp(menu_ref_1, menu_ref_2); delayms(255); delayms(200); } else if (joy_x>=RIGHT){ //User pushes right joystick right if(values[menu_ref_2]<100){ values[menu_ref_2]=values[menu_ref_2]+5; //decrement value by 5% } LCD_disp(menu_ref_1, menu_ref_2); delayms(255); delayms(200); } } //All other menu_ref_1's do not have values displayed if (motor_button==1){ motor_button=0; RUN=1; } //send here } /*Menu on setup*/ if (RUN==1){ on_setup(); GLOBAL_RUN = RUN; sendRun(); //MOTOR ON GOES AFTER motor_button=0; } /*MOTOR ON BEHAVIOUR*/ while(RUN==1){ if(PORTDbits.RD1 == 0) { motor_button = 1; } if (motor_button==1){ //At interrupt, stop motor and return to menu motor_button=0; RUN=0; GLOBAL_RUN = RUN; sendRun(); } switchChannels(0); //GLOBAL_VELOCITY = doADC(); GLOBAL_VELOCITY = doADC() //Get joystick values joy_y = doADC(); GLOBAL_VELOCITY = joy_y; switchChannels(1); joy_x = doADC(); GLOBAL_OMEGA = joy_x; sendVelocity(); sendOmega(); //send command here } /*MOTOR OFF MESSAGE*/ RUN=0; //MOTOR OFF FUNCTION GOES BEFORE MESSAGE LCD_title(t5); //"Whoa!" delays(2); //safety delay LCD_disp(menu_ref_1, menu_ref_2); //Return to normal display } }