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

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

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

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

Освоение МК ATmega16

  • Автор темы Автор темы News
  • Дата начала Дата начала
Сейчас пишу программу для часов :)
Давно мечтал иметь часы самодельные!
 
Вод только CVAVR накосячил и неправильно перевел на ассемблер код
ты уверен что это CVAVR накосячил? :D

часы на Mega16 - такая роскошь)) тогда попытайся использовать весь функционал этого МК :)
 
ты уверен что это CVAVR накосячил? :D
На 100%. Ведь по программе только 1 нога используется, остальные даже не упомянаются!
часы на Mega16 - такая роскошь)) тогда попытайся использовать весь функционал этого МК
Да ну ладно! mega16A-AU 90 рублей стоит.
Вод только частоту придется занизить до 32 Килогерц :(
Что значат 2 буквы после тире в названии МК?
 
Что значат 2 буквы после тире в названии МК?
mega16A-AU для поверхностного монтажа, Mega16A-PU можно вставить в панельку, бери лучше её, 140 руб стоит :)
только чем отличается Mega16 от Mega16A че то не понятно..
Вод только частоту придется занизить до 32 Килогерц
зачем? хочешь использовать часовой кварц?
 
а что мешает поставить кварц побольше?
 
Написал я программу для часов.
Правда вывод информацыы пока не сделан (Выбираю индикаторы)
Основной минус этой программы, что функция Main представляет из себя бесконечный цыкл, а следственно вся вычислительная мощь уходит на его работу...
#include <mega16.h>
//Объявляем глобальные переменные. Переменную таймера, секундную, минутную и часовую переменную - соответственно.
char Timer;
char Second;
char Minute;
char Hour;

void main(void)
{
//Запускаем таймер с коэф. делени 1024. При кварце в 16Мгц он будет переполнятся 61Раз (Таймер на 8 Бит).
TCCR0 = 0b00000101;
//Когда таймер переполнится, будет установлен 0 бит регистра TIFR и цыкл будет покинут.
while (!(TIFR&0x01));
//Так как таймер переполнился, прибавим к переменной Timer - 1.
Timer++;
//И обнулим бит переполнения таймера путем перезаписи.
TIFR |=1<<0;
//Когда в переменной Timer будет значение 61, прибавим к переменной Second 1 (В секунду таймер переполняется 61 раз!).
//И обнулим переменную Timer для дальнейшей работы.
if (Timer==61) {Second++; Timer=0;};

//При достижении переменной Second 60 Секунд, к переменной Minute будет приплюсовываться 1.
//Переменная Second - очистица.
if (Second==60) {Minute++; Second=0;};

//При достижении переменной Minute 60 Минут, к переменной Hour будет приплюсовываться 1.
//Переменная Minute - очистица.
if (Minute==60) {Hour++; Minute=0;};

//Переменная Hour обнуляется по достижению 24 Часов.
if (Hour==24) {Hour=0;};

//Перезапускаем функцию Main.
main();
}

Покритекуйте. Что можно бы добавить, что убавить. Какие индикаторы с шифровкой предложите?
 
Буду использовать такой индикатор.
IVL2_7_8.webp
Шикарно смотрится.
 
Чет я совсем напортачил.
Надо еще попроктиковатся.
 
Что за индикаторы такие интересные? :)
 
Оказываеися если иницыализировать ножки как выходы
Они автоматически приобретают значения 1. Из-за этого ничего видимо и неработало...
 
Я наверно лучьше на tiny13A побалуюсь (Как никак всего 30Р стоит)
А потом как подучюсь на мегу перейду.
 
Посмотрел датащит на тиньку 13.
В Register Summary хотел посмотреть регистр TIFR0
Написано мол смотри на странице 75.
Вот тут и был ступор.... Датащит ссылается на несуществующие страницы (В нем их 22)
Так где мне прочитать о этом регистре?
На ОФФ сайте ДШ так-же срезан...
 
