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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

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

Сообщение ARV »

Я бы даже сказал грубее: не страдайте фигней. Одновременными в нашей жизни могут быть только абсолютно независимые процессы. В случае одно ядерного МК независимых внутренних процессов быть не может, и даже в многоядерных существуют зависимости между ядрами.
Поэтому надо не такты считать, добиваясь идеальной "параллельности", а оценить реальные "задержки" и их значимость, и просто решить свою задачу.
Самый простой и универсальный способ для этого я назвал: прерывания.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Многих сбивает с толку использование аппаратных средств, интегрированных в МК помимо основного ядра.
Да эти блоки работают автономно и параллельно с выполнением основной программы .
Некоторые могут быть практически полностью автономны с момента их запуска (допустим тот же выходной меандр выдавать), другие таки требуют наличия программных прерываний.
А тут уже надо расфасовывать основную программу и возможные наложения коротюсеньких (разумно соизмеримых) прерываний.
Выбираем наиболее оптимальную конфигурацию и работаем.
Однако планировку задач никто не отменял - все зависит от конкретных ресурсов и конкретной задачи.
:beer:
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

ребят еще вопрос как в atmel studio писать правильно место PORTB= 0b0000001;
к примеру так PORTB.1=1; как в codevisionavr
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

тогда PORTB|=0b00000001;

Добавлено after 1 minute 26 seconds:
потому что командой PORTB= 0b0000001; ты не только портб.1=1 сделаешь, но и все остальные ноги порта принудительно сбросишь.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

[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]
как с помощью прерывания мигать любой ножкой?? просто сколько ищу инфы так и не нашел
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Никак. PORTx.y= N - фича кодевижена.

Добавлено after 2 minutes 17 seconds:
В кодевижене запустите визард и активируйте таймер (с прерыванием при переполнении, например). Визард пропишет даже обработчик прерывания от таймера.
Docendo discimus
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

В ассемблере
sbi PORTB,1 ; это ежли для первого бита
или если как память
lds tmp_n,(PORTB+0x20)
sbr tmp_n,1<<1
sts (PORTB+0x20),tmp_n
:roll:
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

http://www.cyberforum.ru/avr/thread1497834.html

Добавлено after 30 seconds:
Только в обработчике менять состояние порта.
Docendo discimus
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

как сделать прерывание светодиода?? не очень понимаю
roman.com
Друг Кота
Сообщения: 9157
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

очень просто)) Открываем кодевижен и пишем...

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 кГц... и радуемся))
1.jpg
(125.92 КБ) 471 скачивание
Прада на частоте 8 кГц мы ничего не увидем :))) Тогда меняем кварц или выбираем другой таймер, например таймер 1 и повторяем процедуру сначала))
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

[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 кГц... и радуемся))
1.jpg
Прада на частоте 8 кГц мы ничего не увидем :))) Тогда меняем кварц или выбираем другой таймер, например таймер 1 и повторяем процедуру сначала))[/uquote]

CODEVISIONAVR выдает ошибки на маску таймера и настройку
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Кошмар. Для одного мигающего светодиода отводят целый таймер. До чего докатились ... :facepalm:
roman.com
Друг Кота
Сообщения: 9157
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

Аlex писал(а):Для одного мигающего светодиода отводят целый таймер.
А ещё мы для каждого светодиода отводим целый порт ! Динамическую индикацию мы не используем... не люблю когда в глазах рябит)) :)))
danilka468 писал(а):CODEVISIONAVR выдает ошибки на маску таймера и настройку
Ну значит тупой кодевижен)) Мой кодевижен тоже не все понимает команды)) Бывает... Но это не важно, главное что я сам все понимаю команды))

Тогда попросите кодевижен, что бы он сам вам сгенерировал код, как ему нравится)). Открыли кодевижен и создали новый проект:
выбрали частоту таймера.jpg
(41.58 КБ) 497 скачиваний
нажали на галочку ниже - Interrrupt.jpg
(39.8 КБ) 244 скачивания
нажали на кнопку "сохранить проект"... Выбрали куда сохранить... имя проекта... и т.д.)) И вуаля! Кодевижен сам сгенерировал исходный код прерывание по таймру 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

};
}
-------------------------------------------------
Готово! )) Запускаем... проверяем...
мигает !!! ))).jpg
(146.23 КБ) 486 скачиваний
Ура !!! )) :)))
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

[uquote="roman.com",url="/forum/viewtopic.php?p=3451420#p3451420"]
Аlex писал(а):Для одного мигающего светодиода отводят целый таймер.
А ещё мы для каждого светодиода отводим целый порт ! Динамическую индикацию мы не используем... не люблю когда в глазах рябит)) :)))
danilka468 писал(а):CODEVISIONAVR выдает ошибки на маску таймера и настройку
Ну значит тупой кодевижен)) Мой кодевижен тоже не все понимает команды)) Бывает... Но это не важно, главное что я сам все понимаю команды))

Тогда попросите кодевижен, что бы он сам вам сгенерировал код, как ему нравится)). Открыли кодевижен и создали новый проект:
выбрали чип, выбрали частоту чипа.jpg
на вкладке таймер выбрали любой таймер.jpg
выбрали частоту таймера.jpg
нажали на галочку ниже - Interrrupt.jpg
нажали на кнопку "сохранить проект"... Выбрали куда сохранить... имя проекта... и т.д.)) И вуаля! Кодевижен сам сгенерировал исходный код прерывание по таймру 0:


CODE
Готово! )) Запускаем... проверяем...
мигает !!! ))).jpg
Ура !!! )) :)))[/uquote]
так и делал... и проблема в том что он мегает раз в 20-30 секунд меня скорость и даже в interupt добавлял TCNT0=0x05; или же светодиод просто стоит и не моргает
Последний раз редактировалось danilka468 Чт сен 06, 2018 09:08:52, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Вообще-то в большинстве АВРок запись в регистр
sbi PINx,y ; где PINx это адрес входного регистра порта х, а у - номер бита, который надо инвертировать
приведет к инверсии выходного состояния данного пина.
А чем мерять интервал - таймером или программным циклом или завершением определенного перечня подпрограмм - не суть важно.
:roll:
danilka468
Открыл глаза
Сообщения: 59
Зарегистрирован: Вс сен 03, 2017 13:16:25

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

Сообщение danilka468 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3451533#p3451533"]Вообще-то в большинстве АВРок запись в регистр
sbi PINx,y ; где PINx это адрес входного регистра порта х, а у - номер бита, который надо инвертировать
приведет к инверсии выходного состояния данного пина.
А чем мерять интервал - таймером или программным циклом или завершением определенного перечня подпрограмм - не суть важно.
:roll:[/uquote]
и все же...я не понимаю как можно сделать что б светодиод моргал постоянно ..
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

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

Сообщение VladislavS »

Он не только мигать, но и плавно загораться может :)

Может ну его, эти микроконтроллеры?
Ответить

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