roboforum.ru

Технический форум по робототехнике.


Часы реального времени на Atmega 16

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Часы реального времени на Atmega 16

Сообщение Dmitry__ » 08 ноя 2012, 19:15

Первая ссылка ведет на завирусованный сайт, вторая на какую-то хрень без теории, третья на капитана очевидность. Злой ты :D
Моя сцылко лучше :roll:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Часы реального времени на Atmega 16

Сообщение Angel71 » 08 ноя 2012, 19:24

:D теория в первом, вирусы онлайн сканеры не нашли, такая шняшко
Подозрение на вирус!
На сайте обнаружены iframe-вставки, ссылающиеся на сомнительные сайты либо обфусицированный код.

норма для сайтов с рекламой. и вообще кто-то крисял, что давно на линух перешел, вроде.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Часы реального времени на Atmega 16

Сообщение Alexandrio89 » 08 ноя 2012, 19:29

хм спасибо за ссылки, ну вот вроде по аналогии с той что выкладывал сделал . кнопки работают индикация тоже , вот только считать не хочет :(
Вложения
Atmega16.rar
(59.54 КиБ) Скачиваний: 0
Alexandrio89
 
Сообщения: 7
Зарегистрирован: 08 ноя 2012, 01:28

Re: Часы реального времени на Atmega 16

Сообщение Dmitry__ » 08 ноя 2012, 19:33

Под линухом я и есть. :D это так хромиум отреагировал. А файрефох открыл нормально. :pardon:
Код: Выделить всёРазвернуть
Внимание! Обнаружена проблема!
arv.radioliga.com cодержит содержимое из www.simple-devices.ru, являющийся распространителем вредоносного ПО. Ваш компьютер может быть заражен вирусом если вы решите посетить этот сайт.
Google обнаружил, что на ваш компьютер могут быть установлены вредоносные программы, если вы продолжите просмотр этого сайта. Если вы посещали его в прошлом или доверяете ему, вполне возможно, что он недавно был взломан хакерами. Рекомендуется прекратить просмотр и посетить сайт завтра либо перейти на другой сайт.
Мы уже сообщили владельцу сайта www.simple-devices.ru о том, что на его сайте найдено вредоносное ПО. Подробнее о проблемах, обнаруженных на www.simple-devices.ru, можно узнать на странице Google Страница диагностики безопасного просмотра.

Если вы понимаете, что этот сайт может причинить вред вашему компьютеру, все равно продолжать.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Часы реального времени на Atmega 16

Сообщение Angel71 » 08 ноя 2012, 20:53

"эй, ты туда не ходи, ты сюда ходи, а то снег в башка попадет", всё по честному. :crazy: у меня софт не выругался, значит моей машине с той страницы ничего пакостного не грозит. :wink: самое опасное для моей машины эт флеш, ява + менее пакостно новые дрова от амд и торрент (запретил ему всякие рекламные гадости с офсайта качать и бсод больше не наблюдается).
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Часы реального времени на Atmega 16

Сообщение Romikgy » 09 ноя 2012, 01:19

Код: Выделить всёРазвернуть
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.8d Professional
Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 08.11.2012
Author  : F4CG                           
Company : F4CG                           
Comments:


Chip type           : ATmega16
Program type        : Application
Clock frequency     : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>
#include <delay.h> 
#define digit_display_time 1

unsigned char milliseconds, seconds, ten_seconds, minutes, ten_minutes, hours, ten_hours;
bit button_pressed1, button_pressed2;

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)   
{ milliseconds++;
  TCNT1H=0x00;
  TCNT1L=0x00;

  if (milliseconds >= 100 )
  {
  milliseconds = 0;
  seconds++;
  };
   
  if (seconds >= 10)
  {
  seconds = 0;
  ten_seconds++;
  };
 
  if (ten_seconds >= 6)
  {
  ten_seconds = 0;
  minutes++;
  };
   
  if (minutes >= 10)
  {
  minutes = 0;
  ten_minutes++;
  }; 
 
  if (ten_minutes >= 6)
  {
  ten_minutes = 0;
  hours++;
  };

  if (hours >= 10)
  {
  hours = 0;
  ten_hours++;
  };

  if (ten_hours >= 2 && hours == 4)
  {
  ten_hours = 0;
  hours=0;
  };   
 

}

