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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Нужно проверить код прошивки датчика температуры на термопаре


Нужно проверить код прошивки датчика температуры на термопаре

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

1

Здравствуйте! Вообщем я написал прошивку для ATMega8 в дипе для датчика температуры на термопаре с 3-х разрядным сегментным индикатором... но собрав на индикаторе бегают числа... вообщем он работает как-то некорректно... вообщем прошу помочь знающих и могущих проверить мой код...  Заранее спасибо!
код частично заимствован там:
http://avrproject.ru/publ/kak_podkljuch … mi/2-1-0-9
http://avrproject.ru/publ/kak_podkljuch … u/2-1-0-70
$regfile = "m8def.dat"
$crystal = 8000000

Dim W As Integer
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim M1 As Integer
Dim M2 As Integer
Dim M3 As Integer
Dim M4 As Integer

Ddrb = &B11111111
Ddrd = &B11111111

'считывание значения с АЦП по прерыванию от таймера

Config Timer1 = Timer , Prescale = 64
On Timer1 Acp

'конфигурация АЦП

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Enable Interrupts
Enable Timer1

Do

         M1 = W
         M2 = M1
         M3 = M1

         M1 = M1 / 100                                      'обработка первого числа
         N1 = Abs(m1)

         M2 = M2 Mod 100                                    'обработка второго числа
         M2 = M2 / 10
         N2 = Abs(m2)

         M3 = M3 Mod 10                                     ' обработка третьего числа
         M3 = M3 / 1
         N3 = Abs(m3)



Gosub Led

Waitms 200
Loop

'работа с АЦП

Acp:

Start Adc                                                   'запуск АЦП
W = Getadc(1)
W = W / 1.28
W = Abs(w)                                                  'подгоняем замеры под действ. температуру
Return

Led:

       Portb = &B00000100                                   'зажигаем первое число

      Select Case N1
         Case 0 : Portd = &B11000000
         Case 1 : Portd = &B11111001
         Case 2 : Portd = &B10100100
         Case 3 : Portd = &B10110000
         Case 4 : Portd = &B10011001
         Case 5 : Portd = &B10010010
         Case 6 : Portd = &B10000010
         Case 7 : Portd = &B11111000
         Case 8 : Portd = &B10000000
         Case 9 : Portd = &B10010000

      End Select
     Waitms 3

     Portb = &B00000010                                     'зажигаем второе число

      Select Case N2
         Case 0 : Portd = &B11000000
         Case 1 : Portd = &B11111001
         Case 2 : Portd = &B10100100
         Case 3 : Portd = &B10110000
         Case 4 : Portd = &B10011001
         Case 5 : Portd = &B10010010
         Case 6 : Portd = &B10000010
         Case 7 : Portd = &B11111000
         Case 8 : Portd = &B10000000
         Case 9 : Portd = &B10010000
      End Select

       Waitms 3

       Portb = &B00000001                                   'зажигаем третье число

      Select Case N3
         Case 0 : Portd = &B11000000
         Case 1 : Portd = &B11111001
         Case 2 : Portd = &B10100100
         Case 3 : Portd = &B10110000
         Case 4 : Portd = &B10011001
         Case 5 : Portd = &B10010010
         Case 6 : Portd = &B10000010
         Case 7 : Portd = &B11111000
         Case 8 : Portd = &B10000000
         Case 9 : Portd = &B10010000
      End Select

       Waitms 3

    Return
End

Отредактировано Mr.Lex (2014-12-31 09:26:59)

0

2

Mr.Lex написал(а):

вообщем он работает как-то некорректно

Это как-то мягко сказано!

0

3

Может здесь посмотрите

0

4

Mr.Lex написал(а):

W = W / 1.28


Вы же получаете дробное значение, а почему переменная "Integer"?

Обработку 7-seg led, надо делать в прерывании таймера, а у Вас там ацп.

Отредактировано sasha_1973 (2014-12-31 12:56:12)

0

5

Я не особо пока разбираюсь... Можете отредактировать как нужно... мне просто срочно нужно... Я буду очень признателен...

0

6

Работа с АЦП примитивная, датчик на ADC0
Не забудьте выставить частоту МК, в текущем варианте, используются заводские установки

Выводы для 7-seg led - любые, выставляются в исходнике

Симуляция + исходник  -  отправил Вам на mail.

Один из вариантов

$map       ' Получаем карту распределения памяти в отчёте компиляции
  $regfile = "m8def.dat"       ' Используемый контроллер
  $crystal = 1000000       ' Частота работы контроллера
  $framesize = 32       ' Размер области используемой для преобразований
  $hwstack = 40       ' Размер аппаратного стека
  $swstack = 16       ' Размер программного стека

'===============================================================================
'           Настройка USART
'===============================================================================
  $baud = 4800
  Ucsra.1 = 1       ' Baud = Baud * 2
  Config Com1 = Baud , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

'===============================================================================
'           Настройка АЦП
'===============================================================================
'Режимы считывания: Single - единичное считывание, результаты заносятся в ADCL, ADCH; Free – постоянное считывание, результаты заносятся в ADCL, ADCH, но происходит всё автономно
  Config Adc = Single , Prescaler = Auto , Reference = Avcc       ' Prescaler может быть 2,4,8,16,32,64,128 или Auto, в случае Auto компилятор выбирает подходящую частоту работы АЦП.
  Config Single = Scientific , Digits = 5       ' Ограничиваем расчёты пятью знаками после запятой

  Dim Данные_ацп_word As Word
  Dim Данные_ацп_single As Single
  Dim Данные_ацп_str As String * 5

'===============================================================================
'           Настройка таймера для работы 7-seg LED индикации
'===============================================================================
  Config Timer0 = Timer , Prescale = 8 , Clear Timer = 0       ' конфигурируем таймер индикации    PRESCALE= 1|8|64|256|1024
  On Timer0 Индикация_7seg_led       ' Nosave        ' Подпрограмма для обработки прерывания
  Stop Timer0

'===============================================================================
'           Настройка портов МК для работы 7-seg LED индикации
'===============================================================================
  Const Const_количество_разрядов = 4

  A Alias Portb.0 : Config A = Output
  B Alias Portb.1 : Config B = Output
  C Alias Portb.2 : Config C = Output
  D Alias Portb.3 : Config D = Output
  E Alias Portb.4 : Config E = Output
  F Alias Portb.5 : Config F = Output
  G Alias Portb.6 : Config G = Output
  H Alias Portb.7 : Config H = Output

  Разряд_1 Alias Portd.4 : Config Разряд_1 = Output
  Разряд_2 Alias Portd.5 : Config Разряд_2 = Output
  Разряд_3 Alias Portd.6 : Config Разряд_3 = Output
  Разряд_4 Alias Portd.7 : Config Разряд_4 = Output

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П Е Р Е М Е Н Н Ы Е
'===============================================================================

  Dim Счетчик_разрядов As Byte       ' Используется в обработчике прерывания TIMER0
  Dim Счетчик_выводимого As Byte
  Dim Temp_buffer_7seg_led As Byte       ' Используется в обработчике прерывания TIMER0

' Значения частоты мигания и длительности засветки знакоместа на LED дисплее при "Флаг_мигание_знакоместа(n) = 1"
  Dim Флаги_миганий As Byte
  Dim Счетчик_миганий As Word       ' Счетчик для обработки частоты и длительности мигания, используется в подпрограмме "Индикация_7seg_led"
  Dim Частота_мигания As Word : Частота_мигания = 200       ' переменная, для хранения значения частоты мигания при  Флаг_мигание(n) = 1
  Dim Длительность_горения_при_мигании As Word : Длительность_горения_при_мигании = 100       ' переменная, для хранения значения длительности горения знакоместа при Флаг_мигание(n) = 1

  Dim Буфер_7seg(const_количество_разрядов) As Byte       ' Выводимый буфер 7-seg LED, используется для перекодировки символов в коды 7-seg LED
  Dim Buffer_7seg_led(const_количество_разрядов) As Byte       ' Выводимый буфер 7-seg LED, используется в обработчике прерывания TIMER0
  Dim Флаг_мигание_знакоместа(const_количество_разрядов) As Byte       ' Хранение флагов мигания знокомест

  Dim Буфер_7seg_str As String * 10       ' Выводимый строковый буфер 7-seg LED

  Dim Tmp_byte As Byte , Длина_строки As Byte , Символ_byte As Byte
  Dim Знакоместо As Byte , Цикл_знакоместо As Byte , Blink_знакоместо As Byte
  Dim Символ_str As String * 1 , Temp_буфер_7seg_str As String * 10

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П О Д П Р О Г Р А М М Ы
'===============================================================================

  Declare Sub Print_7seg_led(byval Copy_str As String , Byval Copy_byte As Byte)       ' Copy_byte - признак мигающего знакоместа

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'--------------  Разрешаем работу необходимых прерываний  ----------------------
'  Enable Adc : Start Adc
  Enable Timer0 : Start Timer0       ' Разрешаем работу прерывания по ПЕРЕПОЛНЕНИЮ
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

    Данные_ацп_word = Getadc(0)
    Данные_ацп_single = Данные_ацп_word * 0.0488
    Данные_ацп_str = Fusing(данные_ацп_single , "#.#")
    Данные_ацп_str = " " + Данные_ацп_str

    If Данные_ацп_word < 200 Then Данные_ацп_str = " " + Данные_ацп_str

    Print_7seg_led Данные_ацп_str , &B_0000_0000
    Print Данные_ацп_str

    Waitms 200

