Читал я читал про прерывания, так толком и не розобрался, точнее розобрался, но не уверенно я понял принцып их работы!
Скажите правильно ли я понял?
1. В одном из режимов работы прерывания, таймеры могут сами шевелить специально отведенными для этого ногами мк!
2. Я могу вводить в таймер значение, достигая которое нога будит давать 1 или 0.
3. Прерывания работают независимо от хода программы, тоесть процессор не будит бросать программу и переходить на прерывания, а потом возвращаться назад!
4. Как я понял я смогу выставлять значение таймера с которого он будит начинать считать, и значение, при котором произойдет непосредственно само прерывание!
Скажите пожалуйста, правильно ли я понял принцып? А то я немогу найти толковой информации, если где ошибся, поправьте пожалуйста!
1 да, но не в одном режиме, а в нескольких
2 да, это продолжение пункта 1
3 нет, как раз наоборот бросает и именно поэтому стараются быстрее выполнять прерывание и возвращаться назад в основную программу.
4да, тут могу уточнить :
А. У 8 битного таймера обычно есть два прерывания -прерывание по переполнению (overflow)и прерывание по достижению значения(output compare).
Оба прерывания могут произойти при одном цикле таймера.
Б. У 16 битного таймера обычно есть три прерывания -прерывание по переполнению, прерывание по достижению значения А и прерывание по достижению значения В.
Еще есть прерывание захвата значения таймера (input capture) это когда значение таймера записывается в специальный регистр при изменении значения на определенной ноге.
В . Это вы все описали прерывания, которые относятся к таймерам, еще есть много разных других прерываний количество которых варьируется от процессора к процессору. Такие как внешнее прерывание(бывает несколько к примеру INT0, INT1), прерывание по изменению состояния ноги PCINT (чаще встречается в серии tiny.), прерывания по приему/передаче байта и так далее подробные данные можно искать в datasheet либо, если это AVR в книге Евстифеева, который свел все Мк одной серии в одну книгу.
все что написано vitalik_1984ом, относится к микроконтроллерам AVR. В других контроллерах могут быть и другие функции таймеров, их может быть больше или меньше. Все подробности смотреть в документации.
Пожалуйста гляньте мой проект. Вроде вставляю готовые примеры из найденных статей, может дело в настройке Codevision или VMlab. Почему то когда я добавляю [] для исключения символов программа перестаёт раскладывать символы по массивам.
В качестве примеры я брал статью с этого сайта. http://www.realcoding.net/article/view/1633
Я понимаю что наличие этого знака "^" определяет будут использованы символы заключённые в [] или нет. Дело в том что по какой то причине если я использую такую scanf("%[^0123456789]", str1); или такую scanf("%[0123456789]", str1); структуру на терминал выходят пустые значения. А если так scanf("%s", str1); то всё в порядке.
Вопрос на засыпку как поставить bit флаги, пример bit fl_rg, и подобные не используя "bit", bit работает но флаги ставит в по умолчанию GPIOx.x, компилятор CVAVR, контроллер XMEGA128A1
"PRT SC" в приложении.
И всё таки по поводу такой записи
char str1[10], str2[10];
scanf("%[0123456789]%s", str1, str2);
printf("\n%s\n%s",str1,str2);
Если верить статье http://www.realcoding.net/articles/funk ... scanf.html
то если на терминале ввести набор символов:
12345abcdefg456
На экране программа выдаст:
12345
abcdefg456
А у меня терминал VM lab выдаёт только <LF> а в окне Watch напротив str1 и str2 <NUL>,<NUL>,<NUL>,...
мужики помогите уже с ног сбился.
не могу ни как передать структуру в функцию, как только не пробовал пересмотрел все странички в поисковике не подходит ни одного варианта.
а надо то
Всем привет!
Хочу сделать устройство, которое посылает по com-порту случайные данные 1 раз в определенный промежуток времени, кроме того оно должно перед отправкой мигать светодиодом, и быть готовым принять какие-то данные и обработать их.(устройств несколько, хочу устанавливать номер каждому устройству и периодически, по команде проверять этот номер).
Само устройство представляет собой контроллер ATmega88PA и преобразователь интерфейсов MAX232. Контроллер работает от кварца на 4 Мгц. Питается все это дело от DTR COM-порта. на светодиод установлен резистор 1 Ком, чтоб току не жрал много. Ток потребления при включенном светодиоде и постоянно молотящим туда-обратно уартом составляет 11.4 мА напряжение питания контроллера 4.2 В.
Написал программу на си, воспользовавшись мастером CodeVision'а.
Сама программа состоит из трез функций -
1) Мигания светодиодом
2) Отправки в ком-порт мусора
3) Принятия данных по порту и обработки их с выводом результата
Первые два события вызываются по таймеру через определенный промежуток времени, третье событие (прием и обработка запроса) по прерыванию на RX.
Все три функции молотятся в бесконечном цикле, и срабатывают только когда поднимается нужный флаг.
По отдельности каждая из функций работает нормально, также нормально работают первые две.
Небольшие глюки возникают при работе функции под номером 3. (Если она работает одна, а остальные закомментированы)
Глюки заключаются в том, что если я задал устройству номер а потом спрашиваю у устройства этот номер, то периодически данные, которые я ему посылаю доходят с ошибкой. Но это ладно, ошибка возникает раз где-то в 10-20 запросов.
Но если я включаю работать все эти три функции одновременно, то в момент наступления прерывания по RX, программа входит в функцию №3 и уже из нее не выходит...
В этом вся и проблема. Уже два дня сижу, всю голову сломал, ничего на ум не приходит.
У меня догадки что все просто через одно место написано (это моя первая программа, и мало знаний как оптимизировать скоость), поэтому контроллер не успеват все обработать. Но если я перещелкиваю на встроенный генератор на 8Мгц, то ничего не меняется все по прежнему виснет.
Товарищи! Не могли бы вы мне подсказать в чем может быть причина такого поведения контроллера? Как можно улучшить программу?
Где я дурак? Куда копать?
Прикладываю свою программу. Заранее извините, за быдлокод.
hazgon писал(а):Всем привет!
Хочу сделать устройство, которое посылает по com-порту случайные данные 1 раз в определенный промежуток времени, кроме того оно должно перед отправкой мигать светодиодом, и быть готовым принять какие-то данные и обработать их.(устройств несколько, хочу устанавливать номер каждому устройству и периодически, по команде проверять этот номер).
Само устройство представляет собой контроллер ATmega88PA и преобразователь интерфейсов MAX232. Контроллер работает от кварца на 4 Мгц. Питается все это дело от DTR COM-порта. на светодиод установлен резистор 1 Ком, чтоб току не жрал много. Ток потребления при включенном светодиоде и постоянно молотящим туда-обратно уартом составляет 11.4 мА напряжение питания контроллера 4.2 В.
Написал программу на си, воспользовавшись мастером CodeVision'а.
Сама программа состоит из трез функций -
1) Мигания светодиодом
2) Отправки в ком-порт мусора
3) Принятия данных по порту и обработки их с выводом результата
Первые два события вызываются по таймеру через определенный промежуток времени, третье событие (прием и обработка запроса) по прерыванию на RX.
Все три функции молотятся в бесконечном цикле, и срабатывают только когда поднимается нужный флаг.
По отдельности каждая из функций работает нормально, также нормально работают первые две.
Небольшие глюки возникают при работе функции под номером 3. (Если она работает одна, а остальные закомментированы)
Глюки заключаются в том, что если я задал устройству номер а потом спрашиваю у устройства этот номер, то периодически данные, которые я ему посылаю доходят с ошибкой. Но это ладно, ошибка возникает раз где-то в 10-20 запросов.
Но если я включаю работать все эти три функции одновременно, то в момент наступления прерывания по RX, программа входит в функцию №3 и уже из нее не выходит...
В этом вся и проблема. Уже два дня сижу, всю голову сломал, ничего на ум не приходит.
У меня догадки что все просто через одно место написано (это моя первая программа, и мало знаний как оптимизировать скоость), поэтому контроллер не успеват все обработать. Но если я перещелкиваю на встроенный генератор на 8Мгц, то ничего не меняется все по прежнему виснет.
Товарищи! Не могли бы вы мне подсказать в чем может быть причина такого поведения контроллера? Как можно улучшить программу?
Где я дурак? Куда копать?
Прикладываю свою программу. Заранее извините, за быдлокод.
Разобрался.
Дело было в том, что в одном месте программы был не задан размер массива, соответственно он объявлялся в произвольной области памяти. А область эта была таймером. Поэтому таймер отрубался. и выполнение остальных частей программы прекращалось.
hazgon писал(а):Господа! Не забывайте задавать размеры массивов!
А если не знаю я размера будущего массива с точностью до байта, шо тогда? Низзя вообще? И зачем я этот клятый Си учил?
Почитайте про динмассивы и хипы.
Ребята, всем доброго вечера! Помогите советом, ткните носом, сам разобраться не могу пока что.
Дело такое, нагородил функцию программного SPI для чтения пяти микросхем цепочкой подключенных 74НС165. Проблема вот в чем, так как 5 микросхем по 8 портов это у нас получается 40 бит, а 40 бит мы в одну переменную записать не можем, поэтому делаю так, читаю первые 32 биты в одну переменную unsigned long int DataInput74hc165_32, а затем еще остальные 8 бит в unsigned сhar DataInput74hc165_8. Как мне вернуть из функции чтения 74нс165 оба значения DataInput74hc165_32, DataInput74hc165_8 ??? или проще сделать две функции ???
Заранее спасибо!
Пишу в СVAR 2.05
Правильнее будет читать в массив чаров и возвращать его. 1 байт - 1 микросхема(8 входов). А дальше уже сливайте эти байты как хотите и делайте с ними что угодно.
Аlex писал(а):Правильнее будет читать в массив чаров и возвращать его. 1 байт - 1 микросхема(8 входов). А дальше уже сливайте эти байты как хотите и делайте с ними что угодно.
тоже об этом думал, к примеру я считаю все пять 74нс165 в одной функции, результат помещу в в массив char Mas74нс165 [] = {1, 2, 3, 4, 5}. но я же опять с помощью return не могу вернуть массив из функции или не так ??