| Счётчик импульсов на pic16f84 + 7x3 индикатор | 
|  | 
| 
 
 
 
 | ChiperKo | Дата: Чт, 18.03.2010, 23:29  |                                                                                                                Сообщение # 1 |  
 | ![ChiperKo]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 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 |  
 | ![ChiperKo]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 6
 
 
 Замечания: ± На сайте с 18.03.2010
 
 
 Статус: 
 Offline
 
 | Немного поясню:  минимальная длительность импульса - 16мс максимальная длина импульса - 400мс
 Кварц - 4 Мг
     Ребят помогите пожалуйста! научка горит..... |  
 |  |  |  | 
| 
 
 
 
 | vv | Дата: Пт, 19.03.2010, 08:29  |                                                                                                                Сообщение # 3 |  
 | ![vv]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Продвинутый
 
  
 Сообщений: 
 
 
 132
 
 
 Замечания: ± На сайте с 13.11.2009
 
 
 Статус: 
 Offline
 
 | Полагаю что нужно использовать прерывание INT. Вход на счет доложен быть RB0 (INT). Предварительно нужно настроить это прерывание в регистре INTCON. 
 Сообщение отредактировал 
 
 vv - Пт, 19.03.2010, 08:33
 
  |  
 |  |  |  | 
| 
 
 
 
 | ADMIN | Дата: Пт, 19.03.2010, 09:16  |                                                                                                                Сообщение # 4 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 20.08.2007
 
 
 Статус: 
 Offline
 
 | да-да |  
 |  |  |  | 
| 
 
 
 
 | ChiperKo | Дата: Пт, 19.03.2010, 09:33  |                                                                                                                Сообщение # 5 |  
 | ![ChiperKo]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 6
 
 
 Замечания: ± На сайте с 18.03.2010
 
 
 Статус: 
 Offline
 
 | Мне уже советовали этот вариант, но он не катит.... апаратный метод тут не подайдёт, т.к. весь прибор уже собран, счётный блок уже закончен.... а времени осталось очень мало ... переделать не успею...в добавок печатка умерла на HDD.....
 скоро конференция "Шаг в будущее" там уже надо будет представлять научный проект.....
  Схема сделана очень качественно и окуратненько.... навешивать проводники тоже как то не очень охота.... к тому-же могут на конференцие сделать замечание за халтуру...   Выход из данной ситуацие всё же есть, как мне подсказали на форуме radiokot.ru    Quote Настраивай таймер примерно на 1мс, в прерывании проверяй порт на изменение (именно на изменение, а не просто проверяй его), там-же обновляй индикацию. Задача проста.
 помогите реализовать это программно.....   В следуйший раз учту когда буду переделовать.... а пока надо довольствоваться тем железом что есть.... 
 Сообщение отредактировал 
 
 ChiperKo - Пт, 19.03.2010, 09:38
 
  |  
 |  |  |  | 
| 
 
 
 
 | vv | Дата: Пт, 19.03.2010, 11:18  |                                                                                                                Сообщение # 6 |  
 | ![vv]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Продвинутый
 
  
 Сообщений: 
 
 
 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 |  
 | ![ChiperKo]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 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 |  
 |   
 
 
 
 
  Группа:
  Модераторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 891
 
 
 Замечания: ± На сайте с 12.01.2009
 
 
 Статус: 
 Offline
 
 | Да не кипятитесь вы. 
 Эта программа не совсем то, что вам нужно. Да и таймер по внешнему счету тут как то.......
 
 Quote (ChiperKo) Quote Настраивай таймер примерно на 1мс, в прерывании проверяй порт на изменение (именно на изменение, а не просто проверяй его), там-же обновляй индикацию.
 Задача проста.
А вот это можно реализовать.
 Добавлено (19.03.2010, 15.15.25)---------------------------------------------
 Для уточнения: импульсы на вход будут идти постоянно, или пришла пачка - отобразили и т. д..
 |  
 |  |  |  | 
| 
 
 
 
 | holyuser | Дата: Пт, 19.03.2010, 15:36  |                                                                                                                Сообщение # 9 |  
 | ![holyuser]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Могу и подсказать
 
  
 Сообщений: 
 
 
 228
 
 
 Замечания: ± На сайте с 12.12.2007
 
 
 Статус: 
 Offline
 
 | Опять тролль завелся... На Радиокоте поржал, наверно, теперь и сюда заявился.
 |  
 |  |  |  | 
| 
 
 
 
 | ChiperKo | Дата: Пт, 19.03.2010, 16:56  |                                                                                                                Сообщение # 10 |  
 | ![ChiperKo]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 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 |  
 | ![slavauk]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Понимаю
 
  
 Сообщений: 
 
 
 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 |  
 | ![ChiperKo]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 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 |  
 |   
 
 
 
 
  Группа:
  Модераторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 891
 
 
 Замечания: ± На сайте с 12.01.2009
 
 
 Статус: 
 Offline
 
 | Эта программа будет работать правильно только если импульсы будут поступать с невысокой частотой. |  
 |  |  |  |