Помогите написать счетчик.
|
|
ntro123 |
Дата: Вт, 17.08.2010, 19:40 | Сообщение # 1 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 28.06.2010
Статус:
Offline
|
Добрый день. 1 контролер 16f873a 1 кнопка к порту С0 1 lcd Сейчас программа умеет считать какое количество нажатий было на кнопку , и выводить на экран. Нужно написать еще одну программу которая будет вычислять среднее количество нажатий за минуту. (вычислять будет из средни арефметического каждых 4ёх нажатий, т.к. если каждое 1 нажатие вычислять то очень быстро обновляться будет это не есть гуд). While i < 180 DelayMS 50 i=i+1 Button PORTC.1, 0, 200, 100, WorkVar, 1, Delo Button PORTC.0, 0, 200, 100, WorkVar, 1, resetall Wend переменная i * 50 / 1000 и есть разница между последнимми нажатиями. складываем 4 нажатия. т.е. каждое новое значение i скалдываем. предположем нажатия были каждую секунду. i=20 20 * 50 / 1000=1+1+1+1=4 потом все делем на 4. получаем по клику в секунду. * 60 в минуту = 60. все бы хорошо НО. у меня в минуту полуается 140 шт. переменная i не сегда такого значения которого должна быть. Может руки кривые. может кто подскажет как реализуются такого рода программы? ПС. За меня на кнопку кликает программа. (не имеющая отношения к протеусу или вобше к пик про100 эмулятор нажатия мыши)
Сообщение отредактировал
ntro123 - Вт, 17.08.2010, 19:54
|
|
|
|
chiper |
Дата: Вт, 17.08.2010, 22:02 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
108
Замечания:
±
На сайте с 14.07.2010
Статус:
Offline
|
Какая частота у использованного вами кварца? Тут это очень важно... чем выше частота тем точнее может работать устройство Посмотрите даташит к микроконтроллеру, там должна быть таблица что и с какой точностью может делать МК при оазных частотах кварца. А если не хотите заморачиваться, то сразу поставьте кварц 20 Мгц, разница должна быть ощутима на лицо
Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
|
|
|
|
ntro123 |
Дата: Ср, 18.08.2010, 15:16 | Сообщение # 3 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 28.06.2010
Статус:
Offline
|
chiper, 4 мгц стоит. ПС. если менять тип переменной i резудьтаты тоже меняются. ПСС. пока все в протеусе. Добавлено (18.08.2010, 15.16.46) --------------------------------------------- А можно еще както реализовать чтобы показвалось время прошедшее? т.е. запустили контроллер он начел отсчитывать секунды минуты и часы?
|
|
|
|
terrarus |
Дата: Ср, 18.08.2010, 15:44 | Сообщение # 4 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Чтобы не загружать 16f873a на подсчет секунд, минут и часов, после чего на решения других задачь у него не будет хватать быстродействия, лучше притменить дополнительно DS1307.
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
ntro123 |
Дата: Ср, 18.08.2010, 19:07 | Сообщение # 5 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 28.06.2010
Статус:
Offline
|
Quote (terrarus) Чтобы не загружать 16f873a на подсчет секунд, минут и часов, после чего на решения других задачь у него не будет хватать быстродействия, лучше притменить дополнительно DS1307. да, я тоже так думаю, но беда в том что я незнаю как можно 2 мк к одному дисплею ... DS1307 - это кто? вобше пожалуйста разжуйте как и что и для чего DS1307. как оно работать будет?
|
|
|
|
ntro123 |
Дата: Ср, 18.08.2010, 19:51 | Сообщение # 6 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 28.06.2010
Статус:
Offline
|
chiper, как крико считал так криво и считает, но подругому. даже если подобрать нужную частоту, то при клики каждые полсекунды вобше числа с отолка берутся у этого мк( вот весь код программы: Code Device = 16F873A Xtal = 4 LCD_DTPin = PORTB.4 LCD_RSPin = PORTB.2 LCD_ENPin = PORTB.1 LCD_Interface = 4 LCD_Lines = 2 LCD_CommandUs = 2000 LCD_DataUs = 50 Dim VR1 As Dword Dim WorkTime As Byte Dim sredni1 As Float Dim sredni2 As Float Dim sredni3 As Float Dim sredni4 As Float Dim i As Word Dim e As Byte Dim h As Byte Dim a As Byte Dim chik As Byte Dim WorkVar As Byte Dim Constanta As Float Low PORTB Low PORTC h=10 GoTo main Cls DelayMS 1000 Print At 1, 2, "TIPOGRAFIA KEM" Print At 2, 6, "WELCOM" DelayMS 6000 Cls DelayMS 1500 FreqOut PORTC.6, 200, 3000, 3000 Cls Print CStr DEFTXT Print At 2, 3, CStr DEFTXT2 main: Button PORTC.1, 0, 200, 100, WorkVar, 1, Delo Button PORTC.0, 0, 200, 100, WorkVar, 1, resetall
If WorkTime=1 Then While i < 180 DelayMS 50 i=i+1 Button PORTC.1, 0, 200, 100, WorkVar, 1, Delo Button PORTC.0, 0, 200, 100, WorkVar, 1, resetall Wend WorkTime=0 i=0 Print At 1, 12, "XXXXX" EndIf GoTo main
Delo: If PORTC.1=0 Then GoTo Delo chik=chik + 1 If chik > 4 Then chik = 1 VR1=VR1 + 1 While e < 5 If VR1<h Then a=5-e Print At 1, a, Dec VR1 Break EndIf Button PORTC.0, 0, 200, 100, WorkVar, 1, resetall e=e+1 h=h*10 Wend
Button PORTC.0, 0, 200, 100, WorkVar, 1, resetall If i!=0 Then Constanta=i / 20 If chik=1 Then sredni1=Constanta ElseIf chik=2 Then sredni2=Constanta ElseIf chik=3 Then sredni3=Constanta ElseIf chik=4 Then sredni4=Constanta + sredni3 sredni4=sredni4 + sredni2 sredni4=sredni4 + sredni1 sredni4=sredni4 / 4 sredni4=3600 / sredni4 Print At 1, 12, Dec sredni4 EndIf i=0 GoTo main EndIf WorkTime=1 GoTo main
resetall: DelayMS 1000 If PORTC.0 = 1 Then GoTo main DelayMS 1000 If PORTC.0 = 1 Then GoTo main DelayMS 1000 If PORTC.0 = 1 Then GoTo main FreqOut PORTC.6, 1000, 3000, 3000 Cls DelayMS 500 WorkTime=0 VR1=0 i=0 e=0 h=10 a=0 sredni1=0 sredni2=0 sredni3=0 sredni4=0 chik=0 Constanta=0 Print CStr DEFTXT Print At 2, 3, CStr DEFTXT2 GoTo main
DEFTXT: CData "00000 pc/h:XXXXX", 0 DEFTXT2: CData "Counter books", 0 вот схема. Добавлено (18.08.2010, 19.51.54) --------------------------------------------- Теоретически все должно идеально пахать.... но наделе беда...
|
|
|
|
terrarus |
Дата: Ср, 18.08.2010, 20:10 | Сообщение # 7 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Quote (ntro123) DS1307 - это кто? Ну...это... такой Чип с 8 ногами ... такой микроконтроллер в корпусе Dip8.... Короче, это специализированный микроконтроллер предтавляющий собой отдельную микросхему - ЧАСЫ РЕАЛЬНОГО ВРЕМЕНИ, который передает данные в другой микроконтроллер, например 16F873A , по протоколу I2C Русский даташит DS1307 Вы найдете на http://www.terrarus.ucoz.ru/proton_....rus.pdf Английский даташит DS1307 Вы найдете на http://www.terrarus.ucoz.ru/proton_....307.pdf Стоит такой чип от 37 рублей до 100, есть конечно и дороже, но такие не используем, так как и за 37 рублей нормальные. Посмотрите цены на DS1307 на http://catalog.compel.ru/rtc/info/DS1307N%2B%20%28MAX%29 и http://platan.ru/cgi-bin/qweryv.pl/0w123.html Ну плюс к нему еще за 6-12 рублей кварц на 32.768 кГц и батарейку дисковую на 3,2 V чтобы при выключении питания всего устройства часы продолжали идти. Пример использования DS1307 можно глянуть на http://www.terrarus.ucoz.ru/contr_na_pic16/index.html
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал
terrarus - Ср, 18.08.2010, 20:28
|
|
|
|
ntro123 |
Дата: Пн, 23.08.2010, 18:05 | Сообщение # 8 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 28.06.2010
Статус:
Offline
|
terrarus, спасибо. все понял. вот накатал еще программку Code Device = 16F873A Xtal = 4 LCD_DTPin = PORTB.4 LCD_RSPin = PORTB.2 LCD_ENPin = PORTB.1 LCD_Interface = 4 LCD_Lines = 2 LCD_CommandUs = 2000 LCD_DataUs = 50 Dim i As Dword Dim o As Dword Dim WorkVar As Byte Dim WorkVar2 As Byte main: Button PORTC.1, 0, 200, 100, WorkVar, 1, delo GoTo main
delo: While i<500 i=i+1 DelayMS 10 Button PORTC.1, 0, 200, 100, WorkVar2, 1, prin Print At 2, 1, Dec i Wend i=0 GoTo main
prin: o=i*10 Cls Print At 1, 1, Dec i i=0 GoTo main выводит разницу междку каждым кликом в мс. на лсд по схему выше. все рано результата кривоват. при нажатии каждые 0.5 сек выводит в основном числа 0.3 и 0.7 (а если сложить и раздели на 2 то получится то что нужно=) ) а должен 500 вобще не предскажуймая штука ... Добавлено (23.08.2010, 18.05.10) --------------------------------------------- terrarus, был бы презнателен еслиб поделилсь куском кода и примивным проектом для протеуса. Где тупо по нажатию на кнопку послыается команда DC1307 что надо начать отчет в секундах от 0, при повторно нажатии время возращается от DC1307 и сбрасывается на 0. Зарание спасибо. ПС. курил даташит ничего не понял... попасылал 1 и 0 на шины но толку 0=)
Сообщение отредактировал
ntro123 - Пн, 23.08.2010, 18:06
|
|
|
|