2 цикла одновременно

Обсуждаем контроллеры компании Atmel.
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

Re: 2 цикла одновременно

Сообщение danilka468 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3451638#p3451638"]Он не только мигать, но и плавно загораться может :)

Может ну его, эти микроконтроллеры?[/uquote]

по шиму .. да можно плавно зажигать, а как мигать то им в прерываниях
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: 2 цикла одновременно

Сообщение ARV »

danilka468 писал(а):а как мигать то им в прерываниях
да вам же не один раз говорили, как! что не понятно вам?

для примера: пусть вы захотели мигать светодиодом на нулевой линии порта B с частотой 1 гц, т.е. 0,5 секунды светит, 0,5 не светит.
алгоритм решения:
1. рассчитываете, как надо настроить таймер, чтобы он генерировал прерывания с частотой в 2 раза чаще, т.е. 2 гц. вероятно, не получится точно такую частоту обеспечить сразу, тогда надо стремиться достичь частоту прерываний больше, чем требуется, в целое число раз (ну или предельно близко к желаемому).
2. настраиваете этот самый таймер в соответствии с расчетом п.1, и прерывания от него тоже активируете, само собой.
3. пишите обработчик прерывания, в котором заводите локальную static-переменную для счетчика вхождений в прерывание. если прерывания у вас из-за настроек таймера будут в 26 раз чаще, чем необходимо, то изначально присваиваете этой переменной значение 26. затем каждый раз при входе в обработчик уменьшаете эту переменную и проверяете, не стала ли она равной 0. если стала - снова записываете в неё 26 и тут же изменяете на противоположный уровень состояние 0-го пина порта B.

можете реализовать этот алгоритм?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
malex66
Открыл глаза
Сообщения: 45
Зарегистрирован: Вс янв 22, 2012 21:57:43

Re: 2 цикла одновременно

Сообщение malex66 »

Спойлер

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

#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 16000000UL  // 16 MHz

volatile unsigned char tmp=0;

ISR(TIMER0_OVF_vect)   // подпрограмма обработки прерывания по
                        //  переполнению таймера
{
   TCNT0=0x00; // сбрасываем счетный регистр таймера/счетчика T0

   if (tmp<=60) tmp++;
   else {
	   tmp=0;
	   if (PIND & (1<<PIND3)) {// переключаем светодиоды на линии PD3, PD4
		   PORTD &= ~(1<<3);
	   	   PORTD |= (1<<4);
	   } else {
		   PORTD |= (1<<3);
		   PORTD &= ~(1<<4);
	   }
   }
}

int main(void)      // начало основой программы
{

   DDRD |= ((1<<3) | (1<<4));   // вывод порты PD3, PD4 сконфигурирован как выход
   PORTD &= ~(1<<3);               // установить "0" на линии PD3 порта D
   PORTD &= ~(1<<4);              // установить "0" на линии PD4 порта D


   TIMSK =0b00000001;  // записываем 1 в бит TOIE0 регистра TIMSK
                                    // устанавливаем флаг разрешения прерывания
                                    // по переполнению таймера/счетчика T0

   TCNT0=0x00;            // сбрасываем счетный регистр таймера/счетчика T0

   TCCR0=0b00000101;  // устанавливаем предделитель CK,
                                    // используя биты CS00, CS01, CS02
                                    // (1024)

   sei(); // разрешаем прерывания;


   while (1) {}  // бесконечный цикл - здесь делаем что нибудь...


}   

ну как то так...
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: 2 цикла одновременно

Сообщение Demiurg »

1) С помощью прерывания. Настраиваем таймер, в обработчике, в зависимости от настроек таймера анализируем, сколько прошло времени, в нужный момент переключаем пин. Задача вроде решена, но для одной единственной задачи задействован аппаратный таймер.
2) В основном цикле настраиваем таймер, по флагам переполнения или совпадения анализируем, сколько прошло времени, в нужный момент переключаем пин. Вариация, настраиваем пин-выход таймера. Аналогично: Задача вроде решена, но для одной единственной задачи задействован аппаратный таймер.
3) Программные таймеры. Но это уже склоняется в сторону автоматного программирования, конечных автоматов. Обычным кодом можно, но этот вариант геморройнее неструктурированным, трудночитабельным кодом.

Могу предложить свою реализацию программных таймеров.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: 2 цикла одновременно

Сообщение Ivanoff-iv »

а что такого? ну, задействовал, теперь у него есть какой никакой системный тик и теперь на него можно будет много чего повесить...
или пусть лежит на черный день а будем как настоящие мужики считать такты и подстраиваться под время исполнения другой части кода?

Добавлено after 5 minutes 17 seconds:
в прерывании по переполнению нет нужды сбрасывать счет таймера (он и сам обнуляется неплохо).
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: 2 цикла одновременно

Сообщение VladislavS »

Зачётный тролль :)
Реклама
Ответить

Вернуться в «AVR»