'   Idle       ' Отправляем МК на тихий час
'===============================================================================
  Goto Главный_цикл
End
'===============================================================================

'===============================================================================
  Sub Print_7seg_led(byval Copy_str As String , Byval Copy_byte)
'===============================================================================
    Знакоместо = 0       ' Обнуляемся, иначе в переменной возможно наличие мусора
    Blink_знакоместо = Copy_byte       ' Забираем мигающие разряды
    Temp_буфер_7seg_str = Copy_str       ' Забираем выводимую строковую переменную

'Узнаём длину выводимой строки
    Длина_строки = Len(temp_буфер_7seg_str)

'Обрезаем лишние символы по количеству выводимых разрядов 7-seg LED индикации
    Tmp_byte = Const_количество_разрядов + 1
    If Длина_строки > Tmp_byte Then
        Temp_буфер_7seg_str = Left(temp_буфер_7seg_str , Tmp_byte)
        Длина_строки = Tmp_byte
    End If       ' If Длина_строки > 5 Then

'Конвертируем буфер из ASCII в коды 7-seg LED индикации
    For Цикл_знакоместо = 1 To Длина_строки
        Знакоместо = Знакоместо + 1       ' Считам разряды
        Символ_str = Mid(temp_буфер_7seg_str , Цикл_знакоместо , 1)       ' Берём по одному символу из строки
        Символ_byte = Asc(символ_str)       ' Узнаём код символа согласно "Таблицы кодов ASCII"

        If Символ_byte = 46 Then       ' Если точка ".", добавляем точку в предыдущем разряде
            Знакоместо = Знакоместо - 1       ' Выводим "символ "точка"" в !!! предыдущем разряде !!!
            Буфер_7seg(знакоместо) = Буфер_7seg(знакоместо) Xor &B_1000_0000       ' Выводим "символ "точка"" в !!! предыдущем разряде !!!
         Elseif Символ_byte = 176 Then
            Буфер_7seg(знакоместо) = &H63       ' Выводим символ "°", значек градуса Сельсия для индикаторов с ОК
           ' Буфер_7seg(знакоместо) = &H9C       ' Выводим символ "°", значек градуса Сельсия для индикаторов с ОА
          Else
            Символ_byte = Символ_byte - 32
            Буфер_7seg(знакоместо) = Lookup(символ_byte , Коды_7seg_led_oa)
        End If       ' If Символ_byte = 46 Then
    Next Цикл_знакоместо       ' For Цикл_знакоместо = 1 To Длина_строки

'---------  Если надо, выставляем флаги мигания нужными разрядами  -------------
'Непосредственно сам процесс мигания, реализован в обработчике прерывания TIMER0
'Количество знакомест 7-seg LED индикаторов, мы не арабы, а тем более, не евреи, но считать будем справа налево
    Знакоместо = 4
'Поднимаем или сбрасываем флаги миганий
    For Цикл_знакоместо = 0 To 3
        If Blink_знакоместо.цикл_знакоместо = 1 Then
            Флаг_мигание_знакоместа(знакоместо) = 1
          Else
            Флаг_мигание_знакоместа(знакоместо) = 0
        End If
        Знакоместо = Знакоместо - 1       ' Считаем разряды
    Next Цикл_знакоместо       ' Время обработки команды = 16 тактов

'-------------------------------------------------------------------------------
  End Sub
'===============================================================================

'===============================================================================
  Индикация_7seg_led:       ' Прерывание TIMER0, обработка 7-seg LED индикации
'-------------------------------------------------------------------------------
   'Перебираем разряды 7-seg LED индикации
    Счетчик_разрядов = Счетчик_разрядов + 1

   'Ограничиваем счётчик
    If Счетчик_разрядов > 4 Then
        Счетчик_разрядов = 1
    End If       ' If Счетчик_разрядов > 4 Then

   'Считам длительность и частоту мигания разрядов 7-seg LED индикаторов
    Счетчик_миганий = Счетчик_миганий + 1
    If Счетчик_миганий > Частота_мигания Then
        Счетчик_миганий = 1       ' длительность мигания
    End If       ' If Счетчик_миганий > Частота_мигания Then

   'Собственно занимаемся миганием разрядов 7-seg LED индикаторов
    If Флаг_мигание_знакоместа(счетчик_разрядов) = 1 And Счетчик_миганий > Длительность_горения_при_мигании Then       ' Если флаг мигания этого разряда выставлен и счетчик > 200
        Temp_buffer_7seg_led = &H00       ' Выводим пустое место в соответствующем разряде, индикаторы с ОК
      Else
        Temp_buffer_7seg_led = Буфер_7seg(счетчик_разрядов)
    End If       ' If Флаг_мигание_знакоместа(счетчик_разрядов) = 1 And Счетчик_миганий > Длительность_горения_при_мигании Then

    'Гасим все разряды, тем самым предотвращая паразитные мигания 7-seg LED индикаторов
    'Если используется регулировка яркости, закомментируте строку
    Reset Разряд_1 : Reset Разряд_2 : Reset Разряд_3 : Reset Разряд_4

   'Раскидываем сегменты по ножкам МК
    A = Temp_buffer_7seg_led.0       ' Сегмент "А"
    B = Temp_buffer_7seg_led.1       ' Сегмент "B"
    C = Temp_buffer_7seg_led.2       ' Сегмент "C"
    D = Temp_buffer_7seg_led.3       ' Сегмент "D"
    E = Temp_buffer_7seg_led.4       ' Сегмент "E"
    F = Temp_buffer_7seg_led.5       ' Сегмент "F"
    G = Temp_buffer_7seg_led.6       ' Сегмент "G"
    H = Temp_buffer_7seg_led.7       ' Сегмент "H (Точка)"

   'Включаем соответствующий разряд индикатора
    On Счетчик_разрядов Goto Засвет_0 , Засвет_1 , Засвет_2 , Засвет_3 , Засвет_4

    Засвет_1:
      Set Разряд_1
      Goto Выход_индикация_7seg_led

    Засвет_2:
      Set Разряд_2
      Goto Выход_индикация_7seg_led

    Засвет_3:
      Set Разряд_3
      Goto Выход_индикация_7seg_led

    Засвет_4:
      Set Разряд_4

    Засвет_0:
'-------------------------------------------------------------------------------
   Выход_индикация_7seg_led:
  Return
'===============================================================================

'===============================================================================
  Коды_7seg_led_oa:       ' Таблица для 7-seg LED с общим анодом
