Счётчик импульсов на pic16f84 + 7x3 индикатор
|
|
ChiperKo |
Дата: Чт, 18.03.2010, 23:29 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 18.03.2010
Статус:
Offline
|
Всем доброе время суток... прошу помощи.... Собираю девайс на базе Pic16f84 ... а именно счётчик импульсов с динамической индикацией на 7 сегментном 3х разрядном идикаторе .... Задача девайса: Проверять состояние порта RA4 и считать кол-во поступивших на него лог. 1 и выводить на индикатор кол-во импульсов... Программу вроде как написал.. Code Segments Var PORTB Digits Var PORTA
i Var Byte n Var Byte Value Var Word ii Var Word
TRISB = $80 ' Set segment pins to output TRISA = $f0 ' Set digit pins to output Value = 0 mainloop
For ii = 0 To 999 GoSub display ' Display the value '* if porta.4 = 1 then Value = Value + 1 if Value = 999 then Value = 0 Next ii GoTo mainloop ' Do it forever '*
' Subroutine to send the number (0 - 9999) in Value to LEDs display For i = 0 To 3 ' Loop through 4 digits n = Value Dig i ' Get digit to display GoSub display1 ' Display the digit Pause 1 ' Leave it on 1 millisecond Next i ' Do next digit Return
' Surboutine to display one digit on LED ' i = digit number ' n = number to display display1 Digits = $ff ' All digits off to prevent ghosting
' Convert binary number in n to segments for LED Lookup n, [$40, $79, $24, $30, $19, $12, $02, $78, $00, $10], Segments
' Set digit pin i to 0 (on) and the rest of the pins to 1 (off) Digits = ~Dcd i
Return Но косяк в том, что получилось так что она считает не кол-во лог. 1 , а тупо выполняет цикл For ii = 0 To 9999 когда на порте весит 1, и получается тупо секундомер :)) Пробовал много разных вариантов.... результат тот-же вот 1 из них Code ' дополнительные переменные tmr0 VAR Word tmr1 VAR Word
' изменение кода взятого в " '* '* " '* tmr1 = 0 if Value = 999 then Value = 0 if porta.4 = 1 then tmr1 = 1 if porta.4 = 1 then bb GoTo mainloop bb:
if tmr1 - 0 = 1 then Value = Value + 1 Next ii GoTo mainloop ' Do it forever
'* В результате пропарился и без результатно.... не алгоритмический у меня склад ума господа =(( тут полюбому есть более простой выход до которого я немогу додуматься......
Сообщение отредактировал
ChiperKo - Пт, 19.03.2010, 21:38
|
|
|
|
ChiperKo |
Дата: Пт, 19.03.2010, 02:20 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 18.03.2010
Статус:
Offline
|
Немного поясню: минимальная длительность импульса - 16мс максимальная длина импульса - 400мс Кварц - 4 Мг Ребят помогите пожалуйста! научка горит.....
|
|
|
|
vv |
Дата: Пт, 19.03.2010, 08:29 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
132
Замечания:
±
На сайте с 13.11.2009
Статус:
Offline
|
Полагаю что нужно использовать прерывание INT. Вход на счет доложен быть RB0 (INT). Предварительно нужно настроить это прерывание в регистре INTCON.
Сообщение отредактировал
vv - Пт, 19.03.2010, 08:33
|
|
|
|
ADMIN |
Дата: Пт, 19.03.2010, 09:16 | Сообщение # 4 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
да-да
|
|
|
|
ChiperKo |
Дата: Пт, 19.03.2010, 09:33 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 18.03.2010
Статус:
Offline
|
Мне уже советовали этот вариант, но он не катит.... апаратный метод тут не подайдёт, т.к. весь прибор уже собран, счётный блок уже закончен.... а времени осталось очень мало ... переделать не успею...в добавок печатка умерла на HDD..... скоро конференция "Шаг в будущее" там уже надо будет представлять научный проект..... Схема сделана очень качественно и окуратненько.... навешивать проводники тоже как то не очень охота.... к тому-же могут на конференцие сделать замечание за халтуру... Выход из данной ситуацие всё же есть, как мне подсказали на форуме radiokot.ru Quote Настраивай таймер примерно на 1мс, в прерывании проверяй порт на изменение (именно на изменение, а не просто проверяй его), там-же обновляй индикацию. Задача проста. помогите реализовать это программно..... В следуйший раз учту когда буду переделовать.... а пока надо довольствоваться тем железом что есть....
Сообщение отредактировал
ChiperKo - Пт, 19.03.2010, 09:38
|
|
|
|
vv |
Дата: Пт, 19.03.2010, 11:18 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
132
Замечания:
±
На сайте с 13.11.2009
Статус:
Offline
|
на каком порту вход счетный? Если на RA4 то все довольно просто. Настраиваешь таймер по внешнему счету и при наступлении прерывания считаешь.... http://www.microchip.ru/files/d-sheets-rus/pic16_11.pdf тут все подробно и на русском))) а тут пример программы http://www.picbasic.ru/forum/9-232-3
Сообщение отредактировал
vv - Пт, 19.03.2010, 11:42
|
|
|
|
ChiperKo |
Дата: Пт, 19.03.2010, 14:26 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 18.03.2010
Статус:
Offline
|
vv - СПАСИБО, но я идиот!!! даа.... RA4.... у меня входной порт пропарился вешал на него таймер...... - нефига.... чёто вообще не врубаюь как работает программа http://www.picbasic.ru/forum/9-232-3123-16-1255260259 ......... ех.... прочитал даташит.... нефига не разобрался.... вот я некогда не понимал... почему когда человек говорит "не алгоритмический у меня склад ума" ему как на зло дают советы которыми он всёравно не сможет воспользоваться т.к. нехрена не понимает в данном алгоритме......... Некогда не быть мне программистом программируемой логики Объектные языки программирования и языки разметки гипертекста понимаю! PHP HTML Java Delphi - без проблем.... а вот Пик бейсик - нехрена... Помогите пожалуйста... я уже 5 месяцев парюсь с научкой.... не сил, не времени уже не осталось .......
Сообщение отредактировал
ChiperKo - Пт, 19.03.2010, 14:43
|
|
|
|
ivan_fd |
Дата: Пт, 19.03.2010, 15:15 | Сообщение # 8 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Да не кипятитесь вы. Эта программа не совсем то, что вам нужно. Да и таймер по внешнему счету тут как то....... Quote (ChiperKo) Quote Настраивай таймер примерно на 1мс, в прерывании проверяй порт на изменение (именно на изменение, а не просто проверяй его), там-же обновляй индикацию. Задача проста. А вот это можно реализовать.Добавлено (19.03.2010, 15.15.25) --------------------------------------------- Для уточнения: импульсы на вход будут идти постоянно, или пришла пачка - отобразили и т. д..
|
|
|
|
holyuser |
Дата: Пт, 19.03.2010, 15:36 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
228
Замечания:
±
На сайте с 12.12.2007
Статус:
Offline
|
Опять тролль завелся... На Радиокоте поржал, наверно, теперь и сюда заявился.
|
|
|
|
ChiperKo |
Дата: Пт, 19.03.2010, 16:56 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 18.03.2010
Статус:
Offline
|
Quote (ivan_fd) Для уточнения: импульсы на вход будут идти постоянно, или пришла пачка - отобразили и т. д.. Импульсы будут идти постоянно.... => надо чтоб постоянно шло обновление... Добавлено (19.03.2010, 16.56.24) --------------------------------------------- Поправка, у меня 4х разрядный 7 сегментный индикатор..... общеанодный, аноды подключены через транзисторы к портам RA0-RA3 Управление портами RB ' Convert binary number in n to segments for LED Lookup n, [$40, $79, $24, $30, $19, $12, $02, $78, $00, $10], Segments вообщем... программа в 1 посте работает... но не так как надо.. именно её надо даработать чтоб считала изменения состояния порта RA4....
Сообщение отредактировал
ChiperKo - Пт, 19.03.2010, 18:30
|
|
|
|
slavauk |
Дата: Пт, 19.03.2010, 21:54 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
64
Замечания:
±
На сайте с 14.03.2009
Статус:
Offline
|
Code Segments Var PORTB Digits Var PORTA
i Var Byte n Var Byte Value Var Word ii Var Word d var byte
TRISB = $80 ' Set segment pins to output TRISA = $f0 ' Set digit pins to output Value = 0 mainloop
For ii = 0 To 9999 GoSub display ' Display the value '* gosub counter if Value = 9999 then Value = 0 Next ii GoTo mainloop ' Do it forever '*
' Subroutine to send the number (0 - 9999) in Value to LEDs display For i = 0 To 3 ' Loop through 4 digits n = Value Dig i ' Get digit to display GoSub display1 ' Display the digit Pause 1 ' Leave it on 1 millisecond Next i ' Do next digit Return
' Surboutine to display one digit on LED ' i = digit number ' n = number to display display1 Digits = $ff ' All digits off to prevent ghosting
' Convert binary number in n to segments for LED Lookup n, [$40, $79, $24, $30, $19, $12, $02, $78, $00, $10], Segments
' Set digit pin i to 0 (on) and the rest of the pins to 1 (off) Digits = ~Dcd i
Return counter if porta.0=0 then d=0 endif if (porta.4=1 and d=0) then value=value+1 d=1 endif return
Сообщение отредактировал
slavauk - Пт, 19.03.2010, 21:55
|
|
|
|
ChiperKo |
Дата: Пт, 19.03.2010, 22:14 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 18.03.2010
Статус:
Offline
|
СПАСИБО!!! но на последней строчке "return[code]" компилятор ругается syntax error Добавлено (19.03.2010, 22.14.09) --------------------------------------------- ВСЁ!!!!!!!!!!!!!!! разобрался!!!!!!!!!!!!!!!!!!!!!!!!!! СПАСИБО!!!!!!!!!!!! РАБОТАЕТ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Code Segments Var PORTB Digits Var PORTA
i Var Byte n Var Byte Value Var Word ii Var Word d var byte
TRISB = $80 ' Set segment pins to output TRISA = $f0 ' Set digit pins to output Value = 0 mainloop
For ii = 0 To 9999 GoSub display ' Display the value '* gosub counter if Value = 9999 then Value = 0 Next ii GoTo mainloop ' Do it forever '*
' Subroutine to send the number (0 - 9999) in Value to LEDs display For i = 0 To 3 ' Loop through 4 digits n = Value Dig i ' Get digit to display GoSub display1 ' Display the digit Pause 1 ' Leave it on 1 millisecond Next i ' Do next digit Return
' Surboutine to display one digit on LED ' i = digit number ' n = number to display display1 Digits = $ff ' All digits off to prevent ghosting
' Convert binary number in n to segments for LED Lookup n, [$40, $79, $24, $30, $19, $12, $02, $78, $00, $10], Segments
' Set digit pin i to 0 (on) and the rest of the pins to 1 (off) Digits = ~Dcd i
Return counter if porta.4=0 then d=0 endif if (porta.4=1 and d=0) then value=value+1 d=1 endif return
|
|
|
|
ivan_fd |
Дата: Сб, 20.03.2010, 20:34 | Сообщение # 13 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Эта программа будет работать правильно только если импульсы будут поступать с невысокой частотой.
|
|
|
|