Пример #1
0
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);
}
Пример #2
0
void i2c_start()
{
    Sda_High();
    delays(15);
    Scl_High();
    delays(15);
    Sda_Low();
    delays(15);
    Scl_Low();
    delays(15);
}
Пример #3
0
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);
}
Пример #6
0
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);
	}
}
Пример #7
0
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);
    }
    
}
Пример #8
0
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
      
      
  }
  
  
  
}