У меня такая проблема:
на вход МК поступает меандр с периодом 0.5 сек. Нужно выдавать на другую ножку МК лог. 1, пока присутствует этот меандр.
Использую ATmega8 с частотой 8 МГц. Пишу на CodeVision AVR.
Если в основном цикле while считать прошло ли 0.5 сек после последней лог. 1 на входе, если да, то опять проверить вход.
Так вот нужно посчитать за сколько такто выполняется цикл while{} - как это сделать?\
Или может есть более простое или эффективное решение проблемы?
Lockdog писал(а):.
Если в основном цикле while считать прошло ли 0.5 сек после последней лог. 1 на входе, если да, то опять проверить вход.
Так вот нужно посчитать за сколько такто выполняется цикл while{} - как это сделать?\
Я язык 'C' для микроконтроллеров не использую, но задача представлчется мне не простой, а очень простой :
- Если есть уже микроконтроллер "вживую", то написать простенький тест, который внутри цикла while просто меняет состояние выхода на противоположное, в результате длительность импульса на этом выходе ( или пауза между импульсами ) будет равна длительности цикла "while" :
- Или же прогнать этот участок кода на симуляторе, не забыв при этом указать частоту тактирования в симуляторе равной частоте используемого кварца.
В любом случае задача сформулирована "через Альпы", потому как о том, что меандр прекратился, мы узнаем не ранее, чем через 0,5с, и
точность будет плюс-минус лапоть.
Может Вам поможет статья про ИК-пульты http://radiokot.ru/articles/14/
В исходнике там можно разобраться с прерываниями по нарастанию/спаду импульса и таймером, который все это будет подсчитывать.
GP1 писал(а):вообще-то у мк есть такие прикольные штуковины - прерывания и таймеры называются, может стоит попробовать?
Jack_A писал(а):
Я язык 'C' для микроконтроллеров не использую, но задача представлчется мне не простой, а очень простой :
- Если есть уже микроконтроллер "вживую", то написать простенький тест, который внутри цикла while просто меняет состояние выхода на противоположное, в результате длительность импульса на этом выходе ( или пауза между импульсами ) будет равна длительности цикла "while" :
- Или же прогнать этот участок кода на симуляторе, не забыв при этом указать частоту тактирования в симуляторе равной частоте используемого кварца.
Теорию я и так понимаю, я прошу помочь с практической частью, т.е. с реальным кодом.
Jack_A писал(а):
В любом случае задача сформулирована "через Альпы", потому как о том, что меандр прекратился, мы узнаем не ранее, чем через 0,5с, и
точность будет плюс-минус лапоть.
Вход, на который подается тестируемый меандр настраиваешь на прерывание по любому перепаду (и 0->1 и 1->0), в обработчике этого прерывания выдаешь на нужный выход лог. 1 (есть меандр) и обнуляешь счетчик таймера. этот же таймер настраиваешь так, чтобы он выдавал прерывание, скажем через 0,51 сек (по совпадению скорее всего), а в обработчике этого прерывания выдаешь на тот самый нужный выход лог. 0. и все.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
DrWatson писал(а):Вход, на который подается тестируемый меандр настраиваешь на прерывание по любому перепаду (и 0->1 и 1->0), в обработчике этого прерывания выдаешь на нужный выход лог. 1 (есть меандр) и обнуляешь счетчик таймера. этот же таймер настраиваешь так, чтобы он выдавал прерывание, скажем через 0,51 сек (по совпадению скорее всего), а в обработчике этого прерывания выдаешь на тот самый нужный выход лог. 0. и все.
Извиняюсь, но можно поподробнее с кодом? Как например задать время 0,51 сек? Я в таймерах на самом деле не очень силён =(
в Меге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 в шестнадцатиричном виде).
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Clock Sourse - это предделитель. Показывает с какой частотой будет тактироваться таймер при определённой частоте кварца, которая выбрана во вкладке Chip.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
вот у нас всегда так: сначала мы всяких неучей вытаскиваем на своем горбу, давая им возможность получить высшее образование на халяву, а потом они становятся нашими боссами и гнобят нас от души, не помня ничего... точнее, как раз помня, что есть люди, которые знают, что они есть ноль без палочки, а того, кто шибко много знает, терпеть рядом с собой нельзя...
по сообщениям автора поста я сделал вывод, что ему надо, чтобы за него кто-то сделал его работу. типичное поведение менеджера:
1. мне знать не надо - на то есть специалисты
2. мне надо, чтобы специалисты вовремя сделали мою работу, я для того и поставлен, чтобы их подгонять
3. специалистам платить не надо - без меня они бы ничего не делали!
имхо, если раздается первая часть фразы "мне нужен готовый код", то следом должно быть продолжение "плачу за это .....". а граждане, которые строят из себя сердобольных и жалеют подобных нахлебников, не ведают, что творят.
помощь не есть бесплатная работа. бесплатная работа есть рабство.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Ребят, ну вас понесло. Для разглагольствований, вроде, есть другие форумы (ноют и пустую болтовню только гуманитарии разводят). А тут же форум по электронике. Разве тут не ищут ответы на вопросы и помощь, а не нагружают?
Причём тут высшее образование, мне для себя это нужно. Вот и решил спросить здесь.
Спасибо всем, кто отозвался и помог.
Это вставка из асемблера, бит i, бит глобального разрешения прерывания. sei - установить бит i (все прерывания разрешены)
cli - очистить бит i (все прервания запрещены)
Вобще почитай литературы по больше по написанию прог для мк на С. В инете исходников киллометр, бери, разбирайся.
И если в голове не складывается хоть примерный алгоритм будущей проги, почитай ещё про построение алгоритмов.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Lockdog писал(а):Modest, спасибо за помощь.
Тут теперь проблема другая, у меня прерывания не хотят работать, в протеусе не эмулируется.
валяй, Modest, продолжай пахать... как и следовало ожидать - пока все за него не сделаешь - будешь "помогать"...
Я не пойму - тебя обидел кто? Уже совсем ничего спросить нельзя? Если сам не можешь ничего, то не надо никого упрекать в помощи. У самого всё сразу получалось?
В общем, видимо, протеус глючит, потому что сейчас запустил программу в отладчике AVR Studio и там всё работало как надо и через 0,5 сек прерывание обрабатывалось.
Спасибо всем за терпение. =)