Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

Re: Вопросы по С/С++ (СИ)

Сообщение Sceam73 »

Читал я читал про прерывания, так толком и не розобрался, точнее розобрался, но не уверенно я понял принцып их работы!
Скажите правильно ли я понял?
1. В одном из режимов работы прерывания, таймеры могут сами шевелить специально отведенными для этого ногами мк!
2. Я могу вводить в таймер значение, достигая которое нога будит давать 1 или 0.
3. Прерывания работают независимо от хода программы, тоесть процессор не будит бросать программу и переходить на прерывания, а потом возвращаться назад!
4. Как я понял я смогу выставлять значение таймера с которого он будит начинать считать, и значение, при котором произойдет непосредственно само прерывание!

Скажите пожалуйста, правильно ли я понял принцып? А то я немогу найти толковой информации, если где ошибся, поправьте пожалуйста!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

1 да, но не в одном режиме, а в нескольких
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: Вопросы по С/С++ (СИ)

Сообщение ibiza11 »

все что написано vitalik_1984ом, относится к микроконтроллерам AVR. В других контроллерах могут быть и другие функции таймеров, их может быть больше или меньше. Все подробности смотреть в документации.
Ставим плюсы: )
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

Re: Вопросы по С/С++ (СИ)

Сообщение Sceam73 »

Именно для авр мне это и нужно! Спс за уточнения, в принцыпе разобрался.... буду пробовать, будут вопросы напишу!
Александр 2677
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

Re: Вопросы по С/С++ (СИ)

Сообщение Александр 2677 »

Пожалуйста гляньте мой проект. Вроде вставляю готовые примеры из найденных статей, может дело в настройке Codevision или VMlab. Почему то когда я добавляю [] для исключения символов программа перестаёт раскладывать символы по массивам.

Код: Выделить всё

 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: Вопросы по С/С++ (СИ)

Сообщение juzik »

Для исключения символов надо писать

Код: Выделить всё

scanf("%[^0123456789]", str1);
Александр 2677
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

Re: Вопросы по С/С++ (СИ)

Сообщение Александр 2677 »

В качестве примеры я брал статью с этого сайта.
http://www.realcoding.net/article/view/1633
Я понимаю что наличие этого знака "^" определяет будут использованы символы заключённые в [] или нет. Дело в том что по какой то причине если я использую такую scanf("%[^0123456789]", str1); или такую scanf("%[0123456789]", str1); структуру на терминал выходят пустые значения. А если так scanf("%s", str1); то всё в порядке.
Аватара пользователя
signum
Встал на лапы
Сообщения: 84
Зарегистрирован: Ср июн 22, 2011 20:41:57
Откуда: Харьков

Re: Вопросы по С/С++ (СИ)

Сообщение signum »

Вопрос на засыпку как поставить bit флаги, пример bit fl_rg, и подобные не используя "bit", bit работает но флаги ставит в по умолчанию GPIOx.x, компилятор CVAVR, контроллер XMEGA128A1
"PRT SC" в приложении.
Вложения
1.rar
(35.66 КБ) 180 скачиваний
Александр 2677
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

Re: Вопросы по С/С++ (СИ)

Сообщение Александр 2677 »

И всё таки по поводу такой записи
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: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Что значит "не могу" ? Что конкретно делаете и что не получается ?
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

так как бы сама структура в качестве аргумента в функцию не передается, передается указатель на нее...
hazgon
Родился
Сообщения: 2
Зарегистрирован: Вс ноя 25, 2012 23:43:12

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Мгц, то ничего не меняется все по прежнему виснет.

Товарищи! Не могли бы вы мне подсказать в чем может быть причина такого поведения контроллера? Как можно улучшить программу?
Где я дурак? Куда копать?

Прикладываю свою программу. Заранее извините, за быдлокод.
Вложения
2.c
(12.85 КБ) 267 скачиваний
Последний раз редактировалось hazgon Пн ноя 26, 2012 06:43:56, всего редактировалось 1 раз.
Tolmi
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Tolmi »

Александр 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: Вопросы по С/С++ (СИ)

Сообщение Александр 2677 »

Понял, спасибо.
hazgon
Родился
Сообщения: 2
Зарегистрирован: Вс ноя 25, 2012 23:43:12

Re: Вопросы по С/С++ (СИ)

Сообщение hazgon »

hazgon писал(а):Всем привет!
Хочу сделать устройство, которое посылает по com-порту случайные данные 1 раз в определенный промежуток времени, кроме того оно должно перед отправкой мигать светодиодом, и быть готовым принять какие-то данные и обработать их.(устройств несколько, хочу устанавливать номер каждому устройству и периодически, по команде проверять этот номер).

Само устройство представляет собой контроллер ATmega88PA и преобразователь интерфейсов MAX232. Контроллер работает от кварца на 4 Мгц. Питается все это дело от DTR COM-порта. на светодиод установлен резистор 1 Ком, чтоб току не жрал много. Ток потребления при включенном светодиоде и постоянно молотящим туда-обратно уартом составляет 11.4 мА напряжение питания контроллера 4.2 В.

Написал программу на си, воспользовавшись мастером CodeVision'а.
Сама программа состоит из трез функций -
1) Мигания светодиодом
2) Отправки в ком-порт мусора
3) Принятия данных по порту и обработки их с выводом результата

Первые два события вызываются по таймеру через определенный промежуток времени, третье событие (прием и обработка запроса) по прерыванию на RX.
Все три функции молотятся в бесконечном цикле, и срабатывают только когда поднимается нужный флаг.

По отдельности каждая из функций работает нормально, также нормально работают первые две.

Небольшие глюки возникают при работе функции под номером 3. (Если она работает одна, а остальные закомментированы)
Глюки заключаются в том, что если я задал устройству номер а потом спрашиваю у устройства этот номер, то периодически данные, которые я ему посылаю доходят с ошибкой. Но это ладно, ошибка возникает раз где-то в 10-20 запросов.

Но если я включаю работать все эти три функции одновременно, то в момент наступления прерывания по RX, программа входит в функцию №3 и уже из нее не выходит...
В этом вся и проблема. Уже два дня сижу, всю голову сломал, ничего на ум не приходит.

У меня догадки что все просто через одно место написано (это моя первая программа, и мало знаний как оптимизировать скоость), поэтому контроллер не успеват все обработать. Но если я перещелкиваю на встроенный генератор на 8Мгц, то ничего не меняется все по прежнему виснет.

Товарищи! Не могли бы вы мне подсказать в чем может быть причина такого поведения контроллера? Как можно улучшить программу?
Где я дурак? Куда копать?

Прикладываю свою программу. Заранее извините, за быдлокод.


Разобрался.
Дело было в том, что в одном месте программы был не задан размер массива, соответственно он объявлялся в произвольной области памяти. А область эта была таймером. Поэтому таймер отрубался. и выполнение остальных частей программы прекращалось.

Господа! Не забывайте задавать размеры массивов!
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение ut1wpr »

hazgon писал(а):Господа! Не забывайте задавать размеры массивов!
А если не знаю я размера будущего массива с точностью до байта, шо тогда? Низзя вообще? И зачем я этот клятый Си учил? :(
Почитайте про динмассивы и хипы.
С уважением,
Виктор.
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение RoTToR »

Ребята, всем доброго вечера! Помогите советом, ткните носом, сам разобраться не могу пока что.
Дело такое, нагородил функцию программного 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: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Правильнее будет читать в массив чаров и возвращать его. 1 байт - 1 микросхема(8 входов). А дальше уже сливайте эти байты как хотите и делайте с ними что угодно.
RoTToR
Открыл глаза
Сообщения: 73
Зарегистрирован: Вс июн 07, 2009 23:16:16
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение RoTToR »

Аlex писал(а):Правильнее будет читать в массив чаров и возвращать его. 1 байт - 1 микросхема(8 входов). А дальше уже сливайте эти байты как хотите и делайте с ними что угодно.

тоже об этом думал, к примеру я считаю все пять 74нс165 в одной функции, результат помещу в в массив char Mas74нс165 [] = {1, 2, 3, 4, 5}. но я же опять с помощью return не могу вернуть массив из функции или не так ??
Ответить

Вернуться в «Разные вопросы по МК»