INT 21h

Домашняя страница самого страшного прерывания

AVR и MPCM

№ 3734 В разделах: Программирование Электроника от October 1st, 2011,

MPCM это очень полезная опция при работе с UART, снижающая нагрузку на микроконтроллер. Допустим у вас есть шина из 20 медленных устройст. Каждый приём символа вызывает в них прерывание, что создает дополнительную нагрузку и кратковременные перерывы в работе основной программы. А если данных передается много? Микроконтроллеры же тогда совсем не будут из прерываний вылазить. Чтобы решить такую досадную проблему придумали режим MPCM. Смысл этого режима заключается в том, что микроконтроллер перестает принимать любые данные, кроме тех, которые помечены как адреса. Это происходит аппаратно, поэтому прерывания не произойдет и основная программа продолжит работать. Но как только придет байт с адресом, а не данными, вызовется прерывание. В прерывании следует сделать проверку пришедшего байта является ли этот байт адресом данного устройства и если является, то снять флаг MPCM и начать приём данных. Как только пакет данных был принят, следует снова поднять флаг MPCM и продолжить игнорировать чужие пакеты до тех пор, пока снова не придет адрес данного устройства.

Обратите внимание на что, что я записал бит MPCM в регистр UCSRA. Это активировало флаг MPCM и заставило микроконтроллер игнорировать все, что не является адресом.

void UART_Init(void)
{
UBRRL = UBRRL_VALUE;
UBRRH = 0;
UCSRA = (1 << MPCM);
UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
UCSRC = (1 << URSEL) | (1 << USBS) | (3 << UCSZ0);
}

А вот так следует делать проверку адреса. Я присвоил адрес 0x01 данному устройству. Помните, что это только пример. Вы не обязаны следовать именно такому алгоритму.

ISR(USART_RX_vect)
{
unsigned char data = UDR;
if (bit_is_clear(UCSRA, RXB8)) {
if ((data & 0x01) == 0x01) {
UCSRA &= ~(1 << MPCM);
}
} else {
uart_buffer_flag--;
uart_buffer[uart_buffer_flag] = data;
}
}

Я проверил бит RXB8, который поднимется в случае принятия адреса и который снимется при принятии не адреса. Если бит не поднят, я принимаю данные в буффер. По окончанию приема следует поднять бит MPCM и начать заново игнорировать данные, но этого не сделал. Если поднят, значит принят адрес и его следует сравнить с адресом устройства. Если это адрес именно этого устройства, то снимаем флаг MPCM и начинаем прием данных со следующего принятого символа.

Нет комментариев »

Оставьте ваш комментарий »

Форма отправки комментария

*

Разрешенные HTML-теги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

RSS RSS Feed только для этого поста |


Комментарии
  • 21h: нене ) без меня )
  • Серегй: Не совсем грабить)) если грабить можно и без рации, есть более благие цели, вы просто ответьте на мой вопрос,...
  • 21h: магазин грабить собрались? ) не, тут я не помощник ;)
  • Серегй: А что бы мне поймать чужую волну, что мне для этого нужно сделать? Допустим я купил данную рацию себе, мне...
  • 21h: слушать никто не запрещает. нет закона, который запрещает слушать. те, кто говорит иначе нагло врут. а если...
  • Серегй: Я хотел узнать могу ли я просто прийти с данной рацией baofeng uv-5r, допустим на объект, ну или вообще...
  • 21h: У меня есть только эти 2. По другим ничего не знаю. В интернете можно скачать инструкцию к вашей модели рации,...
  • Серегй: Добрый день! Хотелось бы задать пару вопросов по поводу раций, у Вас есть куда можно обратиться ТАТ.
  • 21h: потому, что нейросетью проще. яркость светофора меняется в зависимости от времени суток от маленькой красной...
  • Михаил: А зачем нейросеть? Почему цвет светофора определить без нейросетей?