예제 #1
0
파일: main.c 프로젝트: rene-dev/Lasertag
int main(void){
	// 12 PB0 LASER_R  ---- NICHT MEHR ----
	// 11 PD7 LASER								(Laser)
	// 10 PD6 HAPTIK		OC0A	Timer0	 8 Bit	(Haptik)
	//  9 PD5 LED_FRONT_B	OC0B	Timer0	 8 Bit
	// 13 PB1 IR_CLOCK_-	OC1A	Timer1	16 Bit
	// 14 PB2 LED_FRONT_G	OC1B	Timer1	16 Bit
	// 15 PB3 LED_FRONT_R	OC2A	Timer2	 8 Bit
	//  1 PD3 LED_FRONT_W	OC2B	Timer2	 8 Bit
	// 24 PC1 LDR			ADC1
	// 25 PC2 V_BATT		ADC2
	//  2 PD4 BUTTON_3
	//  7 PB6 BUTTON_2
	//  8 PB7 BUTTON_1
	// 12 PB0 ONOFF

	cli();

	//set pins
	DDRB |= (1 << DDB1) | (1 << DDB2) | (1 << DDB3); //OUTPUT
	DDRD |= (1 << DDD3) | (1 << DDD5) | (1 << DDD6) | (1 << DDD7); //OUTPUT
	DDRB &= ~(1 << PB6) & ~(1 << PB7); //INPUT
	PORTB |= (1 << PB6) | (1 << PB7); //input pullup
	DDRD &= ~(1 << PD4); //INPUT
	PORTD |= (1 << PD4); //input pullup
	
	//ausschalten
	//DDRB |= (1 << DDB0); //OUTPUT
	//PORTB &= ~(1 << DDB0); //LOW

	//init Timers for PWM:
	//https://sites.google.com/site/qeewiki/books/avr-guide/pwm-on-the-atmega328
	//WGM* s157: fast pwm without ctc
	//CS*  s158: _BV(CS20) = prescaler 1 (gilt für a und b)
	//PWM_fequency = clock_speed / [Prescaller_value * (1 + TOP_Value) ] = 8000000/(1*(1+210)) = 37.915 kHz
	
	//Timer 0: Mode 3: Fast PWM, TOP: 0xFF, Update of OCRx: Bottom, TOV1 Flag set on: TOP, Prescaler: 1, Set OC0x on Compare Match
	TCCR0A = _BV(COM0B0) | _BV(COM0A0) | _BV(COM0B1) | _BV(COM0A1) | _BV(WGM00) | _BV(WGM01);
	TCCR0B = _BV(CS00);
	//TIMSK0 |= (1<<TOIE0); //Overflow Interrupt for count millis
	
	//Timer 2: Mode 3: Fast PWM, TOP: 0xFF, Update of OCRx: Bottom, TOV1 Flag set on: TOP, Prescaler: 1, Set OC2x on Compare Match
	TCCR2A = _BV(COM2B0) | _BV(COM2A0) | _BV(COM2B1) | _BV(COM2A1) | _BV(WGM20) | _BV(WGM21);
	TCCR2B = _BV(CS20);
	
	//Timer 1: Mode 14: Fast PWM, inverting mode, Top: ICR1, Update of OCR1x: Bottom, TOV1 Flag set on: TOP, Prescaler: 1
	//https://docs.google.com/spreadsheets/d/1HadMDsU0MGo1LXUr1gKNFrfe4wX_Bq9kbVIwOvD3chk
	TCCR1A = _BV(COM1B0) | _BV(COM1A0) | _BV(COM1B1) | _BV(COM1A1) | _BV(WGM11);
	TCCR1B = _BV(CS10) | _BV(WGM12) | _BV(WGM13);

	//IR carrier frequency to 37.915 kHz:
	ICR1 = 210;
	//IR carrier frequency duty cycle to 50%:
	IR_CLOCK_DUTY_CYCLE = ICR1-ICR1/2;
	
	//switch off all light
	LED_FRONT_R=255;
	LED_FRONT_G=ICR1;
	LED_FRONT_B=255;
	LED_FRONT_W=255;
	HAPTIK=255; //haptik
	//PORTB |= (1 << PB0); //an
	
	//i2c init
	init_twi_slave(I2C_BUS_ADRESS<<1);

	//UART init
	UBRR0H = UBRR_VAL >> 8;
	UBRR0L = UBRR_VAL & 0xFF;
	UCSR0B |= _BV(TXEN0) | _BV(RXEN0) | _BV(RXCIE0); //UART RX, TX und RX-Interrupt einschalten
	UCSR0C = (1<<UCSZ01) | (1<<UCSZ00); //Asynchron 8N1 
	
	sei(); // enable Interrupts global
	
	uint32_t laser_duration_counter=0;
	uint32_t vibrate_duration_counter=0;
	uint32_t muzzle_flash_duration_counter=0;
	uint32_t muzzle_flash_duration_counter_max=0; //fürs ausfaden
	uint16_t ir_delay=0;
	uint8_t ir_count=255;
	
			// return links*256 + rechts
	uint16_t battt = 12345;
	misc_buffer.v_bat_l = battt>>8;
	misc_buffer.v_bat_r = battt;
	
 	while(1){
/*  		// ---------------- blinken + buttons (gedrueckt halten) + ir shoot ----------------
		LED_FRONT_R = 255-1-taster(&PINB, BUTTON_1)*100;
		LED_FRONT_G = ICR1-map8(2, 0, 255, 0, ICR1); //0 bis ICR1
		LED_FRONT_B = 255-1-taster(&PINB, BUTTON_2)*100;
		LED_FRONT_W = 255-1-taster(&PIND, BUTTON_3)*100;
		laser(1); //laser
		HAPTIK = 255-50; //haptik

		_delay_ms(255);
		_delay_ms(255);
		_delay_ms(255);
		
		LED_FRONT_R = 255-0;
		LED_FRONT_G = ICR1-map8(0, 0, 255, 0, ICR1); //0 bis ICR1
		LED_FRONT_B = 255-0;
		LED_FRONT_W = 255-0;
		laser(0); //laser
		HAPTIK = 255-0; //haptik
		
		_delay_ms(255);
		_delay_ms(255);
		_delay_ms(255);
		
		shoot_buffer.playerid = 42;
		shoot_buffer.damage = 123;
		shoot_buffer.enable = 1;
		uint8_t array[] = {shoot_buffer.playerid, shoot_buffer.damage};
		USART_Transmit(shoot_buffer.playerid); //IR_TX: PlayerID
		USART_Transmit(shoot_buffer.damage); //IR_TX: Schaden
		USART_Transmit(crc8(array, 2)); //IR_TX: crc8 checksum
 */
		
 		// ---------------- pew ----------------
		uint8_t brightness = 80;
		if(taster(&PINB, BUTTON_1)){
			if(taster(&PINB, BUTTON_2) && !taster(&PIND, BUTTON_3)){
				LED_FRONT_R = 255-brightness;
				LED_FRONT_G = ICR1-map8(0, 0, 255, 0, ICR1);
				LED_FRONT_B = 255-0;
				LED_FRONT_W = 255-0;
				_delay_ms(20);
				laser(1);
			}else if(!taster(&PINB, BUTTON_2) && taster(&PIND, BUTTON_3)){
				LED_FRONT_R = 255-0;
				LED_FRONT_G = ICR1-map8(brightness, 0, 255, 0, ICR1);
				LED_FRONT_B = 255-0;
				LED_FRONT_W = 255-0;
				_delay_ms(20);
				laser(1);
			}else if(taster(&PINB, BUTTON_2) && taster(&PIND, BUTTON_3)){
				LED_FRONT_R = 255-brightness;
				LED_FRONT_G = ICR1-map8(brightness, 0, 255, 0, ICR1);
				LED_FRONT_B = 255-brightness;
				LED_FRONT_W = 255-brightness;
				_delay_ms(20);
				laser(1);
			}else{
				LED_FRONT_R = 255-0;
				LED_FRONT_G = ICR1-map8(0, 0, 255, 0, ICR1);
				LED_FRONT_B = 255-brightness;
				LED_FRONT_W = 255-0;
				_delay_ms(20);
				laser(1);
			}
			
			
			_delay_ms(30);
			LED_FRONT_R = 255-0;
			LED_FRONT_G = ICR1-map8(0, 0, 255, 0, ICR1);
			LED_FRONT_B = 255-0;
			LED_FRONT_W = 255-0;
			
			_delay_ms(200);
			laser(0);
			_delay_ms(255);
		}
					
		
		
/* 		// ---- buttons ----
		laser_buffer.laser = taster(&PINB, BUTTON_1);
		led_front_buffer.r = taster(&PINB, BUTTON_2)*255;
		led_front_buffer.b = taster(&PIND, BUTTON_3)*255;
 */
	}
}
예제 #2
0
int main(int argc, char** argv) {
    init();
    taster();
    return (EXIT_SUCCESS);
}