Перейти к содержанию
    

Часы реального времени на M8 или M88

разница, как вы понимаете, будет 10%... хотя на счет 5% я, пожалуй, погорячился - скорее все же 3% предел...
НемогоOFF:

И 3% уже бывает много 3+3 = 6% а это уже больше чем нужно для 8N1

 

Имел недавно разборки с соединеннием PC и платки с АРМ7, там ошибки сыпало примерно

один раз на 100 пакетов. После безрезультатного перекапывания почти всего кода(код был чужой),

решил проверить все с самого начала, оказалось что была ошибка округления

при настройке делителя UART.

Ошибка установки скорости была ~2,5% вместо ~1,25% и ошибки уже сыпало...

После правки ошибки исчезли совсем.

Так что ИМХО 1,5-2% с одной стороны, это максимум на который можно закладываться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вы снова говорите о суммировании отклонений... а если один "абонент" имеет стабильную частоту - второму можно отклоняться и на 3%... а иногда получается и больше...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

разница, как вы понимаете, будет 10%... хотя на счет 5% я, пожалуй, погорячился - скорее все же 3% предел...

0,5% работает в подавляющем большинстве случаев. Там же где погрешность baudrate выше, работает или случайно или "до поры до времени" :) Погрешности тактовых двух независимых источников в общем случае также независимы, поэтому погрешности являются аддитивными, т.е. их нужно суммировать. 2,5%+2,5% это будет конечно 5%, что вроде как допустимо для 8N1. Но тут еще нужно учитывать среду передачи, в которой фронты импульсов далеки от прямоугольных. Особенно, если опторазвязка какая-нибудь используется.

Так что стремиться нужно к 0,5% и тогда не будет лишнего геморроя и загадочных эффектов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вы снова говорите о суммировании отклонений... а если один "абонент" имеет стабильную частоту - второму можно отклоняться и на 3%... а иногда получается и больше...
Я же показал реальную ситуацию, сколько погрешность на моем PC я не знаю,

сколько будет на компе у клиента я тоже не знаю, поэтому нельзя закладываться на лучший

вариант, типа на компе будет 0% а на девайсе 3-5% и все будет работать...

Поэтому как минимум делим погрешность пополам и плюс еще запас, хотя

лучше стремится вобще к отсутствию этой "цифровой" погрешности.

В описываемом мною примере, после нахождения правильных коэф PLL,

вносимая погрешность стала =0%, хотя и при 1,25% все уже работало без сбоев.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извиняюсь за оффтоп.... но где на Украине можно купить DS3102/DS3107 и т.п. Желательно проверенные места.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, хочу поддержать автора за его стремление сделать красивый экономичный девайс. Добавить микросхему, аккумулятор и написать инструкцию, куда не нажимать - это просто, но НЕ ПРАВИЛЬНО. Правильно когда девайс работает несмотря ни на что.

 

Здравствуейте. У меня свой проэкт в котором M8 работает как регистратор внешних событий, а внешний комп записывает приходящие на СОМ порт дные и подписывает их время. И есть задание сделать так что бы если комп отключен то что бы логи записывались в память а потом скидывались на сом порт при подключении компа. память я выбрал 24LC256 microchip (5ms). Так как ночью могут отключать вобще рубильник света а включать утром то устройство должно включится в рабочий режим с правильным временем.

 

Из чего тут следует, что питания не бывает сутками?

 

Как имено грамотно сделать RTC немного не понятно. начну с главного вопроса. если исптользовать таймер 2 асинхронно то получается нужно использовать внутрений RC генератор. а его стабильность в зависимости температуры не известна. а ведь довольно важно что бы скорость обмена с СОМ портом (UART) была в районе +/- 0.5 %. Так же не смог найти калибровочный байт (нужен для частоты 8Мг). Подскажите плиз как и где его прочитать!? В книгах написано что он должен прочитатся программатором при програмировании и т.д. у меня програматор STK 200\300самодельный а программа ICC_AVR V7. 000. я вощем не смог разобратся.

Всё правильно - один кварц уже есть, под него подгоняем RC генератор. Есть аппнота AVR055: Using a 32kHz XTAL for run-time calibration of the internal RC. Точность частоты COM-порта должна быть 2%. Это согласуется с 5%, о которых говорят другие авторы, если учитывать погрешность н аобеих сторонах канала. Калибровочный байт называется OSCCAL, адрес его 0x31(0x51) в даташите на мегу8 есть про него много. Он читается программатором, напрмер avreal'ом:

Device connected, MEGA16 detected

Chip not locked

Fuses

OSCCAL = BD, BD, B7, B7

BODLEVEL = 1

BODEN = 1

SUT = 2

CKSEL = F

BLB1 = 3

BLB0 = 3

OCDEN = 1

JTAGEN = 1

CKOPT = 0

EESAVE = 1

BOOTSZ = 0

BOOTRST = 1

 

Второе это как именно организовать отсчёт времени , ведь Т2 переполняется после 255. (при частоте кварца 32768 и коэфициенте деления 1024 частота работы таймера будет 32). тоесть переполнение произойдёт после 8 секундн. а контролер находится в слип режиме, тоесть надо получается через 8 сек пробудить его и добавить +8 секунд в переменну памяти и снова отправить в слип

Именно так!

Ещё есть впрос как пробуждать контролер если появилось питание? Физически могу организовать изменение напряжения на практичски любой из ножек (0-нет питания, 4В - есть питание, или наоборот). но я посмотрел асинхнно внешние прерывания в мегах 8/88 определятся не могут. тоже нужен совет!

Глядя на таблицу 14 даташита "Table 14. Active Clock Domains and Wake-up Sources in the Different Sleep Modes" вижу, что светит Вам режим Power save, в котором Wake-up Sources INT0,1 и Timer2. Если не получается с INT, что мешает проверить какую-нибудь ногу на наличие высокого уровня от основного источника питания? Всё равно по таймеру просыпаться - время наращивать.

Изменено пользователем Maik-vs

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо! уже всё работает не смотря не на что, благодарен что ответили чётко. остался вопрос почему в слипе Т2 спешит на 1 сек за час ? ... я грешу на флюс.. на сам знаю что это не очень верное предположение...

вот прерывание от Т2

 

#pragma interrupt_handler timer2_ovf_isr:5

void timer2_ovf_isr(void)

{

g=g^1;if(g==1){LED_ON;}else{LED_OFF;}

sec_pl=1;

}

 

и то что в main его обрабатывает

if(sec_pl==1){

 

sec++;if(sec>=60){sec=0;}

if(sec==0){min++;if(min>=60){min=0;}

if(min==0 && sec==0){hor++;if(hor>=24){hor=0;}}}

sec_pl=0;

 

if(V==0x01 && sleep_en==1){sleep_en=2;sleep_off();}

if(sleep_en==1){asm("sleep");asm("nop");}

 

if(sleep_en==2){clock(0,0);}

 

}//end if(sec_pl==1)

что скажет народ?

Изменено пользователем Electronic)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

остался вопрос почему в слипе Т2 спешит на 1 сек за час ?

Видимо потому, что кусок функции часов

и то что в main его обрабатывает

if(sec_pl==1){

 

sec++;if(sec>=60){sec=0;}

if(sec==0){min++;if(min>=60){min=0;}

if(min==0 && sec==0){hor++;if(hor>=24){hor=0;}}}

sec_pl=0;

должен выглядеть как-то так

  if(sec_pl!=0)
  { if (sec<59)
      sec++;
    else
    { sec=0;
      if (min<59)
        min++;
      else
      { min=0;
        if (hour<23)
          hour++;
        else
          hour=0;
      }
    }
    sec_pl=0; 
  }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Переписал код обработки времени как вы сказали, но всё так же спешеат в нормальном режиме на 2 сек за час. в слипе не пробывал. Но я так понял они у меня спешат и норм режиме и в слипе одинаково, странно как то... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да уход одинаковый... проверил. 2 сек в час не зависимо от того слип или не слип

Делаете подстройку на 2 с в час - и проблема решена.

Можно ещё поиграться с разными кварцами

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Переписал код обработки времени как вы сказали, но всё так же спешеат в нормальном режиме на 2 сек за час. в слипе не пробывал. Но я так понял они у меня спешат и норм режиме и в слипе одинаково, странно как то... :(
Все-таки непонятно от какого источника у вас сейчас тактируются часы? Т.е. переменная sec_pl как и когда инкрементируется? Может система тактирования или таймер неправильно инициализированы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

//TIMER2 initialize - prescale:1024

// WGM: Normal

// desired value: 1Hz

// actual value: 1,000Hz (0,0%)

void timer2_init(void)

{

TCCR2 = 0x00; //stop

ASSR = 0x08; //set async mode

TCNT2 = 0x00; //setup

OCR2 = 0x00;

TCCR2 = 0x05; //start*

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да уход одинаковый... проверил. 2 сек в час не зависимо от того слип или не слип

Почитайте доку на используемый кварц.

Почитайте доку MCU.

Обратите внимание на параметр "емкостная нагрузочная способность".

Кварцы бывают разные 6pf, 12pf.

Это сильно влияет на точность хода часов (проверено опытным путём).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

//TIMER2 initialize - prescale:1024

// WGM: Normal

// desired value: 1Hz

// actual value: 1,000Hz (0,0%)

void timer2_init(void)

{

TCCR2 = 0x00; //stop

ASSR = 0x08; //set async mode

TCNT2 = 0x00; //setup

OCR2 = 0x00;

TCCR2 = 0x05; //start*

}

 

Пересмотрел всю тему, может я невнимателен, но так и не нашел, какова частота кварца? Если предположить, что "часовой" зачит 32,768 кГц, то при делителе 1024 Вы никак не получите прерывание по переполнению таймера частотой в 1 Гц при начальном значении TCNT2==0, значит либо нужен более высокочастотный кварц, либо в регистр TCNT2 нужно записать какое-то число каждый раз при переполнении (в данном режиме работы таймера). Если в TCNT2 что-то пишется, то действия при записи и могут быть причиной неточности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...