убегает время
|
|
XOXOJI87 |
Дата: Вт, 02.12.2014, 15:05 | Сообщение # 1 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 12.11.2014
Статус:
Offline
|
Привет всем, тема заезженная каждый наверно давно себе часы сделал))) я вот тока учусь работать с PIC. суть вот в чем:
часы за час убежали на почти 2 секунды, пусть будет 1,5
кварц 20мГц таймер используется TMR1 сдвиг таймера 3036
планирую себе бортовой в машину с нарастающим функционалом. вывод на LCD 2*20 несколько экранов отображения энкодер в управлении (для него задействовал переполнение TMR0). может есть лучший вариант?
забыл добавить, PORTB.0 будет тахометром... поэтому энкодер на переполнении TMR0
Сообщение отредактировал
XOXOJI87 - Вт, 02.12.2014, 15:14
|
|
|
|
ivan_fd |
Дата: Вт, 02.12.2014, 16:08 | Сообщение # 2 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Часы как сделаны. На таймере 1 с кварцем 32768??? Или просто на таймере. Хотя в любом случаи можно исправить программной коррекцией.
|
|
|
|
MiXaS |
Дата: Вт, 02.12.2014, 17:43 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Самый простой вариант, если Вам нужна точность это DS3231.
|
|
|
|
xvovanx |
Дата: Вт, 02.12.2014, 17:49 | Сообщение # 4 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
327
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
Цитата XOXOJI87 ( ) сдвиг таймера 3036 А в обработчике прерываний тоже перезаписываешь в таймер 3036? Четыре такта на перезапись учитываешь (3040)? Вот из моих разработок - тикают как атомные
|
|
|
|
ADMIN |
Дата: Вт, 02.12.2014, 18:04 | Сообщение # 5 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Я бы на код глянул для начала...
|
|
|
|
XOXOJI87 |
Дата: Ср, 03.12.2014, 10:55 | Сообщение # 6 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 12.11.2014
Статус:
Offline
|
вот код, посмотрите, где что может подправить...
это мой первый опыт программирования для микроконтроллеров
и еще один момент, не пойму, везде в схемах и в учебниках с кварцем ставится 2 конденсатора...
так вот, обязательны ли они, потому как сейчас я их не впаивал Код '**************************************************************** '* Name : UNTITLED.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 28.11.2014 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** Clear Device 16F877A Xtal 20
'Описание для работы с LCD Declare LCD_Type ALPHA Declare LCD_DTPin PORTB.4 'начальный порт для информации PORTB.4 Declare LCD_RSPin PORTB.3 'Вывод для RS - PORTB.3 Declare LCD_ENPin PORTB.2 'Вывод для E - PORTB.2 Declare LCD_Interface 4 'Разрядность шины LCD DEFINE LCD_Lines 2 'Количество строк DEFINE LCD_CommandUs 2000 DEFINE LCD_DataUs 50
'Print At 1,3, "Initialization" '"Инициализация" 'вывод на LCD '------------------------------ Declare Adin_Res 10 ' Pазрядность результата преобразования АЦП = 10 Declare Adin_Tad FRC ' Источник тактирования АЦП = FRC Declare Adin_Stime 50 ' Установить время ожидания в 50 мкс перед началом преобразования
Declare Float_Rounding = On ' не
ADCON1 = %10000100 'выбираем режим АЦП TRISA = %00011111 'все вывода порта А как входы
TRISB=%00000001 ' B.0 - вход,остальные выходы Clear PORTB
DelayMS 500 Cls 'отчистить экран 'настройка TMR0 OPTION_REG = %11111011 'разрешаем работу таймера 0 от внешних импульсов INTCON = %11110000 'настройка прерываени TMR0 TMR0=255 '--------------------
'настройка TMR1 TMR1L=$DC 'запимываем в таймер1 начальное значение 3036 TMR1H=$0B T1CON=%00110001 PIE1.0=1 ' разрешаем прерывания при переполнении TMR1 '------------- Dim scr As Byte ' Номер отображаемого экрана Dim minute As Byte Dim second As Byte Dim ms100 As Byte Dim hour As Byte Dim imp As Word Dim rpm As Word Dim paus As Byte Dim dig_volt As Word
On_Interrupt GoTo myint
main: dig_volt=ADIn 1 dig_volt=dig_volt * 4.884 If second=60 Then second=0 minute=minute+1 End If If minute=60 Then minute=0 hour=hour+1 End If If hour=24 Then hour=0 End If 'cls If paus=3 And scr!=221 Then scr=220:paus=0:Cls If paus=3 And scr=221 Then scr=0:paus=0:Cls GoSub na_lcd DelayMS 500
GoTo main
na_lcd: 'вывод на LCD
Select scr Case 0 Print At 1,9, "Ekran 1" Print At 2,8, Dec2 hour, ":", Dec2 minute, ":", Dec2 second Case 1 Print At 1,9, "Ekran 2" Print At 2,8, "V - ", Dec dig_volt Case 220 Print At 1,9, "Settings" Case 221 Print At 1,9,"Settings" Print At 2,9,"EXIT" End Select
Resume
Disable myint: Context Save If INTCON.2=1 Then 'по переполнению TMR0 INTCON.2=0 scr=scr+1 If scr=2 Then scr=0 Cls TMR0=255 End If If INTCON.1=1 Then INTCON.1=0 imp=imp+1 End If If PIR1.0=1 Then ' при переполнении TMR1 PIR1.0=0 ms100=ms100+1 ' проходит 100мс If ms100=10 Then ' после 10*100мс=1с ms100=0 second=second+1 'If PORTA.2=0 Then ' paus=paus+1 'Else ' paus=0 'End If rpm=imp*30 imp=0 End If TMR1L=$DC 'устанавливаем начальное значение TMR1=3036 TMR1H=$0B End If Context Restore Resume Enable Добавлено (02.12.2014, 19:18) ---------------------------------------------
Цитата xvovanx ( ) А в обработчике прерываний тоже перезаписываешь в таймер 3036? Четыре такта на перезапись учитываешь (3040)? Вот из моих разработок - тикают как атомные сейчас попробуемДобавлено (03.12.2014, 10:55) --------------------------------------------- теперь за 14 часов убежали на 23-24 секунды(
Сообщение отредактировал
XOXOJI87 - Вт, 02.12.2014, 19:15
|
|
|
|
ADMIN |
Дата: Ср, 03.12.2014, 12:30 | Сообщение # 7 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Стоит попробовать скорректировать строчку: TMR1L=$DC 'устанавливаем начальное значение TMR1=3036 TMR1H=$0B
Я в протеусе посмотрел, при значении 3036 таймер переполняется через 100,01 ms, а не ровно через 100 Второе - кварц может быть не точным, можно пробовать поменять. Насчет конденсаторов - у меня чаще всего и без них работает, но если требуется точность, думаю, лучше поставить.
|
|
|
|
XOXOJI87 |
Дата: Ср, 03.12.2014, 12:36 | Сообщение # 8 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 12.11.2014
Статус:
Offline
|
Цитата ADMIN ( ) Я в протеусе посмотрел, при значении 3036 таймер переполняется через 100,01 ms, а не ровно через 100Второе - кварц может быть не точным, можно пробовать поменять. Насчет конденсаторов - у меня чаще всего и без них работает, но если требуется точность, думаю, лучше поставить. на супер точность не претендую... под кондеры места на плат есть, пока не буду ставить, посмотрим.
по поводу значения таймера. 3036 выдал мне proton helper.
про неточные кварцы читал, как проверить это можно?
Цитата MiXaS ( ) Самый простой вариант, если Вам нужна точность это DS3231. есть пример как с этим делом работать?
|
|
|
|
ADMIN |
Дата: Ср, 03.12.2014, 15:30 | Сообщение # 9 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Цитата XOXOJI87 ( ) по поводу значения таймера. 3036 выдал мне proton helper. по поводу этой фразы - вы не вполне понимаете,что дает это значение, не так ли? это значение нужно корректировать в зависимости от того, сколько вы находитесь в обработчике прерывания. Если каждый раз, произведя какие-то операции в обработчике, загружать это же значение, то общий ход времени будет, с каждым заходом в обработчик, смещаться вперед как раз на то время, которое занимает в обработчике команды между заходом в него и загрузкой новых значений в TMR1. Для корректировки придуманы симуляторы...
|
|
|
|
XOXOJI87 |
Дата: Ср, 03.12.2014, 17:27 | Сообщение # 10 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 12.11.2014
Статус:
Offline
|
Цитата ADMIN ( ) по поводу этой фразы - вы не вполне понимаете,что дает это значение, не так ли? это значение нужно корректировать в зависимости от того, сколько вы находитесь в обработчике прерывания. Если каждый раз, произведя какие-то операции в обработчике, загружать это же значение, то общий ход времени будет, с каждым заходом в обработчик, смещаться вперед как раз на то время, которое занимает в обработчике команды между заходом в него и загрузкой новых значений в TMR1. Для корректировки придуманы симуляторы... Что касается понимания... в какой то степени вы правы, программа мне выдала значение для смещения таймера, я его использую.
а в том плане что они придуманы для корректировки времени нахождения в обработчике прерываний... теперь и это знаю.
но ведь я это значение не плюсую к текущему значению таймера. а указываю с какое значение установить, после всех операций в обработчике прерываний.
|
|
|
|
ADMIN |
Дата: Ср, 03.12.2014, 19:04 | Сообщение # 11 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Все правильно, но таймер в это время тикает - тикает время, которое не учитывается при выполнении операций в обработчике. Вот это то время и нужно прибавлять к 3036, а потом его в таймер записывать, чтобы ничего не терялось. Вот так вот...
|
|
|
|
XOXOJI87 |
Дата: Ср, 03.12.2014, 19:17 | Сообщение # 12 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 12.11.2014
Статус:
Offline
|
Полностью согласен, но тогда бы часы отставали, как я думаю(((( пока только кварц грешить(
|
|
|
|
xvovanx |
Дата: Чт, 04.12.2014, 10:50 | Сообщение # 13 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
327
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
Да, в данном случае только кварцы "шалят". Тут либо подобрать предустановку TMR1 меньше 3036, либо програмно раз в сутки отнять секунд 30-40.
|
|
|
|
xaker-sss |
Дата: Чт, 04.12.2014, 14:11 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
208
Замечания:
±
На сайте с 26.04.2009
Статус:
Offline
|
Цитата xvovanx ( ) Да, в данном случае только кварцы "шалят". Кварцы шалят конкретно, четверо часов с одинаковой прошивкой, по схеме http://www.picbasic.ru/publ/chasy_na_pic16f628_s_datoj_i_dnem_nedeli/2-1-0-133 , а коррекция у всех разная, начиная от 3997 кончая 4024, без коррекции точность не получится, тем более у кварцев со временем частота уходит, желательно ставить б/у.
ПРОТОН ЭТО ВЕЩЬ.
|
|
|
|
MiXaS |
Дата: Чт, 04.12.2014, 22:51 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Вот голову морочаете себе и драгоценное тратите. Покупаете ds3231 и вообще не паритесь. Бонусом получаете 2 будильника. Микруха на плате с модулем памяти и аккумулятором lir,2032 стоит 70 руб. Там уже все предусмотрено и температурная помпенсация и защита от электромагнитных помех. поставил и забыл, когда надо опросил
|
|
|
|