Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
30.11.2010, 00:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Сообщение от Dorgx7
|
alexgap,если я убираю TCNT0=0x00 из тела прерывания проект полностью весит
|
Вы исходно запутались с таймером.
Ваш код инициализации:
Код:
|
TCCR0=0x03;
TCNT0=0x00;
OCR0=249;
TIMSK=0x03; |
Первая строчка говорит, что вы будете работать с таймером в normal mode и К прескалера выбрали CLK/64.
И тут же в третьей строчке определяете значения регистра сравнения. Но он не будет работать, вы выбрали normal mode. Возможно, вы хотели mode CTC? Тогда первая строчка будет:
Последняя строчка вообще никуда не годится. Вы разрешили одновременно ДВА прерывания! По переполнению таймера и по совпадению регистра сравнения. Уж если вы решили реагировать на совпадение, то строка должна выглядеть так:
Да и процедура обслуживания прерывания у вас применена по вектору переполнения. Уж не знаю, что вы и хотите. В настройках одно, в работе другое, а вектор опять не такой. Трудно понять, особенно если не знать частоту тактировки МК. Да мне оно особенно и не нужно. Для начала причешите мысли и программу. И не забудьте из тела обработчика (предварительно правильно назвав имя вектора) выбросить сброс счетчика, он лишний. mode CTC - clear on compare match - (очистка при достижении совпадения) сделает это сама.
С карндашом и бумагой просчитайте все константы настройки таймера, определите моду, определите вектор под эту моду и все получится.
Ну, а по поводу динамической индикации (попутно) замечу, что реализовывать ее в теле основной программы - моветон. Для этого вам надо организовать еще одно прерывание, специально под рефрешинг.
Успехов.
|
|
|
|
01.12.2010, 02:14
|
|
Частый гость
Регистрация: 04.02.2007
Сообщений: 43
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Вот перечитал даташит и переписал настройку таймера и прерывания:
/************************************************** ***
Chip type : ATmega16
Clock frequency : 16,000000 MHz
************************************************** ***/
#include ‹mega16.h›
// Timer 0 output compare interrupt service routine
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
PORTA ^=(1‹‹0) ;
}
void main(void)
{
DDRA=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: CTC top=OCR0
// OC0 output: Disconnected
TCNT0=0x00;
OCR0=0xF9;
TCCR0=0x0B;
TIMSK=0x02;// Timer(s)/Counter(s) Interrupt(s) initialization
#asm("sei")// Global enable interrupts
while (1)
{
// Place your code here
};
}
при остановке на строке "PORTA ^=(1‹‹0)";в proteus`е выдает время выполнения от 0.99994 до 1,00010
Подскажите насколько я правильно понял даташит и пойдет ли этот код для часов ?
Заранее всех благодарю за помощь и терпение.
|
|
|
|
01.12.2010, 03:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Сообщение от Dorgx7
|
Подскажите насколько я правильно понял даташит и пойдет ли этот код для часов ?
|
Подойдет, вот только это всего лишь временной интервал. Чтоб получить НОРМАЛЬНЫЕ часы нужна еще индикация хоть какая нибудь, собственно часы и дата, процедуры установки времени и разные фенечки типа будильника. Так что начало как бы есть, осталось всего ничего - еще процентов 98 кода дописать
|
|
|
|
01.12.2010, 09:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Сообщение от kison
|
Подойдет, вот только это всего лишь временной интервал. Чтоб получить НОРМАЛЬНЫЕ часы нужна еще индикация хоть какая нибудь, собственно часы и дата, процедуры установки времени и разные фенечки типа будильника. Так что начало как бы есть, осталось всего ничего - еще процентов 98 кода дописать
|
Слушайте kison-а, он мудер!
Вы сварганили ядро, теперь надо в его "заполнить". Вставляйте в тело обработчика счетчик единиц времени.
И готовьте второе прерывание - под динамическую индикацию. Рекомендую начать тоже с карандашика, бумаги и калькулятора. Да, не забудьте определиться с типом индикатора. От этого зависит вся процедура.
|
|
|
|
01.12.2010, 10:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Сообщение от ut1wpr
|
И готовьте второе прерывание - под динамическую индикацию
|
Прошу пардона за мой французский - а нафиг второе прерывание? Не судьба из имеющегося динамичку запускать?
|
|
|
|
01.12.2010, 10:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Сообщение от omercury
|
Прошу пардона за мой французский - а нафиг второе прерывание? Не судьба из имеющегося динамичку запускать?
|
Для прихода понимания.
Безусловно все можно в одном, но пусть чел поймет, что и почем.
Не будем грузить сразу. А то увлечется и понаписывает в обработчике кодов аж на 1.1 мсек., потом будет глюки искать
Впрочем, он же в начале пути, волен выбирать.
|
|
|
|
03.12.2010, 05:40
|
|
Частый гость
Регистрация: 04.02.2007
Сообщений: 43
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
вот cделал индикацию
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
if( ++ms == 1000){ ms = 0;
if( ++sec == 60 ){ sec = 0;
if( ++min == 60 ){ min = 0;
if( ++hour == 24 ) {hour = 0;
}}}}
PORTA=255;
PORTB=0;
if (++Dig==6){Dig=0;};
switch (Dig){
case 0: PORTB SET_B(0);PORTA=recode[(hour / 10)];break;
case 1: PORTB SET_B(1);PORTA=recode[(hour % 10)];break;
case 2: PORTB SET_B(2);PORTA=recode[(min / 10)];break;
case 3: PORTB SET_B(3);PORTA=recode[(min % 10)];break;
case 4: PORTB SET_B(4);PORTA=recode[(sec / 10)];break;
case 5: PORTB SET_B(5);PORTA=recode[(sec % 10)];break;
};
}
вроде все правильно но часики за 8ч отстают на 4 сек ((
Последний раз редактировалось Dorgx7; 03.12.2010 в 05:47.
|
|
|
|
03.12.2010, 09:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Сообщение от ut1wpr
|
Для прихода понимания.
|
Ну да. Сделает человек второе прерывание. Всё запустит. Вроде работает всё - красота! А потом окажется, что время убегает куда-то. Будет грешить на кварц - продали некачественный. Начнёт разбираться - и придёт понимание! Кварц ни при чём. Просто прерывания накладываются и сбивают логику работы программы. Это же AVR, а не MSC51. Контроллер прерываний урезан - нету в нём разделения по приоритетам. При приходе нескольких прерываний выбирается первое по списку... Потом следующее. НАДО тактировать от одного.
Сообщение от omercury
|
А то увлечется и понаписывает в обработчике кодов аж на 1.1 мсек.
|
А чтоб не увлекался - опять же подсказать надо. В прерываниях лучше ставить флаги, а расчеты оставить на основной цикл.
Оно понятно, что своими граблями да по своему лбу колотить - оно надёжнее. Запомнится лучше...
Последний раз редактировалось omercury; 03.12.2010 в 09:49.
|
|
|
|
03.12.2010, 10:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Сообщение от omercury
|
Контроллер прерываний урезан - нету в нём разделения по приоритетам. При приходе нескольких прерываний выбирается первое по списку...
|
Так нету или первое по списку? Если нет, то выбор рэндомайзный. Если по списку - то значит список есть и приоритеты расставлены. А нам остается только подстраиваться под них. Изменить их нам не дано.
Сообщение от omercury
|
В прерываниях лучше ставить флаги, а расчеты оставить на основной цикл.
|
Вопрос спорный. Я бы не был так категоричен. Смотря что выполнять. Если время реакции на выполнение функции вне прерывания по самому прерыванию не важно - тогда да. В противном случае всегда жмемся к началу обработчика...
|
|
|
|
03.12.2010, 10:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Сообщение от ut1wpr
|
Так нету или первое по списку?
|
В начале памяти программ векторы прерываний. Если придут все сразу(ситуация невероятная, но теоретически возможная), кроме сброса, то будут обрабатываться по очереди - начиная с младшего адреса.
Сообщение от ut1wpr
|
Вопрос спорный. Я бы не был так категоричен. Смотря что выполнять. Если время реакции на выполнение функции вне прерывания по самому прерыванию не важно - тогда да. В противном случае всегда жмемся к началу обработчика...
|
Ежу понятно.
У ТС так и сделано - критичный ко времени расчет вначале.
Будем на словах ловить, или по-делу?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:32.
|
|