'-------------------------------------------------------------------------------
    $asm
     .db &HFF       ' 32 - "Пробел"
     .db 0       '    33 - "!"
     .db 0       '    34 - "Верхние кавычки"
     .db 0       '    35 - "#"
     .db 0       '    36 - "$"
     .db 0       '    37 - "%"
     .db 0       '    38 - "&"
     .db 0       '    39 - "'"
     .db 0       '    40 - "("
     .db 0       '    41 - ")"
     .db 0       '    42 - "*"
     .db 0       '    43 - "+"
     .db 0       '    44 - ","
     .db &HBF       ' 45 - "-"
     .db &H7F       ' 46 - "."
     .db 0       '    47 - "/"
     .db &HC0       ' 48 - "0"
     .db &HF9       ' 49 - "1"
     .db &HA4       ' 50 - "2"
     .db &HB0       ' 51 - "3"
     .db &H99       ' 52 - "4"
     .db &H92       ' 53 - "5"
     .db &H82       ' 54 - "6"
     .db &HF8       ' 55 - "7"
     .db &H80       ' 56 - "8"
     .db &H90       ' 57 - "9"
     .db 0       '    58 - ":"
     .db 0       '    59 - ";"
     .db 0       '    60 - "<"
     .db 0       '    61 - "="
     .db 0       '    62 - ">"
     .db 0       '    63 - "?"
     .db 0       '    64 - "@"
     .db &H88       ' 65 - "A"
     .db 0       '    66 - "B"
     .db &HC6       ' 67 - "C"
     .db 0       '    68 - "D"
     .db &H86       ' 69 - "E"
     .db &H8E       ' 70 - "F"
     .db 0       '    71 - "G"
     .db &H89       ' 72 - "H"
     .db &HF9       ' 73 - "I"
     .db &HF1       ' 74 - "J"
     .db 0       '    75 - "K"
     .db &H7C       ' 76 - "L"
     .db 0       '    77 - "M"
     .db 0       '    78 - "N"
     .db &HC0       ' 79 - "O"
     .db &H8C       ' 80 - "P"
     .db 0       '    81 - "Q"
     .db 0       '    82 - "R"
     .db &H92       ' 83 - "S"
     .db 0       '    84 - "T"
     .db &HC1       ' 85 - "U"
     .db 0       '    86 - "V"
     .db 0       '    87 - "W"
     .db 0       '    88 - "X"
     .db &H91       ' 89 - "Y"
     .db 0       '    90 - "Z"
     .db &HC6       ' 91 - "["
     .db 0       '    92 - "\"
     .db &HF0       ' 93 - "]"
     .db 0       '    94 - "^"
     .db &HF7       ' 95 - "_" - подчёркивание
     .db 0       '    96 - "`"
     .db 0       '    97 - "a"
     .db &H83       ' 98 - "b"
     .db &HA7       ' 99 - "c"
     .db &HA1       '100 - "d"
     .db 0       '   101 - "e"
     .db 0       '   102 - "f"
     .db 0       '   103 - "g"
     .db &H8B       '104 - "h"
     .db &HFB       '105 - "i"
     .db 0       '   106 - "j"
     .db 0       '   107 - "k"
     .db 0       '   108 - "l"
     .db 0       '   109 - "m"
     .db &HAB       '110 - "n"
     .db &HA3       '111 - "o"
     .db 0       '   112 - "p"
     .db 0       '   113 - "q"
     .db &HAF       '114 - "r"
     .db 0       '   115 - "s"
     .db &H87       '116 - "t"
     .db &HE3       '117 - "u"
    $end Asm
'===============================================================================

http://sf.uploads.ru/t/wCFmE.jpg

Отредактировано sasha_1973 (2014-12-31 10:30:49)

0

7

Благодарю! Я вам очень признателен!

0

8

Второй вариант, существенно точнее, как раз для термопары, 12-бит АЦП с помощью оверсемплинга (oversampling)

Для дальнейшего увеличения разрядности АЦП, было-бы неплохо увеличить количество разрядов 7-seg led индикации.

Симуляция + исходник, закинул Вам на mail.

Исходник 12 бит АЦП с помощью оверсемплинга (oversampling)

$map       ' Получаем карту распределения памяти в отчёте компиляции
  $regfile = "m8def.dat"       ' Используемый контроллер
  $crystal = 1000000       ' Частота работы контроллера
  $framesize = 32       ' Размер области используемой для преобразований
  $hwstack = 40       ' Размер аппаратного стека
  $swstack = 16       ' Размер программного стека

'===============================================================================
'           Настройка USART
'===============================================================================
  $baud = 4800
  Ucsra.1 = 1       ' Baud = Baud * 2
  Config Com1 = Baud , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

'===============================================================================
'           Настройка АЦП
'===============================================================================
'Режимы считывания: Single - единичное считывание, результаты заносятся в ADCL, ADCH; Free – постоянное считывание, результаты заносятся в ADCL, ADCH, но происходит всё автономно
  Config Adc = Free , Prescaler = Auto , Reference = Avcc
'  Config Adc = Single , Prescaler = Auto , Reference = Avcc       ' Prescaler может быть 2,4,8,16,32,64,128 или Auto, в случае Auto компилятор выбирает подходящую частоту работы АЦП.
  On Adc Обработка_прерывания_ацп
  Config Single = Scientific , Digits = 3       ' Ограничиваем расчёты пятью знаками после запятой

  Dim Флаг_данные_ацп As Byte
  Dim Данные_ацп As Word
  Dim Сырые_данные_ацп(2) As Byte At Данные_ацп Overlay

  Dim Сумма_ацп As Word
  Dim 12_bit_данные_ацп As Word

  Dim Готовые_данные_ацп_word As Word

  Dim Счетчик_измерений_ацп As Byte

  Dim Данные_ацп_word As Word
  Dim Данные_ацп_single As Single
  Dim Данные_ацп_str As String * 10
  Dim Готовые_данные_ацп_str As String * 5

'===============================================================================
'           Настройка таймера для работы 7-seg LED индикации
'===============================================================================
  Config Timer0 = Timer , Prescale = 8 , Clear Timer = 0       ' конфигурируем таймер индикации    PRESCALE= 1|8|64|256|1024
  On Timer0 Индикация_7seg_led       ' Nosave        ' Подпрограмма для обработки прерывания
  Stop Timer0

'===============================================================================
'           Настройка портов МК для работы 7-seg LED индикации
'===============================================================================
  Const Const_количество_разрядов = 4

  A Alias Portb.0 : Config A = Output
  B Alias Portb.1 : Config B = Output
  C Alias Portb.2 : Config C = Output
  D Alias Portb.3 : Config D = Output
  E Alias Portb.4 : Config E = Output
  F Alias Portb.5 : Config F = Output
  G Alias Portb.6 : Config G = Output
  H Alias Portb.7 : Config H = Output

  Разряд_1 Alias Portd.4 : Config Разряд_1 = Output
  Разряд_2 Alias Portd.5 : Config Разряд_2 = Output
  Разряд_3 Alias Portd.6 : Config Разряд_3 = Output
  Разряд_4 Alias Portd.7 : Config Разряд_4 = Output

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П Е Р Е М Е Н Н Ы Е
'===============================================================================

  Dim Счетчик_разрядов As Byte       ' Используется в обработчике прерывания TIMER0
  Dim Счетчик_выводимого As Byte
  Dim Temp_buffer_7seg_led As Byte       ' Используется в обработчике прерывания TIMER0

' Значения частоты мигания и длительности засветки знакоместа на LED дисплее при "Флаг_мигание_знакоместа(n) = 1"
  Dim Флаги_миганий As Byte
  Dim Счетчик_миганий As Word       ' Счетчик для обработки частоты и длительности мигания, используется в подпрограмме "Индикация_7seg_led"
  Dim Частота_мигания As Word : Частота_мигания = 200       ' переменная, для хранения значения частоты мигания при  Флаг_мигание(n) = 1
  Dim Длительность_горения_при_мигании As Word : Длительность_горения_при_мигании = 100       ' переменная, для хранения значения длительности горения знакоместа при Флаг_мигание(n) = 1

  Dim Буфер_7seg(const_количество_разрядов) As Byte       ' Выводимый буфер 7-seg LED, используется для перекодировки символов в коды 7-seg LED
  Dim Buffer_7seg_led(const_количество_разрядов) As Byte       ' Выводимый буфер 7-seg LED, используется в обработчике прерывания TIMER0
  Dim Флаг_мигание_знакоместа(const_количество_разрядов) As Byte       ' Хранение флагов мигания знокомест

  Dim Буфер_7seg_str As String * 10       ' Выводимый строковый буфер 7-seg LED

  Dim Tmp_byte As Byte , Длина_строки As Byte , Символ_byte As Byte
  Dim Знакоместо As Byte , Цикл_знакоместо As Byte , Blink_знакоместо As Byte
  Dim Символ_str As String * 1 , Temp_буфер_7seg_str As String * 10

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П О Д П Р О Г Р А М М Ы
'===============================================================================

  Declare Sub Print_7seg_led(byval Copy_str As String , Byval Copy_byte As Byte)       ' Copy_byte - признак мигающего знакоместа

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'--------------  Разрешаем работу необходимых прерываний  ----------------------
  Enable Adc : Start Adc
  Enable Timer0 : Start Timer0       ' Разрешаем работу прерывания по ПЕРЕПОЛНЕНИЮ
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

    If Флаг_данные_ацп <> 0 Then

        Данные_ацп_single = 12_bit_данные_ацп * 1.22
        Готовые_данные_ацп_word = Данные_ацп_single
        Данные_ацп_str = Str(готовые_данные_ацп_word)
        Готовые_данные_ацп_str = Format(данные_ацп_str , "   0" )
        Print_7seg_led Готовые_данные_ацп_str , &B_0000_0000
        Print Готовые_данные_ацп_str
        Флаг_данные_ацп = 0
        Goto Главный_цикл
    End If

   Idle       ' Отправляем МК на тихий час
'===============================================================================
  Goto Главный_цикл
End
'===============================================================================

'===============================================================================
  Обработка_прерывания_ацп:
'-------------------------------------------------------------------------------

    Сырые_данные_ацп(1) = Adcl
    Сырые_данные_ацп(2) = Adch

'------  Набираем сумму измерений для 12 бит  ----------

    Сумма_ацп = Сумма_ацп + Данные_ацп

    Incr Счетчик_измерений_ацп

    If Счетчик_измерений_ацп = 16 Then
        Счетчик_измерений_ацп = 0
        Shift Сумма_ацп , Right , 2
        12_bit_данные_ацп = Сумма_ацп
        Флаг_данные_ацп = 1
        Сумма_ацп = 0
    End If
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Sub Print_7seg_led(byval Copy_str As String , Byval Copy_byte)
'===============================================================================
    Знакоместо = 0       ' Обнуляемся, иначе в переменной возможно наличие мусора
    Blink_знакоместо = Copy_byte       ' Забираем мигающие разряды
    Temp_буфер_7seg_str = Copy_str       ' Забираем выводимую строковую переменную

'Узнаём длину выводимой строки
    Длина_строки = Len(temp_буфер_7seg_str)

'Обрезаем лишние символы по количеству выводимых разрядов 7-seg LED индикации
    Tmp_byte = Const_количество_разрядов + 1
    If Длина_строки > Tmp_byte Then
        Temp_буфер_7seg_str = Left(temp_буфер_7seg_str , Tmp_byte)
        Длина_строки = Tmp_byte
    End If       ' If Длина_строки > 5 Then

'Конвертируем буфер из ASCII в коды 7-seg LED индикации
    For Цикл_знакоместо = 1 To Длина_строки
        Знакоместо = Знакоместо + 1       ' Считам разряды
        Символ_str = Mid(temp_буфер_7seg_str , Цикл_знакоместо , 1)       ' Берём по одному символу из строки
        Символ_byte = Asc(символ_str)       ' Узнаём код символа согласно "Таблицы кодов ASCII"

        If Символ_byte = 46 Then       ' Если точка ".", добавляем точку в предыдущем разряде
            Знакоместо = Знакоместо - 1       ' Выводим "символ "точка"" в !!! предыдущем разряде !!!
            Буфер_7seg(знакоместо) = Буфер_7seg(знакоместо) Xor &B_1000_0000       ' Выводим "символ "точка"" в !!! предыдущем разряде !!!
         Elseif Символ_byte = 176 Then
            Буфер_7seg(знакоместо) = &H63       ' Выводим символ "°", значек градуса Сельсия для индикаторов с ОК
           ' Буфер_7seg(знакоместо) = &H9C       ' Выводим символ "°", значек градуса Сельсия для индикаторов с ОА
          Else
            Символ_byte = Символ_byte - 32
            Буфер_7seg(знакоместо) = Lookup(символ_byte , Коды_7seg_led_oa)
        End If       ' If Символ_byte = 46 Then
    Next Цикл_знакоместо       ' For Цикл_знакоместо = 1 To Длина_строки

'---------  Если надо, выставляем флаги мигания нужными разрядами  -------------
'Непосредственно сам процесс мигания, реализован в обработчике прерывания TIMER0
'Количество знакомест 7-seg LED индикаторов, мы не арабы, а тем более, не евреи, но считать будем справа налево
    Знакоместо = 4
'Поднимаем или сбрасываем флаги миганий
    For Цикл_знакоместо = 0 To 3
        If Blink_знакоместо.цикл_знакоместо = 1 Then
            Флаг_мигание_знакоместа(знакоместо) = 1
          Else
            Флаг_мигание_знакоместа(знакоместо) = 0
        End If
        Знакоместо = Знакоместо - 1       ' Считаем разряды
    Next Цикл_знакоместо       ' Время обработки команды = 16 тактов

'-------------------------------------------------------------------------------
  End Sub
'===============================================================================

'===============================================================================
  Индикация_7seg_led:       ' Прерывание TIMER0, обработка 7-seg LED индикации
'-------------------------------------------------------------------------------
   'Перебираем разряды 7-seg LED индикации
    Счетчик_разрядов = Счетчик_разрядов + 1

   'Ограничиваем счётчик
    If Счетчик_разрядов > 4 Then
        Счетчик_разрядов = 1
    End If       ' If Счетчик_разрядов > 4 Then

   'Считам длительность и частоту мигания разрядов 7-seg LED индикаторов
    Счетчик_миганий = Счетчик_миганий + 1
    If Счетчик_миганий > Частота_мигания Then
        Счетчик_миганий = 1       ' длительность мигания
    End If       ' If Счетчик_миганий > Частота_мигания Then

   'Собственно занимаемся миганием разрядов 7-seg LED индикаторов
    If Флаг_мигание_знакоместа(счетчик_разрядов) = 1 And Счетчик_миганий > Длительность_горения_при_мигании Then       ' Если флаг мигания этого разряда выставлен и счетчик > 200
        Temp_buffer_7seg_led = &H00       ' Выводим пустое место в соответствующем разряде, индикаторы с ОК
      Else
        Temp_buffer_7seg_led = Буфер_7seg(счетчик_разрядов)
    End If       ' If Флаг_мигание_знакоместа(счетчик_разрядов) = 1 And Счетчик_миганий > Длительность_горения_при_мигании Then

    'Гасим все разряды, тем самым предотвращая паразитные мигания 7-seg LED индикаторов
    'Если используется регулировка яркости, закомментируте строку
    Reset Разряд_1 : Reset Разряд_2 : Reset Разряд_3 : Reset Разряд_4

   'Раскидываем сегменты по ножкам МК
    A = Temp_buffer_7seg_led.0       ' Сегмент "А"
    B = Temp_buffer_7seg_led.1       ' Сегмент "B"
    C = Temp_buffer_7seg_led.2       ' Сегмент "C"
    D = Temp_buffer_7seg_led.3       ' Сегмент "D"
    E = Temp_buffer_7seg_led.4       ' Сегмент "E"
    F = Temp_buffer_7seg_led.5       ' Сегмент "F"
    G = Temp_buffer_7seg_led.6       ' Сегмент "G"
    H = Temp_buffer_7seg_led.7       ' Сегмент "H (Точка)"

   'Включаем соответствующий разряд индикатора
    On Счетчик_разрядов Goto Засвет_0 , Засвет_1 , Засвет_2 , Засвет_3 , Засвет_4

    Засвет_1:
      Set Разряд_1
      Goto Выход_индикация_7seg_led

    Засвет_2:
      Set Разряд_2
      Goto Выход_индикация_7seg_led

    Засвет_3:
      Set Разряд_3
      Goto Выход_индикация_7seg_led

    Засвет_4:
      Set Разряд_4

    Засвет_0:
'-------------------------------------------------------------------------------
   Выход_индикация_7seg_led:
  Return
'===============================================================================

'===============================================================================
  Коды_7seg_led_oa:       ' Таблица для 7-seg LED с общим анодом
'-------------------------------------------------------------------------------
    $asm
     .db &HFF       ' 32 - "Пробел"
     .db 0       '    33 - "!"
     .db 0       '    34 - "Верхние кавычки"
     .db 0       '    35 - "#"
     .db 0       '    36 - "$"
     .db 0       '    37 - "%"
     .db 0       '    38 - "&"
     .db 0       '    39 - "'"
     .db 0       '    40 - "("
     .db 0       '    41 - ")"
     .db 0       '    42 - "*"
     .db 0       '    43 - "+"
     .db 0       '    44 - ","
     .db &HBF       ' 45 - "-"
     .db &H7F       ' 46 - "."
     .db 0       '    47 - "/"
     .db &HC0       ' 48 - "0"
     .db &HF9       ' 49 - "1"
     .db &HA4       ' 50 - "2"
     .db &HB0       ' 51 - "3"
     .db &H99       ' 52 - "4"
     .db &H92       ' 53 - "5"
     .db &H82       ' 54 - "6"
     .db &HF8       ' 55 - "7"
     .db &H80       ' 56 - "8"
     .db &H90       ' 57 - "9"
     .db 0       '    58 - ":"
     .db 0       '    59 - ";"
     .db 0       '    60 - "<"
     .db 0       '    61 - "="
     .db 0       '    62 - ">"
     .db 0       '    63 - "?"
     .db 0       '    64 - "@"
     .db &H88       ' 65 - "A"
     .db 0       '    66 - "B"
     .db &HC6       ' 67 - "C"
     .db 0       '    68 - "D"
     .db &H86       ' 69 - "E"
     .db &H8E       ' 70 - "F"
     .db 0       '    71 - "G"
     .db &H89       ' 72 - "H"
     .db &HF9       ' 73 - "I"
     .db &HF1       ' 74 - "J"
     .db 0       '    75 - "K"
     .db &H7C       ' 76 - "L"
     .db 0       '    77 - "M"
     .db 0       '    78 - "N"
     .db &HC0       ' 79 - "O"
     .db &H8C       ' 80 - "P"
     .db 0       '    81 - "Q"
     .db 0       '    82 - "R"
     .db &H92       ' 83 - "S"
     .db 0       '    84 - "T"
     .db &HC1       ' 85 - "U"
     .db 0       '    86 - "V"
     .db 0       '    87 - "W"
     .db 0       '    88 - "X"
     .db &H91       ' 89 - "Y"
     .db 0       '    90 - "Z"
     .db &HC6       ' 91 - "["
     .db 0       '    92 - "\"
     .db &HF0       ' 93 - "]"
     .db 0       '    94 - "^"
     .db &HF7       ' 95 - "_" - подчёркивание
     .db 0       '    96 - "`"
     .db 0       '    97 - "a"
     .db &H83       ' 98 - "b"
     .db &HA7       ' 99 - "c"
     .db &HA1       '100 - "d"
     .db 0       '   101 - "e"
     .db 0       '   102 - "f"
     .db 0       '   103 - "g"
     .db &H8B       '104 - "h"
     .db &HFB       '105 - "i"
     .db 0       '   106 - "j"
     .db 0       '   107 - "k"
     .db 0       '   108 - "l"
     .db 0       '   109 - "m"
     .db &HAB       '110 - "n"
     .db &HA3       '111 - "o"
     .db 0       '   112 - "p"
     .db 0       '   113 - "q"
     .db &HAF       '114 - "r"
     .db 0       '   115 - "s"
     .db &H87       '116 - "t"
     .db &HE3       '117 - "u"
    $end Asm
'===============================================================================

http://sf.uploads.ru/t/f7wbQ.jpg
     .db

Отредактировано sasha_1973 (2014-12-31 11:07:35)

0

9

Эммм... проблема... заливаю прошивку как из 1 варианта, ну только порты меняю... появляется вот такая ерунда...
вот http://uploads.ru/?g=S9Kb1.jpg

0

10

Mr.Lex написал(а):

Эммм... проблема... заливаю прошивку как из 1 варианта, ну только порты меняю... появляется вот такая ерунда...
вот http://uploads.ru/?g=S9Kb1.jpg

У Вас индикаторы с ОА или ОК ?

0

11

Исходник с общим катодом

$map       ' Получаем карту распределения памяти в отчёте компиляции
  $regfile = "m8def.dat"       ' Используемый контроллер
  $crystal = 1000000       ' Частота работы контроллера
  $framesize = 32       ' Размер области используемой для преобразований
  $hwstack = 40       ' Размер аппаратного стека
  $swstack = 16       ' Размер программного стека

'===============================================================================
'           Настройка USART
'===============================================================================
  $baud = 4800
  Ucsra.1 = 1       ' Baud = Baud * 2
  Config Com1 = Baud , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

'===============================================================================
'           Настройка АЦП
'===============================================================================
'Режимы считывания: Single - единичное считывание, результаты заносятся в ADCL, ADCH; Free – постоянное считывание, результаты заносятся в ADCL, ADCH, но происходит всё автономно
  Config Adc = Single , Prescaler = Auto , Reference = Avcc       ' Prescaler может быть 2,4,8,16,32,64,128 или Auto, в случае Auto компилятор выбирает подходящую частоту работы АЦП.
  Config Single = Scientific , Digits = 5       ' Ограничиваем расчёты пятью знаками после запятой

  Dim Данные_ацп_word As Word
  Dim Данные_ацп_single As Single
  Dim Данные_ацп_str As String * 5

'===============================================================================
'           Настройка таймера для работы 7-seg LED индикации
'===============================================================================
  Config Timer0 = Timer , Prescale = 8 , Clear Timer = 0       ' конфигурируем таймер индикации    PRESCALE= 1|8|64|256|1024
  On Timer0 Индикация_7seg_led       ' Nosave        ' Подпрограмма для обработки прерывания
  Stop Timer0

'===============================================================================
'           Настройка портов МК для работы 7-seg LED индикации
'===============================================================================
  Const Const_количество_разрядов = 4

  A Alias Portb.0 : Config A = Output
  B Alias Portb.1 : Config B = Output
  C Alias Portb.2 : Config C = Output
  D Alias Portb.3 : Config D = Output
  E Alias Portb.4 : Config E = Output
  F Alias Portb.5 : Config F = Output
  G Alias Portb.6 : Config G = Output
  H Alias Portb.7 : Config H = Output

  Разряд_1 Alias Portd.4 : Config Разряд_1 = Output
  Разряд_2 Alias Portd.5 : Config Разряд_2 = Output
  Разряд_3 Alias Portd.6 : Config Разряд_3 = Output
  Разряд_4 Alias Portd.7 : Config Разряд_4 = Output

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П Е Р Е М Е Н Н Ы Е
'===============================================================================

  Dim Счетчик_разрядов As Byte       ' Используется в обработчике прерывания TIMER0
  Dim Счетчик_выводимого As Byte
  Dim Temp_buffer_7seg_led As Byte       ' Используется в обработчике прерывания TIMER0

' Значения частоты мигания и длительности засветки знакоместа на LED дисплее при "Флаг_мигание_знакоместа(n) = 1"
  Dim Флаги_миганий As Byte
  Dim Счетчик_миганий As Word       ' Счетчик для обработки частоты и длительности мигания, используется в подпрограмме "Индикация_7seg_led"
  Dim Частота_мигания As Word : Частота_мигания = 200       ' переменная, для хранения значения частоты мигания при  Флаг_мигание(n) = 1
  Dim Длительность_горения_при_мигании As Word : Длительность_горения_при_мигании = 100       ' переменная, для хранения значения длительности горения знакоместа при Флаг_мигание(n) = 1

  Dim Буфер_7seg(const_количество_разрядов) As Byte       ' Выводимый буфер 7-seg LED, используется для перекодировки символов в коды 7-seg LED
  Dim Buffer_7seg_led(const_количество_разрядов) As Byte       ' Выводимый буфер 7-seg LED, используется в обработчике прерывания TIMER0
  Dim Флаг_мигание_знакоместа(const_количество_разрядов) As Byte       ' Хранение флагов мигания знокомест

  Dim Буфер_7seg_str As String * 10       ' Выводимый строковый буфер 7-seg LED

  Dim Tmp_byte As Byte , Длина_строки As Byte , Символ_byte As Byte
  Dim Знакоместо As Byte , Цикл_знакоместо As Byte , Blink_знакоместо As Byte
  Dim Символ_str As String * 1 , Temp_буфер_7seg_str As String * 10

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П О Д П Р О Г Р А М М Ы
'===============================================================================

  Declare Sub Print_7seg_led(byval Copy_str As String , Byval Copy_byte As Byte)       ' Copy_byte - признак мигающего знакоместа

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'--------------  Разрешаем работу необходимых прерываний  ----------------------
'  Enable Adc : Start Adc
  Enable Timer0 : Start Timer0       ' Разрешаем работу прерывания по ПЕРЕПОЛНЕНИЮ
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

    Данные_ацп_word = Getadc(0)
    Данные_ацп_single = Данные_ацп_word * 0.0488
    Данные_ацп_str = Fusing(данные_ацп_single , "&.&")
    Данные_ацп_str = " " + Данные_ацп_str

    If Данные_ацп_word < 200 Then Данные_ацп_str = " " + Данные_ацп_str

    Print_7seg_led Данные_ацп_str , &B_0000_0000
    Print Данные_ацп_str

    Waitms 200

'   Idle       ' Отправляем МК на тихий час
'===============================================================================
  Goto Главный_цикл
End
'===============================================================================

'===============================================================================
  Sub Print_7seg_led(byval Copy_str As String , Byval Copy_byte)
'===============================================================================
    Знакоместо = 0       ' Обнуляемся, иначе в переменной возможно наличие мусора
    Blink_знакоместо = Copy_byte       ' Забираем мигающие разряды
    Temp_буфер_7seg_str = Copy_str       ' Забираем выводимую строковую переменную

'Узнаём длину выводимой строки
    Длина_строки = Len(temp_буфер_7seg_str)

'Обрезаем лишние символы по количеству выводимых разрядов 7-seg LED индикации
    Tmp_byte = Const_количество_разрядов + 1
    If Длина_строки > Tmp_byte Then
        Temp_буфер_7seg_str = Left(temp_буфер_7seg_str , Tmp_byte)
        Длина_строки = Tmp_byte
    End If       ' If Длина_строки > 5 Then

'Конвертируем буфер из ASCII в коды 7-seg LED индикации
    For Цикл_знакоместо = 1 To Длина_строки
        Знакоместо = Знакоместо + 1       ' Считам разряды
        Символ_str = Mid(temp_буфер_7seg_str , Цикл_знакоместо , 1)       ' Берём по одному символу из строки
        Символ_byte = Asc(символ_str)       ' Узнаём код символа согласно "Таблицы кодов ASCII"

        If Символ_byte = 46 Then       ' Если точка ".", добавляем точку в предыдущем разряде
            Знакоместо = Знакоместо - 1       ' Выводим "символ "точка"" в !!! предыдущем разряде !!!
            Буфер_7seg(знакоместо) = Буфер_7seg(знакоместо) Xor &B_1000_0000       ' Выводим "символ "точка"" в !!! предыдущем разряде !!!
         Elseif Символ_byte = 176 Then
            Буфер_7seg(знакоместо) = &H63       ' Выводим символ "°", значек градуса Сельсия для индикаторов с ОК
           ' Буфер_7seg(знакоместо) = &H9C       ' Выводим символ "°", значек градуса Сельсия для индикаторов с ОА
          Else
            Символ_byte = Символ_byte - 32
            Буфер_7seg(знакоместо) = Lookup(символ_byte , Коды_7seg_led_ok)
        End If       ' If Символ_byte = 46 Then
    Next Цикл_знакоместо       ' For Цикл_знакоместо = 1 To Длина_строки

'---------  Если надо, выставляем флаги мигания нужными разрядами  -------------
'Непосредственно сам процесс мигания, реализован в обработчике прерывания TIMER0
'Количество знакомест 7-seg LED индикаторов, мы не арабы, а тем более, не евреи, но считать будем справа налево
    Знакоместо = 4
'Поднимаем или сбрасываем флаги миганий
    For Цикл_знакоместо = 0 To 3
        If Blink_знакоместо.цикл_знакоместо = 1 Then
            Флаг_мигание_знакоместа(знакоместо) = 1
          Else
            Флаг_мигание_знакоместа(знакоместо) = 0
        End If
        Знакоместо = Знакоместо - 1       ' Считаем разряды
    Next Цикл_знакоместо       ' Время обработки команды = 16 тактов

'-------------------------------------------------------------------------------
  End Sub
'===============================================================================

'===============================================================================
  Индикация_7seg_led:       ' Прерывание TIMER0, обработка 7-seg LED индикации
'-------------------------------------------------------------------------------
   'Перебираем разряды 7-seg LED индикации
    Счетчик_разрядов = Счетчик_разрядов + 1

   'Ограничиваем счётчик
    If Счетчик_разрядов > 4 Then
        Счетчик_разрядов = 1
    End If       ' If Счетчик_разрядов > 4 Then

   'Считам длительность и частоту мигания разрядов 7-seg LED индикаторов
    Счетчик_миганий = Счетчик_миганий + 1
    If Счетчик_миганий > Частота_мигания Then
        Счетчик_миганий = 1       ' длительность мигания
    End If       ' If Счетчик_миганий > Частота_мигания Then

   'Собственно занимаемся миганием разрядов 7-seg LED индикаторов
    If Флаг_мигание_знакоместа(счетчик_разрядов) = 1 And Счетчик_миганий > Длительность_горения_при_мигании Then       ' Если флаг мигания этого разряда выставлен и счетчик > 200
        Temp_buffer_7seg_led = &H00       ' Выводим пустое место в соответствующем разряде, индикаторы с ОК
      Else
        Temp_buffer_7seg_led = Буфер_7seg(счетчик_разрядов)
    End If       ' If Флаг_мигание_знакоместа(счетчик_разрядов) = 1 And Счетчик_миганий > Длительность_горения_при_мигании Then

    'Гасим все разряды, тем самым предотвращая паразитные мигания 7-seg LED индикаторов
    'Если используется регулировка яркости, закомментируте строку
    Set Разряд_1 : Set Разряд_2 : Set Разряд_3 : Set Разряд_4

   'Раскидываем сегменты по ножкам МК
    A = Temp_buffer_7seg_led.0       ' Сегмент "А"
    B = Temp_buffer_7seg_led.1       ' Сегмент "B"
    C = Temp_buffer_7seg_led.2       ' Сегмент "C"
    D = Temp_buffer_7seg_led.3       ' Сегмент "D"
    E = Temp_buffer_7seg_led.4       ' Сегмент "E"
    F = Temp_buffer_7seg_led.5       ' Сегмент "F"
    G = Temp_buffer_7seg_led.6       ' Сегмент "G"
    H = Temp_buffer_7seg_led.7       ' Сегмент "H (Точка)"

   'Включаем соответствующий разряд индикатора
    On Счетчик_разрядов Goto Засвет_0 , Засвет_1 , Засвет_2 , Засвет_3 , Засвет_4

    Засвет_1:
      Reset Разряд_1
      Goto Выход_индикация_7seg_led

    Засвет_2:
      Reset Разряд_2
      Goto Выход_индикация_7seg_led

    Засвет_3:
      Reset Разряд_3
      Goto Выход_индикация_7seg_led

    Засвет_4:
      Reset Разряд_4

    Засвет_0:
'-------------------------------------------------------------------------------
   Выход_индикация_7seg_led:
  Return
'===============================================================================

'===============================================================================
  Коды_7seg_led_ok:
'-------------------------------------------------------------------------------
    $asm
     .db 0       '    32 - "Пробел"
     .db 0       '    33 - "!"
     .db 0       '    34 - "Верхние кавычки"
     .db 0       '    35 - "#"
     .db 0       '    36 - "$"
     .db 0       '    37 - "%"
     .db 0       '    38 - "&"
     .db 0       '    39 - "'"
     .db 0       '    40 - "("
     .db 0       '    41 - ")"
     .db 0       '    42 - "*"
     .db 0       '    43 - "+"
     .db 0       '    44 - ","
     .db &H40       ' 45 - "-"
     .db &H80       ' 46 - "."
     .db 0       '    47 - "/"
     .db &H3F       ' 48 - "0"
     .db &H06       ' 49 - "1"
     .db &H5B       ' 50 - "2"
     .db &H4F       ' 51 - "3"
     .db &H66       ' 52 - "4"
     .db &H6D       ' 53 - "5"
     .db &H7D       ' 54 - "6"
     .db &H07       ' 55 - "7"
     .db &H7F       ' 56 - "8"
     .db &H6F       ' 57 - "9"
     .db 0       '    58 - ":"
     .db 0       '    59 - ";"
     .db 0       '    60 - "<"
     .db 0       '    61 - "="
     .db 0       '    62 - ">"
     .db 0       '    63 - "?"
     .db 0       '    64 - "@"
     .db &H77       ' 65 - "A"
     .db 0       '    66 - "B"
     .db &H39       ' 67 - "C"
     .db 0       '    68 - "D"
     .db &H79       ' 69 - "E"
     .db &H71       ' 70 - "F"
     .db 0       '    71 - "G"
     .db &H76       ' 72 - "H"
     .db &H06       ' 73 - "I"
     .db &H0E       ' 74 - "J"
     .db 0       '    75 - "K"
     .db &H38       ' 76 - "L"
     .db 0       '    77 - "M"
     .db 0       '    78 - "N"
     .db &H3F       ' 79 - "O"
     .db &H73       ' 80 - "P"
     .db 0       '    81 - "Q"
     .db 0       '    82 - "R"
     .db &H6D       ' 83 - "S"
     .db 0       '    84 - "T"
     .db &H3E       ' 85 - "U"
     .db 0       '    86 - "V"
     .db 0       '    87 - "W"
     .db 0       '    88 - "X"
     .db &H6E       ' 89 - "Y"
     .db 0       '    90 - "Z"
     .db &H39       ' 91 - "["
     .db 0       '    92 - "\"
     .db &H0F       ' 93 - "]"
     .db 0       '    94 - "^"
     .db &H08       ' 95 - "_" - подчёркивание
     .db 0       '    96 - "`"
     .db 0       '    97 - "a"
     .db &H7C       ' 98 - "b"
     .db &H58       ' 99 - "c"
     .db &H5E       '100 - "d"
     .db 0       '   101 - "e"
     .db 0       '   102 - "f"
     .db 0       '   103 - "g"
     .db &H74       '104 - "h"
     .db &H04       '   105 - "i"
     .db 0       '   106 - "j"
     .db 0       '   107 - "k"
     .db 0       '   108 - "l"
     .db 0       '   109 - "m"
     .db &H54       '110 - "n"
     .db &H5C       '111 - "o"
     .db 0       '   112 - "p"
     .db 0       '   113 - "q"
     .db &H50       '114 - "r"
     .db 0       '   115 - "s"
     .db &H78       '116 - "t"
     .db &H1C       '117 - "u"
    $end Asm
'===============================================================================

12-бит АЦП с общим катодом

$map       ' Получаем карту распределения памяти в отчёте компиляции
  $regfile = "m8def.dat"       ' Используемый контроллер
  $crystal = 1000000       ' Частота работы контроллера
  $framesize = 32       ' Размер области используемой для преобразований
  $hwstack = 40       ' Размер аппаратного стека
  $swstack = 16       ' Размер программного стека

'===============================================================================
'           Настройка USART
'===============================================================================
  $baud = 4800
  Ucsra.1 = 1       ' Baud = Baud * 2
  Config Com1 = Baud , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

'===============================================================================
'           Настройка АЦП
'===============================================================================
'Режимы считывания: Single - единичное считывание, результаты заносятся в ADCL, ADCH; Free – постоянное считывание, результаты заносятся в ADCL, ADCH, но происходит всё автономно
  Config Adc = Free , Prescaler = Auto , Reference = Avcc
'  Config Adc = Single , Prescaler = Auto , Reference = Avcc       ' Prescaler может быть 2,4,8,16,32,64,128 или Auto, в случае Auto компилятор выбирает подходящую частоту работы АЦП.
  On Adc Обработка_прерывания_ацп
  Config Single = Scientific , Digits = 3       ' Ограничиваем расчёты пятью знаками после запятой

  Dim Флаг_данные_ацп As Byte
  Dim Данные_ацп As Word
  Dim Сырые_данные_ацп(2) As Byte At Данные_ацп Overlay

  Dim Сумма_ацп As Word
  Dim 12_bit_данные_ацп As Word

  Dim Готовые_данные_ацп_word As Word

  Dim Счетчик_измерений_ацп As Byte

  Dim Данные_ацп_word As Word
  Dim Данные_ацп_single As Single
  Dim Данные_ацп_str As String * 10
  Dim Готовые_данные_ацп_str As String * 5

'===============================================================================
'           Настройка таймера для работы 7-seg LED индикации
'===============================================================================
  Config Timer0 = Timer , Prescale = 8 , Clear Timer = 0       ' конфигурируем таймер индикации    PRESCALE= 1|8|64|256|1024
  On Timer0 Индикация_7seg_led       ' Nosave        ' Подпрограмма для обработки прерывания
  Stop Timer0

'===============================================================================
'           Настройка портов МК для работы 7-seg LED индикации
'===============================================================================
  Const Const_количество_разрядов = 4

  A Alias Portb.0 : Config A = Output
  B Alias Portb.1 : Config B = Output
  C Alias Portb.2 : Config C = Output
  D Alias Portb.3 : Config D = Output
  E Alias Portb.4 : Config E = Output
  F Alias Portb.5 : Config F = Output
  G Alias Portb.6 : Config G = Output
  H Alias Portb.7 : Config H = Output

  Разряд_1 Alias Portd.4 : Config Разряд_1 = Output
  Разряд_2 Alias Portd.5 : Config Разряд_2 = Output
  Разряд_3 Alias Portd.6 : Config Разряд_3 = Output
  Разряд_4 Alias Portd.7 : Config Разряд_4 = Output

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П Е Р Е М Е Н Н Ы Е
'===============================================================================

  Dim Счетчик_разрядов As Byte       ' Используется в обработчике прерывания TIMER0
  Dim Счетчик_выводимого As Byte
  Dim Temp_buffer_7seg_led As Byte       ' Используется в обработчике прерывания TIMER0

' Значения частоты мигания и длительности засветки знакоместа на LED дисплее при "Флаг_мигание_знакоместа(n) = 1"
  Dim Флаги_миганий As Byte
  Dim Счетчик_миганий As Word       ' Счетчик для обработки частоты и длительности мигания, используется в подпрограмме "Индикация_7seg_led"
  Dim Частота_мигания As Word : Частота_мигания = 200       ' переменная, для хранения значения частоты мигания при  Флаг_мигание(n) = 1
  Dim Длительность_горения_при_мигании As Word : Длительность_горения_при_мигании = 100       ' переменная, для хранения значения длительности горения знакоместа при Флаг_мигание(n) = 1

  Dim Буфер_7seg(const_количество_разрядов) As Byte       ' Выводимый буфер 7-seg LED, используется для перекодировки символов в коды 7-seg LED
  Dim Buffer_7seg_led(const_количество_разрядов) As Byte       ' Выводимый буфер 7-seg LED, используется в обработчике прерывания TIMER0
  Dim Флаг_мигание_знакоместа(const_количество_разрядов) As Byte       ' Хранение флагов мигания знокомест

  Dim Буфер_7seg_str As String * 10       ' Выводимый строковый буфер 7-seg LED

  Dim Tmp_byte As Byte , Длина_строки As Byte , Символ_byte As Byte
  Dim Знакоместо As Byte , Цикл_знакоместо As Byte , Blink_знакоместо As Byte
  Dim Символ_str As String * 1 , Temp_буфер_7seg_str As String * 10

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П О Д П Р О Г Р А М М Ы
'===============================================================================

  Declare Sub Print_7seg_led(byval Copy_str As String , Byval Copy_byte As Byte)       ' Copy_byte - признак мигающего знакоместа

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'--------------  Разрешаем работу необходимых прерываний  ----------------------
  Enable Adc : Start Adc
  Enable Timer0 : Start Timer0       ' Разрешаем работу прерывания по ПЕРЕПОЛНЕНИЮ
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

    If Флаг_данные_ацп <> 0 Then

        Данные_ацп_single = 12_bit_данные_ацп * 1.22
        Готовые_данные_ацп_word = Данные_ацп_single
        Данные_ацп_str = Str(готовые_данные_ацп_word)
        Готовые_данные_ацп_str = Format(данные_ацп_str , "   0" )
        Print_7seg_led Готовые_данные_ацп_str , &B_0000_0000
        Print Готовые_данные_ацп_str
        Флаг_данные_ацп = 0
        Goto Главный_цикл
    End If

   Idle       ' Отправляем МК на тихий час
'===============================================================================
  Goto Главный_цикл
End
'===============================================================================

'===============================================================================
  Обработка_прерывания_ацп:
'-------------------------------------------------------------------------------

    Сырые_данные_ацп(1) = Adcl
    Сырые_данные_ацп(2) = Adch

'------  Набираем сумму измерений для 12 бит  ----------

    Сумма_ацп = Сумма_ацп + Данные_ацп

    Incr Счетчик_измерений_ацп

    If Счетчик_измерений_ацп = 16 Then
        Счетчик_измерений_ацп = 0
        Shift Сумма_ацп , Right , 2
        12_bit_данные_ацп = Сумма_ацп
        Флаг_данные_ацп = 1
        Сумма_ацп = 0
    End If
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Sub Print_7seg_led(byval Copy_str As String , Byval Copy_byte)
'===============================================================================
    Знакоместо = 0       ' Обнуляемся, иначе в переменной возможно наличие мусора
    Blink_знакоместо = Copy_byte       ' Забираем мигающие разряды
    Temp_буфер_7seg_str = Copy_str       ' Забираем выводимую строковую переменную

'Узнаём длину выводимой строки
    Длина_строки = Len(temp_буфер_7seg_str)

'Обрезаем лишние символы по количеству выводимых разрядов 7-seg LED индикации
    Tmp_byte = Const_количество_разрядов + 1
    If Длина_строки > Tmp_byte Then
        Temp_буфер_7seg_str = Left(temp_буфер_7seg_str , Tmp_byte)
        Длина_строки = Tmp_byte
    End If       ' If Длина_строки > 5 Then

'Конвертируем буфер из ASCII в коды 7-seg LED индикации
    For Цикл_знакоместо = 1 To Длина_строки
        Знакоместо = Знакоместо + 1       ' Считам разряды
        Символ_str = Mid(temp_буфер_7seg_str , Цикл_знакоместо , 1)       ' Берём по одному символу из строки
        Символ_byte = Asc(символ_str)       ' Узнаём код символа согласно "Таблицы кодов ASCII"

        If Символ_byte = 46 Then       ' Если точка ".", добавляем точку в предыдущем разряде
            Знакоместо = Знакоместо - 1       ' Выводим "символ "точка"" в !!! предыдущем разряде !!!
            Буфер_7seg(знакоместо) = Буфер_7seg(знакоместо) Xor &B_1000_0000       ' Выводим "символ "точка"" в !!! предыдущем разряде !!!
         Elseif Символ_byte = 176 Then
            Буфер_7seg(знакоместо) = &H63       ' Выводим символ "°", значек градуса Сельсия для индикаторов с ОК
           ' Буфер_7seg(знакоместо) = &H9C       ' Выводим символ "°", значек градуса Сельсия для индикаторов с ОА
          Else
            Символ_byte = Символ_byte - 32
            Буфер_7seg(знакоместо) = Lookup(символ_byte , Коды_7seg_led_ok)
        End If       ' If Символ_byte = 46 Then
    Next Цикл_знакоместо       ' For Цикл_знакоместо = 1 To Длина_строки

'---------  Если надо, выставляем флаги мигания нужными разрядами  -------------
'Непосредственно сам процесс мигания, реализован в обработчике прерывания TIMER0
'Количество знакомест 7-seg LED индикаторов, мы не арабы, а тем более, не евреи, но считать будем справа налево
    Знакоместо = 4
'Поднимаем или сбрасываем флаги миганий
    For Цикл_знакоместо = 0 To 3
        If Blink_знакоместо.цикл_знакоместо = 1 Then
            Флаг_мигание_знакоместа(знакоместо) = 1
          Else
            Флаг_мигание_знакоместа(знакоместо) = 0
        End If
        Знакоместо = Знакоместо - 1       ' Считаем разряды
    Next Цикл_знакоместо       ' Время обработки команды = 16 тактов

'-------------------------------------------------------------------------------
  End Sub
'===============================================================================

'===============================================================================
  Индикация_7seg_led:       ' Прерывание TIMER0, обработка 7-seg LED индикации
'-------------------------------------------------------------------------------
   'Перебираем разряды 7-seg LED индикации
    Счетчик_разрядов = Счетчик_разрядов + 1

   'Ограничиваем счётчик
    If Счетчик_разрядов > 4 Then
        Счетчик_разрядов = 1
    End If       ' If Счетчик_разрядов > 4 Then

   'Считам длительность и частоту мигания разрядов 7-seg LED индикаторов
    Счетчик_миганий = Счетчик_миганий + 1
    If Счетчик_миганий > Частота_мигания Then
        Счетчик_миганий = 1       ' длительность мигания
    End If       ' If Счетчик_миганий > Частота_мигания Then

   'Собственно занимаемся миганием разрядов 7-seg LED индикаторов
    If Флаг_мигание_знакоместа(счетчик_разрядов) = 1 And Счетчик_миганий > Длительность_горения_при_мигании Then       ' Если флаг мигания этого разряда выставлен и счетчик > 200
        Temp_buffer_7seg_led = &HFF       ' Выводим пустое место в соответствующем разряде, индикаторы с ОК
      Else
        Temp_buffer_7seg_led = Буфер_7seg(счетчик_разрядов)
    End If       ' If Флаг_мигание_знакоместа(счетчик_разрядов) = 1 And Счетчик_миганий > Длительность_горения_при_мигании Then

    'Гасим все разряды, тем самым предотвращая паразитные мигания 7-seg LED индикаторов
    'Если используется регулировка яркости, закомментируте строку
    Set Разряд_1 : Set Разряд_2 : Set Разряд_3 : Set Разряд_4

   'Раскидываем сегменты по ножкам МК
    A = Temp_buffer_7seg_led.0       ' Сегмент "А"
    B = Temp_buffer_7seg_led.1       ' Сегмент "B"
    C = Temp_buffer_7seg_led.2       ' Сегмент "C"
    D = Temp_buffer_7seg_led.3       ' Сегмент "D"
    E = Temp_buffer_7seg_led.4       ' Сегмент "E"
    F = Temp_buffer_7seg_led.5       ' Сегмент "F"
    G = Temp_buffer_7seg_led.6       ' Сегмент "G"
    H = Temp_buffer_7seg_led.7       ' Сегмент "H (Точка)"

   'Включаем соответствующий разряд индикатора
    On Счетчик_разрядов Goto Засвет_0 , Засвет_1 , Засвет_2 , Засвет_3 , Засвет_4

    Засвет_1:
      Reset Разряд_1
      Goto Выход_индикация_7seg_led

    Засвет_2:
      Reset Разряд_2
      Goto Выход_индикация_7seg_led

    Засвет_3:
      Reset Разряд_3
      Goto Выход_индикация_7seg_led

    Засвет_4:
      Reset Разряд_4

    Засвет_0:
'-------------------------------------------------------------------------------
   Выход_индикация_7seg_led:
  Return
'===============================================================================

'===============================================================================
  Коды_7seg_led_ok:
'-------------------------------------------------------------------------------
    $asm
     .db 0       '    32 - "Пробел"
     .db 0       '    33 - "!"
     .db 0       '    34 - "Верхние кавычки"
     .db 0       '    35 - "#"
     .db 0       '    36 - "$"
     .db 0       '    37 - "%"
     .db 0       '    38 - "&"
     .db 0       '    39 - "'"
     .db 0       '    40 - "("
     .db 0       '    41 - ")"
     .db 0       '    42 - "*"
     .db 0       '    43 - "+"
     .db 0       '    44 - ","
     .db &H40       ' 45 - "-"
     .db &H80       ' 46 - "."
     .db 0       '    47 - "/"
     .db &H3F       ' 48 - "0"
     .db &H06       ' 49 - "1"
     .db &H5B       ' 50 - "2"
     .db &H4F       ' 51 - "3"
     .db &H66       ' 52 - "4"
     .db &H6D       ' 53 - "5"
     .db &H7D       ' 54 - "6"
     .db &H07       ' 55 - "7"
     .db &H7F       ' 56 - "8"
     .db &H6F       ' 57 - "9"
     .db 0       '    58 - ":"
     .db 0       '    59 - ";"
     .db 0       '    60 - "<"
     .db 0       '    61 - "="
     .db 0       '    62 - ">"
     .db 0       '    63 - "?"
     .db 0       '    64 - "@"
     .db &H77       ' 65 - "A"
     .db 0       '    66 - "B"
     .db &H39       ' 67 - "C"
     .db 0       '    68 - "D"
     .db &H79       ' 69 - "E"
     .db &H71       ' 70 - "F"
     .db 0       '    71 - "G"
     .db &H76       ' 72 - "H"
     .db &H06       ' 73 - "I"
     .db &H0E       ' 74 - "J"
     .db 0       '    75 - "K"
     .db &H38       ' 76 - "L"
     .db 0       '    77 - "M"
     .db 0       '    78 - "N"
     .db &H3F       ' 79 - "O"
     .db &H73       ' 80 - "P"
     .db 0       '    81 - "Q"
     .db 0       '    82 - "R"
     .db &H6D       ' 83 - "S"
     .db 0       '    84 - "T"
     .db &H3E       ' 85 - "U"
     .db 0       '    86 - "V"
     .db 0       '    87 - "W"
     .db 0       '    88 - "X"
     .db &H6E       ' 89 - "Y"
     .db 0       '    90 - "Z"
     .db &H39       ' 91 - "["
     .db 0       '    92 - "\"
     .db &H0F       ' 93 - "]"
     .db 0       '    94 - "^"
     .db &H08       ' 95 - "_" - подчёркивание
     .db 0       '    96 - "`"
     .db 0       '    97 - "a"
     .db &H7C       ' 98 - "b"
     .db &H58       ' 99 - "c"
     .db &H5E       '100 - "d"
     .db 0       '   101 - "e"
     .db 0       '   102 - "f"
     .db 0       '   103 - "g"
     .db &H74       '104 - "h"
     .db &H04       '   105 - "i"
     .db 0       '   106 - "j"
     .db 0       '   107 - "k"
     .db 0       '   108 - "l"
     .db 0       '   109 - "m"
     .db &H54       '110 - "n"
     .db &H5C       '111 - "o"
     .db 0       '   112 - "p"
     .db 0       '   113 - "q"
     .db &H50       '114 - "r"
     .db 0       '   115 - "s"
     .db &H78       '116 - "t"
     .db &H1C       '117 - "u"
    $end Asm
'===============================================================================

Отредактировано sasha_1973 (2014-12-31 13:41:18)

0

12

GNT-5631AG-21  Вот индикатор я так полагаю что с ОА...

0

13

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

0

14

Mr.Lex написал(а):

GNT-5631AG-21  Вот индикатор я так полагаю что с ОА...

У Вас индикаторы с общим катодом   -   посмотрите

Отредактировано sasha_1973 (2014-12-31 15:23:52)

0

15

Mr.Lex написал(а):

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

Чем Вам не нравится мой вариант?

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Нужно проверить код прошивки датчика температуры на термопаре