Example #1
0
File: gyro.c Project: rubda/KMM
void start_conversion()
{
	uint16_t REG = 0;
	
	//Steg 2 conversion
	ss_low();
	send_spi(START_CONVERSION);
	REG = get_spi(0xFF);
	ss_high();
	if (REG & (1 << 15)) start_conversion();
	REG = 0;
}
Example #2
0
File: gyro.c Project: rubda/KMM
void deactivate_adc()
{
	uint16_t REG = 0;
	
	//Avaktivera adc omvandlingen
	ss_low();
	send_spi(DEACTIVATE_ADC);
	REG = get_spi(0xFF);
	ss_high();
	
	if (REG & (1 << 15)) deactivate_adc();
	REG = 0;
}
Example #3
0
File: gyro.c Project: rubda/KMM
void activate_adc()
{
	uint16_t REG = 0;
	
	//Steg 1 sätt ADC till aktiv mode
	ss_low();
	send_spi(ACTIVATE_ADC);
	REG = get_spi(0xFF);
	ss_high();
	
	if (REG & (1 << 15)) activate_adc();
	REG = 0;
	_delay_us(200);
}
Example #4
0
File: gyro.c Project: rubda/KMM
uint16_t get_angular_rate()
{
	uint16_t REG = 0;
	uint16_t DATA = 0;
	
	//Steg 3 poll
	ss_low();
	send_spi(POLL);
	_delay_us(200);
	
	//if (REG & (1 << 15)) get_angular_rate();
	REG = get_spi(0xFF);
	ss_high();
	
	REG = REG >> 1;
	DATA = REG & 0x07FF; 
	
	return DATA;		
}	
Example #5
0
int main(void)
{
	// Initiera funktionalitet
	init_spi();
	USART_init();
	
	sei(); //Enable global interrupts

	clearbit(PORTC, PINC0); // "Ready to Receive" till Firefly

	// Har autonom-toggle på PA0
	static uint8_t has_pressed_auto;
	clearbit(DDRA, 0);

// Huvudloop
    while(1)
    {

		static uint8_t spi_state = 0; // 0 väntar, 1 skriver
		static uint8_t usart_state = 0; // 0 väntar, 1 skriver
		uint8_t spir, has_spir = 0, usartr, has_usartr = 0;

		if(!has_pressed_auto) {
			if(!(PINA & 0x01)) {
				has_pressed_auto = 1;
				send_spi(COMM_ENABLE_PID);
			}
		}

		// Processa SPI
		if(spi_state == 0) {
			// Kolla om vi har fått nåt
			if(SPSR & (1 << SPIF)) {
				spir = SPDR;
				has_spir = 1;
			}
			// Finns det nåt att skicka?
			else if(spiw_r != spiw_w) {
				SPDR = spiw_data[spiw_r++];
				PORTA ^= (1 << PORTA7);
				spi_state = 1;
			}				
		}
		else if(spi_state == 1) {
			if(SPSR & (1 << SPIF)) {
				uint8_t c;
				spi_state = 0;
				c = SPDR;
				if(c != 0) {
					has_spir = 1;
					spir = c;
				}
			}				
		}

		// Processa USART
		if(usart_state == 0) {
			// Firefly vill sända data
			if(UCSRA & (1 << RXC)) {
				usartr = UDR;
				has_usartr = 1;
			}
			// Vi vill sända data
			else if(usartw_r != usartw_w) {
				usart_state = 1;
				setbit(PORTC, PINC0);
			}				
		}
		else if(usart_state == 1) {
			if(UCSRA & (1 << UDRE)) {
				UDR = usartw_data[usartw_r++];
				usart_state = 0;
				clearbit(PORTC, PINC0);
			}				
		}
	
		// Nu finns data i usartr om has_usartr == 1
		// och i spir om has_spir == 1
		
		if(has_usartr) {
			decode_remote(usartr);
		}
		if(has_spir) {
			send_usart(spir);
		}
    }
}
Example #6
0
// Tolka data från fjärrenheten
void decode_remote(uint8_t ch)
{
	
	/* Hanterar kommando 'p', som tar tre argument: de tre PID-värden som används till regleringen */
	static uint8_t pid = 0;	// Flagga som anger att sist mottagna kommando från fjärrenheten var just pid!
	static uint8_t display = 0; // Indikerar att nästa byte är en byte som ska vidare till styr
	static uint8_t speed_all = 0;
	static uint8_t p, i, dh, dl;	// Argumenten till PID!

	/* Om PID är aktiverat (dvs. icke-noll), behandla den aktuella byten som ett argument till PID */
	if(pid) {
		if(pid == 4) p = ch;
		else if(pid == 3) i = ch;
		else if(pid == 2) dh = ch;
		else if(pid == 1) {
			dl = ch;
			send_spi(COMM_SET_PID);
			send_spi(p);
			send_spi(i);
			send_spi(dh);
			send_spi(dl);
			--pid;
			return;			// This ought to be needed, shound't it?
		}
		--pid;
	} else if(display)	/* Nästa byte är ett tecken som ska vidare till displayen på styrenheten */
	{
		display = 0;
		send_spi(ch);
		return;
	}	
	else if(speed_all) {
		send_spi(COMM_SET_SPEED);
		send_spi(ch);
		speed_all = 0;
		return;
	}
	else {
	
		// Konverterar från Blåtand till styr-komm-protokollet!
		switch(ch) {
			case 'l': send_spi(COMM_LEFT); break;					// vänster
			case 'd': send_spi(COMM_DRIVE); break;					// fram
			case 'r': send_spi(COMM_RIGHT); break;					// höger
			case 's': send_spi(COMM_STOP); break;								// stop
			case 'b': send_spi(COMM_BACK); break;					// bakåt
			case 'c': send_spi(COMM_CLAW_IN); break;					// claw in
			case 'o': send_spi(COMM_CLAW_OUT); break;				// claw out
			case 'v': send_spi(COMM_DRIVE_LEFT); break;				// kör framåt och vänster
			case 'h': send_spi(COMM_DRIVE_RIGHT); break;				// framåt och höger
			case 'q': send_spi(COMM_CLEAR_DISPLAY); break;						// Rensa displayen
			case 'z': send_spi(COMM_DISPLAY); display = 1; break;				// tecken till displayen
			case 'p': pid = 4; break;											// PID-konstanter
			case 'n': send_spi(COMM_ENABLE_PID); break;							// Slå på reglering
			case 'm': send_spi(COMM_DISABLE_PID); break;						// Slå av reglering
			case 't': send_spi(COMM_TOGGLE_SENSORS); break;						// Aktivera/deaktivera sensorer
			case 'w': send_spi(COMM_TURN_90_DEGREES_LEFT); break;				// Vrid 90 grader vänster
			case 'e': send_spi(COMM_TURN_90_DEGREES_RIGHT); break;				// Vrid 90 grader höger
			case '1': send_spi(COMM_CALIBRATE_SENSORS); break;					// Kalibrera sensorer
			case '#': speed_all = 1; break;
		}			
	}
}