Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » убегает время (И снова часы на pic16f877a)
убегает время
XOXOJI87 Дата: Вт, 02.12.2014, 15:05  |                                                                                                                Сообщение # 1
Группа: Пользователи
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 12.11.2014

Статус: Offline

Привет всем, тема заезженная каждый наверно давно себе часы сделал)))
я вот тока учусь работать с PIC.
суть вот в чем:

часы за час убежали на почти 2 секунды, пусть будет 1,5

кварц 20мГц
таймер используется TMR1
сдвиг таймера 3036

планирую себе бортовой в машину с нарастающим функционалом.
вывод на LCD 2*20
несколько экранов отображения
энкодер в управлении (для него задействовал переполнение TMR0). может есть лучший вариант?

забыл добавить, PORTB.0  будет тахометром... поэтому энкодер на переполнении TMR0

Сообщение отредактировал XOXOJI87 - Вт, 02.12.2014, 15:14
ЯНДЕКС Дата: 02.12.2014
ivan_fd Дата: Вт, 02.12.2014, 16:08  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Часы как сделаны. На таймере 1 с кварцем 32768??? Или просто на таймере.
Хотя в любом случаи можно исправить программной коррекцией.
MiXaS Дата: Вт, 02.12.2014, 17:43  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Самый простой вариант, если Вам нужна точность это DS3231.
xvovanx Дата: Вт, 02.12.2014, 17:49  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 326
Репутация: 59   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата XOXOJI87 ()
сдвиг таймера 3036

А в обработчике прерываний тоже перезаписываешь в таймер 3036? Четыре такта на перезапись учитываешь (3040)? Вот из моих разработок - тикают как атомные smile
Прикрепления: 9911288.jpg (115.2 Kb)
ADMIN Дата: Вт, 02.12.2014, 18:04  |                                                                                                                Сообщение # 5
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Я бы на код глянул для начала...
XOXOJI87 Дата: Ср, 03.12.2014, 10:55  |                                                                                                                Сообщение # 6
Группа: Пользователи
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Стоит попробовать скорректировать строчку:
TMR1L=$DC            'устанавливаем начальное значение TMR1=3036 
TMR1H=$0B

Я в протеусе посмотрел, при значении 3036 таймер переполняется через 100,01 ms, а не ровно через 100
Второе - кварц может быть не точным, можно пробовать поменять. Насчет конденсаторов - у меня чаще всего и без них работает, но если требуется точность, думаю, лучше поставить.
XOXOJI87 Дата: Ср, 03.12.2014, 12:36  |                                                                                                                Сообщение # 8
Группа: Пользователи
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 12.11.2014

Статус: Offline

Цитата ADMIN ()
Я в протеусе посмотрел, при значении 3036 таймер переполняется через 100,01 ms, а не ровно через 100Второе - кварц может быть не точным, можно пробовать поменять. Насчет конденсаторов - у меня чаще всего и без них работает, но если требуется точность, думаю, лучше поставить.
на супер точность не претендую...
под кондеры места на плат есть, пока не буду ставить, посмотрим.

по поводу значения таймера. 3036 выдал мне proton helper.

про неточные кварцы читал, как проверить это можно?

Цитата MiXaS ()
Самый простой вариант, если Вам нужна точность это DS3231.
есть пример как с этим делом работать?
ADMIN Дата: Ср, 03.12.2014, 15:30  |                                                                                                                Сообщение # 9
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Цитата XOXOJI87 ()
по поводу значения таймера. 3036 выдал мне proton helper.
по поводу этой фразы - вы не вполне понимаете,что дает это значение, не так ли? это значение нужно корректировать в зависимости от того, сколько вы находитесь в обработчике прерывания. Если каждый раз, произведя какие-то операции в обработчике, загружать это же значение, то общий ход времени будет, с каждым заходом в обработчик, смещаться вперед как раз на то время, которое занимает в обработчике команды между заходом в него и загрузкой новых значений в TMR1. Для корректировки придуманы симуляторы...
XOXOJI87 Дата: Ср, 03.12.2014, 17:27  |                                                                                                                Сообщение # 10
Группа: Пользователи
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 12.11.2014

Статус: Offline

Цитата ADMIN ()
по поводу этой фразы - вы не вполне понимаете,что дает это значение, не так ли? это значение нужно корректировать в зависимости от того, сколько вы находитесь в обработчике прерывания. Если каждый раз, произведя какие-то операции в обработчике, загружать это же значение, то общий ход времени будет, с каждым заходом в обработчик, смещаться вперед как раз на то время, которое занимает в обработчике команды между заходом в него и загрузкой новых значений в TMR1. Для корректировки придуманы симуляторы...

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

а в том плане что они придуманы для корректировки времени нахождения в обработчике прерываний... теперь и это знаю.

но ведь я это значение не плюсую к текущему значению таймера. а указываю с какое значение установить, после всех операций в обработчике прерываний.
ADMIN Дата: Ср, 03.12.2014, 19:04  |                                                                                                                Сообщение # 11
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Все правильно, но таймер в это время тикает - тикает время, которое не учитывается при выполнении операций в обработчике. Вот это то время и нужно прибавлять к 3036, а потом его в таймер записывать, чтобы ничего не терялось. Вот так вот...
ЯНДЕКС Дата: 03.12.2014
XOXOJI87 Дата: Ср, 03.12.2014, 19:17  |                                                                                                                Сообщение # 12
Группа: Пользователи
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 12.11.2014

Статус: Offline

Полностью согласен, но тогда бы часы отставали, как я думаю((((
пока только кварц грешить(
xvovanx Дата: Чт, 04.12.2014, 10:50  |                                                                                                                Сообщение # 13
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 326
Репутация: 59   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Да, в данном случае только кварцы "шалят". Тут либо подобрать предустановку TMR1 меньше 3036, либо програмно раз в сутки отнять секунд 30-40.
xaker-sss Дата: Чт, 04.12.2014, 14:11  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 208
Репутация: 6   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Вот голову морочаете себе и драгоценное тратите. Покупаете ds3231 и вообще не паритесь. Бонусом получаете 2 будильника. Микруха на плате с модулем памяти и аккумулятором lir,2032 стоит 70 руб. Там уже все предусмотрено и температурная помпенсация и защита от электромагнитных помех. поставил и забыл, когда надо опросил
Форум Picbasic.ru » Программирование МК » Proton PicBasic » убегает время (И снова часы на pic16f877a)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: