2 цикла одновременно
Re: 2 цикла одновременно
Если пытаться выжать из МК "по максимуму" - тогда переходим на ассемблер и детальнейший разбор даташитов.

- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: 2 цикла одновременно
Я бы даже сказал грубее: не страдайте фигней. Одновременными в нашей жизни могут быть только абсолютно независимые процессы. В случае одно ядерного МК независимых внутренних процессов быть не может, и даже в многоядерных существуют зависимости между ядрами.
Поэтому надо не такты считать, добиваясь идеальной "параллельности", а оценить реальные "задержки" и их значимость, и просто решить свою задачу.
Самый простой и универсальный способ для этого я назвал: прерывания.
Поэтому надо не такты считать, добиваясь идеальной "параллельности", а оценить реальные "задержки" и их значимость, и просто решить свою задачу.
Самый простой и универсальный способ для этого я назвал: прерывания.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: 2 цикла одновременно
Многих сбивает с толку использование аппаратных средств, интегрированных в МК помимо основного ядра.
Да эти блоки работают автономно и параллельно с выполнением основной программы .
Некоторые могут быть практически полностью автономны с момента их запуска (допустим тот же выходной меандр выдавать), другие таки требуют наличия программных прерываний.
А тут уже надо расфасовывать основную программу и возможные наложения коротюсеньких (разумно соизмеримых) прерываний.
Выбираем наиболее оптимальную конфигурацию и работаем.
Однако планировку задач никто не отменял - все зависит от конкретных ресурсов и конкретной задачи.

Да эти блоки работают автономно и параллельно с выполнением основной программы .
Некоторые могут быть практически полностью автономны с момента их запуска (допустим тот же выходной меандр выдавать), другие таки требуют наличия программных прерываний.
А тут уже надо расфасовывать основную программу и возможные наложения коротюсеньких (разумно соизмеримых) прерываний.
Выбираем наиболее оптимальную конфигурацию и работаем.
Однако планировку задач никто не отменял - все зависит от конкретных ресурсов и конкретной задачи.
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
ребят еще вопрос как в atmel studio писать правильно место PORTB= 0b0000001;
к примеру так PORTB.1=1; как в codevisionavr
к примеру так PORTB.1=1; как в codevisionavr
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: 2 цикла одновременно
тогда PORTB|=0b00000001;
Добавлено after 1 minute 26 seconds:
потому что командой PORTB= 0b0000001; ты не только портб.1=1 сделаешь, но и все остальные ноги порта принудительно сбросишь.
Добавлено after 1 minute 26 seconds:
потому что командой PORTB= 0b0000001; ты не только портб.1=1 сделаешь, но и все остальные ноги порта принудительно сбросишь.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Реклама
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3450912#p3450912"]тогда PORTB|=0b00000001;
Добавлено after 1 minute 26 seconds:
потому что командой PORTB= 0b0000001; ты не только портб.1=1 сделаешь, но и все остальные ноги порта принудительно сбросишь.[/uquote]
тип не как не упростить что б более читабельно было? например как в codevisionavr
Добавлено after 7 minutes 42 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3449132#p3449132"]Не майтесь ерундой: аппаратный способ мигания в данном случае не универсальный. По прерываниям можно мигать любой ножкой МК, и не только. Это универсальный способ.[/uquote]
как с помощью прерывания мигать любой ножкой?? просто сколько ищу инфы так и не нашел
Добавлено after 1 minute 26 seconds:
потому что командой PORTB= 0b0000001; ты не только портб.1=1 сделаешь, но и все остальные ноги порта принудительно сбросишь.[/uquote]
тип не как не упростить что б более читабельно было? например как в codevisionavr
Добавлено after 7 minutes 42 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3449132#p3449132"]Не майтесь ерундой: аппаратный способ мигания в данном случае не универсальный. По прерываниям можно мигать любой ножкой МК, и не только. Это универсальный способ.[/uquote]
как с помощью прерывания мигать любой ножкой?? просто сколько ищу инфы так и не нашел
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: 2 цикла одновременно
Никак. PORTx.y= N - фича кодевижена.
Добавлено after 2 minutes 17 seconds:
В кодевижене запустите визард и активируйте таймер (с прерыванием при переполнении, например). Визард пропишет даже обработчик прерывания от таймера.
Добавлено after 2 minutes 17 seconds:
В кодевижене запустите визард и активируйте таймер (с прерыванием при переполнении, например). Визард пропишет даже обработчик прерывания от таймера.
Docendo discimus
Re: 2 цикла одновременно
В ассемблере
sbi PORTB,1 ; это ежли для первого бита
или если как память
lds tmp_n,(PORTB+0x20)
sbr tmp_n,1<<1
sts (PORTB+0x20),tmp_n

