Подсчёт количества тактов

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21

Сообщение Lockdog »

Добрый день!

У меня такая проблема:
на вход МК поступает меандр с периодом 0.5 сек. Нужно выдавать на другую ножку МК лог. 1, пока присутствует этот меандр.
Использую ATmega8 с частотой 8 МГц. Пишу на CodeVision AVR.

Если в основном цикле while считать прошло ли 0.5 сек после последней лог. 1 на входе, если да, то опять проверить вход.

Так вот нужно посчитать за сколько такто выполняется цикл while{} - как это сделать?\

Или может есть более простое или эффективное решение проблемы?
Контактная информация:
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

вообще-то у мк есть такие прикольные штуковины - прерывания и таймеры называются, может стоит попробовать? :tea:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6350
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Lockdog писал(а):.
Если в основном цикле while считать прошло ли 0.5 сек после последней лог. 1 на входе, если да, то опять проверить вход.
Так вот нужно посчитать за сколько такто выполняется цикл while{} - как это сделать?\
Я язык 'C' для микроконтроллеров не использую, но задача представлчется мне не простой, а очень простой :
- Если есть уже микроконтроллер "вживую", то написать простенький тест, который внутри цикла while просто меняет состояние выхода на противоположное, в результате длительность импульса на этом выходе ( или пауза между импульсами ) будет равна длительности цикла "while" :
- Или же прогнать этот участок кода на симуляторе, не забыв при этом указать частоту тактирования в симуляторе равной частоте используемого кварца.
В любом случае задача сформулирована "через Альпы", потому как о том, что меандр прекратился, мы узнаем не ранее, чем через 0,5с, и
точность будет плюс-минус лапоть.
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

Может Вам поможет статья про ИК-пульты
http://radiokot.ru/articles/14/
В исходнике там можно разобраться с прерываниями по нарастанию/спаду импульса и таймером, который все это будет подсчитывать.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21

Сообщение Lockdog »

GP1 писал(а):вообще-то у мк есть такие прикольные штуковины - прерывания и таймеры называются, может стоит попробовать? :tea:
Jack_A писал(а): Я язык 'C' для микроконтроллеров не использую, но задача представлчется мне не простой, а очень простой :
- Если есть уже микроконтроллер "вживую", то написать простенький тест, который внутри цикла while просто меняет состояние выхода на противоположное, в результате длительность импульса на этом выходе ( или пауза между импульсами ) будет равна длительности цикла "while" :
- Или же прогнать этот участок кода на симуляторе, не забыв при этом указать частоту тактирования в симуляторе равной частоте используемого кварца.
Теорию я и так понимаю, я прошу помочь с практической частью, т.е. с реальным кодом.
Jack_A писал(а): В любом случае задача сформулирована "через Альпы", потому как о том, что меандр прекратился, мы узнаем не ранее, чем через 0,5с, и
точность будет плюс-минус лапоть.
Это не критично
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

Вход, на который подается тестируемый меандр настраиваешь на прерывание по любому перепаду (и 0->1 и 1->0), в обработчике этого прерывания выдаешь на нужный выход лог. 1 (есть меандр) и обнуляешь счетчик таймера. этот же таймер настраиваешь так, чтобы он выдавал прерывание, скажем через 0,51 сек (по совпадению скорее всего), а в обработчике этого прерывания выдаешь на тот самый нужный выход лог. 0. и все.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Реклама
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21

Сообщение Lockdog »

DrWatson писал(а):Вход, на который подается тестируемый меандр настраиваешь на прерывание по любому перепаду (и 0->1 и 1->0), в обработчике этого прерывания выдаешь на нужный выход лог. 1 (есть меандр) и обнуляешь счетчик таймера. этот же таймер настраиваешь так, чтобы он выдавал прерывание, скажем через 0,51 сек (по совпадению скорее всего), а в обработчике этого прерывания выдаешь на тот самый нужный выход лог. 0. и все.
Извиняюсь, но можно поподробнее с кодом? Как например задать время 0,51 сек? Я в таймерах на самом деле не очень силён =(
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение 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 в шестнадцатиричном виде).
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

