Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / 4 / Отчёт_ИДЗ4.docx
Скачиваний:
0
Добавлен:
12.02.2026
Размер:
38.03 Кб
Скачать

Пример решения задачи

Задача на расчёт пропускной способности системы из нескольких датчиков.

Требуется проводить опрос N датчиков, передающих 16 бит данных с частотой 100 Гц. Далее все собранные данные отправляются на другое вычислительное устройство по интерфейсу UART с конфигурацией <baudrate = 115200, 8 бит данных, без проверки чётности, 2 стоп-бита>. Определите максимальное N, если считать, что единственным ограничением является пропускная способность используемого интерфейса UART.

Baudrate = 115200 бит/сек. Если частота опроса 100 Гц, значит каждый опрос не может превышать 1/100 = 0.01 сек. За это время через интерфейс можно передать не более 1152 бит. В одном пакете передаётся 1 старт бит, 8 бит данных и 2 стоп-бита, т.е. всего 11 бит. Тогда, всего для заданного проежутка времени мы можем передать 1152/11 = 104 пакета данных. А значит N = 104.

Приложение. Листинг кода.

#include <avr/io.h>

#include <avr/interrupt.h>

#define F_CPU 8000000

#define USART_BAUDRATE 9600

#define BAUD_PRESCALE ((F_CPU / (USART_BAUDRATE * 16UL)) - 1)

#define IRQs_FOR_DUTY_CHANGE 20

#define ADC_FS 5 // Частота выполнения АЦП-преобразования (Гц)

#define TIMER_COUNT ((F_CPU / (8 * ADC_FS)) - 1) // Значение для OCR0A

uint8_t irq_counter = 0; // Счётчик прерываний

int main(void){

DDRA &= ~(1 << DDRA6);

// Устанавливаем Пин светодиода

DDRA |= (1 << DDRA5); // Направление выход

GTCCR |= (1 << REMAP); // Маска ШИМ на этот пин

// Настройка ядра

CCP = 0xD8; // Устанавливаем ПД 0

CLKPSR = 0;

// Настройка UART

UBRR = BAUD_PRESCALE;

UCSRB |= (1 << TXEN);

UCSRC = (1 << UCSZ1)|(1 << UCSZ0);

// Настройки таймера

TCCR0A |= (1 << WGM01)|(1 << COM0B0)|(1 << COM0B1);

TCCR0B |= (1 << WGM03)|(1 << WGM02)|(1 << CS01);

ICR0 = 256;

OCR0B = 0;

TIMSK0 |= (1 << TOIE0);

// Настройка АЦП

ADCSRA |= (1 << ADEN)|(1 << ADPS2)|(1 << ADIE);

ADCSRB |= (1 << ADLAR);

ADMUX |= (1 << MUX1)|(1 << MUX0);

sei();

while (1){}

}

ISR(TIM0_OVF_vect){

irq_counter++;

// Если прерываний 20

if (irq_counter == IRQs_FOR_DUTY_CHANGE) {

irq_counter = 0; // Сбросили счётчик

ADCSRA |= (1 << ADSC);}

}

ISR(ADC_vect){

//DDRA = 0;

//uint16_t analogReading;

OCR0BL = ADCL;

OCR0BH = ADCH;

UDR = ADCH;

}

Соседние файлы в папке 4