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; */ } }
int main(int argc, char** argv) { init(); taster(); return (EXIT_SUCCESS); }