Часики pic 16f628
|
|
ecilop |
Дата: Пн, 27.04.2009, 11:22 | Сообщение # 1 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 08.04.2009
Статус:
Offline
|
Есть необходимость сделать такую конструкцию. Часы с таблом, которые считают с точностью до одной сотой секунды, при срабатывании датчика время передается по рс232 на комп. При этом на табло время замирает на 10 секунд. Еще необходима обработка пары кнопок и опрос нескольких датчиков с выводом данных на комп. Вроде бы все сделать просто, но возникают сомнение, если пытаться все запустить на одном пике, будет ли он успевать и время точно считать и выводить на табло, передавать, получать по rs232, надо будет вводить какую-то корекцию ??? Учитывая точность в одну сотую секунды. Подскажите, отсчет времени планирую сделать на прерываниях, все остальное уже в программе. Но иногда мне кажется идеальным вариантом, было бы использовать какие-то внешние часы, в нужный момент времени считывать с них данные, использовать два контроллера?
|
|
|
|
vsky |
Дата: Пн, 27.04.2009, 12:41 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
50
Замечания:
±
На сайте с 23.09.2008
Статус:
Offline
|
одного контроллера с головой хватит, даже можно без прерываний обойтись. самое главное- выбрать правильный тип дисплея поэтому определитесь, какое у Вас "табло"
|
|
|
|
ecilop |
Дата: Пн, 27.04.2009, 13:19 | Сообщение # 3 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 08.04.2009
Статус:
Offline
|
Табло как табло, статическая светодиодная индикация, семисегментные индикаторы, подключенные к счетчикам дешифраторам, цифра кодируется количеством импульсов.
Сообщение отредактировал
ecilop - Пн, 27.04.2009, 13:23
|
|
|
|
vsky |
Дата: Пн, 27.04.2009, 15:10 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
50
Замечания:
±
На сайте с 23.09.2008
Статус:
Offline
|
тогда проблем нет- крутимся в бесконечном цикле опрашивая "датчики" и каждые 100мс импульс на "табло" отсчёт времени хоть через опрос флага переполнения таймера (предварительно его надо настроить), хоть через PAUSE (в разных ветках, необходимо будет подобрать значения задержек) если Ваше "время" помещается в двух байтах, то его можно передать непосредственно записью в регистр TXREG (байты по очереди, вставка ASM), без задержек и проверок условий.
|
|
|
|
ecilop |
Дата: Пн, 27.04.2009, 18:40 | Сообщение # 5 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 08.04.2009
Статус:
Offline
|
Я думаю, что лучше аппаратный таймер использовать, переполнение будет вызывать прерывание, пока еще не разбирался как, но думаю получится. Частоту кварца 4 МГц, должно быть достаточно.... А если использовать программную возможность организации порта serin? serout
|
|
|
|
brown |
Дата: Пн, 27.04.2009, 19:02 | Сообщение # 6 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
А не проще ли использовать микросхему реального времени типа DS1307? Тем более нужна хорошая точность хода.
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
|
|
|
|
ГыГы |
Дата: Пн, 27.04.2009, 23:09 | Сообщение # 7 |
Группа:
Пользователи
Ранг:
Начал соображать
Сообщений:
20
Замечания:
±
На сайте с 17.02.2009
Статус:
Offline
|
Часами может быть и сам комп. Точнее часов не найдёшь. Синхронизируйтесь постоянно с компом и будет Вам счастье
|
|
|
|
ecilop |
Дата: Пт, 29.05.2009, 14:01 | Сообщение # 8 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 08.04.2009
Статус:
Offline
|
Буду пробовать...А по поводу передачи данных на комп.. Добавлено (29.05.2009, 14.01.28) --------------------------------------------- Собрал вот железную часть, что-нефига не получается выстроить все в стройный алгоритм. Не могу точно словить каждые 100мс с таймера. ВОбщем не получается, отсчитывать время по хардваренму таймеру.
|
|
|
|
Dmitry |
Дата: Пт, 29.05.2009, 23:04 | Сообщение # 9 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Quote (ecilop) ВОбщем не получается, отсчитывать время по хардваренму таймеру. А считывание регистров таймера производится командами пикбейсика? Если да, то точно скорее всего и не получится, особенно если программа еще чем-то занимается. Надежнее всего включить прерывание по таймеру, записать в его регистр -0,01с до переполнения и писать обработчик прерывания на ассемблере. А в этом обработчике увеличивать переменную часов на 0,01с и вновь выставлять таймер на -0,01с до переполнения.
|
|
|
|
ecilop |
Дата: Вт, 02.06.2009, 23:00 | Сообщение # 10 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 08.04.2009
Статус:
Offline
|
Да все пытался делать команда пикбейсика....Буду пробовать вставочку на асме, может действительно получится. Хотя скорее всего я не умею работать с таймером
|
|
|
|
brown |
Дата: Ср, 03.06.2009, 10:49 | Сообщение # 11 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
Примеры часов, в том числе от holyuser. ecilop, посмотрите, разберитесь в алгоритме, может да поможет.
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
|
|
|
|
ecilop |
Дата: Ср, 17.06.2009, 01:27 | Сообщение # 12 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 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 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 08.04.2009
Статус:
Offline
|
ТО есть. лучше вместо оператора паузе использовать самописный цикл? Тогда прерывания смогут выполнятся после каждого оператора в этом цикле... А в случае оператора паузе, дав задержку на 10 секунд, в этот момент не могу быть выполнены прерывания???
|
|
|
|
ivan_fd |
Дата: Чт, 18.06.2009, 13:22 | Сообщение # 15 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Quote (ecilop) ТО есть. лучше вместо оператора паузе использовать самописный цикл? Тогда прерывания смогут выполнятся после каждого оператора в этом цикле... А в случае оператора паузе, дав задержку на 10 секунд, в этот момент не могу быть выполнены прерывания??? Да вы правы.
|
|
|
|