Потому и помянул я Визарда, который без мутатени сгенерит то что не надо или надо, не повезет или повезет если.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21

Сообщение Lockdog »

А где в визарде предделитель указывать?


Вот так правильно?
Вложения
1.jpg
(32.17 КБ) 327 скачиваний
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

Сообщение Modest »

Clock Sourse - это предделитель. Показывает с какой частотой будет тактироваться таймер при определённой частоте кварца, которая выбрана во вкладке Chip.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21

Сообщение Lockdog »

Ясно. Clock Value выставил 7,813 кГц
А с остальным как?
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

Сообщение Modest »

Уф. Щас всего ине вспомню, и посмотреть негде (сижу на работе). В CVAVRе есть примеры с таймером и прерываниями, посмотри там.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18862
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

по сообщениям автора поста я сделал вывод, что ему надо, чтобы за него кто-то сделал его работу. типичное поведение менеджера:
1. мне знать не надо - на то есть специалисты
2. мне надо, чтобы специалисты вовремя сделали мою работу, я для того и поставлен, чтобы их подгонять
3. специалистам платить не надо - без меня они бы ничего не делали!

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

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

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21

Сообщение Lockdog »

Ребят, ну вас понесло. Для разглагольствований, вроде, есть другие форумы (ноют и пустую болтовню только гуманитарии разводят). А тут же форум по электронике. Разве тут не ищут ответы на вопросы и помощь, а не нагружают?

Причём тут высшее образование, мне для себя это нужно. Вот и решил спросить здесь.
Спасибо всем, кто отозвался и помог.
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

Сообщение Modest »

Сильно не растраивайся, их можно понять, просто есть народ который уже задолбол своими тупыми вопросами. Никаких нервов не наберёшься.

А с прерываниями, таймерами, ШИМ, прочим тоже помню по началу геморно было.
Вот настройка прерываний
Новый точечный рисунок.png
(10.26 КБ) 572 скачивания
Настройка таймера
Новый точечный рисунок1.png
(12.87 КБ) 571 скачивание
Сюда вставляй код обработки прерываний, для внешнего прерывания и для прерывания от таймера
Новый точечный рисунок2.png
(13.35 КБ) 532 скачивания
Это вставка из асемблера, бит i, бит глобального разрешения прерывания. sei - установить бит i (все прерывания разрешены)
cli - очистить бит i (все прервания запрещены)
Новый точечный рисунок3.png
(14.54 КБ) 321 скачивание
Таймер у тя будет сразу запущен. Что бы отключить его надо записать
TCCR0 = 0
TCNT = 0
чтобы запустить, соотвецтвенно
TCCR0 = 0x05
TCNT = 0
Новый точечный рисунок4.png
(14.74 КБ) 544 скачивания
Вобще почитай литературы по больше по написанию прог для мк на С. В инете исходников киллометр, бери, разбирайся.
И если в голове не складывается хоть примерный алгоритм будущей проги, почитай ещё про построение алгоритмов.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21

Сообщение 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);
  
}
Банально даже один раз ножку не дёргает, хотя все регистры смотрел по даташиту и вроде бы всё настроил правильно.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18862
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Lockdog писал(а):Modest, спасибо за помощь.
Тут теперь проблема другая, у меня прерывания не хотят работать, в протеусе не эмулируется.
валяй, Modest, продолжай пахать... как и следовало ожидать - пока все за него не сделаешь - будешь "помогать"...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21

Сообщение Lockdog »

ARV писал(а):
Lockdog писал(а):Modest, спасибо за помощь.
Тут теперь проблема другая, у меня прерывания не хотят работать, в протеусе не эмулируется.
валяй, Modest, продолжай пахать... как и следовало ожидать - пока все за него не сделаешь - будешь "помогать"...
Я не пойму - тебя обидел кто? Уже совсем ничего спросить нельзя? Если сам не можешь ничего, то не надо никого упрекать в помощи. У самого всё сразу получалось?
Контактная информация:
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21

Сообщение Lockdog »

В общем, видимо, протеус глючит, потому что сейчас запустил программу в отладчике AVR Studio и там всё работало как надо и через 0,5 сек прерывание обрабатывалось.
Спасибо всем за терпение. =)
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»