Страница 3 из 3
Добавлено: Вт дек 15, 2009 23:25:28
Барсик
Организуйте глобальную переменную и используйте её как флаг. В самом начале обработчика прерывания проверяйте значение этой переменной. Если она == 0, то в обработчике прерывания ничего делать не надо... Как только в теле основной программы присвоите ей значение не равное нулю, так сразу начнёт работать Ваше прерывание, которое генерит Ваши импульсы...
Вопросы и ответы по написанию программ
Добавлено: Ср дек 16, 2009 19:54:19
lag1
Догадываюсь, что вопрос прозвучит некорректно, но все-же хотелось бы уточнить: возможно ли написать такую программу, чтобы одновременно мигали два светодиода но с разной частотой (1гц и 5гц)? Спасибо!
Re: Вопросы и ответы по написанию программ
Добавлено: Ср дек 16, 2009 20:17:57
mr.Kirill
lag1 писал(а):Догадываюсь, что вопрос прозвучит некорректно, но все-же хотелось бы уточнить: возможно ли написать такую программу, чтобы одновременно мигали два светодиода но с разной частотой (1гц и 5гц)? Спасибо!
Конечно можно.
Один из вариантов:
1. Настраиваем таймер на переполнение каждые 100мс.
2. Вызываем прерывание по переполнению.
3. Заводим переменную, которая будет увеличиваться с каждым переполнением.
4. В теле прерывания делаем инверсию одного из выходов, к которому подключен светодиод, который должен мигать 5 Гц.
Увеличиваем переменную из п.3.
5. Проверяем не дошла ли переменная до 5, если да, то п.6, если нет, то п.7.
6. Делаем инверсию второго вывода, к которому подключен светодиод, мигающий 1Гц. Обнуляем переменную.
7. Выходим из прерывания.
Добавлено: Ср дек 16, 2009 23:16:44
DrWatson
А можно и чуть проще. Настраиваем таймер, чтобы он менял состояние скажем выхода OCRxA на противоположное 10 раз в секунду (это даст 5 Гц) и вызывал прерывание, в котором каждые 5 прерываний будем менять на противоположное состояние выхода (подсчитывая их в переменной), на котором нужен 1 Гц.
Добавлено: Чт дек 17, 2009 06:09:17
mr.Kirill
В моем варианте нет привязки к конкретному выводу...

Добавлено: Чт дек 17, 2009 22:56:16
САША1987
все сделал. внешнее прерывание работает как надо.
возник вопрос в другой программе
во вложении .
не понимаю в чем ошибка!
в CVAVR ошибки и предупреждения не показывает, но работает не правильно. если я задаю PINB.1=1, массив mas[0] в условии if не делает переменную а=1. не могу понять в чем проблема. помогите пожалуйста
Добавлено: Чт дек 17, 2009 23:46:25
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;
}
};
}
----------------------------------------
Добавлено: Пт дек 18, 2009 17:05:47
Барсик
САША1987 писал(а):...если я задаю PINB.1=1
Вообще то запись PINB.1=1 неправильная. В программе так писать нельзя. Может Вы имели в виду то, что чем то устанавливаете на ноге высокий уровень? Как отлаживаете программу? В симуляторе? В отладчике? В реальном железе?
САША1987 писал(а):...не могу понять в чем проблема...
Я тоже. Вроде бы всё правильно...
А почему Вы объявили массив как static ? Его бы надо объявить как volatile ...
Добавлено: Пт дек 18, 2009 18:53:52
САША1987
да на имел ввиду что на ноге высок уровень. но с этим разобрался.
а вот сложить элементы массива (mas[32]) на знаю как! Может кто-нибудь подсказать?
Re: Вопросы и ответы по написанию программ
Добавлено: Пн апр 05, 2010 10:24:37
САША1987
Товарищи есть ли где подробное описание работы с таймерами в CVAVR?