Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 15.04.2010, 19:37  
kan1331954
Прохожий
 
Регистрация: 01.02.2008
Сообщений: 6
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
kan1331954 на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

Программированием МК занимаюсь недавно но понимание и результаты есть.Буду рад помочь в этом вопросе. Теперь к теме .

Вопрос формирования заданых интервалов времени (например 1 сек) на таймерах конроллеров T/C0 или T/C1 хорошо расписан на ASMе у Ю.Ревича в книге "Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера" стр.176. А на странице 179 - конкретный код
секундного интервала. Книга в сети есть. Внизу на стр. 177 есть одна очень важная фраза - о сбросе предделителей таймеров. Это дейтвительно очень важно.
Я как раз делал частотомер и мне нужен был этот 1-секундный измерительный интервал сформированый одним из таймеров (кстати неважно каким).
Картина такая : например если вы используете предделитель таймера - f/256 , то ваш интервал 1 сек. будет гулять в пределах от минимального до максимального на 256 тактов вашего кварца. Если f/64 -то на 64 такта.
Разницу во времени посчитаете сами.
В общем когда я применил этот самый сброс предделителя таймера перед его запуском проблема исчезла.Оставалось только одно - подобрать коэффициэнты. Мой кварц 10 МГц и секундный интервал 10 000 000 тактов ,
стоит мертво и в симуляторе и в железе.
Зовут ужинать , остальное потом.
Реклама:
kan1331954 вне форума  
Непрочитано 15.04.2010, 21:49  
kan1331954
Прохожий
 
Регистрация: 01.02.2008
Сообщений: 6
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
kan1331954 на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

Поужинал ,продолжаю. Кто-то выше правильлно сказал ,что у кого-то же получилось и работает. Д а получилось и прекрасно работает.
Еще даю наводку:
1)А.В.Белов. Микроконтроллеры AVR в радиолюбительской практике.2007
стр . 126 , 129
2)А.В.Евстифеев Микроконтроллеры AVR семейства Mega 2007-600RM.djvu
стр. 339

Теперь о своей программе. Это частотомер на ATtiny2313 с измеряемой частотой до 4 МГц (т.к. кварц 10 МГц ). Она в двух вариантах : в одном - T/C0 счет , а T/C1 формирование измерительного интервала .Поужинал ,продолжаю. Кто-то выше правильлно сказал ,что у кого-то же
получилось и работает. Д а получилось и прекрасно работает.
Еще даю наводку:
1)А.В.Белов. Микроконтроллеры AVR в радиолюбительской практике.2007
стр . 126 , 129
2)А.В.Евстифеев Микроконтроллеры AVR семейства Mega 2007-600RM.djvu
стр. 339

Теперь о своей программе. Это частотомер на ATtiny2313 с измеряемой частотой до 4 МГц (т.к. кварц 10 МГц ). Она в двух вариантах : в одном - T/C0 счет , а T/C1 формирование измерительного интервала .
В другом варианте - наоборот.
По результатам измерений разница между вариантами несколько единиц при измеряемой частоте 2,5 МГц и эта разница определяется обработкой прерываний счетного таймера. Все проверено в железе.
Но вам ,как я понял, нужно всего лишь формирование интервала 1 сек.
(Всю эту тему я пока не читал). Ну так возьмите п/п Time_1sec из
моей программы и пользуйтесь , я буду только рад.
Законный вопрос - откуда взять ? И на это есть ответ :

http://vrtp.ru/index.php?showtopic=2211&st=1800
Сообщение 270908 от 11.04.2010

На vtrp.ru я под именем - alex_sen .
Второй момент может огорчить многих. Я сторонник и почитатель
графической среды программирования Algorithm Builder так что
у тех ,кто знает только СИ или АСМ будут некоторые проблемы.
Если же кому-то нужны только hex - файлы , то они там есть
На этом пока все. Будут вопросы - задавайте.


В другом варианте - наоборот.
По результатам измерений разница между вариантами несколько единиц при измеряемой частоте 2,5 МГц и эта разница определяется обработкой прерываний счетного таймера. Все проверено в железе.
Но вам ,как я понял, нужно всего лишь формирование интервала 1 сек.
(Всю эту тему я пока не читал). Ну так возьмите п/п Time_1sec из
моей программы и пользуйтесь , я буду только рад.
Законный вопрос - откуда взять ? И на это есть ответ :

http://vrtp.ru/index.php?showtopic=2211&st=1800
Сообщение 270908 от 11.04.2010

На vtrp.ru я под именем - alex_sen .
Второй момент может огорчить многих. Я сторонник и почитатель
графической среды программирования Algorithm Builder так что
у тех ,кто знает только СИ или АСМ будут некоторые проблемы.
Если же кому-то нужны только hex - файлы , то они там есть
На этом пока все. Будут вопросы - задавайте.
kan1331954 вне форума  
Непрочитано 15.04.2010, 21:55  
kan1331954
Прохожий
 
Регистрация: 01.02.2008
Сообщений: 6
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
kan1331954 на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

Что-то послание получилось исковерканное . Посылаю снова.

Поужинал ,продолжаю. Кто-то выше правильлно сказал ,что у кого-то же
получилось и работает. Д а получилось и прекрасно работает.
Еще даю наводку:
1)А.В.Белов. Микроконтроллеры AVR в радиолюбительской практике.2007
стр . 126 , 129
2)А.В.Евстифеев Микроконтроллеры AVR семейства Mega 2007-600RM.djvu
стр. 339

Теперь о своей программе. Это частотомер на ATtiny2313 с измеряемой частотой до 4 МГц (т.к. кварц 10 МГц ). Она в двух вариантах : в одном - T/C0 счет , а T/C1 формирование измерительного интервала .
В другом варианте - наоборот.
По результатам измерений разница между вариантами несколько единиц при измеряемой частоте 2,5 МГц и эта разница определяется обработкой прерываний счетного таймера. Все проверено в железе.
Но вам ,как я понял, нужно всего лишь формирование интервала 1 сек.
(Всю эту тему я пока не читал). Ну так возьмите п/п Time_1sec из
моей программы и пользуйтесь , я буду только рад.
Законный вопрос - откуда взять ? И на это есть ответ :

http://vrtp.ru/index.php?showtopic=2211&st=1800
Сообщение 270908 от 11.04.2010

На vtrp.ru я под именем - alex_sen .
Второй момент может огорчить многих. Я сторонник и почитатель
графической среды программирования Algorithm Builder так что
у тех ,кто знает только СИ или АСМ будут некоторые проблемы.
Если же кому-то нужны только hex - файлы , то они там есть
На этом пока все. Будут вопросы - задавайте.
kan1331954 вне форума  
Непрочитано 16.04.2010, 02:14  
kan1331954
Прохожий
 
Регистрация: 01.02.2008
Сообщений: 6
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
kan1331954 на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

Прочитал всю тему. Ясно стало следующее :
-здесь собрались Сишники а также Сишники ,которые естественно знают ASM.
-создание 1-сек. интервала требуется не для создания этого интервала просто так , а для вполне конкретного практического применения. 70-80 процентов это частотомеры.
По причине специфических особенностей МК (в отличие например от программируемой
логики) сделать приличный (по точности) прибор на одном МК , без дополнительной
обвязки , да еще и на дешевом китайском кварце и при этом размером со спичечный
коробок или пачку сигарет - это утопия. Про кварц я не говорю - он создает временнУю
и температурную погрешность . Для многих применений такая пргрешность вполне приемлема. Уж лучше использовать старые советские кварцы с военной аппаратуры.
Проблема в совместном использовании T/C0 и T/C1 для счета и для формирования
интервала (или наоборот - разница небольшая ,хотя есть) с использованием прерываний
(и опять неважно : по переполнению или по совпадению) без внешней обвязки МК (а вот
это важно , дальше будет понятно). Исходя из такого построения программы получается
вот что : ATtiny2313 , кварц 10 МГц ,максимальная измер. частота 4 МГц , до 1 МГц ошибки нет или (+/-1) , как и должно быть.С увеличением частоты начинает появляться ошибка. По расчетам так и должно быть. Смотри :
http://vrtp.ru/index.php?showtopic=2211&st=1800
Сообщение 270908 от 11.04.2010
Выход предлагаемый с использованием Т/С2 и часового кварца хорош . От устраняет проблему в совместном использовании T/C0 и T/C1, плох только сам кварц в плане стабильности и отсутствия термостатирования . Но и опять же для многих применений это вполне приемлемо.
Еще немного о требованиях к частотомерам , а также к измерителям периодов и длительностей (импульсов).
Если нужно измерить частоту переменного тока в сети или скорость вращения двигателя
любимого автомобиля или например скорость вращения пропеллера авиамодели ,где
допустима погрешность 0,1- 1,0 процент , то вариант (описаный выше ) состояший из МК,LCD-дисплея и еще 4-5 резисторов и конденсаторов более чем достаточен. Таких
программ в сети много.Я не упрекаю их и их создателей . С заложеной в них точностью
они делают свое дело. Не будем терять на это время.