void main(void)
{         
unsigned char digits[10] = {18, 159, 56, 28, 149, 84, 80, 31, 16, 20};     

{
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0xFF;
DDRB=0xFF;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x03;
DDRD=0x7C;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125.000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=125;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
}
#asm("sei")

while (1)
      {
      PORTD |=1<<5;                               
      PORTB = digits[ten_minutes];                 
      delay_ms(digit_display_time);             
      PORTD &=~(1<<5);                           
      PORTD |=1<<4;
      PORTB = digits[minutes];
      if (milliseconds >= 50) PORTB &=~(1<<4); else PORTB|=1<<4; 
      delay_ms(digit_display_time);
      PORTD &=~(1<<4);
      PORTD |=1<<3;
      //PORTB = digits[ten_minutes];
      PORTB = digits[ten_seconds];
      delay_ms(digit_display_time);
      PORTD &=~(1<<3);
      PORTD |=1<<6;
      //PORTB = digits[minutes];   
      PORTB = digits[seconds];
      delay_ms(digit_display_time);
      PORTD &=~(1<<6);         
       
    //    seconds = 0;
// ten_seconds++;
           
      if ((PIND & 1<<0) == 0 && button_pressed1 == 0)                   
      {
      delay_ms(1);
      hours++;
      button_pressed1 = 1;
      };   
     
      if ((PIND & 1<<0) == 1) button_pressed1=0;                         
     

     
      if ((PIND & 1<<1) == 0 && button_pressed2 == 0)                     
      {
      delay_ms(1);
      minutes++;
      button_pressed2 = 1;
      };   
     
      if (PIND & 1<<1) button_pressed2=0;
     
       
                 
           
      };
}
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

Re: Часы реального времени на Atmega 16

Сообщение Alexandrio89 » 12 ноя 2012, 11:37

Romikgy , спасибо!!!)))
Alexandrio89
 
Сообщения: 7
Зарегистрирован: 08 ноя 2012, 01:28

Re: Часы реального времени на Atmega 16

Сообщение Drunya » 13 ноя 2012, 10:52

Глюк по-немецки означает "счастье"...
Аватара пользователя
Drunya
 
Сообщения: 196
Зарегистрирован: 05 июн 2007, 12:20
Откуда: Киев
прог. языки: C/C++, ASSEMBLER

Re: Часы реального времени на Atmega 16

Сообщение Kotto » 10 дек 2012, 20:50

Всем привет! Задумал я сделать часы, наверное классическая задача для начинающего. Купил индикатор семисегментный, управлять им научился, все казалось бы хорошо, но...

Столкнулся с большущей проблемой точного измерения времени. В качестве МК выбран ATMega8

1) Куда на ней подключить часовой кварц на 32 кГц? Везде пишут что кварц ставится на TOSC1 и TOSC2, но на атмега8 эти выводы совпадают с XTAL1 и XTAL2, что же делать то? А если у меня МК затактирована от внешнего кварца на этих же ногах например на 20 мгц? Фиг с ним, ладно, выключили внешний кварц, 8 мГц от встроенного хватит, но дальше то что делать?

2)
//Запускаем таймер с коэф. делени 1024. При кварце в 16Мгц он будет переполнятся 61Раз (Таймер на 8 Бит).
TCCR0 = 0b00000101;

???

16 мГц = 16 000 000 Гц, что за коэффициент деления? Как на него делить и что на него делить, допустим частота 8 мГц, какой нужно выбрать коэффициент деления? Почему он будет переполняться 61 раз и за какой период времени он переполнится 61 раз??? Где об этом на нормальном языке можно почитать?

Благодарю за ответы, не дайте моему мозгу сломаться! Пишу на CodeVisionAVR. Ну или кому не сложно объясните как для полного дибила :) Изучаю не для учебы и не для работы, просто для себя.
Kotto
 
Сообщения: 6
Зарегистрирован: 10 дек 2012, 20:37

Re: Часы реального времени на Atmega 16

Сообщение boez » 12 дек 2012, 17:49

Если я ничего не путаю - есть 2 варианта.

1 - поставить какой-то высокочастотный кварц, например на 1 МГц и fuse-битами выбрать работу от него. В таймере 1 выбрать при инициализации работу от системного такта с прескалером побольше (читать раздел 16-bit Timer/Counter1) и считать время таймером 1. Часовой кварц не использовать.

2 - поставить 32768, а МК настроить fuse-битами на работу от внутреннего RC. Таймер 2 настроить на тактирование от внешнего кварца 32768 (раздел 8-bit Timer/Counter2 with PWM and Asynchronous Operation)

Ну а дальше исходя из имеющихся частот выбирать - какой ставить prescaler и какой период таймера. В результате обычно стараются получить период 1 герц или другое круглое значение (если присутствует динамическая индикация - то явно повыше нужно, например 1024 Гц, а потом программно делить). Таймер поставить в CTC mode (Modes of operation в том же разделе про таймер), режим хорош тем что период задается 1 раз и дальше все само работает.

