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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Переменные в массиве


Переменные в массиве

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

1

Столкнулся с непоняткой. Нужно сделать терморегулятор на высокую температуру. Друг предложил АЦП для термопары использовать MAX31855. Он отличный программист. В моей версии при создании массива просто забыл прописать переменную. То есть. По шине SPI получаю 32 бита данных, и записываю в переменную Temp.
Далее клонирую для обработки переменную пять раз Temp(5).

Код:
'MAX31855 mit Thermoelement K Typ
'abgeдndertes Beispiel aus dem Bascom-Forum
$regfile = "m328pdef.dat"
$crystal = 8000000
$baud = 9600
$hwstack = 64
$swstack = 64
$framesize = 100

'Open "comc.3:9600,8,n,1" For Output As #1
Config Portc.2 = Input
Config Portc.1 = Output
Config Portc.0 = Output

So Alias Pinc.2
Clk Alias Portc.0
Cs Alias Portc.1

Dim Temp(5) As Long                                         'Полученные данные

Dim Temp1 As Integer                                        'Термопара со знаком
Dim Temper1 As Byte                                         'Сотые термопары

Dim Temp2 As Integer                                        'Корпус Со Знаком
Dim Temper2 As Word

Dim Temp3 As Word
Dim Error As Bit                                            'Бит Ошибки
'===============================================================================
Do
 Clk = 1
  Cs = 0
    Waitms 100
   ' Shiftin So , Clk , Temp , 0 , 32 , 100
  Cs = 1

   'Temp = &B00111110100000010001100100000000               '+1000.00 термопара, D17нах, D16 ошибка, +25.0000, D3 - D0 нах
   'Temp = &B00111110100010010001100100000000               '+1000.50 термопара, D17нах, D16 ошибка, +25.0000, D3 - D0 нах
   Temp = &B11110000011001000110010010010000               '-250.75 +100.5625  без ошибки
   'Temp = &B11110000011001001100100111100000               '-250.75 -55.1250   без ошибки                              '
   'Temp = &B0011 1110 1000 0001 0001 1001 0000 0000

     Temp(1) = Temp
     Temp(2) = Temp
     Temp(3) = Temp
     Temp(4) = Temp
     Temp(5) = Temp
'************************ТЕРМОПАРА*****************************************************************************************************
     Shift Temp(1) , Right , 20                             'Целая часть без запятой
     Temp1 = Temp(1)
     Shift Temp(1) , Right , 11                             'Знак температуры термопары

   If Temp(1) = 1 Then                                      'Расчет отрицательной температуры термопары
     Temp1 = 4096 - Temp1
     Temp1 = 0 - Temp1
   End If
'------------------------------------------------------------------------------------------------
     Shift Temp(4) , Left , 12                              '.00 значение дробной части термопары
     Shift Temp(4) , Right , 30
     Temper1 = Temp(4)

   If Temp(1) = 0 Then
      Temper1 = Temper1 * 25
    Else
     If Temper1 = 0 Then
      Temper1 = 0
     Else
      Temper1 = 4 - Temper1
      Temper1 = Temper1 * 25
     End If
   End If
'*************************ВНУТРЕННИЙ***************************************************************************************************
     Shift Temp(2) , Left , 16                              'Целая часть без запятой
     Shift Temp(2) , Right , 24
     Temp2 = Temp(2)
     Shift Temp(2) , Right , 7                              'Знак температуры в корпусе

   If Temp(2) = 1 Then                                      'Относительно знака
     Temp2 = 256 - Temp2                                    'Расчет отрицательной температуры
     Temp2 = 0 - Temp2
   End If
'-----------------------------------------------------------------------------------------------
     Shift Temp(5) , Left , 24                              '.0000 значение дробной части корпуса
     Shift Temp(5) , Right , 28
     Temper2 = Temp(5)


   If Temp(2) = 0 Then                                      'Прересчет дроби в нормальный вид
      Temper2 = Temper2 * 625
    Else
     If Temper2 = 0 Then
      Temper2 = 0
     Else
       If Temper2 = 15 Then
         Temper2 = 0
         Else
         Temper2 = 16 - Temper2
         Temper2 = Temper2 * 625
       End If
     End If
   End If
'**************************ОШИБКА**************************************************************************************************
     Shift Temp(3) , Left , 15
     Shift Temp(3) , Right , 31
     Error = Temp(3)


   Print "Tpara=" ; Temp1 ; "." ; Temper1 ; " T=" ; Temp2 ; "." ; Temper2 ; " " ; Error ; " " ; Temp(5)

  Waitms 1000
 Loop
End

Но как видите саму переменную Temp не задал. Но программа работает. На железе с заданной переменной, но пока без МАХа(нет в наличии), в протеус с виртуальным МАХом.
Вопрос. Реально так задавать переменную? Задается она как основная?
Друг меня сьел за это. Считает грубой ошибкой.

0

2

Попадал на такое... ;)

Если переименовать Temp, то компилятор сразу начнет ругаться на отсутствие объявления переменной.
Если оставить как есть, то будет работать, но рано или поздно споткнется.

Глюк Bascom'а, видимо... ;)

0

3

rom-i написал(а):

как видите саму переменную Temp не задал

А это что?

rom-i написал(а):

Dim Temp(5) As Long

У вас массив на 5 штук темпов из лонгов. :)
Дальше у вас идет такой "хитрый маневр":

rom-i написал(а):

Temp = &B11110000011001000110010010010000 '-250.75 +100.5625 без ошибки

Но тут же вы его загружаете в:

rom-i написал(а):

Temp(1) = Temp
Temp(2) = Temp
Temp(3) = Temp
Temp(4) = Temp
Temp(5) = Temp

В теории, компилятор скорее всего ей присваивает по умолчанию первую ячейку и всё работает, пока вы в теле программы не начнёте так же адресовать эту переменную. Т.е. Temp = Temp(1). Так можно подпортить данные.

rom-i написал(а):

Считает грубой ошибкой

Грубая ошибка - это когда у вас дым пошел и всё выгорело, а так, при отсутствии должной культуры программирования (ясность в голове и слежение/учитывание всего), рано или поздно - это чревато глюками и ненадежной работы программы/устройства. Пока они простые - большая часть глюков может быть просто незаметна...
В общем лучше писать так:

Код:
Temp(1) = &B11110000011001000110010010010000               '-250.75 +100.5625  без ошибки

и

Код:
     Temp(2) = Temp(1)
     Temp(3) = Temp(1)
     Temp(4) = Temp(1)
     Temp(5) = Temp(1)

И строк меньше получается. :)

0

4

Nord
Реальный ответ.
Конечно задам переменную с другим именем.
RDW
Спасибо за подтвежение.
В приципе понятно, что рано, или поздно в озу перехлест(наложение) переменных произойдет.
Тем боллее одноименных.

0

5

rom-i написал(а):

Конечно задам переменную с другим именем

Проще сделать, как RDW говорит... ;)

0

6

Друзья, Вы себе рейтинг на форумах поднимаете?
Temp(1) используется для старших разрядов, и два раза изменяется.

-1

7

https://yadi.sk/d/mj3yL3E3HvfJZw
Не ,буду голословным. Протеус не ниже 8.3

Отредактировано rom-i (2018-11-11 19:52:10)

-1

8

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

0

9

RDW
Микросхемы заказаны. В железе только с заданной переменной пробовал.
В программировании на уровне первого класса. Вот стало интересно. Как так, переменную не задал, а она есть.
Глупо забыл.
Компилятор тоже не сразу взял, заругался на стековую память. Сам высчитывать не умею. Спросил у знакомого, отрицалово. Всял из чужей программы. Там переменные большые используются.
$hwstack = 64
$swstack = 64
$framesize = 100
Компилятор взял. Программа заработала в железе, но пременная задана числом. Отправил другу исходники. Он ругаться начал на не заданную переменную. Естественно переписал. Добавил Dim Temp0 As Long, дальше массив к ней прировнял.
Меня удивило еще одно. Вначале брал массив из двух Temp(2). Обработка только целых чисел ответа МАХа. Позже занялся дробными, и массив уже стал Temp(5). Но использование Flech памяти МК компилятор не изменил.
На этом месте, и вопрос возник.
Можно так делать? Если нет, с какого компилятор берет? Почему в железе работает, и в протеус?

Отредактировано rom-i (2018-11-11 20:48:21)

-1


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Переменные в массиве