А теперь решение проблемы приличных (по точности ) приборов , но конечно же
не навороченых промышленных монстров.
Вот любопытная ссылка :
http://www.herbert-dingfelder.de/fre...q_counter.html
Интервал измерения формируется двумя внешними двоичными счетчиками 74НС4040 ,не контроллером.
А в качестве счетных регистров используются 3 байта
1) младший - внешний счетчик 74НС4040 (не весь - только 8 бит)
2) средний - TCNT1L
3) старший -TCNT1H
АНАЛИЗ:
- При измерительном интервале 0,128сек трех байт вполне достаточно для измерения
заявленой частоты 70 МГц
- Входная частота на МК примерно 0,3 МГц
- И самое главное- Т/С1 работает в режиме аппаратного счета без прерываний . Вот за
это автору 5++
- Выбор формирования интервала на внешних счетчиках .... ну это выбор автора.
Видимо Т/С0 занят чем-то другим.Мне просто лень разбираться в сишном коде.
Хотя начинал именно с Си , с СVAVR .

Вот на таком принципе есть смысл делать прибор:
Т/С0 на прерываниях формирует измерительный интервал (в моем случае
1 / 0,25 сек - 10 000 000/2 500 000 тактов)
Т/С1 в режиме счета без прерываний с внешним счетчиком (в моем случае 74НС590)
производят счет.
Входная частота ‹= 10 МГц (в моем случае 7-разрядный LED -индикатор)
Задающий генератор - внешний -"Гиацинт" 10 МГц
Погрешность 1-2 / 10 000 000 ("Гиацинт" это обеспечит)
МК - ATmega 16 ( надо много ног , хотя программа помещается в tiny2313)
Прибор настольный , очень небольшой , питание 220В, для таскания в кармане не предусмотрен.

Программа написана. Отлажена в симуляторе.Жду посылку с недостающими деталями для
отладки в железе.
kan1331954 вне форума  
Непрочитано 16.04.2010, 08:51  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

Сообщение от neon-f Посмотреть сообщение
я посмотрел описание 2313, у неё нет ног TOSC1 и TOSC2
таймер тини2313 не может работать от внешнего часового кварца
Только от системного тактирования или от внешнего источника импульсов

Последний раз редактировалось ilya_sh; 16.04.2010 в 08:58.
ilya_sh вне форума  
Сказали "Спасибо" ilya_sh
neon-f (16.04.2010)
Непрочитано 16.04.2010, 16:14  
neon-f
Частый гость
 
Регистрация: 09.11.2009
Сообщений: 31
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
neon-f на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

Сообщение от ilya_sh Посмотреть сообщение
таймер тини2313 не может работать от внешнего часового кварца
плохо. мне нужно что-то в корпусе soic, 10-12линий и не дорогое. мега 8 не бывает в soic корпусе.
По поводу секундных импульсов. если нужен не точный секундный интервал, а подсчет количества секундных импульсов(всякие часы и др. устройства реального уровня) то можно особо не мудрить. С помощью таймера-счетчика в режиме прерывания по переполнению, получаем какие-нибудь стабильные временные интервалы. подсчитываем эти интервалы, и как только этих интервалов набежало на целую секунду, значение секунд увеличиваем на единицу.

Пример. Вы используете кварц 8мгц. подаем эту частоту на таймер счетчик Т0. таймер настроен на прерывание по переполнению. 8.000.000\256=31150 раз за секунду наступит прерывание. Дальше все элементарно, считаем эти прерывания, и как только их набегает 31150, к значению секунд добавляем единицу. ну а дальше кто на что горазд....
Вот как это выглядит у меня в коде
[/quote]
#include ‹tiny2313.h›
unsigned int tic=0;
unsigned char sec=0x00;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{tic++;}

