Страница 1 из 2
Подсчёт количества тактов
Добавлено: Пт май 07, 2010 18:54:12
Lockdog
Добрый день!
У меня такая проблема:
на вход МК поступает меандр с периодом 0.5 сек. Нужно выдавать на другую ножку МК лог. 1, пока присутствует этот меандр.
Использую ATmega8 с частотой 8 МГц. Пишу на CodeVision AVR.
Если в основном цикле while считать прошло ли 0.5 сек после последней лог. 1 на входе, если да, то опять проверить вход.
Так вот нужно посчитать за сколько такто выполняется цикл while{} - как это сделать?\
Или может есть более простое или эффективное решение проблемы?
Re: Подсчёт количества тактов
Добавлено: Пт май 07, 2010 19:11:01
GP1
вообще-то у мк есть такие прикольные штуковины - прерывания и таймеры называются, может стоит попробовать?

Re: Подсчёт количества тактов
Добавлено: Пт май 07, 2010 19:45:50
Jack_A
Lockdog писал(а):.
Если в основном цикле while считать прошло ли 0.5 сек после последней лог. 1 на входе, если да, то опять проверить вход.
Так вот нужно посчитать за сколько такто выполняется цикл while{} - как это сделать?\
Я язык 'C' для микроконтроллеров не использую, но задача представлчется мне не простой, а очень простой :
- Если есть уже микроконтроллер "вживую", то написать простенький тест, который внутри цикла while просто меняет состояние выхода на противоположное, в результате длительность импульса на этом выходе ( или пауза между импульсами ) будет равна длительности цикла "while" :
- Или же прогнать этот участок кода на симуляторе, не забыв при этом указать частоту тактирования в симуляторе равной частоте используемого кварца.
В любом случае задача сформулирована "через Альпы", потому как о том, что меандр прекратился, мы узнаем не ранее, чем через 0,5с, и
точность будет плюс-минус лапоть.
Re: Подсчёт количества тактов
Добавлено: Пт май 07, 2010 20:21:57
boobonick
Может Вам поможет статья про ИК-пульты
http://radiokot.ru/articles/14/
В исходнике там можно разобраться с прерываниями по нарастанию/спаду импульса и таймером, который все это будет подсчитывать.
Re: Подсчёт количества тактов
Добавлено: Пт май 07, 2010 23:24:35
Lockdog
GP1 писал(а):вообще-то у мк есть такие прикольные штуковины - прерывания и таймеры называются, может стоит попробовать?

Jack_A писал(а):
Я язык 'C' для микроконтроллеров не использую, но задача представлчется мне не простой, а очень простой :
- Если есть уже микроконтроллер "вживую", то написать простенький тест, который внутри цикла while просто меняет состояние выхода на противоположное, в результате длительность импульса на этом выходе ( или пауза между импульсами ) будет равна длительности цикла "while" :
- Или же прогнать этот участок кода на симуляторе, не забыв при этом указать частоту тактирования в симуляторе равной частоте используемого кварца.
Теорию я и так понимаю, я прошу помочь с практической частью, т.е. с реальным кодом.
Jack_A писал(а):
В любом случае задача сформулирована "через Альпы", потому как о том, что меандр прекратился, мы узнаем не ранее, чем через 0,5с, и
точность будет плюс-минус лапоть.
Это не критично
Re: Подсчёт количества тактов
Добавлено: Пт май 07, 2010 23:36:41
DrWatson
Вход, на который подается тестируемый меандр настраиваешь на прерывание по любому перепаду (и 0->1 и 1->0), в обработчике этого прерывания выдаешь на нужный выход лог. 1 (есть меандр) и обнуляешь счетчик таймера. этот же таймер настраиваешь так, чтобы он выдавал прерывание, скажем через 0,51 сек (по совпадению скорее всего), а в обработчике этого прерывания выдаешь на тот самый нужный выход лог. 0. и все.
Re: Подсчёт количества тактов
Добавлено: Пт май 07, 2010 23:38:43
Lockdog
DrWatson писал(а):Вход, на который подается тестируемый меандр настраиваешь на прерывание по любому перепаду (и 0->1 и 1->0), в обработчике этого прерывания выдаешь на нужный выход лог. 1 (есть меандр) и обнуляешь счетчик таймера. этот же таймер настраиваешь так, чтобы он выдавал прерывание, скажем через 0,51 сек (по совпадению скорее всего), а в обработчике этого прерывания выдаешь на тот самый нужный выход лог. 0. и все.
Извиняюсь, но можно поподробнее с кодом? Как например задать время 0,51 сек? Я в таймерах на самом деле не очень силён =(
Re: Подсчёт количества тактов
Добавлено: Сб май 08, 2010 00:08:39
DrWatson
в Меге8 есть 3 таймера: два 8-разрядных, один 16-разрядный, у всех есть предделители, причем у T0 и T1 общий предделитель, но коэффициенты независимы. Для данной задачи подойдет Т1, так как у Т0 и Т2 с максимальным предделителем 1024 на тактовой 8 МГц при максимальном коэффициенте пересчета 256 сможем контролировать частоту 30 Гц минимум.
Для Т1 с предделителем 1024, 0,51 сек (1,96 Гц) будет соответствовать значению TCNT=15319, забиваем OCR1A=15319, настраиваем прерывание по совпадению с OCR1A и обработчик прерывания на совпадение будет выдавать на "нужный" выход лог. 0. можно настроить и перезагрузку TCNT1 при совпадении с OCR1A (хотя не обязательно).
Формула для 0,51 сек:
8 000 000 Гц/0,51 с = 156862745=15319*1024, где 1024 предделитель, а 15319 значение TCNT, которое будет через 0,51 сек с начала счета. Расчет приблизительный (дробные отбрасываются).
Ну а что в какие регистры управления таймером определяются по даташиту.
А вообще в CVAVR с Wizardом запрограммировать все это действо не составит проблем (только OCR1A=3BD7 в шестнадцатиричном виде).
Re: Подсчёт количества тактов
Добавлено: Сб май 08, 2010 00:33:20
DrWatson
Потому и помянул я Визарда, который без мутатени сгенерит то что не надо или надо, не повезет или повезет если.
Re: Подсчёт количества тактов
Добавлено: Сб май 08, 2010 10:40:45
Lockdog
А где в визарде предделитель указывать?
Вот так правильно?
Re: Подсчёт количества тактов
Добавлено: Сб май 08, 2010 10:48:10
Modest
Clock Sourse - это предделитель. Показывает с какой частотой будет тактироваться таймер при определённой частоте кварца, которая выбрана во вкладке Chip.
Re: Подсчёт количества тактов
Добавлено: Сб май 08, 2010 10:59:03
Lockdog
Ясно. Clock Value выставил 7,813 кГц
А с остальным как?
Re: Подсчёт количества тактов
Добавлено: Сб май 08, 2010 11:17:17
Modest
Уф. Щас всего ине вспомню, и посмотреть негде (сижу на работе). В CVAVRе есть примеры с таймером и прерываниями, посмотри там.
Re: Подсчёт количества тактов
Добавлено: Сб май 08, 2010 15:10:17
ARV
вот у нас всегда так: сначала мы всяких неучей вытаскиваем на своем горбу, давая им возможность получить высшее образование на халяву, а потом они становятся нашими боссами и гнобят нас от души, не помня ничего... точнее, как раз помня, что есть люди, которые знают, что они есть ноль без палочки, а того, кто шибко много знает, терпеть рядом с собой нельзя...
по сообщениям автора поста я сделал вывод, что ему надо, чтобы за него кто-то сделал его работу. типичное поведение менеджера:
1. мне знать не надо - на то есть специалисты
2. мне надо, чтобы специалисты вовремя сделали мою работу, я для того и поставлен, чтобы их подгонять
3. специалистам платить не надо - без меня они бы ничего не делали!
имхо, если раздается первая часть фразы "мне нужен готовый код", то следом должно быть продолжение "плачу за это .....". а граждане, которые строят из себя сердобольных и жалеют подобных нахлебников, не ведают, что творят.
помощь не есть бесплатная работа. бесплатная работа есть рабство.
Re: Подсчёт количества тактов
Добавлено: Сб май 08, 2010 16:56:33
Lockdog
Ребят, ну вас понесло. Для разглагольствований, вроде, есть другие форумы (ноют и пустую болтовню только гуманитарии разводят). А тут же форум по электронике. Разве тут не ищут ответы на вопросы и помощь, а не нагружают?
Причём тут высшее образование, мне для себя это нужно. Вот и решил спросить здесь.
Спасибо всем, кто отозвался и помог.
Re: Подсчёт количества тактов
Добавлено: Пн май 10, 2010 09:10:51
Modest
Сильно не растраивайся, их можно понять, просто есть народ который уже задолбол своими тупыми вопросами. Никаких нервов не наберёшься.
А с прерываниями, таймерами, ШИМ, прочим тоже помню по началу геморно было.
Вот настройка прерываний
Настройка таймера
Сюда вставляй код обработки прерываний, для внешнего прерывания и для прерывания от таймера
Это вставка из асемблера, бит i, бит глобального разрешения прерывания. sei - установить бит i (все прерывания разрешены)
cli - очистить бит i (все прервания запрещены)
Таймер у тя будет сразу запущен. Что бы отключить его надо записать
TCCR0 = 0
TCNT = 0
чтобы запустить, соотвецтвенно
TCCR0 = 0x05
TCNT = 0
Вобще почитай литературы по больше по написанию прог для мк на С. В инете исходников киллометр, бери, разбирайся.
И если в голове не складывается хоть примерный алгоритм будущей проги, почитай ещё про построение алгоритмов.
Re: Подсчёт количества тактов
Добавлено: Чт май 13, 2010 12:03:02
Lockdog
Modest, спасибо за помощь.
Тут теперь проблема другая, у меня прерывания не хотят работать, в протеусе не эмулируется.
Код: Выделить всё
#include <ioavr.h>
#include <intrinsics.h>
#include <iom8.h>
int main( void )
{
DDRC=0x00;
DDRD=0xFF;
TCCR1A=(0<<WGM11)|(0<<WGM10);
TCCR1B=(0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(0<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);
TCNT1H=0xF0;
TCNT1L=0x6F;
TIMSK=(1<<TOIE1);
__enable_interrupt();
while(1)
{
PORTD = (1<<1);
}
}
#pragma vector = TIMER1_OVF_vect
__interrupt void flashing(void)
{
TCNT1H=0xF0;
TCNT1L=0x6F;
PORTD = (1<<0);
}
Банально даже один раз ножку не дёргает, хотя все регистры смотрел по даташиту и вроде бы всё настроил правильно.
Re: Подсчёт количества тактов
Добавлено: Чт май 13, 2010 12:30:20
ARV
Lockdog писал(а):Modest, спасибо за помощь.
Тут теперь проблема другая, у меня прерывания не хотят работать, в протеусе не эмулируется.
валяй,
Modest, продолжай пахать... как и следовало ожидать - пока все за него не сделаешь - будешь "помогать"...
Re: Подсчёт количества тактов
Добавлено: Чт май 13, 2010 12:57:11
Lockdog
ARV писал(а):Lockdog писал(а):Modest, спасибо за помощь.
Тут теперь проблема другая, у меня прерывания не хотят работать, в протеусе не эмулируется.
валяй,
Modest, продолжай пахать... как и следовало ожидать - пока все за него не сделаешь - будешь "помогать"...
Я не пойму - тебя обидел кто? Уже совсем ничего спросить нельзя? Если сам не можешь ничего, то не надо никого упрекать в помощи. У самого всё сразу получалось?
Re: Подсчёт количества тактов
Добавлено: Пт май 14, 2010 11:15:53
Lockdog
В общем, видимо, протеус глючит, потому что сейчас запустил программу в отладчике AVR Studio и там всё работало как надо и через 0,5 сек прерывание обрабатывалось.
Спасибо всем за терпение. =)