• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Часы на ATmega-8A

  • Автор темы Автор темы Dima223
  • Дата начала Дата начала

Dima223

Новые
Регистрация
4 Ноя 2014
Сообщения
17
Реакции
1
Баллы
0
Часы на ATmega-8A

Начал осваивать микроконтроллеры. решил реализовать часы на семисегментном индикаторе. В результате часы отстают на 15сек каждую минуту. Мог увеличить период и подстроить, но шли бы они не совсем точно. Попробовал реализовать используя ассинхронный режим и часовой кварц (пока только Proteus). Результат - снова отставания на 15 сек каждую минуту.
Думаю проблема или в Протеусе или в программе индикации "Prog2"
Знаю что написано коряво (и не смотрите на комменты), но долго думал и так ошибку и не нашел.
Интересный факт, что реализовав часы 3-мя способами остается это отставание.
Подскажите пожалуйста, буду очень благодарен.
Компилятор IAR. Файл протеуса в архиве в папке Prot
"https://yadi.sk/d/pLgsBu4VjGu9t"
 
Не понятно, часы реализованы в железе, или только в симуляторе?
 
TIFR &=~(1<<6); //cbroc flag prerivania
по даташиту флаг сбрасывается логической единицей:
TOV2 is cleared by hardware
when executing the corresponding interrupt Handling Vector. Alternatively, TOV2 is
cleared by writing a logic one to the flag.
кварц какой?

на первый взгляд все правильно
 
Последнее редактирование:
по даташиту флаг сбрасывается логической единицей:
кварц какой?

на первый взгляд все правильно

Кварц 32768 Гц. Оно и без строки сброса флага так и работало. Я ее потом добавил когда искал проблемы и не помогло.
 
ну если смотреть по времени симуляции в протеусе все правильно работает. скорее всего это тормоза самого симулятора.
 
ну если смотреть по времени симуляции в протеусе все правильно работает. скорее всего это тормоза самого симулятора.
И правда. Почему я туда раньше не посмотрел....
Спасибо огромное.
 
DDRC &=~(1<<0);//button 1
PORTC |=(1<<0);

temp=TESTBIT(PINC,0);
if ((temp==0)&&(temp1==1))
{
hour++;
}
temp1=temp;
Добавил кнопку для часов (ножка PC0). Она работает, т.е. добавляет +1 час
Добавил кнопку для минут (ножка PC1). Грубо говоря та же программа, одно действие, но вот она не работает и все
DDRC &=~(1<<1);//button 2
PORTC |=(1<<1);//

t=TESTBIT(PINC,1);
if ((t==0)&&(t1==1))
{
hour++;
}
t1=t;

Помогите пожалуйста
 
а симулятора нет? глянь что возвращает TESTBIT(PINC,1); скорее всего вернет 2(а точнее 0b10)
 
А где и как это посмотреть?
 
не знаю за IAR, компилил в AVR Studio4 там можно запустить симуляцию. в любом случае поставь t=PINC>>1 & (1<<0); вместо t=TESTBIT(PINC,1);
так у меня заработало.
 
Заработало, только вот в чем причина? В остальных программах такая запись работала.
 
а в других программах ты использовал регистры кроме нулевого?) похоже функция возвращает весь байт, хранящийся в регистре порта.
 
В том то и прикол, что раньше я писал TESTBIT и с нулевыми и остальными битами и проблем не возникало. И если написать кнопку без защиты от дребезга контактов: if (TESTBIT(PORTC,2)==0) и условие, то оно работает.
Хотя писал раньше в этом же компиляторе.
 
ну тут не подскажу) гугли
 
Привет. Есть вопрос по фьюзам. Используется асинхронный режим с внешним кварцем 32768 Гц и внутренним тактовым генератором 1МГц. В даташите и в инете вычитал как выставить кварц битом CKSEL3..0 =1001
(External Low-frequency Crystal). Вот с даташита: "To use a 32.768kHz watch crystal as the clock source for the device, the Low-frequency Crystal
Oscillator must be selected by setting the CKSEL Fuses to “1001”."
Тут понятно. А как выставить частоту внутреннего генератора. Или нужно только выставить для кварца, а внутренний по умолчанию будет работать?
 
отправил бы ссылку в личку, но, похоже, еще недоступна. вроде как тактируется проц от внутреннего RC генератора, а асинхронный таймер от кварца. easyelectronics.ru avr-uchebnyj-kurs-asinxronnyj-rezhim-tajmera найди через гугл(все что после ".ru")
 
Читал давно эту статью. Тут четко про фьюзы не написано.
1)"Структура же Timer/Counter2 немного отличается от остальных — у него нет счетного входа, зато есть возможность задействовать собственный тактовый генератор."
2)"Для этого на выводы TOSC2 и TOSC1 вешается кварцевый резонатор. Низкочастотный, обычно это часовой кварц на 32768Гц. Причем тактовая частота процессора должна быть выше как минимум в четыре раза. У нас тактовая от внутреннего генератора 8Мгц"
3)"Для включения надо всего лишь установить бит AS2 регистра ASSR — и все, таймер работает в асинхронном режиме."
Как я понял фьюзы надо выставить на внутренний генератор и установить бит AS2 и МК будет тактироваться от внутреннего, а к Т2 подключится кварц?
 
ну или так. нигде не нашел точного описания такой конфигурации.
 
Назад
Сверху