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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Отображение переменной в главном цикле программы


Отображение переменной в главном цикле программы

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

1

Добрый день. Есть некая переменная, которая изменяется в прерываниях по таймеру, в зависимости от различных условий.
В главном цикле программы организован вывод этой переменной на LCD, затем задержка и зацикливание. Проблема в том, что вместо реальных значений переменной на экран выводятся какие-то странные значения, которые никак не могут быть значениями переменной. Фрагмент кода:

Код:
Config Timer0 = Timer , Prescale = 64
On Timer0 Myint
Enable Interrupts
Enable Timer0

Do

Cls
Locate 1 , 1
Lcd "variable: " ; A
Waitms 200 

Loop


Myint:

'Здесь производятся операции с переменной A
.............

Return

End

При этом в обработчике прерываний всё работает корректно, состояние переменной A такое, каким и должно быть. Однако, в главном цикле программы при этом вместо A отображается что-то не то.

0

2

Скорее всего в прерывании операции с переменной А производятся путем последовательной перезаписи. В итоге на дисплее видим в произвольном порядке промежуточные значения переменной А. Нужно в прерывании произвести все преобразования над переменной А, и затем только записать результат в другую переменную B. Таким образом переменная B всегда будет содержать конечный результат преобразований.

0

3

Перед Return переменная А уже содержит конечный результат, который при следующих прерываниях меняется весьма слабо. При значениях переменной А, например, от 100 до 150, в основном цикле программы на дисплей выводятся значения 1-10.

ps: Однако, запрет прерываний в основном цикле программы почему-то исправил ситуацию...

Do

Disable Interrupts
Cls
Locate 1 , 1
Lcd "variable: " ; A
Enable Interrupts
Waitms 200

Loop

Отредактировано kokosh (2014-10-16 16:57:35)

0

4

Переменная А байт?

0

5

Хоть байт, хоть слово, выводится только первая цифра, иногда проскакивает вторая. Добавил инкрмент переменной в главный цикл программы:

Код:
Do

Cls

Locate 1 , 1
Lcd "var: " ; A
Waitms 200

Incr A

Loop

И теперь внимание: работает только при запрещённых прерываниях по таймеру! Если разрешить прерывания от таймера, даже если в обработчике есть только всего одна команда - Return, то начинает глючить.

Подозреваю, что это какой-то глюк Протеуса...

ps: Вот код, убрал всё лишнее. С запрещёнными прерываниями работает, с разрешёнными - пишет только первую, иногда - вторую цифру. Самое смешное, что "..." пишет всегда после этого!

Код:
$regfile = "m8adef.dat"
$crystal = 8000000
$hwstack=10
$swstack=6
$framesize=10

Config Timer0 = Timer , Prescale = 64

Cursor Off Noblinkd

Dim A As Byte


On Timer0 Myint
Enable Interrupts
Enable Timer0


Do
Cls
Locate 1 , 1
Lcd "a: " ; A ; "..."
Waitms 200
Incr A
Loop


Myint:
Return

End

Отредактировано kokosh (2014-10-16 18:05:07)

0

6

Я обкатал вариант использования LCD через PCF8574 http://bascomavr.3bb.ru/viewtopic.php?id=981 от sasha_1973. Результатом очень доволен. В системе с кучей прерываний и периферии вывод на LCD через аппаратный I2C. Особо не усложняет ни схему ни код. Но уже избавляешься от неприятных влияний на LCD.

0

7

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

$hwstack=10
$swstack=6
$framesize=10

Это "слишком много". Надо "еще меньше".

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Отображение переменной в главном цикле программы