ΠΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ: AVR ATMega. Π€ΡΠ½ΠΊΡΠΈΠΈ ΠΈ Π·Π°Π΄Π°ΡΠ° ΡΡΡΡΠΎΠΉΡΡΠ²Π°: ΠΠΎΠ±ΡΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΡΡΠΎΠΊ! ΠΡΠΆΠ½ΠΎ ΠΏΠΎΠΌΠΎΡΡ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π±Π°Π·Π΅ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° AVR. ΠΡΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° ΡΠ·ΡΠΊΠ΅ C; Π½Π° ΠΠ¦Π PC0, PC1, PC2, PC3 ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ATMEGA328P Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΡ Ρ Π΄Π²ΡΡ
Π΄Π°ΡΡΠΈΠΊΠΎΠ² Π₯ΠΎΠ»Π»Π°. ΠΠ½ΠΈ ΡΡΠΈΡΠ°ΡΡ ΡΠ°ΡΡΠΎΡΡ Π²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π΅Ρ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ½ΠΊΠΎΠ΄Π΅ΡΠ°. PC0 - Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡΠ΅Π΅ ΡΠ°ΡΡΠΎΡΡ Π²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ»Π΅ΡΠ°, PC1 - Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡΠ΅Π΅ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ»Π΅ΡΠ°. Π‘ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ PC2, PC3 Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ, ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΊΠΎΠ»Π΅ΡΠ°. ΠΡΠ»ΠΈ Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΠ΅, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠ΅Π΅ Π·Π° Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ°ΡΠ΅Π½ΠΈΡ, Π±ΠΎΠ»ΡΡΠ΅ Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΡ, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠ΅Π³ΠΎ Π·Π° ΡΠ°ΡΡΠΎΡΡ, ΡΠΎ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π² Π΄ΡΡΠ³ΡΡ ΡΡΠΎΡΠΎΠ½Ρ. ΠΠΏΠΎΡΠ½ΠΎΠ΅ Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΠ΅ 2,5 ΠΠΎΠ»ΡΡ. ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΠΎΡΠ° 5 ΠΎΠ±ΠΎΡΠΎΡΠΎΠ² Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ, ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ - 0,1 ΠΎΠ±ΠΎΡΠΎΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ. PD0, PD1 ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΈ ΠΏΡΠΈΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ
ΠΏΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ USART. ΠΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π½Π° ΠΠ. ΠΡΠ»ΠΈ Ρ ΠΠ Π²Π²Π΅ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ 0Ρ
10 ΡΠΎ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΠ΅Ρ. Π’Π°ΠΊΠΆΠ΅ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ ΡΡΠΌΠΌΠ° Ρ ΠΏΠΎΡΠ°Π·ΡΡΠ΄Π½ΠΎΠΉ ΠΈΠ½Π²Π΅ΡΡΠΈΠ΅ΠΉ (ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ 0Ρ
10 Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°). ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠ»Π΅ΡΠ°. ΠΡΠ»ΠΈ ΠΎΠ½ΠΈ ΠΊΡΡΡΡΡΡΡ Π² Π΄ΡΡΠ³ΡΡ ΡΡΠΎΡΠΎΠ½Ρ (Ρ.Π΅. Π½Π° PC1, PC3 Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Π½Π° PC0, PC2), Π²ΡΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΊΠΎΡΠΎΡΡΠΈ Π·Π½Π°ΠΊ ΠΌΠΈΠ½ΡΡ. ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Free Running mode. ΠΠ°Π½Π½ΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Ρ ΡΠ°ΡΡΠΎΡΠΎΠΉ 1 ΠΊΠΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΡΠ°Π·Ρ ΠΏΠΎ USART. ΠΠΎΠ΄ΡΡΠ΅Ρ ΡΠΊΠΎΡΠΎΡΡΠΈ ΠΏΠΎ ΡΠΎΡΠΌΡΠ»Π΅ 2*pi*d*frequency, Π³Π΄Π΅ d - ΡΡΠΎ Π΄ΠΈΠ°ΠΌΠ΅ΡΡ ΠΊΠΎΠ»Π΅Ρ (ΡΠ°Π²Π΅Π½ 0,25). frequency - ΡΠ°ΡΡΠΎΡΠ° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΉ, ΠΎΡ 0,1 Π΄ΠΎ 5. ΠΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π²Ρ
ΠΎΠ΄Π½ΡΡ
Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΠ¦Π ΠΎΡ 1 Π΄ΠΎ 2,5 Π. ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π²Π²Π΅ΡΡΠΈ ΡΠ°ΠΊΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ, Π³Π΄Π΅ ΡΠ°ΡΡΠΎΡΠ° 0,1 - ΡΡΠΎ 1 Π, Π° ΡΠ°ΡΡΠΎΡΠ° 5 - 2,5 Π. ΠΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠ°Π²ΠΈΡΡ. #include
// ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° Π΄Π»Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅ #include // ΠΠ»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΡΠ½ΠΊΡΠΈΡΠΌ ΡΠΈΠΊΠ»Π° Π·Π°Π΄Π΅ΠΆΠΊΠΈ #include // ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡΠΌΠΈ #define F_CPU 11059200UL // Π’Π°ΠΊΡΠΎΠ²Π°Ρ ΡΠ°ΡΡΠΎΡΠ° ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° #define POLYNOMIAL 0x9B // ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌ Π΄Π»Ρ CRC8 #define RX_NUM 4 // ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡΡ
Π±Π°ΠΉΡΠΎΠ² #define TX_NUM 4 // ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΡ
Π±Π°ΠΉΡΠΎΠ² #define BUFMASKRX (RX_NUM-1) //ΠΠ°ΡΠΊΠΈ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² ΠΊΠΎΠ»ΡΡΠ΅Π²ΡΡ
Π±ΡΡΠ΅ΡΠΎΠ² #define BUFMASKTX (TX_NUM-1) // ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ volatile uint16_t adc_values[4]; // ΠΌΠ°ΡΡΠΈΠ² Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΠ¦Π volatile uint32_t frequency[4]; // ΠΌΠ°ΡΡΠΈΠ² Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°ΡΡΠΎΡΡ Π² ΠΡ void ADC_INIT() { ADCSRA |= (1 << ADEN); // Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΠ¦Π ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ 128 (ΡΠ°ΡΡΠΎΡΠ° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ = 86,4 ΠΊΠΡ) ADCSRA |= (1 << ADATE); // Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ΅ΠΆΠΈΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΊΠ°ΡΠΊΠ° ΠΏΠΎ ΠΊΠ°Π½Π°Π»Π°ΠΌ ADCSRA |= (1 << ADIE); // Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΠΠ¦Π DDRC = &= ~(1 << 0) | ~(1 << 1) | ~(1 << 2) | ~(1 << 3); // PC0, PC1, PC2, PC3 Π½Π° Π²Ρ
ΠΎΠ΄ PORTC |= (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3); // ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΡΡΠ³ΠΈΠ²Π°ΡΡΠΈΡ
ΡΠ΅Π·ΠΈΡΡΠΎΡΠΎΠ² Π΄Π»Ρ Π²Ρ
ΠΎΠ΄ΠΎΠ² PC0, PC1, PC2, PC3 } void USART_INIT(unsigned int UBRR) { UBRR0H = (unsigned char) (UBRR >> 8); // Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠΊΠΎΡΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ 57600 Π±ΠΎΠ΄ UBRR0L = (unsigned char) UBRR; UCSR0B |= (1 << TXEN0) | (1 << RXEN0); // ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΠΈΠΊ ΠΈ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ UCSR0B |= (1 << RXCIE0); // Π Π°Π·ΡΠ΅ΡΠ°Π΅ΠΌ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΏΡΠΈΠ΅ΠΌΠ΅ UCSR0C |= (1 << UCSZ01) | (1 << UCSZ00) | (1 << UMSEL00); // Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠΎΡΠΌΠ°Ρ ΠΊΠ°Π΄ΡΠ°: 8 Π±ΠΈΡ Π΄Π°Π½Π½ΡΡ
, 1 ΡΡΠΎΠΏ-Π±ΠΈΡ DDRD |= (1 << 1); // Tx Π½Π° Π²ΡΡ
ΠΎΠ΄ DDRD &= ~(1 << 0); // Rx Π½Π° Π²Ρ
ΠΎΠ΄ UBRR0H = 0; UBRR0L = 11; } void USART_Transmit(uint32_t frequency) { // ΠΠ΅ΡΠ΅Π΄Π°ΡΠ°, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½Π°Ρ Π½Π° ΠΎΠΏΡΠΎΡΠ΅ ΡΠ»Π°Π³Π° ΡΠ΅Π³ΠΈΡΡΡΠ° UDRE while (!(UCSR0A & (1 << UDRE0))); // ΠΠ΄Π΅ΠΌ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ UDR0 = frequency; // ΠΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ } unsigned char USART_Receive(void) { // ΠΡΠΈΠ΅ΠΌ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° ΠΎΠΏΡΠΎΡΠ΅ ΡΠ»Π°Π³Π° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ΅ΠΌΠ° RXC while (!(UCSR0A & (1 << RXC0))); // ΠΠ΄Π΅ΠΌ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ΅ΠΌΠ° return UDR0; // ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΏΡΠΈΠ½ΡΡΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ } ISR(ADC_vect) { ADMUX &= ~(1 << MUX3) | ~(1 << MUX2) | ~(1 << MUX1) | ~(1 << MUX0); // ΠΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΊΠ°Π½Π°Π»Ρ ΠΠ¦Π Π΄Π»Ρ ΠΎΠΏΡΠΎΡΠ° (PC0, PC1, PC2, PC3) ADCSRA |= (1 << ADSC); // ΠΠ°ΡΠ°Π»ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΠ¦Π uint8_t adc = ADCL; static uint8_t channel = 0; adc_values[channel] = adc; // Π‘ΠΎΡ
ΡΠ°Π½ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΠ¦Π static char frequency[channel] = adc_values[channel] * 0.3; // Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ°ΡΡΠΎΡΡ Π²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π΅ΡΠ° channel++; // ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠ°Π½Π°Π» if (channel > 3) { channel = 0; } } ISR(USART0_RX_vect) { // ΠΡΡΠ΅Ρ ΠΏΡΠΈΠ΅ΠΌΠ° ΠΈ Π΅Π³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ: char bufRx[RX_NUM]; // Π±ΡΡΠ΅Ρ ΠΏΡΠΈΠ΅ΠΌΠ° unsigned char rxIn, rxOut; char bufTx[TX_NUM]; // Π±ΡΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ unsigned char txIn, txOut; bufRX[rxIn++] = UDR0; // ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠ΅ΠΌΠ° USART rxIn &= BUFMASKRX; } static void handlerTXUSART (void) // ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ USART { if((txIn != txOut) && (UCSR0A & (1 << UDRE0))) { UDR0 = bufTX[txOut++]; txOut &= BUFMASKTX; } } uint8_t calculateCRC8(uint8_t* data, uint8_t length) { uint8_t crc = 0xFF; // Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ CRC8 uint8_t i, j; for (i = 0; i < length; i++) { crc ^= data[i]; // XOR Ρ Π±Π°ΠΉΡΠΎΠΌ Π΄Π°Π½Π½ΡΡ
for (j = 0; j < 8; j++) { if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL; // ΡΠ΄Π²ΠΈΠ³ ΠΈ XOR Ρ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠΎΠΌ else crc <<= 1; // ΠΏΡΠΎΡΡΠΎ ΡΠ΄Π²ΠΈΠ³ Π²Π»Π΅Π²ΠΎ } } return ~crc; // ΠΏΠΎΡΠ°Π·ΡΡΠ΄Π½Π°Ρ ΠΈΠ½Π²Π΅ΡΡΠΈΡ } int main(void) { ADC_INIT(); USART_INIT(); sei(); // Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ uint8_t command = 0x10; while(1){ USART_Transmit(frequency[0]); USART_Transmit(frequency[1]); USART_Transmit(frequency[2]); USART_Transmit(frequency[3]); uint8_t data[] = UDR0; uint8_t crc = calculateCRC8(&command, 1); crc = calculateCRC8(data, sizeof(data)); USART_Transmit(crc); handlerTXUSART(); } return 0; }.