sbi PORTB,1 ; это ежли для первого бита
или если как память
lds tmp_n,(PORTB+0x20)
sbr tmp_n,1<<1
sts (PORTB+0x20),tmp_n
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: 2 цикла одновременно
http://www.cyberforum.ru/avr/thread1497834.html
Добавлено after 30 seconds:
Только в обработчике менять состояние порта.
Добавлено after 30 seconds:
Только в обработчике менять состояние порта.
Docendo discimus
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
как сделать прерывание светодиода?? не очень понимаю
Re: 2 цикла одновременно
очень просто)) Открываем кодевижен и пишем...
1- выбрали МК - например ATmega8: кварц - 4 МHz; фьюзы: Low EF; Higt C9.
2- написали программу вручную (или сгенерировали код в кодевижене). Например пишем программу вручную:
-------------------------
// Обработчик прерываний таймера 0.
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTB.1 = ~ PORTB.1; // включаем/выключаем порт - мигаем светодиодом
}
void main(void) // Главная функция
{
// Настроили порт (на котором будет мигать светодиод)
DDRB.1=1; // порт на выход
PORTB.1=0; // начальное состояние порта (вкл/выкл).
// Настроли таймер 0.
TCCR0=0x01; // Настроили режим работы таймера 0 (предделитель и т.д.) > 4.000.000 кварц / 256 тактов таймер =15.625 цикл
// Настроили маску прерываний для таймера 0.
TIMSK=0x01;
// Разрешили Глобальное прерывание
#asm("sei")
...
while (1) {}; // тут основная программа.
...
} // конец
----------------------
Всё )) Сидим, смотрим как мигает светодиод с частотй ~8 кГц... и радуемся)) Прада на частоте 8 кГц мы ничего не увидем
Тогда меняем кварц или выбираем другой таймер, например таймер 1 и повторяем процедуру сначала))
1- выбрали МК - например ATmega8: кварц - 4 МHz; фьюзы: Low EF; Higt C9.
2- написали программу вручную (или сгенерировали код в кодевижене). Например пишем программу вручную:
-------------------------
// Обработчик прерываний таймера 0.
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTB.1 = ~ PORTB.1; // включаем/выключаем порт - мигаем светодиодом
}
void main(void) // Главная функция
{
// Настроили порт (на котором будет мигать светодиод)
DDRB.1=1; // порт на выход
PORTB.1=0; // начальное состояние порта (вкл/выкл).
// Настроли таймер 0.
TCCR0=0x01; // Настроили режим работы таймера 0 (предделитель и т.д.) > 4.000.000 кварц / 256 тактов таймер =15.625 цикл
// Настроили маску прерываний для таймера 0.
TIMSK=0x01;
// Разрешили Глобальное прерывание
#asm("sei")
...
while (1) {}; // тут основная программа.
...
} // конец
----------------------
Всё )) Сидим, смотрим как мигает светодиод с частотй ~8 кГц... и радуемся)) Прада на частоте 8 кГц мы ничего не увидем
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
[uquote="roman.com",url="/forum/viewtopic.php?p=3451036#p3451036"]очень просто)) Открываем кодевижен и пишем...
1- выбрали МК - например ATmega8: кварц - 4 МHz; фьюзы: Low EF; Higt C9.
2- написали программу вручную (или сгенерировали код в кодевижене). Например пишем программу вручную:
-------------------------
// Обработчик прерываний таймера 0.
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTB.1 = ~ PORTB.1; // включаем/выключаем порт - мигаем светодиодом
}
void main(void) // Главная функция
{
// Настроили порт (на котором будет мигать светодиод)
DDRB.1=1; // порт на выход
PORTB.1=0; // начальное состояние порта (вкл/выкл).
// Настроли таймер 0.
TCCR0=0x01; // Настроили режим работы таймера 0 (предделитель и т.д.) > 4.000.000 кварц / 256 тактов таймер =15.625 цикл
// Настроили маску прерываний для таймера 0.
TIMSK=0x01;
// Разрешили Глобальное прерывание
#asm("sei")
...
while (1) {}; // тут основная программа.
...
} // конец
----------------------
Всё )) Сидим, смотрим как мигает светодиод с частотй ~8 кГц... и радуемся)) Прада на частоте 8 кГц мы ничего не увидем
Тогда меняем кварц или выбираем другой таймер, например таймер 1 и повторяем процедуру сначала))[/uquote]
CODEVISIONAVR выдает ошибки на маску таймера и настройку
1- выбрали МК - например ATmega8: кварц - 4 МHz; фьюзы: Low EF; Higt C9.
2- написали программу вручную (или сгенерировали код в кодевижене). Например пишем программу вручную:
-------------------------
// Обработчик прерываний таймера 0.
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTB.1 = ~ PORTB.1; // включаем/выключаем порт - мигаем светодиодом
}
void main(void) // Главная функция
{
// Настроили порт (на котором будет мигать светодиод)
DDRB.1=1; // порт на выход
PORTB.1=0; // начальное состояние порта (вкл/выкл).
// Настроли таймер 0.
TCCR0=0x01; // Настроили режим работы таймера 0 (предделитель и т.д.) > 4.000.000 кварц / 256 тактов таймер =15.625 цикл
// Настроили маску прерываний для таймера 0.
TIMSK=0x01;
// Разрешили Глобальное прерывание
#asm("sei")
...
while (1) {}; // тут основная программа.
...
} // конец
----------------------
Всё )) Сидим, смотрим как мигает светодиод с частотй ~8 кГц... и радуемся)) Прада на частоте 8 кГц мы ничего не увидем
CODEVISIONAVR выдает ошибки на маску таймера и настройку
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: 2 цикла одновременно
Кошмар. Для одного мигающего светодиода отводят целый таймер. До чего докатились ... 
Re: 2 цикла одновременно
А ещё мы для каждого светодиода отводим целый порт ! Динамическую индикацию мы не используем... не люблю когда в глазах рябит))Аlex писал(а):Для одного мигающего светодиода отводят целый таймер.
Ну значит тупой кодевижен)) Мой кодевижен тоже не все понимает команды)) Бывает... Но это не важно, главное что я сам все понимаю команды))danilka468 писал(а):CODEVISIONAVR выдает ошибки на маску таймера и настройку
Тогда попросите кодевижен, что бы он сам вам сгенерировал код, как ему нравится)). Открыли кодевижен и создали новый проект: нажали на кнопку "сохранить проект"... Выбрали куда сохранить... имя проекта... и т.д.)) И вуаля! Кодевижен сам сгенерировал исходный код прерывание по таймру 0:
Код кодевижена:
-------------------------------------------------
#include <mega8.h>
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4000,000 kHz
TCCR0=0x01;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
-------------------------------------------------
Теперь только добавили к исходному коду кодевижена свой светодиод: ))
-------------------------------------------------
#include <mega8.h>
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
PORTB.1 = ~ PORTB.1; // включаем/выключаем порт - мигаем светодиодом
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Настроили порт (на котором будет мигать светодиод)
DDRB.1=1; // порт на выход
PORTB.1=0; // начальное состояние порта (вкл/выкл).
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4000,000 kHz
TCCR0=0x01;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
-------------------------------------------------
Готово! )) Запускаем... проверяем... Ура !!! ))
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
[uquote="roman.com",url="/forum/viewtopic.php?p=3451420#p3451420"]
Тогда попросите кодевижен, что бы он сам вам сгенерировал код, как ему нравится)). Открыли кодевижен и создали новый проект: нажали на кнопку "сохранить проект"... Выбрали куда сохранить... имя проекта... и т.д.)) И вуаля! Кодевижен сам сгенерировал исходный код прерывание по таймру 0:
CODE
Готово! )) Запускаем... проверяем... Ура !!! ))
[/uquote]
так и делал... и проблема в том что он мегает раз в 20-30 секунд меня скорость и даже в interupt добавлял TCNT0=0x05; или же светодиод просто стоит и не моргает
А ещё мы для каждого светодиода отводим целый порт ! Динамическую индикацию мы не используем... не люблю когда в глазах рябит))Аlex писал(а):Для одного мигающего светодиода отводят целый таймер.
Ну значит тупой кодевижен)) Мой кодевижен тоже не все понимает команды)) Бывает... Но это не важно, главное что я сам все понимаю команды))danilka468 писал(а):CODEVISIONAVR выдает ошибки на маску таймера и настройку
Тогда попросите кодевижен, что бы он сам вам сгенерировал код, как ему нравится)). Открыли кодевижен и создали новый проект: нажали на кнопку "сохранить проект"... Выбрали куда сохранить... имя проекта... и т.д.)) И вуаля! Кодевижен сам сгенерировал исходный код прерывание по таймру 0:
CODE
Готово! )) Запускаем... проверяем... Ура !!! ))
так и делал... и проблема в том что он мегает раз в 20-30 секунд меня скорость и даже в interupt добавлял TCNT0=0x05; или же светодиод просто стоит и не моргает
Последний раз редактировалось danilka468 Чт сен 06, 2018 09:08:52, всего редактировалось 1 раз.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: 2 цикла одновременно
в приличном обществе канделябром можно получить за код без тега code и за цитирование предыдущего сообщения в полном объеме
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: 2 цикла одновременно
Вообще-то в большинстве АВРок запись в регистр
sbi PINx,y ; где PINx это адрес входного регистра порта х, а у - номер бита, который надо инвертировать
приведет к инверсии выходного состояния данного пина.
А чем мерять интервал - таймером или программным циклом или завершением определенного перечня подпрограмм - не суть важно.

sbi PINx,y ; где PINx это адрес входного регистра порта х, а у - номер бита, который надо инвертировать
приведет к инверсии выходного состояния данного пина.
А чем мерять интервал - таймером или программным циклом или завершением определенного перечня подпрограмм - не суть важно.
-
danilka468
- Открыл глаза
- Сообщения: 59
- Зарегистрирован: Вс сен 03, 2017 13:16:25
Re: 2 цикла одновременно
[uquote="BOB51",url="/forum/viewtopic.php?p=3451533#p3451533"]Вообще-то в большинстве АВРок запись в регистр
sbi PINx,y ; где PINx это адрес входного регистра порта х, а у - номер бита, который надо инвертировать
приведет к инверсии выходного состояния данного пина.
А чем мерять интервал - таймером или программным циклом или завершением определенного перечня подпрограмм - не суть важно.
[/uquote]
и все же...я не понимаю как можно сделать что б светодиод моргал постоянно ..
sbi PINx,y ; где PINx это адрес входного регистра порта х, а у - номер бита, который надо инвертировать
приведет к инверсии выходного состояния данного пина.
А чем мерять интервал - таймером или программным циклом или завершением определенного перечня подпрограмм - не суть важно.
и все же...я не понимаю как можно сделать что б светодиод моргал постоянно ..
Re: 2 цикла одновременно
программа выполняет какое-то свое дело.
естественно она имеет собственное время исполнения
если длительность времени превысит скорость реакции глаза (пресловутое 50Гц)
интервал между инверсиями состояния вывода (и соответственно включенного и выключенного состояния светика)
будет заметен глазом наблюдателя.
Вот в одном месте достаточно длинного кусманчика программы и ставим инверсию на соответствующем выводе.
Собственно именно инверсия состояния (независимо от того, каким конкретным алгоритмом оная достигается - или анализом текущего статуса вывода с последующим его соответствующим изменением или использованием особенностей АВРок - записью в PINx.n единицы).
Для случая, ежли программа коротенькая добавляем программный счетчик количества выполненных фрагментов кода.
Как вариант - программный счетчик машинных циклов
или
аппаратный таймер, имеющий возможность самостоятельного изменения состояния вывода МК при переполнении (тогда процесс абсолютно автономный от работы программы)

естественно она имеет собственное время исполнения
если длительность времени превысит скорость реакции глаза (пресловутое 50Гц)
интервал между инверсиями состояния вывода (и соответственно включенного и выключенного состояния светика)
будет заметен глазом наблюдателя.
Вот в одном месте достаточно длинного кусманчика программы и ставим инверсию на соответствующем выводе.
Собственно именно инверсия состояния (независимо от того, каким конкретным алгоритмом оная достигается - или анализом текущего статуса вывода с последующим его соответствующим изменением или использованием особенностей АВРок - записью в PINx.n единицы).
Для случая, ежли программа коротенькая добавляем программный счетчик количества выполненных фрагментов кода.
Как вариант - программный счетчик машинных циклов
или
аппаратный таймер, имеющий возможность самостоятельного изменения состояния вывода МК при переполнении (тогда процесс абсолютно автономный от работы программы)
Последний раз редактировалось BOB51 Чт сен 06, 2018 11:50:11, всего редактировалось 1 раз.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: 2 цикла одновременно
Он не только мигать, но и плавно загораться может 
Может ну его, эти микроконтроллеры?
Может ну его, эти микроконтроллеры?


