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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Изменяется локальная переменная в функции, почему?


Изменяется локальная переменная в функции, почему?

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

1

Как так может быть? Может стек/фрейм "наезжают" друг на друга? Как в симуляторе отследить местоположение ЛОКАЛЬНОЙ переменной?
Скажу сразу: в проге куча подпрограмм и процедур. По "кускам" вроде всё работает, вместе что-то не совсем хочет.
Где почитать, как происходит проброс переменных в функцию и вывод их в основное тело программы???

0

2

Лол, а я об этом предупреждал. Максимум что есть из офф, только это: http://avrhelp.mcselec.com/index.html?memory_usage.htm
Я в своё время предлагал Марку сделать отдельно или интегрированный калькулятор, хоть облегченную версию (без учета нюансов), но он уперся в те моменты, что из-за динамических переменных в функциях - это невозможно.
Решить можно только равно поделить остаток памяти на эти переменные.

0

3

RDW написал(а):

Я в своё время предлагал Марку сделать отдельно или интегрированный калькулятор

Разве он его не сделал?

Скриншот

http://s4.uploads.ru/b4AMw.png

+1

4

Отдельной опции/кнопки я не вижу, а этой вкладкой я не пользуюсь, т.ч. о "Info" не в теме.

0

5

Чтож, буду "пилить" код и разбираться с проблемой.

0

6

Из прерываний не вызываются функции с параметрами или локальными переменными? Тогда нужно прочитать http://avrhelp.mcselec.com/frameprotect.htm

0

7

Я сам в афиге! Всю жизнь писал через процедуры и подпрограммы и всё это работало. А в этот раз добавил ДЕСЯТЬ строчек для опроса аналогового  джойстика и всё рассыпалось вхлам.... o.O    Сам до сих пор не понимаю, что и как.....

Перенёс проект на 2560, сделал фреймы и стеки по 512 и по 1024 - всё равно изменяется. !!!   Я в афиге !!!!    100 пудово глюк баскома!!!!!!!

0

8

-NMi- написал(а):

глюк баскома

А может ошибка в коде...

0

9

Нужен кусок кода?

0

10

Не видя кода как сможем помощь найти ошибку?

0

11

Код

Function Get_analog_joystik() As Byte
  Local Temp_a_joy As Word
  Temp_a_joy = Getadc(2)                                   
  Get_analog_joystik = 0
  If Temp_a_joy < 300 Then Get_analog_joystik = &H6B       
  If Temp_a_joy > 700 Then Get_analog_joystik = &H74       
  Temp_a_joy = Getadc(1)                                   
  If Temp_a_joy < 300 Then Get_analog_joystik = &H75       
  If Temp_a_joy > 700 Then Get_analog_joystik = &H72       
  Temp_a_joy = Getadc(0)                                     'SW
  If Temp_a_joy < 40 Then Get_analog_joystik = &H70
End Function

Процедура ДОЛЖНА возвращать 0 - если джойстик не используется, либо один из 5 скан-кодов от обычной PS/2 клавиатуры.
Переменная  Get_analog_joystik  является локальной в списке переменных отладчика. Она меняется спонтанно. Реально проблема выглядит так: даже если не трогать джойстик программа сама по себе через разные промежутки времени меняет экранное меню, т.е. как будто джойстиком бы пользовался пользователь.

И ещё... я тут в кодевижене нашёл прикольный режим работы ADC от переполнения таймера.  Т.е. при переполнении таймера запускаются измерения преобразователя, по завершению преобразования опять генерится прерывание уже по ADC и в нём забираются результаты преобразования. Как сделать такое на баскоме? Или тупо скопировать код на С++ , переделав его в код баскома???

0

12

Не гарантируется корректность работы такого кода. Из справки. http://avrhelp.mcselec.com/declare_function.htm

When you set the function result, you need to take care that no other code is executed after this.

So a good way to set the result would be this :

Код:
Function Myfunc(b as byte) as Byte
   local bDummy as byte
   'some code here
   Myfunc=3 ' assign result
   ' no other code is executed
End Function

If you execute other code after you assigned the function result, registers will be trashed. This is no problem if you assigned the function result to a variable. But when you use a function without assigning it to a variable, some temporarily registers are used which might be trashed.

Правильней было бы так

Код:
Function Get_analog_joystik() As Byte
  Local Temp_a_joy As Word
  Local Res As Byte

  Temp_a_joy = Getadc(2)
  Res = 0
  If Temp_a_joy < 300 Then Res = &H6B
  If Temp_a_joy > 700 Then Res = &H74
  Temp_a_joy = Getadc(1)
  If Temp_a_joy < 300 Then Res = &H75
  If Temp_a_joy > 700 Then Res = &H72
  Temp_a_joy = Getadc(0)                                     'SW
  If Temp_a_joy < 40 Then Res = &H70

  Get_analog_joystik = Res
End Function

0

13

Блин...  :confused:   этот код с точностью до буквы работает уже более года на другом устройстве и никаких глюков там не наблюдалось. Мало того, аналоговая клавиатура из 6 кнопок опрашивается точно так-же и не глючит...
Хорошо, я понял где проблема, перепишу на медни...

0

14

Если такой код работает в другом проекте, то может в этом проблема в другой части кода?

0

15

Единственная разница там : config submode=new
Остальное "собрано" из таких-же подпрограмм, ну только функционал другой.

0

16

-NMi- допускаешь глюк на аппаратном уровне? Что за камень и откуда? На днях проскакивала статейка, в ней описывались аппаратные глюки МК, купленных в китае. (партийный брак)

0

17

Естественно китай. Камень 328р.  Давай ссылку на статью, почитаю.

0

18

MACTEPok написал(а):

-NMi- допускаешь глюк на аппаратном уровне? Что за камень и откуда? На днях проскакивала статейка, в ней описывались аппаратные глюки МК, купленных в китае. (партийный брак)

Хорошо хоть --"(партийный брак)", а не витринный образец (кусок пластика с ножками.), красивенький, до опупения, только не работает.

Отредактировано sasha_1973 (2017-02-07 05:34:43)

0

19

-NMi-, Статья

0

20

sasha_1973 написал(а):

витринный образец (кусок пластика с ножками.), красивенький, до опупения, только не работает.


Ни разу не было. Есть одна 328, ногами дрыгает а на связь с прогером не выходит. Но походу я сам её статикой убил.

0

21

С локальными переменными всё прокатило. Всем спасибо.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Изменяется локальная переменная в функции, почему?