Мелкие вопросы по МК и ПЛИС.
-
Chettuser
Re: Мелкие вопросы по МК и ПЛИС.
Прерывания по событиям вообще существуют для разгрузки вычислительного ядра от монотонной работы. Используется при использовании модулей периферии, например аппаратный модуль SPI.
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Мелкие вопросы по МК и ПЛИС.
jazz393 писал(а):Добрый день(точнее утро). Немного глупый вопрос - зачем существует прерывание по передаче?Ну к примеру в usart или в i2c или can...Я вот не понимаю, с прерыванием по приём - всё понятно, а вот передача....мы же итак отправляем посылку из тела main в нужное нам время, зачем тогда оно существует?
Во время передачи, если не использовать прерывания по передаче или опустошению буфера, контроллер будет простаивать ожидая этот флаг в тупом цикле. На скорости 9600 при тактовой 16М это между прочим 1600 тактов на бит.
Если использовать прерывания, то во время передачи символа контроллер будет делать другие полезные вещи.
А если вам надо килобайт данных переслать на скорости 9600? Вы будете 10 секунд ждать и ничего не делать?
PS:пока писал, уже ответили
Видимо ваши 20к строк надо как-то оптимизировать. У меня в самом сложном проекте всего около 1500 строк (а в ассемблере каждая строка это отдельная инструкция, не считая директив компилятора), при этом UART используются 95% времени, SPI 50% и контроллер приспокойно успевает просчитать практически в реальном времени 3 сотни хитрых функций. Без прерываний хрен бы он что успел...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Re: Мелкие вопросы по МК и ПЛИС.
всем спасибо, сейчас буду пытаться настроить прерывание и оптимизировать всё
-
sanyo.95
- Нашел транзистор. Понюхал.
- Сообщения: 170
- Зарегистрирован: Вс мар 30, 2014 21:41:24
- Откуда: Украина
Re: Мелкие вопросы по МК и ПЛИС.
pyzhman писал(а):Вам нужно позаботиться о том, чтобы содержимое hour попало в RTC, т.е. записать его туда.
О, теперь уже что-то проясняеться. То есть после чтения кнопки и инкремента переменной hour, мне как то нужно записать её в RTC? И как мне это сделать. Спасибо.
Re: Мелкие вопросы по МК и ПЛИС.
блин я всёравно не понимаю...ну есть эти 2 флага...
1) генерирует прерывание когда буфер передатчика пуст
т.е. допустим в программе у меня передача сделана так, тюею я в строке while ((UCSR1A & DATA_REGISTER_EMPTY)==0); жду когда флаг освободится...
Не понимаю следующего - как его использовать...если буфер передатчика всёвремя свободен, и мне надо скажем отправить какую-то строку char *str , то как это всё организовывается...? Мне что нужно будет разрешить прерывание, оно (если свободен буфер) вызывается, и записывает в буфер UDR1 = data[z]; затем прерывание возвращается и продолжается выполнять main, когда
флаг UDRE опять сработает, то снова вызывается прерывание и пишется UDR1 = data[z]; , а когда я дохожу до data[z]==0x03 (это признак конца сообщения) то я запрещаю это прерывание и обнуляю z =0; который должен быть глобальным счетчиком...
я правильно понимаю пункт 1?
или же я сначала всё должен записать в UDR1 т.е. UDR1 = data[z++]; в цикле пока data[z]!=0x03, и только затем уже давать добро на отправку?
2)Прерывание по завершению передачи - всёравно не представляю для чего оно на практике ....
и вызывается оно после каждого байта, или после того, как весь UDR1 завершит передачу?
я переводил сейчас даташит но всёравно лучше объясните, а то оттуда картина не очень понятна
1) генерирует прерывание когда буфер передатчика пуст
т.е. допустим в программе у меня передача сделана так, тюею я в строке while ((UCSR1A & DATA_REGISTER_EMPTY)==0); жду когда флаг освободится...
Код: Выделить всё
void uasrt_tx_1(char *data){
unsigned char z=0;
z=0;
do
{
while ((UCSR1A & (1<<UDRE))==0);
UDR1 = data[z++];
}while(data[z-1]!=0x03);
}Не понимаю следующего - как его использовать...если буфер передатчика всёвремя свободен, и мне надо скажем отправить какую-то строку char *str , то как это всё организовывается...? Мне что нужно будет разрешить прерывание, оно (если свободен буфер) вызывается, и записывает в буфер UDR1 = data[z]; затем прерывание возвращается и продолжается выполнять main, когда
флаг UDRE опять сработает, то снова вызывается прерывание и пишется UDR1 = data[z]; , а когда я дохожу до data[z]==0x03 (это признак конца сообщения) то я запрещаю это прерывание и обнуляю z =0; который должен быть глобальным счетчиком...
я правильно понимаю пункт 1?
или же я сначала всё должен записать в UDR1 т.е. UDR1 = data[z++]; в цикле пока data[z]!=0x03, и только затем уже давать добро на отправку?
2)Прерывание по завершению передачи - всёравно не представляю для чего оно на практике ....
и вызывается оно после каждого байта, или после того, как весь UDR1 завершит передачу?
я переводил сейчас даташит но всёравно лучше объясните, а то оттуда картина не очень понятна
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Мелкие вопросы по МК и ПЛИС.
jazz393 писал(а):блин я всёравно не понимаю...ну есть эти 2 флага...
1)Не понимаю следующего - как его использовать...если буфер передатчика всёвремя свободен, и мне надо скажем отправить какую-то строку char *str , то как это всё организовывается...? Мне что нужно будет разрешить прерывание, оно (если свободен буфер) вызывается, и записывает в буфер UDR1 = data[z]; затем прерывание возврощается и продолжается выполнять main, когда
флаг UDRE опять сработает, то снова вызывается прерывание и пишется UDR1 = data[z]; , а когда я дохожу до data[z]==0x03 (это признак конца сообщения) то я запрещаю это прерывание и обнуляю z -= который должен быть глобальным счетчиком...
я правильно понимаю пункт 1?
Вроде верно
jazz393 писал(а):или же я сначала всё должен записать в UDR1 т.е. UDR1 = data[z++]; в цикле пока dztz[z]!=0x03, и только затем уже давать добро на отправку?
Если вы так сделаете, то контроллер быстро перезапишет в UDR1 всю строку посимвольно, а т.к. UDR1 это всего лишь 8 битный регистр, то в нем просто останется последний символ, при этом запись первого запустит процесс передачи (первый байт попадет в сдвиговый регистр). После передачи первого байта, в регистр запишется последний байт и отправится на передачу, т.е. передадутся 1 и последний символы, а вся середина потеряется, вот что примерно получится...
Как работает UART подробно описано в даташите на контроллер.
jazz393 писал(а):2)Прерывание по завершению передачи - всёравно не представляю для чего оно на практике ....
и вызывается оно после каждого байта, или после того, как весь UDR1 завершит передачу?
Никакого "всего UDR1" нету, есть 8 битный буферный регистр UDR1 (точнее 2, на вход и выход), так что прерывание вызовется после передачи байта. Контроллер ничего не знает о строках и массивах, он 8 битный, так что вся работа по реализации алгоритмов отправки/приема/обработки массивов данных лежит на разработчике.
Разница в том, что прерывание по пустому буферу, если его включить, будет срабатывать постоянно, если в буфере будет пусто, а прерывание по окончанию передачи срабатывает один раз (до следующей передачи). И срабатывают они в разное время. По пустому буферу прерывание начинает срабатывать как только из UDR байт перемещается в выходной сдвиговый регистр, а по окончанию передачи срабатывает как только из выходного регистра уходят последний байт со стоп битами.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Re: Мелкие вопросы по МК и ПЛИС.
Да спасибо, впринципе я уже примерно понял как делать - кольцевой буфер на отправку, и в прерывании считывать из него если счетчики записанной инфы и переданной инфы не совпадают
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
иначе говоря:
Код: Выделить всё
буфер;
флаг_окончания_передачи=0;
обработчик_прерываний_по_передаче_символа{
если буфер не пуст{
извечь из буфера очередной символ и поместить его в UDR;
} иначе {
флаг_окончания_передачи=1;
}
}
передача_строки(строка){
ждать пока флаг_окончания_передачи =0;
флаг_окончания_передачи=0;
буфер=строка;
извлечь из буфера первый символ и поместить его в UDR;
}
главная_функция{
...
разрешить прерывания по передаче символа;
...
передача_строки("Туды её в качель!");
...
}если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Мелкие вопросы по МК и ПЛИС.
в само прерывание не попадает, отправляет только 1 байт из тела самой функции...
глоб прерывания разрешены и собственно все др прерывания работают...
функция передачи
обр прерываний
глоб прерывания разрешены и собственно все др прерывания работают...
функция передачи
Код: Выделить всё
void transmit_Usart_INT_1(unsigned char *data)
{
unsigned char i=0;
if(flag_tx_rdy_1)
return;
do
{
flag_tx_rdy_1=1;
buf_tx_usart_1[tail_tx_usart_1++]=data[i++];
if(tail_tx_usart_1==48)
tail_tx_usart_1=0;
}while(data[i-1] != 0x03);
if(head_tx_usart_1 != tail_tx_usart_1)
{
UDR1=data[head_tx_usart_1++];
flag_tx_rdy_1=1;
}
UCSR1B |= (1<<UDRIE1)); // разрешаем прерывание
}обр прерываний
Код: Выделить всё
interrupt [USART1_TXC] void usart1_tx_isr(void)
{
#asm("cli")
UDR1='k';
// UDR1=buf_tx_usart_1[head_tx_usart_1];
flag_tx_rdy_1=0;
if (++head_tx_usart_1 == 48)
head_tx_usart_1=0;
#asm("sei")
if(head_tx_usart_1 == tail_tx_usart_1)
UCSR1B &= ~(1<<UDRIE1);
return;
}- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Мелкие вопросы по МК и ПЛИС.
jazz393 писал(а):Код: Выделить всё
#asm("cli")
#asm("sei")
Лишнее. Поправьте если не прав.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Мелкие вопросы по МК и ПЛИС.
Gudd-Head писал(а):jazz393 писал(а):Код: Выделить всё
#asm("cli")
#asm("sei")
Лишнее. Поправьте если не прав.
да там что с ними что без них, просто ещё куча таймеров, это на всякий
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Мелкие вопросы по МК и ПЛИС.
jazz393 писал(а):да там что с ними что без них, просто ещё куча таймеров, это на всякий
Глобальные прерывания отключаются автоматически при переходе на обработчик прерывания, и автоматически же восстанавливаются при выходе из него. Сказать что будет, если разрешить прерывание внутри самого обработчика прерывания? А если в этот момент взведется как раз флаг ЭТОГО прерывания? Так что для начала cli-sei таки уберите оттудова...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Re: Мелкие вопросы по МК и ПЛИС.
Уточню. Только при выходе по RETI.Engineer_Keen писал(а):... автоматически же восстанавливаются при выходе из него.
Re: Мелкие вопросы по МК и ПЛИС.
Engineer_Keen писал(а):jazz393 писал(а):да там что с ними что без них, просто ещё куча таймеров, это на всякий
Глобальные прерывания отключаются автоматически при переходе на обработчик прерывания, и автоматически же восстанавливаются при выходе из него. Сказать что будет, если разрешить прерывание внутри самого обработчика прерывания? А если в этот момент взведется как раз флаг ЭТОГО прерывания? Так что для начала cli-sei таки уберите оттудова...
убрал, результат тот же самый=(
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Мелкие вопросы по МК и ПЛИС.
akl писал(а):Уточню. Только при выходе по RETI.
Думаю любителям ЯВУ этого знать не нужно не обязательно
jazz393, очевидно что дело было не только в cli-sei, но sei явно мог породить еще большие глюки...
Конкретно в чем косяк не скажу, т.к. Си не воспринимаю на 100%, у меня все проще...
Спойлер
Код: Выделить всё
[...]
;отправка
LDIW XH,CMD ;ставим указатель (X) на строку
LD R16,X+ ;читаем первый символ
OUT UDR,R16 ;отправляем в UART
OUTI UCSRB,(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN) ;включаем прерывание
STW CMD_PTR,XH
[...]
;прерывание по передаче
UART_TX:
PUSHS3 R16,XH,XL ;сохраняем регистры
LDW XH,CMD_PTR ;читаем указатель
LD R16,X+ ;читаем строку
OUT UDR,R16 ;отправляем в UART
STW CMD_PTR,XH ;сохраняем указатель
CJNE R16,0x03,TX_EX ;проверяем что не конец строки
OUTI UCSRB,(1<<RXCIE)|(0<<TXCIE)|(1<<RXEN)|(1<<TXEN) ;отключаем прерывание
TX_EX: POPS3 R16,XH,XL ;восстанавливаем регистры
RETI ;выходим из прерывания
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Re: Мелкие вопросы по МК и ПЛИС.
оу кстати разобрался - cvavr генерировал обработчик для др прерывания)
Re: Мелкие вопросы по МК и ПЛИС.
Добрый день,, пишу на си, подскажите где найти таблицу векторов прерываний точнее что писать в ISR()?
В файле interrupt.h не нашел.
В файле interrupt.h не нашел.
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Друзья, тут на 513 страничке я начинал распрашивать, и сейчас вынужден продолжить. Ибо летом отдыхал, а теперь очень надо к концу месяца проект демонстрировать.
viewtopic.php?f=62&t=32&start=10240
Там мало чего есть, правда. Исходное пока такое. Есть МК, на одну ножку которого выводится постоянно тактовый сигнал 8МГц. На одну ножку мы можем выводить лог.1 лог.0, а на ещё одной ножке принимать.Это формирует нам некоторый канал передачи данных. Сейчас требуется сделать чтоб была пара МК. Им даны некоторые ID. Один должен послать сообщение "ID второго + некоторое число". Второй приняв зажигает светодиод зелёный и посылает сообщение "ID первого + то же число". И так будет бесконечно. Соответственно если принятое не совпадает, зажигается красный светодиод.
Выводить данные надо с пока что любой частотой. Потолок шины 128кБод. Ниже всё стабильно. В теории. Эти 2 МК будут тестировать надёжность моей линии. Может кто накидать такой код?
viewtopic.php?f=62&t=32&start=10240
Там мало чего есть, правда. Исходное пока такое. Есть МК, на одну ножку которого выводится постоянно тактовый сигнал 8МГц. На одну ножку мы можем выводить лог.1 лог.0, а на ещё одной ножке принимать.Это формирует нам некоторый канал передачи данных. Сейчас требуется сделать чтоб была пара МК. Им даны некоторые ID. Один должен послать сообщение "ID второго + некоторое число". Второй приняв зажигает светодиод зелёный и посылает сообщение "ID первого + то же число". И так будет бесконечно. Соответственно если принятое не совпадает, зажигается красный светодиод.
Выводить данные надо с пока что любой частотой. Потолок шины 128кБод. Ниже всё стабильно. В теории. Эти 2 МК будут тестировать надёжность моей линии. Может кто накидать такой код?
- КАШАК
- Это не хвост, это антенна
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Добрый вечер
Есть МК STM32 с ЦАП на борту, к нему подключен УНЧ на TDA2003. Так вот через этот самый ЦАП при работе МК лезет различный ШУМ и писк. Вопрос - как избавиться?
Есть МК STM32 с ЦАП на борту, к нему подключен УНЧ на TDA2003. Так вот через этот самый ЦАП при работе МК лезет различный ШУМ и писк. Вопрос - как избавиться?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Re: Мелкие вопросы по МК и ПЛИС.
Скажите пожалуйста если есть микроконтроллер, подключен к общей шине, но по плюсовой шине питания не подается. Опасно если на его портах входа подаются сигналы?
Хочу на одной плате поставить несколько микроконтроллеров определенные ножки будут совпадать. По идее должен работать только один микроконтроллер. Таким образом на МК1 выключаю питание и подаю на МК2 ну и так далее.
Хочу на одной плате поставить несколько микроконтроллеров определенные ножки будут совпадать. По идее должен работать только один микроконтроллер. Таким образом на МК1 выключаю питание и подаю на МК2 ну и так далее.

