Вопросы и ответы по написанию программ

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Друг Кота
Аватара пользователя
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Организуйте глобальную переменную и используйте её как флаг. В самом начале обработчика прерывания проверяйте значение этой переменной. Если она == 0, то в обработчике прерывания ничего делать не надо... Как только в теле основной программы присвоите ей значение не равное нулю, так сразу начнёт работать Ваше прерывание, которое генерит Ваши импульсы...
Реклама
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пн июн 09, 2008 23:40:31

Сообщение lag1 »

Догадываюсь, что вопрос прозвучит некорректно, но все-же хотелось бы уточнить: возможно ли написать такую программу, чтобы одновременно мигали два светодиода но с разной частотой (1гц и 5гц)? Спасибо!
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

Сообщение mr.Kirill »

lag1 писал(а):Догадываюсь, что вопрос прозвучит некорректно, но все-же хотелось бы уточнить: возможно ли написать такую программу, чтобы одновременно мигали два светодиода но с разной частотой (1гц и 5гц)? Спасибо!
Конечно можно.
Один из вариантов:
1. Настраиваем таймер на переполнение каждые 100мс.
2. Вызываем прерывание по переполнению.
3. Заводим переменную, которая будет увеличиваться с каждым переполнением.
4. В теле прерывания делаем инверсию одного из выходов, к которому подключен светодиод, который должен мигать 5 Гц.
Увеличиваем переменную из п.3.
5. Проверяем не дошла ли переменная до 5, если да, то п.6, если нет, то п.7.
6. Делаем инверсию второго вывода, к которому подключен светодиод, мигающий 1Гц. Обнуляем переменную.
7. Выходим из прерывания.
[color=#0000BF]"Какой тоской душа не сражена - быть твердым заставляют времена"© "Король Лир" У.Шекспир.[/color]
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

А можно и чуть проще. Настраиваем таймер, чтобы он менял состояние скажем выхода OCRxA на противоположное 10 раз в секунду (это даст 5 Гц) и вызывал прерывание, в котором каждые 5 прерываний будем менять на противоположное состояние выхода (подсчитывая их в переменной), на котором нужен 1 Гц.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

Сообщение mr.Kirill »

В моем варианте нет привязки к конкретному выводу... :)
[color=#0000BF]"Какой тоской душа не сражена - быть твердым заставляют времена"© "Король Лир" У.Шекспир.[/color]
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт ноя 27, 2009 12:09:06

Сообщение САША1987 »

все сделал. внешнее прерывание работает как надо.

возник вопрос в другой программе
во вложении .

не понимаю в чем ошибка!

в CVAVR ошибки и предупреждения не показывает, но работает не правильно. если я задаю PINB.1=1, массив mas[0] в условии if не делает переменную а=1. не могу понять в чем проблема. помогите пожалуйста
Вложения
.txt
(1.13 КБ) 199 скачиваний
Пометил вазу. Хорошо...
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

а что должно быть ?
Ну вот так
void main(void)
{
char z;
// вызываем функцию, которая записывает в массив 32 //информационных бита
init();
while (1)
{
for(z=0;z<32;z++)
{
if (mas[z]==1)
{a=0x01;}
else {a=0;}
PORTA.1=a;
}
};
}
----------------------------------------
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

САША1987 писал(а):...если я задаю PINB.1=1
Вообще то запись PINB.1=1 неправильная. В программе так писать нельзя. Может Вы имели в виду то, что чем то устанавливаете на ноге высокий уровень? Как отлаживаете программу? В симуляторе? В отладчике? В реальном железе?
САША1987 писал(а):...не могу понять в чем проблема...
Я тоже. Вроде бы всё правильно...
А почему Вы объявили массив как static ? Его бы надо объявить как volatile ...
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт ноя 27, 2009 12:09:06

Сообщение САША1987 »

да на имел ввиду что на ноге высок уровень. но с этим разобрался.

а вот сложить элементы массива (mas[32]) на знаю как! Может кто-нибудь подсказать?
Пометил вазу. Хорошо...
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт ноя 27, 2009 12:09:06

Сообщение САША1987 »

Товарищи есть ли где подробное описание работы с таймерами в CVAVR?
Пометил вазу. Хорошо...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»