Пример: для 1 МГц прескалер 64, период 15625 - получаем 1 Гц. Для варианта с 32768 - ну например прескалер 256, период 128. Для 1024 Гц - ну сам пересчитай, прескалеры там наверное вообще 1 брать, а периодом рулить.

В общем коэффициент деления - это число, на которое делится тактовая частота :) Равен произведению прескалера и периода таймера. С этой частотой будет вызываться обработчик прерывания таймера, в котором ты будешь увеличивать на 1 счетчик секунд (для варианта с 1 Гц) или счетчик своих внутренних тиков для варианта с 1024 Гц, тогда там же переключать активное знакоместо на индикаторе и выводить туда цифру.

Прескалер - это по русски предварительный делитель частоты, см. структурные схемы таймеров все там же - в даташите :)
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Часы реального времени на Atmega 16

Сообщение Kotto » 14 дек 2012, 08:51

Спасибо за ответ! С делителями частоты и с тем что откуда берется я разобрался. Подключил часовой кварц, атмега 8 успешно начала тактировать таймер Т2 от часового кварца. Теперь проблема следующая:

выкладываю программу: http://sderni.ru/159105

Вот, на атмеге 48 вообще никак не работает, хоть застрелись, погрешность ровно секунда в минуту, на атмеге 8 работала всю ночь точно такая же программа, все идеально, за 8 часов не набежала ни секундная погрешность. Вот где я не прав???

Часовой кварц сажаю на ноги TOSC1 и TOSC2, у атмег8 и 48 эти ноги совпадают с xtal1 и xtal2, МК тактирую от внутреннего генератора на 8 мГц.

Инициализация и включение таймеров и прерываний доверил CodeVisionAVR его визарду по созданию программы. Вроде бы визард нигде не ошибся, все корректно прописал для atmega48.

Если отключить часовой кварц в данной схеме от atmega8, то часы перестают тикать вообще, никак не тикают, ноль на них остается в течение продолжительного времени и не изменяется. Если в аналогичной схеме на атмега48 отключить кварц, то часы продолжают тикать вообще не понятно от чего и не понятно в каком режиме. Ощущение будто часы и не тактировались изначально от кварца, хотя если задеть xtal1 источником повышенной частоты, часы начинают крутиться довольно быстро.

Все прочие условия абсолютно равные, питание от USB программатора от одного и того же USB порта. Разница лишь в замене микросхемы atmega8 dip на atmega48 SMD. Что за пипец собсно? Где я не прав?
Kotto
 
Сообщения: 6
Зарегистрирован: 10 дек 2012, 20:37

Re: Часы реального времени на Atmega 16

Сообщение Madf » 14 дек 2012, 11:26

фюз делителя на 8 проверили?
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: Часы реального времени на Atmega 16

Сообщение Kotto » 14 дек 2012, 11:44

Да, я его и снимал и ставил и ни какого результата. Да и впрочем какая разница работает программа на 1 мгц или на 8 мгц, она слишком простая, всего лишь считает секунды и все, и каждую минуту на атмеге 48 она грешит на секунда. А на атмеге 8 эта же схема и эта же программа в порядке. Да и фьюз делителя на 8 он ведь не влияет на прерывание от таймера, которое на атмеге 48 берется с потолка откуда то, нет кварца - нет прерывания. Для 8й это справедливо, а для 48й нет, что такое не ясно.
Kotto
 
Сообщения: 6
Зарегистрирован: 10 дек 2012, 20:37

Re: Часы реального времени на Atmega 16

Сообщение boez » 14 дек 2012, 13:26

Так а где версия программы для 48, которая не работает? Я вижу только для меги 8.

Добавлено спустя 1 минуту 55 секунд:
Да, и файлы лучше аттачить прямо к сообщениям, а не класть непонятно куда.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Часы реального времени на Atmega 16

Сообщение Kotto » 14 дек 2012, 13:32

Да программка точно такая же, код процедур не изменен, только инициализация иная. Ввиду слабого понимания процесса доверил сие визарду CodeVisionAVR. Вот что сгенерировал визард для меги 48

Clk.c
(2.96 КиБ) Скачиваний: 418


Спасибо большое за ответы! Очень хочу разобраться, а то спать нормально не смогу :)

Добавлено спустя 1 минуту 21 секунду:
Может визард ошибся? Или это архитектура меги 48 отличается от меги 8 на столько сильно? Но ведь у меня устойчивое ощущение что не тактирует он, зараза, таймер от кварца, а точнее тактирует невесть от чего вообще.

Добавлено спустя 48 секунд:
Простите за файлы, сейчас разберусь как их аттачить сюда
---

Вот, прикрепил прямо к сообщению
Kotto
 
Сообщения: 6
Зарегистрирован: 10 дек 2012, 20:37

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5