Часики pic 16f628 - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » Часики pic 16f628
Часики pic 16f628
ecilop Дата: Пн, 27.04.2009, 11:22  |                                                                                                                Сообщение # 1
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 08.04.2009

Статус: Offline

Есть необходимость сделать такую конструкцию.
Часы с таблом, которые считают с точностью до одной сотой секунды, при срабатывании датчика время передается по рс232 на комп. При этом на табло время замирает на 10 секунд. Еще необходима обработка пары кнопок и опрос нескольких датчиков с выводом данных на комп.

Вроде бы все сделать просто, но возникают сомнение, если пытаться все запустить на одном пике, будет ли он успевать и время точно считать и выводить на табло, передавать, получать по rs232, надо будет вводить какую-то корекцию ??? Учитывая точность в одну сотую секунды. Подскажите, отсчет времени планирую сделать на прерываниях, все остальное уже в программе. Но иногда мне кажется идеальным вариантом, было бы использовать какие-то внешние часы, в нужный момент времени считывать с них данные, использовать два контроллера?

ЯНДЕКС Дата: 27.04.2009
vsky Дата: Пн, 27.04.2009, 12:41  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 41
Репутация: 0   ±
Замечания:   ±
На сайте с 23.09.2008

Статус: Offline

одного контроллера с головой хватит, даже можно без прерываний обойтись.

самое главное- выбрать правильный тип дисплея smile

поэтому определитесь, какое у Вас "табло" biggrin

ecilop Дата: Пн, 27.04.2009, 13:19  |                                                                                                                Сообщение # 3
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 08.04.2009

Статус: Offline

Табло как табло, статическая светодиодная индикация, семисегментные индикаторы, подключенные к счетчикам дешифраторам, цифра кодируется количеством импульсов. smile
Сообщение отредактировал ecilop - Пн, 27.04.2009, 13:23
vsky Дата: Пн, 27.04.2009, 15:10  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 41
Репутация: 0   ±
Замечания:   ±
На сайте с 23.09.2008

Статус: Offline

тогда проблем нет- крутимся в бесконечном цикле опрашивая "датчики" и каждые 100мс импульс на "табло"

отсчёт времени хоть через опрос флага переполнения таймера (предварительно его надо настроить), хоть через PAUSE (в разных ветках, необходимо будет подобрать значения задержек)

если Ваше "время" помещается в двух байтах, то его можно передать непосредственно записью в регистр TXREG (байты по очереди, вставка ASM), без задержек и проверок условий.

ecilop Дата: Пн, 27.04.2009, 18:40  |                                                                                                                Сообщение # 5
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 08.04.2009

Статус: Offline

Я думаю, что лучше аппаратный таймер использовать, переполнение будет вызывать прерывание, пока еще не разбирался как, но думаю получится. Частоту кварца 4 МГц, должно быть достаточно.... А если использовать программную возможность организации порта serin? serout
brown Дата: Пн, 27.04.2009, 19:02  |                                                                                                                Сообщение # 6
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 335
Репутация: 10   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

А не проще ли использовать микросхему реального времени типа DS1307? Тем более нужна хорошая точность хода.

Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
ГыГы Дата: Пн, 27.04.2009, 23:09  |                                                                                                                Сообщение # 7
Группа: Пользователи
Ранг:  Начал соображать
Сообщений: 20
Репутация: 0   ±
Замечания:   ±
На сайте с 17.02.2009

Статус: Offline

Часами может быть и сам комп. Точнее часов не найдёшь.
Синхронизируйтесь постоянно с компом и будет Вам счастье smile
ecilop Дата: Пт, 29.05.2009, 14:01  |                                                                                                                Сообщение # 8
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 08.04.2009

Статус: Offline

Буду пробовать...А по поводу передачи данных на комп..

Добавлено (29.05.2009, 14.01.28)
---------------------------------------------
Собрал вот железную часть, что-нефига не получается выстроить все в стройный алгоритм.
Не могу точно словить каждые 100мс с таймера.
ВОбщем не получается, отсчитывать время по хардваренму таймеру.

Dmitry Дата: Пт, 29.05.2009, 23:04  |                                                                                                                Сообщение # 9
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Quote (ecilop)
ВОбщем не получается, отсчитывать время по хардваренму таймеру.

А считывание регистров таймера производится командами пикбейсика?
Если да, то точно скорее всего и не получится, особенно если программа еще чем-то занимается. Надежнее всего включить прерывание по таймеру, записать в его регистр -0,01с до переполнения и писать обработчик прерывания на ассемблере. А в этом обработчике увеличивать переменную часов на 0,01с и вновь выставлять таймер на -0,01с до переполнения.
ecilop Дата: Вт, 02.06.2009, 23:00  |                                                                                                                Сообщение # 10
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 08.04.2009

Статус: Offline

Да все пытался делать команда пикбейсика....Буду пробовать вставочку на асме, может действительно получится. Хотя скорее всего я не умею работать с таймером smile
brown Дата: Ср, 03.06.2009, 10:49  |                                                                                                                Сообщение # 11
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 335
Репутация: 10   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

