示例#1
0
void processTWI( void )
{
	uint8_t b,p1,p2;

	b = usiTwiReceiveByte();

	switch (b) {
	case 0x81: // set slave address
		p1 = usiTwiReceiveByte();
		if(p1 < 128) // Address is 7 bit
		{
			eeprom_update_byte(&b_slave_address, p1);
			usiTwiSlaveInit(eeprom_read_byte(&b_slave_address));
		}
		break;
	case 0x82: // clear led
		led_clear();
		break;
	case 0x83: // set led brightness, p1=led, p2=brightness
		p1 = usiTwiReceiveByte();
		p2 = usiTwiReceiveByte();
		set_led_pulse(p1,0); // Turn off pulsing
		set_brightness(p1,p2);
		break;
	case 0x84: // Set to pulse led, p1=led, p2 = (0 = OFF, 1 = ON)
		set_led_pulse(usiTwiReceiveByte(),usiTwiReceiveByte());
		break;
	case 0x85: // Dim up/down led to specific value, p1=led, p2=value to dim to
		dim_led(usiTwiReceiveByte(),usiTwiReceiveByte());
		break;
	case 0x86: // get firmware revision
		usiTwiTransmitByte(FIRMWARE_REVISION);
		break;
	case 0x90: // get keyUp Event
		usiTwiTransmitByte(getKeyUp());
		break;
	case 0x91: // get KeyDown Event
		usiTwiTransmitByte(getKeyDown());
		break;
	case 0x92: // set keyrepeat
		set_keyrepeat(usiTwiReceiveByte(),usiTwiReceiveByte());
		break;
	case 0xFE: // reset to known state
		led_clear();
		button_init();
		flushTwiBuffers();
		break;
	case 0xFF: // flush the bus
		break;
	default:
		break;
	}
}
示例#2
0
/*
 * Get ADC Data and put it into output fifo with device ID
 *
 * input:	none
 *
 * output:	data into Rx_buf
 *
 */
void dev_adc_1_get_data()
{
//	uint8_t data;
	usiTwiTransmitByte( DEV_ADC_1_ID );
//	data = dev_adc_1_H + test++;
	usiTwiTransmitByte( dev_adc_1_H );
//	usiTwiTransmitByte( data );
//	data = dev_adc_1_L + test++;
usiTwiTransmitByte( dev_adc_1_L );
//	usiTwiTransmitByte( data );

//	usiTwiTransmitByte( test++ );
//	usiTwiTransmitByte( test++ );
	
	return;
}
示例#3
0
int main(void)
{
	//********** Initiate variables *********
	adcArray[0] = 4;						// Device ID for Flexiforce 301A
	adcArray[1] = 0;
	adcArray[2] = 0;
	
	//********** Initialization ********** 
	
	usiTwiSlaveInit( slaveadress );			// Enable TWI I2C and set static slave address
	InitADC();								// Init ADC
	sei();									// Init global interupt
	
	//********** Main functions **********
	while(1)
	{
		
		if(!ADC_flag)
		{
		adcArray[1] = ADCL;
		adcArray[2] = ADCH;
		ADC_flag = 0;
		}

		
		while(!usiTwiDataInReceiveBuffer());		// Wait for master
		usiTwiTransmitByte(adcArray[0]);	// Send sensor ID
		
		while(!usiTwiDataInReceiveBuffer());		// Wait for master
		usiTwiTransmitByte(adcArray[1]);	// Send low part of sensordata
	
		while(!usiTwiDataInReceiveBuffer());		// Wait for master
		usiTwiTransmitByte(adcArray[2]);	// Send high part of sensordata
		
	}
	
	
	return 0;
}
int main(void)
{
    uint8_t count;

    count = 0;

    usiTwiSlaveInit( SLAVE_ADRS );		// Initialize TWI hardware for Slave operation.

    sei();								// Enable interrupts.

    usiTwiSlaveEnable();				// Enable the TWI interface to receive data.

    while(1)
    {
        if( !usiTwiDataInTransmitBuffer() )
        {
            usiTwiTransmitByte( count );	// stuff count into TxBuf[]

            ++count;						// inc for next value.
        }
    }
}
void USI_TWI_S::send(uint8_t data){  // send it back to master
  usiTwiTransmitByte(data);
}
示例#6
0
//
// called infinitely in main() along with handle_script()
//
static void handle_i2c(void)
{
    //uint8_t tmp;
    //int8_t baddr;
    if( usiTwiDataInReceiveBuffer() ) {
        cmd  = usiTwiReceiveByte();
        myaddr = slaveAddressMatched;
        slaveAddressMatched = -1;

        switch(cmd) {
        case('@'):         // set addr to send to {'@',freemaddr,i2caddr,0}
        case('#'):         // script cmd: set ir pwm frequency & duty cycle
        case('%'):         // IR light on/off
        case('&'):         // packet_wait_millis, wait_after
            read_i2c_vals(3);  // all these take 3 args
            handle_script_cmd();
            break;
        case('$'):         // script cmd: send ir code
            read_i2c_vals(5);
            if( cmdargs[0] == 0 ) { // FIXME: 0 == sony command type 
                //uint32_t data = *(cmdargs+1);
                IRsend_sendSony( (cmdargs[1]<<8) | cmdargs[2],12 );  // FIXME
            } 
            else if( cmdargs[0] == 1 ) {  // 1 == RC5
                IRsend_sendSony( (cmdargs[1]<<8) | cmdargs[2],12 );  // FIXME
            }
            break;
        case('!'):           // send arbitrary i2c data 
            read_i2c_vals(8);  
            IRsend_sendSonyData64bit( cmdargs );
            //fanfare(3, 100 );
            break;
        case('^'):           // set colorspot {'^', 13, r,g,b }
            read_i2c_vals(4);

            cmdargs[6] = cmdargs[3]; // b
            cmdargs[5] = cmdargs[2]; // g
            cmdargs[4] = cmdargs[1]; // r
            cmdargs[3] = cmdargs[0]; // pos
            
            cmdargs[2] = 0xfe;       // 0xfe == set colorspot 
            cmdargs[1] = freem_addr;
            cmdargs[0] = 0x55;       // magic start byte

            cmdargs[7] = compute_checksum(cmdargs,7);

            //IRsend_sendSonyData64bit( cmdargs );
            ir_queue( cmdargs );

            break;
        case('*'):           // play colorspot {'*', 13, 0, 0 }
            read_i2c_vals(3);
            handle_script_cmd();
            /*
            tmp = blinkm_addr;  // FIXME: bit of a hack here
            blinkm_addr = 0xfd; // 0xfd == play colorspot 
            cmd = cmdargs[0];
            cmdargs[0] = cmdargs[1]; 
            cmdargs[1] = cmdargs[2];
            //cmdargs[2] = cmdargs[3];  // no, only have 3 args to use
            handle_script_cmd();
            blinkm_addr = tmp;
            */
            break;

            // stolen from blinkm.c
        case('a'):         // get address 
            usiTwiTransmitByte( eeprom_read_byte(&ee_i2c_addr) );
            break;
        case('A'):         // set address
            cmdargs[0] = cmdargs[1] = cmdargs[2] = cmdargs[3] = 0;
            read_i2c_vals(4);  // address, 0xD0, 0x0D, address
            if( cmdargs[0] != 0 && cmdargs[0] == cmdargs[3] && 
                cmdargs[1] == 0xD0 && cmdargs[2] == 0x0D ) {  // 
                eeprom_write_byte( &ee_i2c_addr, cmdargs[0] ); // write address
                i2c_addrs[0] = cmdargs[0];
                for( uint8_t i = 1; i<slaveAddressesCount; i++ ) {
                    i2c_addrs[i] = i2c_addrs[0] + i;
                }
                usiTwiSlaveInit( i2c_addrs );                 // re-init
                _delay_ms(5);  // wait a bit so the USI can reset
            }
            break;
        case('Z'):        // return protocol version
            usiTwiTransmitByte( BLINKM_PROTOCOL_VERSION_MAJOR );
            usiTwiTransmitByte( BLINKM_PROTOCOL_VERSION_MINOR );
            break;
        case('P'):       // play ctrlm script
            read_i2c_vals(3);
            play_script(0, cmdargs[1], cmdargs[2]);
            break;

        // blinkm cmds
        case('n'):         // script cmd: set rgb color now
        case('c'):         // script cmd: fade to rgb color
        case('C'):         // script cmd: fade to random rgb color
        case('h'):         // script cmd: fade to hsv color
        case('H'):         // script cmd: fade to random hsv color
        case('p'):         // script cmd: play script
            read_i2c_vals(3);
            handle_script_cmd();
            break;
        case('f'):
        case('t'):
            read_i2c_vals(1);
            handle_script_cmd();
        case('o'):
        case('O'):
            handle_script_cmd();
            break;
//
// new v2 commands
//
        case('l'):         // return script len & reps
            read_i2c_vals(1);  // script_id
            if( cmdargs[0] == 0 ) { // eeprom script
                usiTwiTransmitByte( eeprom_read_byte( &ee_script.len ) );
                usiTwiTransmitByte( eeprom_read_byte( &ee_script.reps ) );
            }
            else {
               //script* s=(script*)pgm_read_word(&(fl_scripts[cmdargs[1]-1]));
               //curr_script_len  = pgm_read_byte( (&s->len) );
               //curr_script_reps = pgm_read_byte( (&s->reps) );
            }
        case('i'):         // return current input values
            //usiTwiTransmitByte( myaddr ); // FIXME FIXME TEST
            usiTwiTransmitByte( timesOver ); // FIXME FIXME TEST
            //usiTwiTransmitByte( inputs[0] );
            usiTwiTransmitByte( inputs[1] );
            usiTwiTransmitByte( inputs[2] );
            usiTwiTransmitByte( inputs[3] );
            break;
        
        } // switch(cmd)
        
    } // if(usiTwi)
}
示例#7
0
int main(void)
{
	uint8_t data;

	uint8_t blinkDelay = BLINK_DELAY;
	bool	blinkToggle = false;

	pState	= PS_IDLE;
	mCounter = 0;

	mod_led_init();
	st_init_tmr0();
	usiTwiSlaveInit( SLAVE_ADRS );	// Initialize USI hardware for I2C Slave operation.

mod_led_toggle(4);
	
	sei();							// Enable interrupts.
	
	usitwiSlaveEnable();			// Enable the USI interface to receive data.

mod_led_toggle(3);

	// A simple loop to check for I2C Commands.
	// A state variable is needed to process multi-byte messages.
	// 01, 05 are Writes. 04 is a Read.
    while(1)
    {
#if 0
		// Heart Beat LED
		if( GPIOR0 & (1<<DEV_1MS_TIC) )
		{
			GPIOR0 &= ~(1<<DEV_1MS_TIC);
			if(--blinkDelay == 0) {
				blinkDelay = BLINK_DELAY;
				if(blinkToggle) {
					mod_led_on();
				} else {
					mod_led_off();
				}
				blinkToggle = !blinkToggle;
			}
		}
#endif
//mod_led_toggle(2);

		if( usiTwiDataInReceiveBuffer() )
		{
			data = usiTwiReceiveByte();
			switch (pState)
			{
				case PS_IDLE:
					// Process new message
					++mCounter;

					switch(data)
					{
						case 01:
							// Writing to the Control Register
							pState = PS_CMD01_0;	// next byte is Control byte
							break;

						case 04:
							// Reading counter
							usiTwiTransmitByte(mCounter);		// load up data for following read.
							break;

						case 05:
							// Writing to LED
							pState = PS_CMD05_0;	// next byte controls LED
							break;

						default:
							break;					// Ignore unknown command.
					}
					break;

				case PS_CMD01_0:
					// Process Control byte. b0=1 clears counter.
					if( (data & 0x01) == 0x01 )
					{
						mCounter = 0;
					}
					pState	= PS_IDLE;				// reset for next message
					break;

				case PS_CMD05_0:
					// Change LED state
					// If the data is 00, then turn OFF the LED. Turn it ON for any non-zero value.
					// NOTE: LED hardware is wired 'Active LOW'.
					if( data == 0)
					{
						mod_led_off();				// Turn LED OFF.
					}
					else
					{
						mod_led_on();				// Turn LED ON.
					}
					pState	= PS_IDLE;				// reset for next message
					break;

				default:
					pState	= PS_IDLE;				// ERROR, restore to know state
					break;
			}
		}
    }
}