Помогите написать счетчик. - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Помогите написать счетчик.
Помогите написать счетчик.
ntro123 Дата: Вт, 17.08.2010, 19:40  |                                                                                                                Сообщение # 1
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 17.08.2010
chiper Дата: Вт, 17.08.2010, 22:02  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 108
Репутация: 4   ±
Замечания:   ±
На сайте с 14.07.2010

Статус: Offline

Какая частота у использованного вами кварца?
Тут это очень важно... чем выше частота тем точнее может работать устройство smile Посмотрите даташит к микроконтроллеру, там должна быть таблица что и с какой точностью может делать МК при оазных частотах кварца.

А если не хотите заморачиваться, то сразу поставьте кварц 20 Мгц, разница должна быть ощутима на лицо smile


Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
ntro123 Дата: Ср, 18.08.2010, 15:16  |                                                                                                                Сообщение # 3
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

chiper, 4 мгц стоит.

ПС. если менять тип переменной i резудьтаты тоже меняются.
ПСС. пока все в протеусе.

Добавлено (18.08.2010, 15.16.46)
---------------------------------------------
А можно еще както реализовать чтобы показвалось время прошедшее?
т.е. запустили контроллер он начел отсчитывать секунды минуты и часы?

terrarus Дата: Ср, 18.08.2010, 15:44  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Чтобы не загружать 16f873a на подсчет секунд, минут и часов, после чего на решения других задачь у него не будет хватать быстродействия, лучше притменить дополнительно DS1307.

Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
ntro123 Дата: Ср, 18.08.2010, 19:07  |                                                                                                                Сообщение # 5
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

Quote (terrarus)
Чтобы не загружать 16f873a на подсчет секунд, минут и часов, после чего на решения других задачь у него не будет хватать быстродействия, лучше притменить дополнительно DS1307.

да, я тоже так думаю, но беда в том что я незнаю как можно 2 мк к одному дисплею ...
DS1307 - это кто?

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

ntro123 Дата: Ср, 18.08.2010, 19:51  |                                                                                                                Сообщение # 6
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 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)
---------------------------------------------
Теоретически все должно идеально пахать.... но наделе беда...

Прикрепления: LCD_.dsn(97Kb)
terrarus Дата: Ср, 18.08.2010, 20:10  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 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
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Помогите написать счетчик.
Страница 1 из 11
Поиск: