Пример решения задачи
Задача
на расчёт пропускной способности системы
из нескольких датчиков.
Требуется
проводить опрос 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;
}