Может в другом месте надо смотреть?
 
Мдаааа. Проблема.
 
Последнее редактирование:
ты не то скачал)))
ты скачал файл ATTiny13 Summary, а надо было полный даташит, там 176 страниц, гугл сразу находит то что нужно)))
вот читай))
http://www.atmel.com/Images/doc2535.pdf
 
#include <mega16.h>
//Объявляем глобальные переменные. Переменную таймера, секундную, минутную и часовую переменную - соответственно.
char Timer;
char Second;
char Minute;
char Hour;

void main(void)
{
DDRA=0xFF;
PORTA.0=1;

while(1)
{
//Запускаем таймер с коэф. делени 1024. При кварце в 16Мгц он будет переполнятся 61Раз (Таймер на 8 Бит).
TCCR0 = 0b00000101;
//Когда таймер переполнится, будет установлен 0 бит регистра TIFR и цыкл будет покинут.
while (!(TIFR&0x01));
//Так как таймер переполнился, прибавим к переменной Timer - 1.
Timer++;
//И обнулим бит переполнения таймера путем перезаписи.
TIFR |=1<<0;
//Когда в переменной Timer будет значение 61, прибавим к переменной Second 1 (В секунду таймер переполняется 61 раз!).
//И обнулим переменную Timer для дальнейшей работы.
if (Timer==61) {Second++; Timer=0; !PORTA.0;};
//При достижении переменной Second 60 Секунд, к переменной Minute будет приплюсовываться 1.
//Переменная Second - очистица.
if (Second==60) {Minute++; Second=0;};
//При достижении переменной Minute 60 Минут, к переменной Hour будет приплюсовываться 1.
//Переменная Minute - очистица.
if (Minute==60) {Hour++; Minute=0;};
//Переменная Hour обнуляется по достижению 24 Часов.
if (Hour==24) {Hour=0;};
};
}
Программа практически доделана.
(Покрайнемере светодиод мигает каждую секунду)
Осталось прочитать датащит на индикатор и вывести сигнал на соответствующие ноги.
Ну и подправить !PORTA.0;
 
Последнее редактирование:
Работает!
Осталось индикатор прикрепить.
#include <mega16.h>
//Объявляем глобальные переменные. Переменную таймера, секундную, минутную и часовую переменную - соответственно.
char Timer;
char Second;
char Minute;
char Hour;
//Переменая управления Сеундным Светодиодом.
char SecLed;

void main(void)
{
DDRA=0xFF;

while(1)
{
//Запускаем таймер с коэф. делени 1024. При кварце в 16Мгц он будет переполнятся 61Раз (Таймер на 8 Бит).
TCCR0 = 0b00000101;
//Когда таймер переполнится, будет установлен 0 бит регистра TIFR и цыкл будет покинут.
while (!(TIFR&0x01));
//Так как таймер переполнился, прибавим к переменной Timer - 1.
Timer++;
//И обнулим бит переполнения таймера путем перезаписи.
TIFR |=1<<0;
//Когда в переменной Timer будет значение 61, прибавим к переменной Second 1 (В секунду таймер переполняется 61 раз!).
//И обнулим переменную Timer для дальнейшей работы.
if (Timer==61) {Second++; Timer=0; PORTA.0=1;};
//При достижении переменной Second 60 Секунд, к переменной Minute будет приплюсовываться 1.
//Переменная Second - очистица.
if (Second==60) {Minute++; Second=0;};
//При достижении переменной Minute 60 Минут, к переменной Hour будет приплюсовываться 1.
//Переменная Minute - очистица.
if (Minute==60) {Hour++; Minute=0;};
//Переменная Hour обнуляется по достижению 24 Часов.
if (Hour==24) {Hour=0;};
if (Timer==0){SecLed++;};
if (SecLed==2){PORTA.0=0; SecLed=0;};
};
}
 
Назад
Сверху