// ATtiny13A #define F_CPU 8980000 #include #include #define ARR_LEN 4 #define ARR_AMO 4 // число строк (массивов пауз) #define FREQ_HALF_T 14 #define PACK_LEN_AMO 50 #define PACK_LEN_T PACK_LEN_AMO * 2 * FREQ_HALF_T #define AUTO_REPLAY 1100 // для Pinnacle void _delay_us_10060() { _delay_us(10060 - PACK_LEN_T); } void _delay_us_3368() { _delay_us(3368 - PACK_LEN_T); } void _delay_us_5876() { _delay_us(5876 - PACK_LEN_T); } // void _delay_us_I() { _delay_us(11500 - PACK_LEN_T); } void _delay_us_II() { _delay_us(2500 - PACK_LEN_T); } void (*p_delay[ARR_AMO][ARR_LEN])() = { {_delay_us_10060, _delay_us_3368, _delay_us_3368, _delay_us_5876}, {_delay_us_II, _delay_us_II, _delay_us_II, _delay_us_I}, {_delay_us_I, _delay_us_I, _delay_us_I, _delay_us_I}, {_delay_us_II, _delay_us_II, _delay_us_II, _delay_us_II} }; void transmit_high() { for (uint8_t i = 0; i < PACK_LEN_AMO; i++) { PORTB |= (1 << PB2); _delay_us(FREQ_HALF_T); PORTB &= ~(1 << PB2); _delay_us(FREQ_HALF_T); } } void setup() { _delay_ms(500); DDRB = 0xFF; PORTB = 0x00; // на ввод DDRB &= ~(1 << DDB0); DDRB &= ~(1 << DDB1); DDRB &= ~(1 << DDB3); DDRB &= ~(1 << DDB4); // притяжка PORTB |= (1 << PB0); PORTB |= (1 << PB1); PORTB |= (1 << PB3); PORTB |= (1 << PB4); } void transmit_token(uint8_t sighal_n) { for(uint8_t i = 0; i < ARR_LEN; i++) { transmit_high(); (*p_delay[sighal_n][i])(); } transmit_high(); _delay_ms(AUTO_REPLAY); } int main(void) { setup(); while (1) { if (!(PINB & (1 << PB0))) transmit_token(0); else if (!(PINB & (1 << PB1))) transmit_token(1); else if (!(PINB & (1 << PB3))) transmit_token(2); else if (!(PINB & (1 << PB4))) transmit_token(3); } }