Примеры часов, в том числе от holyuser. ecilop, посмотрите, разберитесь в алгоритме, может да поможет.
Прикрепления: Clocks_example.rar(61Kb)


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
ecilop Дата: Ср, 17.06.2009, 01:27  |                                                                                                                Сообщение # 12
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 08.04.2009

Статус: Offline

Продолжаю воевать, спасибо за примеры.
Не получается подключить пределитель к TMR0, прерывания работают, но какой бы коэффициент я не ставил, задержки не меняются. Вот две строки которые должны по моему мнению, включить прерывание от тмр0, выставить коэф.делителя в 256

Code
OPTION_REG=%00000111 'êîíôèãóðèì äåëèòåëü.
INTCON=%10100000 'Âêëþ÷àåì ïðåðûâàíèÿ îò ïåðåïîëíåíèÿ

'ВОт кусочек тестовой прожки.
led var byte[73]' test
temp var byte
i var byte
k var byte
prog var byte
tic var byte
c var byte[10]
EEPROM 1,[0,0]
EEPROM 50,["S","T","E","V"]

OPTION_REG=%00000111 'êîíôèãóðèì äåëèòåëü.
INTCON=%10100000 'Âêëþ÷àåì ïðåðûâàíèÿ îò ïåðåïîëíåíèÿ
On Interrupt Goto tica

PORTB = 0 ' initialize PORTC
TRISB = %00000000 ' configure PORTC as output
TRISA=%00001111

main:

c[1]=10 'chasi
c[2]=10 'chasi
c[3]=10 'minuti
c[4]=10 'minuti
c[5]=10 'secundi
c[6]=10 'secundi
c[7]=10 'desjatiesec
c[8]=10 'sotsecundi

go:
PULSOUT PORTB.0,1 'reset

For i=1 to 8
for k=1 to c[i]
PORTB=%10000000
PORTB=%00000000
pause 1
next

PORTB=%01000000
'pause 1
PORTB=%00000000
'pause 1
next i

pause 100
goto go

disable
tica:
tic=tic+1
if tic<255 then goto ticaxit
tic=0

c[8]=c[8]+1
if c[8]<10 then goto ticaxit
c[8]=0

c[7]=c[7]+1
if c[7]<10 then goto ticaxit
c[7]=0

c[6]=c[6]+1
if c[6]<10 then goto ticaxit
c[6]=0

c[5]=c[5]+1
if c[5]<6 then goto ticaxit
c[5]=0

c[4]=c[4]+1
if c[4]<10 then goto ticaxit
c[4]=0

c[3]=c[3]+1
if c[3]<6 then goto ticaxit
c[3]=0

c[2]=c[2]+1
if c[2]<10 then goto ticaxit
c[2]=0

c[1]=c[1]+1
if c[1]<6 then goto ticaxit
c[1]=0

ticaxit:
INTCON=%10100100 'reset interpur flag
resume
enable

end

Добавлено (17.06.2009, 01.27.09)
---------------------------------------------
И еще, подскажите, плыз, особенности работы с прерываниями операторов pause, serin serout

Сообщение отредактировал ecilop - Ср, 17.06.2009, 00:29
Dmitry Дата: Чт, 18.06.2009, 02:23  |                                                                                                                Сообщение # 13
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Вот тут ошибка:
ticaxit:
INTCON=%10100100 'reset interpur flag

Цитата с мануала:
Bit TMR0IF must be cleared in software by the Timer0
module Interrupt Service Routine before re-enabling
this interrupt.

т.е. в конце прерывания надо обнулять второй бит в intcon
Напиши:
ticaxit:
INTCON.2=0 'reset interpur flag

Quote (ecilop)
особенности работы с прерываниями операторов pause, serin serout

Особенность такая, что, пока не отработает очередной оператор, прерывание проверяться (и, соответственно, выполняться) не будет. Программные прерывания, что поделаешь...
ecilop Дата: Чт, 18.06.2009, 10:56  |                                                                                                                Сообщение # 14
Группа: Пользователи
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 08.04.2009

Статус: Offline

ТО есть. лучше вместо оператора паузе использовать самописный цикл? Тогда прерывания смогут выполнятся после каждого оператора в этом цикле... А в случае оператора паузе, дав задержку на 10 секунд, в этот момент не могу быть выполнены прерывания???
ivan_fd Дата: Чт, 18.06.2009, 13:22  |                                                                                                                Сообщение # 15
Группа: Модераторы
Ранг:  Специалист
Сообщений: 888
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (ecilop)
ТО есть. лучше вместо оператора паузе использовать самописный цикл? Тогда прерывания смогут выполнятся после каждого оператора в этом цикле... А в случае оператора паузе, дав задержку на 10 секунд, в этот момент не могу быть выполнены прерывания???

Да вы правы.


Меня все время преследуют умные мысли...но я быстрее!!!
Форум Picbasic.ru » Программирование МК » PicBasicPro » Часики pic 16f628
Страница 1 из 11
Поиск: