Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
Читал я читал про прерывания, так толком и не розобрался, точнее розобрался, но не уверенно я понял принцып их работы!
Скажите правильно ли я понял?
1. В одном из режимов работы прерывания, таймеры могут сами шевелить специально отведенными для этого ногами мк!
2. Я могу вводить в таймер значение, достигая которое нога будит давать 1 или 0.
3. Прерывания работают независимо от хода программы, тоесть процессор не будит бросать программу и переходить на прерывания, а потом возвращаться назад!
4. Как я понял я смогу выставлять значение таймера с которого он будит начинать считать, и значение, при котором произойдет непосредственно само прерывание!
Скажите пожалуйста, правильно ли я понял принцып? А то я немогу найти толковой информации, если где ошибся, поправьте пожалуйста!
Скажите правильно ли я понял?
1. В одном из режимов работы прерывания, таймеры могут сами шевелить специально отведенными для этого ногами мк!
2. Я могу вводить в таймер значение, достигая которое нога будит давать 1 или 0.
3. Прерывания работают независимо от хода программы, тоесть процессор не будит бросать программу и переходить на прерывания, а потом возвращаться назад!
4. Как я понял я смогу выставлять значение таймера с которого он будит начинать считать, и значение, при котором произойдет непосредственно само прерывание!
Скажите пожалуйста, правильно ли я понял принцып? А то я немогу найти толковой информации, если где ошибся, поправьте пожалуйста!
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
1 да, но не в одном режиме, а в нескольких
2 да, это продолжение пункта 1
3 нет, как раз наоборот бросает и именно поэтому стараются быстрее выполнять прерывание и возвращаться назад в основную программу.
4да, тут могу уточнить :
2 да, это продолжение пункта 1
3 нет, как раз наоборот бросает и именно поэтому стараются быстрее выполнять прерывание и возвращаться назад в основную программу.
4да, тут могу уточнить :
- А. У 8 битного таймера обычно есть два прерывания -прерывание по переполнению (overflow)и прерывание по достижению значения(output compare).
Оба прерывания могут произойти при одном цикле таймера.
Б. У 16 битного таймера обычно есть три прерывания -прерывание по переполнению, прерывание по достижению значения А и прерывание по достижению значения В.
Еще есть прерывание захвата значения таймера (input capture) это когда значение таймера записывается в специальный регистр при изменении значения на определенной ноге.
В . Это вы все описали прерывания, которые относятся к таймерам, еще есть много разных других прерываний количество которых варьируется от процессора к процессору. Такие как внешнее прерывание(бывает несколько к примеру INT0, INT1), прерывание по изменению состояния ноги PCINT (чаще встречается в серии tiny.), прерывания по приему/передаче байта и так далее подробные данные можно искать в datasheet либо, если это AVR в книге Евстифеева, который свел все Мк одной серии в одну книгу.
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
все что написано vitalik_1984ом, относится к микроконтроллерам AVR. В других контроллерах могут быть и другие функции таймеров, их может быть больше или меньше. Все подробности смотреть в документации.
Ставим плюсы: )
Re: Вопросы по С/С++ (СИ)
Именно для авр мне это и нужно! Спс за уточнения, в принцыпе разобрался.... буду пробовать, будут вопросы напишу!
-
Александр 2677
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Пн фев 22, 2010 11:16:00
Re: Вопросы по С/С++ (СИ)
Пожалуйста гляньте мой проект. Вроде вставляю готовые примеры из найденных статей, может дело в настройке Codevision или VMlab. Почему то когда я добавляю [] для исключения символов программа перестаёт раскладывать символы по массивам.
В архиве лежат проекты Codevision , VMlab и Proteus.
Код: Выделить всё
char str1[10], str2[10];
scanf("%[0123456789]%s", str1, str2);
printf("\n%s\n%s",str1,str2);В архиве лежат проекты Codevision , VMlab и Proteus.
- Вложения
-
- SSCANF.rar
- (89.92 КБ) 163 скачивания
-
juzik
- Встал на лапы
- Сообщения: 128
- Зарегистрирован: Пт сен 23, 2011 23:49:20
- Откуда: Симферополь, Украина
Re: Вопросы по С/С++ (СИ)
Для исключения символов надо писать
Код: Выделить всё
scanf("%[^0123456789]", str1);-
Александр 2677
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Пн фев 22, 2010 11:16:00
Re: Вопросы по С/С++ (СИ)
В качестве примеры я брал статью с этого сайта.
http://www.realcoding.net/article/view/1633
Я понимаю что наличие этого знака "^" определяет будут использованы символы заключённые в [] или нет. Дело в том что по какой то причине если я использую такую scanf("%[^0123456789]", str1); или такую scanf("%[0123456789]", str1); структуру на терминал выходят пустые значения. А если так scanf("%s", str1); то всё в порядке.
http://www.realcoding.net/article/view/1633
Я понимаю что наличие этого знака "^" определяет будут использованы символы заключённые в [] или нет. Дело в том что по какой то причине если я использую такую scanf("%[^0123456789]", str1); или такую scanf("%[0123456789]", str1); структуру на терминал выходят пустые значения. А если так scanf("%s", str1); то всё в порядке.
Re: Вопросы по С/С++ (СИ)
Вопрос на засыпку как поставить bit флаги, пример bit fl_rg, и подобные не используя "bit", bit работает но флаги ставит в по умолчанию GPIOx.x, компилятор CVAVR, контроллер XMEGA128A1
"PRT SC" в приложении.
"PRT SC" в приложении.
- Вложения
-
- 1.rar
- (35.66 КБ) 180 скачиваний
-
Александр 2677
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Пн фев 22, 2010 11:16:00
Re: Вопросы по С/С++ (СИ)
И всё таки по поводу такой записи
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>,...
Что же я делаю не так? Может глянете мой проект.
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>,...
Что же я делаю не так? Может глянете мой проект.
- БАТАРЕЙКУС
- Потрогал лапой паяльник
- Сообщения: 346
- Зарегистрирован: Сб фев 07, 2009 19:21:25
Re: Вопросы по С/С++ (СИ)
мужики помогите уже с ног сбился.
не могу ни как передать структуру в функцию, как только не пробовал пересмотрел все странички в поисковике не подходит ни одного варианта.
а надо то
в функцию.
не могу ни как передать структуру в функцию, как только не пробовал пересмотрел все странички в поисковике не подходит ни одного варианта.
а надо то
Код: Выделить всё
typedef struct
{
int bayt_Root ;
int bits_Root ;
int bayt_FAT ;
int bits_FAT ;
}SD_stryct ;
SD_stryct SD_Sys ;в функцию.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Что значит "не могу" ? Что конкретно делаете и что не получается ?
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
так как бы сама структура в качестве аргумента в функцию не передается, передается указатель на нее...
Re: Вопросы по С/С++ (СИ)
Всем привет!
Хочу сделать устройство, которое посылает по com-порту случайные данные 1 раз в определенный промежуток времени, кроме того оно должно перед отправкой мигать светодиодом, и быть готовым принять какие-то данные и обработать их.(устройств несколько, хочу устанавливать номер каждому устройству и периодически, по команде проверять этот номер).
Само устройство представляет собой контроллер ATmega88PA и преобразователь интерфейсов MAX232. Контроллер работает от кварца на 4 Мгц. Питается все это дело от DTR COM-порта. на светодиод установлен резистор 1 Ком, чтоб току не жрал много. Ток потребления при включенном светодиоде и постоянно молотящим туда-обратно уартом составляет 11.4 мА напряжение питания контроллера 4.2 В.
Написал программу на си, воспользовавшись мастером CodeVision'а.
Сама программа состоит из трез функций -
1) Мигания светодиодом
2) Отправки в ком-порт мусора
3) Принятия данных по порту и обработки их с выводом результата
Первые два события вызываются по таймеру через определенный промежуток времени, третье событие (прием и обработка запроса) по прерыванию на RX.
Все три функции молотятся в бесконечном цикле, и срабатывают только когда поднимается нужный флаг.
По отдельности каждая из функций работает нормально, также нормально работают первые две.
Небольшие глюки возникают при работе функции под номером 3. (Если она работает одна, а остальные закомментированы)
Глюки заключаются в том, что если я задал устройству номер а потом спрашиваю у устройства этот номер, то периодически данные, которые я ему посылаю доходят с ошибкой. Но это ладно, ошибка возникает раз где-то в 10-20 запросов.
Но если я включаю работать все эти три функции одновременно, то в момент наступления прерывания по RX, программа входит в функцию №3 и уже из нее не выходит...
В этом вся и проблема. Уже два дня сижу, всю голову сломал, ничего на ум не приходит.
У меня догадки что все просто через одно место написано (это моя первая программа, и мало знаний как оптимизировать скоость), поэтому контроллер не успеват все обработать. Но если я перещелкиваю на встроенный генератор на 8Мгц, то ничего не меняется все по прежнему виснет.
Товарищи! Не могли бы вы мне подсказать в чем может быть причина такого поведения контроллера? Как можно улучшить программу?
Где я дурак? Куда копать?
Прикладываю свою программу. Заранее извините, за быдлокод.
Хочу сделать устройство, которое посылает по com-порту случайные данные 1 раз в определенный промежуток времени, кроме того оно должно перед отправкой мигать светодиодом, и быть готовым принять какие-то данные и обработать их.(устройств несколько, хочу устанавливать номер каждому устройству и периодически, по команде проверять этот номер).
Само устройство представляет собой контроллер ATmega88PA и преобразователь интерфейсов MAX232. Контроллер работает от кварца на 4 Мгц. Питается все это дело от DTR COM-порта. на светодиод установлен резистор 1 Ком, чтоб току не жрал много. Ток потребления при включенном светодиоде и постоянно молотящим туда-обратно уартом составляет 11.4 мА напряжение питания контроллера 4.2 В.
Написал программу на си, воспользовавшись мастером CodeVision'а.
Сама программа состоит из трез функций -
1) Мигания светодиодом
2) Отправки в ком-порт мусора
3) Принятия данных по порту и обработки их с выводом результата
Первые два события вызываются по таймеру через определенный промежуток времени, третье событие (прием и обработка запроса) по прерыванию на RX.
Все три функции молотятся в бесконечном цикле, и срабатывают только когда поднимается нужный флаг.
По отдельности каждая из функций работает нормально, также нормально работают первые две.
Небольшие глюки возникают при работе функции под номером 3. (Если она работает одна, а остальные закомментированы)
Глюки заключаются в том, что если я задал устройству номер а потом спрашиваю у устройства этот номер, то периодически данные, которые я ему посылаю доходят с ошибкой. Но это ладно, ошибка возникает раз где-то в 10-20 запросов.
Но если я включаю работать все эти три функции одновременно, то в момент наступления прерывания по RX, программа входит в функцию №3 и уже из нее не выходит...
В этом вся и проблема. Уже два дня сижу, всю голову сломал, ничего на ум не приходит.
У меня догадки что все просто через одно место написано (это моя первая программа, и мало знаний как оптимизировать скоость), поэтому контроллер не успеват все обработать. Но если я перещелкиваю на встроенный генератор на 8Мгц, то ничего не меняется все по прежнему виснет.
Товарищи! Не могли бы вы мне подсказать в чем может быть причина такого поведения контроллера? Как можно улучшить программу?
Где я дурак? Куда копать?
Прикладываю свою программу. Заранее извините, за быдлокод.
- Вложения
-
- 2.c
- (12.85 КБ) 267 скачиваний
Последний раз редактировалось hazgon Пн ноя 26, 2012 06:43:56, всего редактировалось 1 раз.
-
Tolmi
- Говорящий с текстолитом
- Сообщения: 1658
- Зарегистрирован: Вс дек 11, 2011 05:25:04
- Откуда: Киев, Украина
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Александр 2677 писал(а):А у меня терминал VM lab выдаёт только <LF> а в окне Watch напротив str1 и str2 <NUL>,<NUL>,<NUL>,...
В диалектах С для МК очень часто библиотеки сильно урезаются в угоду компактности. Возможно, этот функционал просто не реализован.
Что же я делаю не так? Может глянете мой проект.
В GCC всё работает, как и описывалось.
Код: Выделить всё
[tolmi@ktoto misc]$ cat test27.c
#include <stdio.h>
void main()
{
char str1[10], str2[10];
scanf("%[0123456789]%s", str1, str2);
printf("\n%s\n%s\n",str1,str2);
}[tolmi@ktoto misc]$ gcc test27.c
[tolmi@ktoto misc]$ ./a.out
45672xdef567
45672
xdef567
[tolmi@ktoto misc]$
In theory, theory and practice are the same. In practice, they're not.
-
Александр 2677
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Пн фев 22, 2010 11:16:00
Re: Вопросы по С/С++ (СИ)
Понял, спасибо.
Re: Вопросы по С/С++ (СИ)
hazgon писал(а):Всем привет!
Хочу сделать устройство, которое посылает по com-порту случайные данные 1 раз в определенный промежуток времени, кроме того оно должно перед отправкой мигать светодиодом, и быть готовым принять какие-то данные и обработать их.(устройств несколько, хочу устанавливать номер каждому устройству и периодически, по команде проверять этот номер).
Само устройство представляет собой контроллер ATmega88PA и преобразователь интерфейсов MAX232. Контроллер работает от кварца на 4 Мгц. Питается все это дело от DTR COM-порта. на светодиод установлен резистор 1 Ком, чтоб току не жрал много. Ток потребления при включенном светодиоде и постоянно молотящим туда-обратно уартом составляет 11.4 мА напряжение питания контроллера 4.2 В.
Написал программу на си, воспользовавшись мастером CodeVision'а.
Сама программа состоит из трез функций -
1) Мигания светодиодом
2) Отправки в ком-порт мусора
3) Принятия данных по порту и обработки их с выводом результата
Первые два события вызываются по таймеру через определенный промежуток времени, третье событие (прием и обработка запроса) по прерыванию на RX.
Все три функции молотятся в бесконечном цикле, и срабатывают только когда поднимается нужный флаг.
По отдельности каждая из функций работает нормально, также нормально работают первые две.
Небольшие глюки возникают при работе функции под номером 3. (Если она работает одна, а остальные закомментированы)
Глюки заключаются в том, что если я задал устройству номер а потом спрашиваю у устройства этот номер, то периодически данные, которые я ему посылаю доходят с ошибкой. Но это ладно, ошибка возникает раз где-то в 10-20 запросов.
Но если я включаю работать все эти три функции одновременно, то в момент наступления прерывания по RX, программа входит в функцию №3 и уже из нее не выходит...
В этом вся и проблема. Уже два дня сижу, всю голову сломал, ничего на ум не приходит.
У меня догадки что все просто через одно место написано (это моя первая программа, и мало знаний как оптимизировать скоость), поэтому контроллер не успеват все обработать. Но если я перещелкиваю на встроенный генератор на 8Мгц, то ничего не меняется все по прежнему виснет.
Товарищи! Не могли бы вы мне подсказать в чем может быть причина такого поведения контроллера? Как можно улучшить программу?
Где я дурак? Куда копать?
Прикладываю свою программу. Заранее извините, за быдлокод.
Разобрался.
Дело было в том, что в одном месте программы был не задан размер массива, соответственно он объявлялся в произвольной области памяти. А область эта была таймером. Поэтому таймер отрубался. и выполнение остальных частей программы прекращалось.
Господа! Не забывайте задавать размеры массивов!
Re: Вопросы по С/С++ (СИ)
А если не знаю я размера будущего массива с точностью до байта, шо тогда? Низзя вообще? И зачем я этот клятый Си учил?hazgon писал(а):Господа! Не забывайте задавать размеры массивов!
Почитайте про динмассивы и хипы.
С уважением,
Виктор.
Виктор.
Re: Вопросы по С/С++ (СИ)
Ребята, всем доброго вечера! Помогите советом, ткните носом, сам разобраться не могу пока что.
Дело такое, нагородил функцию программного 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
Дело такое, нагородил функцию программного 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
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Правильнее будет читать в массив чаров и возвращать его. 1 байт - 1 микросхема(8 входов). А дальше уже сливайте эти байты как хотите и делайте с ними что угодно.
Re: Вопросы по С/С++ (СИ)
Аlex писал(а):Правильнее будет читать в массив чаров и возвращать его. 1 байт - 1 микросхема(8 входов). А дальше уже сливайте эти байты как хотите и делайте с ними что угодно.
тоже об этом думал, к примеру я считаю все пять 74нс165 в одной функции, результат помещу в в массив char Mas74нс165 [] = {1, 2, 3, 4, 5}. но я же опять с помощью return не могу вернуть массив из функции или не так ??