[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » форумы » Общие вопросы по Bascom-AVR » Подсчёт количества импульсов за последние 30 секунд (Дозиметр на баскоме)
Подсчёт количества импульсов за последние 30 секунд
koshkoshkaДата: Суббота, 14.06.2014, 11:47 | Сообщение # 1
Группа: Пользователи
Сообщений: 2

Статус: Offline
Подскажите плиз, как организовать подсчёт количества импульсов по входу INT0 в Atmega8 средствами Bascom. Мне надо, чтобы программа подсчитала их и сохранила в переемнную, которую я хочу умножить на 0,57 и вывести на экран. Это будет количество микрорентген в час. Я пока организовал реакцию на импульсы от СБМ-20.

Вот мой код, подскажите. Он просто выводит количество импульсов с момента старта


Код
$regfile = "m8adef.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Int0 = Rising   
On Int0 Encod
Dim W As Word
Enable Interrupts
Enable Int0

Cls
Cursor Off
W = 0

Do

Loop

End

Encod:                     

   If Pind.2 = 1 Then      
   Incr W
   Cls
   Lcd W
                      
   End If
   Waitus 190                    ' ждем 190 микросекунд для сброса импульса СБМ-20
   Gifr = 64                    ' сбрасываем регистр хранения прерывания INT0. Увидел этот код где-то. Не знаю нужно или нет.

Return




Сообщение отредактировал koshkoshka - Суббота, 14.06.2014, 11:47
 
ПетрДата: Воскресенье, 15.06.2014, 11:11 | Сообщение # 2
Группа: Проверенные
Сообщений: 47

Статус: Offline
Можно создать массив на 30 элементов и переменную указывающую на текущий элемент, и по таймеру каждую секунду изменять значение этой переменной (при достижении 30 - обнулять) и очищать содержимое ячейки массива с номером в переменной. При поступлении нового импульса, прибавлять нужно к содержимому ячейки массива с номером в переменной. При выводе результата, считать сумму всех элементов массива. Таким образом получим число импульсов за прошедшие 30 секунд.

 
sany2Дата: Воскресенье, 15.06.2014, 16:47 | Сообщение # 3
Группа: Проверенные
Сообщений: 107

Статус: Offline
если особая точность не нужна ,то как-то так

dim r as byte                                               'количество переполнений таймера
dim rad as single                                         'то,что будем показывать
Dim W As Word                             'кол-во импульсов на int0

Config Int0 = Rising
On Int0 Encod
Config Timer1 = Timer , Prescale = 256   '256/10000000*65535    - перполнение таймера каждые 1,67 сек
On Timer1 rad:
do
if  r>=18 then                                            '   за 30 секунд  таймер 1 переполняется 18 раз
disable timer 1
disable int0
rad=w*0.57                                              'ещё на два надо умножить наверно,если 0.57 это минутный коэффициэнт
w=0                                                           'обнуляем счётчики
r=0
enable int0
enable timer1
end if
loop

Encod:
incr w
return

rad:
incr r
return

Я интересовался этой темой,но уже забыл коэффициент СБМ-20, воможно придётся вам подправить в коде.
Можно считать время между импульсами и от них плясать,но разбросы тогда ого-го.Поэтому лучше всё-таки чтобы время замера было не меньше 20 секунд.




Сообщение отредактировал sany2 - Воскресенье, 15.06.2014, 20:53
 
koshkoshkaДата: Понедельник, 16.06.2014, 14:25 | Сообщение # 4
Группа: Пользователи
Сообщений: 2

Статус: Offline
Сделал по другому. Догадался почти сразу после написания данной темы. Теперь он показывает микрорентгены в час. Коэффициент СБМ-20=  0,0057. Это если импульсы в минуту переводить в микрозиверты.
Для микрорентгенов надо ещё на 115 умножить.

Код
$regfile = "m8adef.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Int0 = Rising
On Int0 Encod
Dim W As Word
Dim S As Word
Dim R As Single
Dim O As Word
Enable Interrupts
Enable Int0

Cls
Cursor Off
Locate 1 , 1
Lcd "Dosimeter SBM-20"
Wait 2
W = 0
S = 0
O = 60                    'Обратный отсчёт 60 секунд
R = 0
Do
   Wait 1
   Incr S
   If S > 65530 Then
       S = 0                    'Сброс таймеры
       W = 0                    'Сброс счётчика импульсов
   End If
   If S > 60 Then
      R = W / S                    'Импульсы делим на секунды
      R = R * 60                    'Переводим в импульсы в минуту в среднем
      R = R * 0.0057                    'Микрозиверты
      R = R * 115                    'Микрорентген
      Cls
      Upperline
      Lcd "Radiation:"
      Lowerline
      Lcd Fusing(r , "#########.#") ; " uR/Hour"
   Else
       O = 60 - S                    'Даём ему просчитаться минуту после включения
       Cls
       Upperline
       Lcd "Please wait " ; O ; " s"
   End If

Loop

End

Encod:

  If Pind.2 = 1 Then
  Incr W

  End If
  Waitus 190                    ' ждем пока утихнет импульс от СБМ-20
  Gifr = 64                    ' сбрасываем регистр хранения прерывания INT0

Return
Прикрепления: 5919722.jpg (140.9 Kb) · 7354725.jpg (50.9 Kb) · 6344768.jpg (137.6 Kb)


 
Форум » форумы » Общие вопросы по Bascom-AVR » Подсчёт количества импульсов за последние 30 секунд (Дозиметр на баскоме)
  • Страница 1 из 1
  • 1
Поиск: