Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Готовые конструкции » Прошивка для дозиметра ARDos (для AtMega8)


Прошивка для дозиметра ARDos (для AtMega8)

Сообщений 1 страница 3 из 3

1

Чисто из спортивного интереса и ввиду наличия свободного времени (на новогодние выходные), написал свою прошивку для железа ARDOS  для Mega8 DIP(были в запаснике и для высвобождения Mega328).

Схема автора ARDOS. Отличия: АЦП на А5, нет фонарика, нет кварца - внутренний RC на  8 мГц .

Особенности: Демо версия (без настроечного меню), считает и всегда может показать дозу за 200 секунд и за 40 секунд ( т.е. из постоянно заполняемой базы на 200 ячеек берет последних 40), считает процент погрешности измерений по мере заполнения массива базы, есть звуковой сигнал при превышении порога 60 мкр. Показывает напряжение батареи, время от включения, накопленную дозу от включения.

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

Код прошивки

'----------------------------
' Дозиметр на "железе"(схема) ARDOS
' Авторский сайт :http://srukami.inf.ua/ardos.html
'форум:http://arduino.ru/forum/proekty/delaem-dozimetr?page=19#comment-335142
' (Там выложена немного иная прошивка без исходника, плата, схема, фьюзы...
' процессор AT Mega 8 (в ArduinoUNO) - внутренний генератор 8мГц,
' дисплей Nokia5110 (красный), датчик СБМ-20(СТС-5)

'FuseHighByte - D9 h
'FuseLowByte  - E4 h

'Оригинальный алгоритм накачки, идея честно сперта с дозиметра Микрон1
'Крупные цифры (сильно поправлена библиотека 3310end_3.bas)
'Есть звуковая индикация (> 60 мкР/час)

'Кто захочет может перекомпилировать на Arduino M328,
'Внимание: При загрузке программатором будет потерян
'оригинальный загрузчик   Arduino

' ДЕМО версия  V1.15 для Bascom V2.0.1.5
' !!!  в 4 КБайт программа не поместилась :-(   !!!
'----------------------------

$regfile = "m8def.dat"
' $regfile = "m328pdef.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 30
$framesize = 52

Const Vers = "Ardos_Mega8 V1.15"
Const Oporn = 121                       ' опорное напряжение для измерения Uпит

Config Adc = Single , Prescaler = Auto
Start Adc                               'Now give power to the chip

Config Int0 = Falling
Config Int1 = Falling
Config Timer2 = Timer , Prescale = 1024
On Int0 Impuls
On Int1 Key_menu
On Timer2 Tim_31g

'хранится в ЕЕПРОМ , параметры накачки
$eeprom
Enakach_n:                             '0
   Data 10
Enakach_on:                            '1
   Data 2
Enakach_off:                           '2
   Data 100
Epadc:                                 '3   ограничение напряжения СБМ-20
    Data 65                             'для делителя напр. сопротивлением  100мОм/150кОм
$data

Dim Nakach_n As Byte , Nakach_on As Byte , Nakach_off As Byte , Padc As Byte
Dim T As Byte , Second As Byte , Mn As Byte , Hour As Byte , Day As Byte
Dim Mas200(201) As Word                 'только массив на 200+1 ячеек
Dim Shet As Word , I As Byte , Ind As Byte
Dim Menu As Byte , Menu_time As Byte , Key_plus As Byte , Key_minus As Byte
Dim D40 As Dword , D200 As Dword , Pogr As Byte , K_pogr As Byte , Proc_pogr As Byte , Proc40 As Byte
Dim D_nakop As Dword , D_nak1 As Dword
Dim Stri(6) As String * 14 , Pos(6) As Byte
Dim Str1 As String * 14 , Str2 As String * 14 , Str3 As String * 14 , Str4 As String * 14
Dim Str5 As String * 14 , Str6 As String * 14 , Svbat As String * 4
Dim Stemp As String * 14 , Temp As Byte , Wtemp As Word
Dim Vbat As Word , Vb1 As Word , Vb2 As Byte , Vb3 As Byte

Enable Int0
Enable Int1
Enable Timer2
Tcnt2 = 04

  Portb = 255                           'подтяжка на всех линиях
  Portc = &B11011111                    ' 255
  Portd = &B10011111                    '255

Config Portb.5 = Output                 ' светодиод
Config Portd.5 = Output                 'накачка
Config Portd.6 = Output                 ' звук
Config Portd.7 = Input                  'ВХОД кнопки
Config Portd.3 = Input                  'int1
Config Portd.4 = Input

Config Portc.2 = Output                 'подсветка дисплея
Podsvetka Alias Portc.2

'Define I/O and name them  для дисплея nokia 5110  на железе ARDOS
Config Portb.4 = Output
D3310dc Alias Portb.4
Config Portb.3 = Output
D3310ce Alias Portb.3
Config Portb.2 = Output
D3310re Alias Portb.2
'Configure SPI in soft mode
Config Spi = Soft , Din = Portd.1 , Dout = Portc.0 , Ss = None , Clock = Portc.1       ', Speed = 2
Spiinit

$include "3310init_1.bas"

'--------------Initialise the display
Call D3310reset
Call D3310init
'-------------3310 contrast <- это улучшает контрастность на разных дисплеях!
   D3310commandout &H21                 'Extended command mode, horizontal addressing
   D3310commandout &HBC                 'Middle contrast
   D3310commandout &H20                 'Normal command mode, horizontal addressing
'--------------------------
Call D3310clear

Enable Interrupts
Pogr = 0
Portb.5 = 0
Menu = 1

Readeeprom Nakach_n , Enakach_n         'Параметры накачки хранятся в EEPROM
Readeeprom Nakach_on , Enakach_on
Readeeprom Nakach_off , Enakach_off
Readeeprom Padc , Epadc                 'порог ограничения напряжения СБМ-20

'----------------------------------------------------------------------------
'основная программа
Do                                      '
$asm
sleep
$end Asm

' ------------------------ считывание напряжения батареи
   Adcsra = &B11100111
   Admux = &B01101110                   'внешнее опорное +Bg
   Waitms 5
   While Adcsra.6 = 0
   Wend
   Adcsra = &B00010000

   $asm
    in r30, adch
    sts {vb2},r30
  $end Asm
' End If

  ' ------------------------- считывание напряжения на СБМ-20
   Adcsra = &B11100111
   Admux = &B11100101                   'внутреннее опорное 2.56  и А5
   Waitms 5
   While Adcsra.6 = 0
   Wend
   Adcsra = &B00010000

   $asm
    in r30, adch
    sts {vb3},r30
  $end Asm

   If Vb3 < Padc Then                   ' если не хватает напряжения
        Gosub Nakachka                  '------- Накачка -------
   End If

'--------------------------------обработка кнопок <>
Key_plus = 0
Key_minus = 0

If Pind.7 = 0 Then
'Key_plus = 0
Key_minus = 1
End If

If Pind.4 = 0 Then
Key_plus = 1
'Key_minus = 0
End If
'Waitms 20
'------------------------------------------------------

If T = 2 Or T = 15 Then                '

  D40 = 0
  D200 = 0

   If Menu_time > 0 Then
      Decr Menu_time
   Else
      Menu = 0
       Menu_time = 0
       Podsvetka = 1

   End If

For I = 161 To 201                     'подсчет   дозы за 40 сек
   D40 = D40 + Mas200(i)
Next I

  For I = 2 To 201                      'подсчет   дозы за 200 сек
   D200 = D200 + Mas200(i)
  Next I
  '------ звук при превышении дозы !!!------
   If D40 > 60 Then                     ' больше 60(30) мкр
   For I = 1 To 128
   Portd.6 = 1
   Waitus 300
   Portd.6 = 0
   Waitus 500

   Next I
   End If
    '---------------------------------
   K_pogr = Pogr / 60                   'вычисл. коэфф. погрешности в завис. от наполнения массива 200
   K_pogr = K_pogr + 1
   D200 = D200 / K_pogr

   Proc_pogr = Pogr / 3                 'вычисл. процента погрешности в завис. от наполнения массива 200
   Proc_pogr = Proc_pogr + 1
   Proc_pogr = 100 - Proc_pogr
     If Proc_pogr < 20 Then
        Proc_pogr = 20
      End If

      If Pogr < 40 Then
         Proc40 = Pogr * 2              'вычисл. процента погрешности в завис. от наполнения массива 40
         Proc40 = 99 - Proc40
           If Proc40 < 20 Then
               Proc40 = 20
            End If
       Else
          Proc40 = 20
       End If

     Str6 = ""                          'вычисление накопительной дозы и формир. строки для вывода на диспл.
   If D_nakop < 1000 Then
      Str6 = Str6 + Str(d_nakop)
      Str6 = Str6 + " mkR"
     Else
      D_nak1 = D_nakop / 1000
      Str6 = Str6 + Str(d_nak1)
      Str6 = Str6 + " mR"
   End If
   Temp = Len(str6)
   Temp = 7 - Temp
   For I = 1 To Temp
      Str6 = " " + Str6
   Next I
   Str6 = "NAKOP: " + Str6

   Vbat = Oporn * 255
   Vbat = Vbat / Vb2

   Str4 = Str(vbat)
   Svbat = Left(str4 , 1 )
   Svbat = Svbat + "."
   Svbat = Svbat + Right(str4 , 2)

   '-------------------- формир. строки для вывода на диспл. батарея+время
   Str1 = Svbat
   Str1 = Str1 + "V "

   Stemp = Str(hour)
      Temp = Len(stemp)
   If Temp < 2 Then
      Str1 = Str1 + " "
      Str1 = Str1 + Stemp
      Else
      Str1 = Str1 + Stemp
   End If

   Str1 = Str1 + ":"

   Stemp = Str(mn)
   Temp = Len(stemp)
   If Temp < 2 Then
      Str1 = Str1 + "0"
       Str1 = Str1 + Stemp
      Else
      Str1 = Str1 + Stemp
   End If

      Str1 = Str1 + ":"                 '

     Stemp = Str(second)
     Temp = Len(stemp)
   If Temp < 2 Then
      Str1 = Str1 + "0"
      Str1 = Str1 + Stemp
      Else
      Str1 = Str1 + Stemp
   End If

   Str3 = ""
   Str4 = ""
   Str5 = ""
' -----------  Меню----------------
Select Case Menu
      Case 1 : Goto Menu1
      Case 2 : Goto Menu2
      Case 3 : Goto Menu3
      Case 4 : Goto Menu4
     End Select

'------------ menu=0  ---------------
     Goto Menu11
Menu2:                                  'ПОИСК - замер 40с,  с подсветкой
      Podsvetka = 0
      Goto Menu11

Menu1:
                                   'ПОИСК - замер 40с, по умолчанию, без подсветки
      Menu_time = 15
      Podsvetka = 1
Menu11:

    Str2 = ""
      Str4 = "POISK     "
      Str4 = Str4 + Str(proc40)
      Str4 = Str4 + "%"

      Str3 = Str(d40)

End_menu:

Pos(1) = 0
Pos(2) = 0
Pos(6) = 0
Pos(4) = 0
Pos(5) = 0

Stri(1) = Str1
Stri(2) = Str2
Stri(3) = Str3
Stri(4) = Str4
Stri(5) = Str5
Stri(6) = Str6

'----------- вывод на дисплей построчно  ----------

   For I = 0 To 5
         If I = 1 Or I = 2 Then
           If Menu < 5 Then
            Call D3310position(0 , 1)
            Call D3310print( "              ")       'очистить строку
            Call D3310position(0 , 2)
            Call D3310print( "              ")       'очистить строку
               Pos(2) = Len(str3)       'Вправо
               Pos(2) = 8 - Pos(2)
            Call D3310position(pos(2) , 1)       'КРУПНЫЙ шрифт 1строка
            Call D3310print2(str3)
            Call D3310position(pos(2) , 2)       'КРУПНЫЙ шрифт 2строка
            Call D3310print2_(str3)
            Call D3310position(10 , 2)
            Call D3310print( "mkR")
           Else

            Call D3310position(0 , I)
            Call D3310print( "              ")       'очистить строку
            Temp = I + 1
            Call D3310position(pos(temp) , I)       'вывод на дисплей с позицией
            Call D3310print(stri(temp))

           End If

         Else
            Call D3310position(0 , I)
            Call D3310print( "              ")       'очистить строку
            Temp = I + 1
            Call D3310position(pos(temp) , I)       'вывод на дисплей с позицией
            Call D3310print(stri(temp))
         End If
   Next I

End If

Loop
Stop
'-----------------------------------------------------------------------------                          '
Menu4:
    Podsvetka = 0                       ' ЗАМЕР меню  200 С подсветкой
    Goto Menu22
Menu3:
                                  ' ЗАМЕР меню 200 без подсветки
   Menu_time = 15
   Podsvetka = 1
Menu22:
     Str2 = ""
       Str3 = Str(d200)

       Str4 = "ZAMER      "
       Str4 = Str4 + Str(proc_pogr)
       Str4 = Str4 + "% "

Goto End_menu

'-----------------------------------------------------------------------------
'--interrupts----
Key_menu:                               'INT1 - обработка нажатия кнопки меню
    Waitms 50
      Incr Menu
      If Menu > 4 Then                  '11 Then
         Menu = 1
      End If
    Menu_time = 20
Return
'---------------------------------------------------------------------------
Impuls:                                 'прерывнние int0 : cчет частиц

Incr Shet
Incr D_nakop
  'включение светодиода частицы
Portb.5 = 1

Gosub Nakachka                         'Накачка

Return

'-----------------------------------------------------------------------------
Tim_31g:                                ' прерывание ~31 Гц при 8 мГц
Tcnt2 = 04
Incr T

      'выключение светодиода частицы
         Portb.5 = 0

If T > 31 Then                          'делать каждую секунду-
    T = 0
                   Mas200(201) = Shet   '!!!запоминаем результат в последней ячейке массива
                  Shet = 0
                 For I = 1 To 200       'сдвигаем массив
                     Mas200(i) = Mas200(i + 1)
                 Next I

                   Mas200(201) = 0

                  Incr Pogr
                  If Pogr > 250 Then
                     Pogr = 250
                  End If

Incr Second                            'выполняется каждую секунду
If Second > 59 Then
      Second = 0
      Incr Mn                           'выполняется каждую мимуту

         If Mn > 59 Then
            Mn = 0
            Incr Hour                   'выполняется каждый час
               If Hour > 23 Then
                  Hour = 0
                  Incr Day
               End If
          End If
  End If
End If

Return

Stop
'=============================================================================
'Nakach_n - циклов накачки
'Nakach_on - состояние включено
'Nakach_off - выключено

Nakachka:
   $asm                                 'накачка высоковольтная
       'ldi r17, 12                      'количество циклов накачки
        lds r17, {nakach_n}             ' берется из ЕЕPROM см.начало программы
   Main0:
       sbi portd,5                      'пин накачки в 1

       'ldi r24,2                        'длительность вкл. состояния
       lds r24, {nakach_on}             ' берется из ЕЕPROM см.начало программы
   Main1:
       Dec R24
       brne   main1

       cbi portd,5                      'пин накачки в 0

       'ldi r24,100                      ' длительность паузы
       lds r24, {Nakach_off}            ' берется из ЕЕPROM см.начало программы
   Main2:
       dec r24
       brne main2

       dec r17
       brne  main0
$end Asm
Return

'библиотека для дисплея
$include "3310end_3.bas"

Схема
http://s7.uploads.ru/lPJzM.jpg

Макет-программатор
http://sa.uploads.ru/jMZlO.jpg

Вид печатной платы проекта (есть в архиве  в СпринтЛайаут5)
http://se.uploads.ru/eQWMs.jpg

Архив со всеми файлами и библиотеками

Отредактировано Sajsen (2018-01-20 17:34:52)

+2

2

Хм... давно собираюсь сделать подобное, но останавливает преобразователь напряжения, для СТС-5 надо 400 вольт, но мне так-же надо и 800 вольт.
Кто пробовал использовать трансформатор от лам телевизора/монитора?

0

3

800 вольт не проблема! Используйте умножитель напряжения:
http://sa.uploads.ru/23BhD.jpg
только не подключайте СБМ-20 на 800 вольт!

0


Вы здесь » Программирование ATMEL в BASCOM. » Готовые конструкции » Прошивка для дозиметра ARDos (для AtMega8)