Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
26.11.2010, 22:53
|
|
Частый гость
Регистрация: 04.02.2007
Сообщений: 43
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Прошу помощи в освоении AVR под CV
Приветствую всех
начал разбираться с ATmega16-16pu кварц 16МГц. рушил сделать часики на 7ми сигментниках.
У меня возник вопрос как лучше как лучше считать время? сейчас использую вот такой код :
//////////////////////////////////////////////////////////
#include ‹mega16.h›
#include ‹delay.h›
interrupt [TIM0_COMP] void timer0_ovf_isr(void)
{
TCNT0=0x00;
//код прерывания
}
void main(void)
{
/* Reset WDT*/
#asm("wdr")
/* Turn off WDT */
WDTCR = 0x00;
TCCR0=0x03;
TCNT0=0x00;
OCR0=250;
TIMSK=0x03;
// Global enable interrupts
#asm("sei")
while (1)
{
//основная програма
}
}
//////////////////////////////////////////////////////////
часы заметно отстают в чем проблема ?
Заранее всем благодарен.
|
|
|
|
26.11.2010, 23:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Что бы таймер имел период в 250 тактов в OCR нужно грузить 250-1=249.
|
|
|
|
26.11.2010, 23:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Часы наверно лучше на часовом кварце делать.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
27.11.2010, 00:40
|
|
Вид на жительство
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 180
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Я считаю секунды так
(Проц атмега16, кварц 11.0592 MHz)
Код:
|
unsigned int iloscIteruptowTimer0;
unsigned long int time;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
if (++iloscIteruptowTimer0 › 673) // Через каждые 673 срабатывания таймера увеличиваем переменную time на одну секунду
{
iloscIteruptowTimer0 = 0; // сброс
if (++time › 86399) time = 0; // в сутках 24 h * 60 min * 60 sec = 86400 секунд, а -1 так как считаем от нуля
for(i=0; i‹precision; i++) // корректировка точности хода часов, "precision" хранится в еепром
{
delay_us(20);
}
}
} |
Код:
|
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 172.800 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x03;
TCNT0=0x00;
OCR0=0x00; |
После подбора значения "precision" часы за сутки идут секунда в секунду с часами компа.
Поправив, как писал kison, OCR0=249; ваш код тоже должен работать, но не ясно что вы делаете в прерывании и что в основной программе.
Последний раз редактировалось CodeNameHawk; 27.11.2010 в 00:58.
|
|
|
|
27.11.2010, 11:31
|
|
Частый гость
Регистрация: 04.02.2007
Сообщений: 43
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
"avr123-nm-ru" Да я конечно согласен что часы лучше делать на часовом кварце, но это если нужны просто часы.Если это устройство в котором необходима скорость выполнения и при этом нужны часы реального времени ?
вот полный код программы: Копия int01.txt.
Возник вопрос продолжает ли считать счетчик вовремя выполнения прерывания?
и как проверить точность счета?
//////////////////////////////
interrupt [TIM0_COMP] void timer0_ovf_isr(void)
{
TCNT0=0x00;
mS++;
if (mS==1000){s++;mS=0;};
if (s›9){Ds++;s=0;};
if (Ds›5){m++;Ds=0;};
if (m›9){Dm++;m=0;};
if (Dm›5){h++;Dm=0;};
if (h›9){Dh++;h=0;};
if (Dh›1){if (h›3){Dh=0;h=0;};};
}
/////////////////////////////
Последний раз редактировалось Dorgx7; 27.11.2010 в 11:35.
|
|
|
|
27.11.2010, 12:05
|
|
Вид на жительство
Регистрация: 03.06.2007
Сообщений: 368
Сказал спасибо: 3
Сказали Спасибо 59 раз(а) в 52 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
А можно сделать часики используя таймер_2 в асинхронном режиме,подключив к выводам TOSC1-TOSC2 часовой кварц.
|
|
|
|
27.11.2010, 13:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Сообщение от Dorgx7
|
"avr123-nm-ru" Да я конечно согласен что часы лучше делать на часовом кварце, но это если нужны просто часы.Если это устройство в котором необходима скорость выполнения и при этом нужны часы реального времени ?
вот полный код программы:Вложение 15169.
Возник вопрос продолжает ли считать счетчик вовремя выполнения прерывания?
и как проверить точность счета?
//////////////////////////////
interrupt [TIM0_COMP] void timer0_ovf_isr(void)
{
TCNT0=0x00;
mS++;
if (mS==1000){s++;mS=0;};
if (s›9){Ds++;s=0;};
if (Ds›5){m++;Ds=0;};
if (m›9){Dm++;m=0;};
if (Dm›5){h++;Dm=0;};
if (h›9){Dh++;h=0;};
if (Dh›1){if (h›3){Dh=0;h=0;};};
}
/////////////////////////////
|
Уточнимся. Счётчик ЧЕГО продолжает считать? Счетчик таймера? Раз таймер не останавливают, значит считает.
Счетчик часов/минут/секунд лучше организовать на трех байтах.
Код:
|
if( ++ms == 1000){ ms = 0;
if( ++sec == 59 ){ sec = 0;
if( ++min == 59 ){ min = 0;
if( ++hour == 23 ) hour = 0;
}
}
} |
В теле программы данные для вывода легко преобразуются в ASCII:
Код:
|
time[0] = (hour / 10) + 30h;
time[1] = (hour % 10) + 30h;
time[2] = (min / 10) + 30h;
time[3] = (min % 10) + 30h;
time[4] = (sec / 10) + 30h;
time[5] = (sec % 10) + 30h; |
или если нужно в дальнейшем перекодировать в семисегментный код по заданному массиву перекодировки recode[]:
Код:
|
time[0] = recode[(hour / 10)];
time[1] = recode[(hour % 10)];
time[2] = recode[(min / 10)];
time[3] = recode[(min % 10)];
time[4] = recode[(sec / 10)];
time[5] = recode[(sec % 10)]; |
Не рекомендую без особой надобности выкладывать тексты программ, в которых Вы запутались. Мало кто захочет расковыривать Ваши ошибки. Лучше задавайте конкретные вопросы по фрагментам, скорее получите ответ, и сами скорее овладеете "правописанием" программ. ![Улыбка](images/smilies/icon_smile.gif)
А то получается по принципу: "Вот я наваял, а оно не работает. Хочу, чтобы работало!" ![Улыбка](images/smilies/icon_smile.gif)
Успехов!
|
|
|
|
27.11.2010, 14:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Сообщение от ut1wpr
|
Код:
|
if( ++ms == 1000){ ms = 0;
if( ++sec == 59 ){ sec = 0;
if( ++min == 59 ){ min = 0;
if( ++hour == 23 ) hour = 0;
}
}
} |
|
этот кусок ИМХО лучше так:
Код:
|
if( ++ms › 999){ ms = 0;
if( ++sec › 59 ){ sec = 0;
if( ++min › 59 ){ min = 0;
if( ++hour › 23 ) hour = 0;
}
}
} |
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
|
|
|
|
27.11.2010, 17:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
Сообщение от picavr
|
этот кусок ИМХО лучше так:
Код:
|
if( ++ms › 999){ ms = 0;
if( ++sec › 59 ){ sec = 0;
if( ++min › 59 ){ min = 0;
if( ++hour › 23 ) hour = 0;
}
}
} |
|
Безусловно, так, принимая во внимание мою ошибку ![Обижен](images/smilies/icon_beee.gif) Сравнивать надо было с 60 и 24. Описка...
|
|
|
|
28.11.2010, 08:20
|
|
Частый гость
Регистрация: 04.02.2007
Сообщений: 43
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Прошу помощи в освоении AVR под CV
ut1wpr, большое спасибо ваш код действительно намного легче читается да и по объему меньше.
Теперь вторая часть программы динамический вывод на 7сегментные индикаторы, как это правильно делается?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:12.
|
|