void main(void)
{
PORTB=0x00; DDRB=0xff;
TCCR0A=0x00; TCCR0B=0x01;
TIMSK=0x02;
#asm("sei")

while (1)
{ if (tic==31150) {tic=0; sec++;} }

поправьте и покритикуйте если что не так.
neon-f вне форума  
Непрочитано 17.04.2010, 17:32  
begun
Гражданин KAZUS.RU
 
Регистрация: 18.07.2006
Сообщений: 870
Сказал спасибо: 231
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
begun на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

а какие кондеры ставите в обвъязке с часовым кварцем?
begun вне форума  
Непрочитано 17.04.2010, 19:42  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

Сообщение от neon-f Посмотреть сообщение
поправьте и покритикуйте если что не так.
мне лень проворачивать все страницы, но наверняка там уже звучали волшебные слова - алгоритм Брезенхема.
Представьте, что Вы используете делитель - и результат деления 8 мегагерц - не целое число .
Для иллюстрации поделил 8 мег на 8 и пустил на 0 таймер
В одном случае квант времени будет больше, в другом - меньше, но результат - это нулевая погрешность.
Код:
#include ‹tiny2313.h›
//; за 2 милисекунды придет 16000 импульсов с частотой 8 мегагерц
#define kvant 16000
//; volatile  signed int count_kvant  - определяем в переменную
volatile  signed int count_kvant =kvant;
#define overfl 8*256 // переполнение при делителе 8  - это 2048 
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
        count_kvant-=overfl;
       if(count_kvant ‹= 0) 
       {
           count_kvant += kvant;
           PORTB.0^=1;
       }

}
Тестовый проект на Вашей 2313 прилагаю.
Вложения:
Тип файла: rar brez.rar (41.4 Кб, 95 просмотров)
__________________
warez
urry вне форума  
Сказали "Спасибо" urry
begun (17.04.2010)
Непрочитано 17.04.2010, 22:18  
begun
Гражданин KAZUS.RU
 
Регистрация: 18.07.2006
Сообщений: 870
Сказал спасибо: 231
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
begun на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

Urry,
Большое спасибо. Я много раз читал ваши сообщения и всегда восхишалс
Вашими знаниями .
Ваш ответ для меня большой почет.
begun вне форума  
Непрочитано 20.04.2010, 00:05  
neon-f
Частый гость
 
Регистрация: 09.11.2009
Сообщений: 31
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
neon-f на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

urry,
Если честно я не понял ваш код, я еще в начале пути изучения С. Если можно и если не лень, расскажите поподробней, я постараюсь разобраться и не тупить.

А я расскажу почему я привязался к прерыванию по переполнению, хотя намного удобней прерывание по совпадению. а все потому, что я думал, что когда наступит прерывание по совпадению, то обнулять таймер нужно программно, и вот пока его обнуляем - отсчет времени не идет, и следовательно накапливается погрешность. И вот тут я прочитал про чудный режим работы таймера - СТС. С ним гораздо проще получать секундные импульсы.
Я взял частоту 8мгц, предварительно разделил на 256, получил на выходе 31250гц и подал на таймер счетчик Т1. таймер настроил на прерыванию по совпадению с А=31250. То есть, получаю прерывание один раз в секунду.

вот так я обрабатывал прерывание-
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{sec++;}

а вот так настраивал таймер Т1.
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0C;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x7A;
OCR1AL=0x12;
OCR1BH=0x00;
OCR1BL=0x00;

TIMSK=0x40;
ACSR=0x80;

Прикладываю весь проект.
Посмотрите все ли верно. У меня в протеусе, за реальную минуту натикивает 45 секунд. Это мой косяк или протеуса?
(для наглядности, на время отладки 1мин=1сек)
Вложения:
Тип файла: rar Static_cloc.rar (66.9 Кб, 69 просмотров)

Последний раз редактировалось neon-f; 20.04.2010 в 00:35.
neon-f вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AVR JTAGICE MKII - проблемы firmware... Luxurious AVR 25 20.10.2014 10:50
На WinAVR + AVR Studio c CVAVR Vetal-soft Embedd С 87 03.03.2013 20:31


Часовой пояс GMT +4, время: 10:20.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot