Счётчик импульсов на pic16f84 + 7x3 индикатор - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » Счётчик импульсов на pic16f84 + 7x3 индикатор (Проблема с доработкой программы)
Счётчик импульсов на pic16f84 + 7x3 индикатор
ChiperKo Дата: Чт, 18.03.2010, 23:29  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 18.03.2010
ChiperKo Дата: Пт, 19.03.2010, 02:20  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2010

Статус: Offline

Немного поясню:

минимальная длительность импульса - 16мс
максимальная длина импульса - 400мс
Кварц - 4 Мг

Ребят помогите пожалуйста! научка горит.....

Прикрепления: 9483648.jpg(32Kb)
vv Дата: Пт, 19.03.2010, 08:29  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 132
Репутация: 6   ±
Замечания:   ±
На сайте с 13.11.2009

Статус: Offline

Полагаю что нужно использовать прерывание INT. Вход на счет доложен быть RB0 (INT). Предварительно нужно настроить это прерывание в регистре INTCON.
Сообщение отредактировал vv - Пт, 19.03.2010, 08:33
ADMIN Дата: Пт, 19.03.2010, 09:16  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1097
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

да-да
ChiperKo Дата: Пт, 19.03.2010, 09:33  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2010

Статус: Offline

Мне уже советовали этот вариант, но он не катит....
апаратный метод тут не подайдёт, т.к. весь прибор уже собран, счётный блок уже закончен.... а времени осталось очень мало ... переделать не успею...в добавок печатка умерла на HDD.....
скоро конференция "Шаг в будущее" там уже надо будет представлять научный проект.....

Схема сделана очень качественно и окуратненько.... навешивать проводники тоже как то не очень охота.... к тому-же могут на конференцие сделать замечание за халтуру...

Выход из данной ситуацие всё же есть, как мне подсказали на форуме radiokot.ru

Quote
Настраивай таймер примерно на 1мс, в прерывании проверяй порт на изменение (именно на изменение, а не просто проверяй его), там-же обновляй индикацию.
Задача проста.

помогите реализовать это программно.....

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

Сообщение отредактировал ChiperKo - Пт, 19.03.2010, 09:38
vv Дата: Пт, 19.03.2010, 11:18  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 132
Репутация: 6   ±
Замечания:   ±
На сайте с 13.11.2009

Статус: Offline

на каком порту вход счетный? Если на RA4 то все довольно просто. Настраиваешь таймер по внешнему счету и при наступлении прерывания считаешь....

http://www.microchip.ru/files/d-sheets-rus/pic16_11.pdf тут все подробно и на русском))) wink

а тут пример программы http://www.picbasic.ru/forum/9-232-3

Сообщение отредактировал vv - Пт, 19.03.2010, 11:42
ChiperKo Дата: Пт, 19.03.2010, 14:26  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2010

Статус: Offline

vv - СПАСИБО, но я идиот!!!

даа.... RA4.... у меня входной порт

пропарился вешал на него таймер...... - нефига....

чёто вообще не врубаюь как работает программа http://www.picbasic.ru/forum/9-232-3123-16-1255260259 .........

ех.... прочитал даташит.... нефига не разобрался....

вот я некогда не понимал... почему когда человек говорит "не алгоритмический у меня склад ума" ему как на зло дают советы которыми он всёравно не сможет воспользоваться т.к. нехрена не понимает в данном алгоритме.........

Некогда не быть мне программистом программируемой логики sad

Объектные языки программирования и языки разметки гипертекста понимаю! PHP HTML Java Delphi - без проблем.... а вот Пик бейсик - нехрена...

Помогите пожалуйста... я уже 5 месяцев парюсь с научкой.... не сил, не времени уже не осталось .......

Сообщение отредактировал ChiperKo - Пт, 19.03.2010, 14:43
ivan_fd Дата: Пт, 19.03.2010, 15:15  |                                                                                                                Сообщение # 8
Группа: Модераторы
Ранг:  Специалист
Сообщений: 881
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Да не кипятитесь вы.
Quote (ChiperKo)
чёто вообще не врубаюь как работает программа http://www.picbasic.ru/forum/9-232-3123-16-1255260259 .........

Эта программа не совсем то, что вам нужно. Да и таймер по внешнему счету тут как то.......
Quote (ChiperKo)
Quote
Настраивай таймер примерно на 1мс, в прерывании проверяй порт на изменение (именно на изменение, а не просто проверяй его), там-же обновляй индикацию.
Задача проста.

А вот это можно реализовать.

Добавлено (19.03.2010, 15.15.25)
---------------------------------------------
Для уточнения: импульсы на вход будут идти постоянно, или пришла пачка - отобразили и т. д..


Меня все время преследуют умные мысли...но я быстрее!!!
holyuser Дата: Пт, 19.03.2010, 15:36  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 233
Репутация: 5   ±
Замечания:   ±
На сайте с 12.12.2007

Статус: Offline

Опять тролль завелся...
На Радиокоте поржал, наверно, теперь и сюда заявился.
ChiperKo Дата: Пт, 19.03.2010, 16:56  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 68
Репутация: 3   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Группа: Модераторы
Ранг:  Специалист
Сообщений: 881
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Эта программа будет работать правильно только если импульсы будут поступать с невысокой частотой.

Меня все время преследуют умные мысли...но я быстрее!!!
Форум Picbasic.ru » Программирование МК » PicBasicPro » Счётчик импульсов на pic16f84 + 7x3 индикатор (Проблема с доработкой программы)
Страница 1 из 11
Поиск: