Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

Прошу помощи в освоении AVR под CV

Непрочитано 26.11.2010, 22:53  
Dorgx7
Частый гость
 
Регистрация: 04.02.2007
Сообщений: 43
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Dorgx7 на пути к лучшему
По умолчанию Прошу помощи в освоении 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)
{
//основная програма

}
}
//////////////////////////////////////////////////////////
часы заметно отстают в чем проблема ?
Заранее всем благодарен.
Реклама:
Dorgx7 вне форума  
Непрочитано 26.11.2010, 23:04  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Прошу помощи в освоении AVR под CV

Что бы таймер имел период в 250 тактов в OCR нужно грузить 250-1=249.
kison вне форума  
Непрочитано 26.11.2010, 23:05  
avr123-nm-ru
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,552
Сказал спасибо: 75
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
avr123-nm-ru на пути к лучшему
По умолчанию Re: Прошу помощи в освоении AVR под CV

Часы наверно лучше на часовом кварце делать.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
avr123-nm-ru вне форума  
Непрочитано 27.11.2010, 00:40  
CodeNameHawk
Вид на жительство
 
Регистрация: 21.10.2009
Сообщений: 349
Сказал спасибо: 181
Сказали Спасибо 65 раз(а) в 57 сообщении(ях)
CodeNameHawk на пути к лучшему
По умолчанию 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.
CodeNameHawk вне форума  
Непрочитано 27.11.2010, 11:31  
Dorgx7
Частый гость
 
Регистрация: 04.02.2007
Сообщений: 43
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Dorgx7 на пути к лучшему
По умолчанию 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.
Dorgx7 вне форума  
Непрочитано 27.11.2010, 12:05  
Vov123
Вид на жительство
 
Регистрация: 03.06.2007
Сообщений: 368
Сказал спасибо: 3
Сказали Спасибо 59 раз(а) в 52 сообщении(ях)
Vov123 на пути к лучшему
По умолчанию Re: Прошу помощи в освоении AVR под CV

А можно сделать часики используя таймер_2 в асинхронном режиме,подключив к выводам TOSC1-TOSC2 часовой кварц.
Vov123 вне форума  
Непрочитано 27.11.2010, 13:37  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию 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)];
Не рекомендую без особой надобности выкладывать тексты программ, в которых Вы запутались. Мало кто захочет расковыривать Ваши ошибки. Лучше задавайте конкретные вопросы по фрагментам, скорее получите ответ, и сами скорее овладеете "правописанием" программ.
А то получается по принципу: "Вот я наваял, а оно не работает. Хочу, чтобы работало!"
Успехов!
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
Dorgx7 (28.11.2010)
Непрочитано 27.11.2010, 14:10  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию 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" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
picavr вне форума  
Непрочитано 27.11.2010, 17:15  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Прошу помощи в освоении AVR под CV

Сообщение от picavr Посмотреть сообщение
этот кусок ИМХО лучше так:
Код:
if( ++ms › 999){ ms = 0;
 if( ++sec › 59 ){  sec = 0;
  if( ++min › 59 ){  min = 0;
    if( ++hour › 23 ) hour = 0;
   }
  }
}
Безусловно, так, принимая во внимание мою ошибку Сравнивать надо было с 60 и 24. Описка...
ut1wpr вне форума  
Непрочитано 28.11.2010, 08:20  
Dorgx7
Частый гость
 
Регистрация: 04.02.2007
Сообщений: 43
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Dorgx7 на пути к лучшему
По умолчанию Re: Прошу помощи в освоении AVR под CV

ut1wpr, большое спасибо ваш код действительно намного легче читается да и по объему меньше.
Теперь вторая часть программы динамический вывод на 7сегментные индикаторы, как это правильно делается?
Dorgx7 вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги dosikus Электронная библиотека 11242 29.12.2015 23:45
Прошу помощи с Металлоискателем korwin757 Поиск схем. Делимся схемами 16 22.11.2010 21:13
Свой планировщик для IAR под AVR Developer_ Микроконтроллеры, АЦП, память и т.д 3 16.07.2010 00:56
GSM реле (управлением звонком) прошу помощи Serjik10 Автоматика и аппаратура связи 7 28.02.2010 00:10


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.