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

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

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

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



UART RXD

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

1

здравствуйте!

Есть код:

Код:
$regfile = "m32def.dat"
$crystal = 8000000
Baud = 9600

Echo Off

Dim Ss As String * 40

Enable Interrupts
Enable Urxc
On Urxc Rxtt
'Enable Timer2
'On Timer2 T2

Do
   Print "...."
   Waitms 100
   Enable Urxc
Loop

Rxtt:
   Disable Urxc
   Input Ss
   Print "11"
Return

При передачи все нормально работает.. на другой стороне принимается корректно!
Но вот с приемом проблемма.. При отправки данных в контроллер - программа влетает в прерывание и циклится на input Ss..
где ошибка? - спасибо!

0

2

прошу прощения за глупо созданную тему! - проблема была в следующем:
с другой стороны посылал строку без символа переноса строки.. chr(13)

0

3

спасибо спасибо!=) Сам додумаю=)

0

4

всетаки давайте посмотрим ваш вариант!

0

5

только можно переменные и вектора писать латиницей - а то сбивает=)

0

6

наверное дело привычки.. Меня все русское тянет воспринимать как коментарии

0

7

почту в личку вам отправил  давно уже

0

8

для защиты от повисания на инпуте используйте $timeout (почитайте про него)

0

9

спасибо ВАМ! Про таймаут буду иметь ввиду! - полезно но пока не пригодился! За примеры спасибо! И дабы не создовать новую тему - задам вопрос тут
Нигде не нашел нормального объяснения..

Код:
enable interrapts
enable int1
on int1 in1

do
       основное тело программы
       if .......... then goto q
loop

q:
.............
goto q


in1
........
return

Пояснение:
Из основного тела программы по какому то условию переходим на метку q.. в которой могут быть в свою очередь и внутренние циклы и какие то переходы на метки.. И пока мы находимся в q..goto q - происходит прерывание по инт1 - и вот вопрос - как корректно перейти из прерывания инт1 в основной цикл программы?? Про стек мне чуть не понятно..

0

10

Обработка прерывания INT1

Config Int1 = требуемый уровень, по которому будет происходить прерывание   
  On int1 Обработка_прерывания_INT1

  Config Pind.соответстыующая ножка МК = Input

  если надо, подтягиваем к "+"
  Pind.соответстыующая ножка МК = 1

   
  Enable INT1
  Enable Interrupts

Do

       основное тело программы
       if .......... then gosub q

Loop
End

q:

Делаем, что надо

Return

Обработка_прерывания_INT1:

Обработка прерывания

Return

Отредактировано sasha_1973 (2013-09-17 07:26:44)

0

11

Александр! вы меня не поняли.. Мне надо из прерывания вернутся в основное тело программы - не зависимо от куда оно было вызванно..
Вот так буде корректно?

Код:
Do
       w:
       основное тело программы
       if .......... then gosub q

Loop
End

q:

Делаем, что надо

Return

Обработка_прерывания_INT1:

Обработка прерывания
goto w

Return

Конечно не корректно!=) - рано или поздно произойдет переполнение стека - а как с этим бороться?

0

12

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

Александр! вы меня не поняли.. Мне надо из прерывания вернутся в основное тело программы - не зависимо от куда оно было вызванно..
Вот так буде корректно?Конечно не корректно!=) - рано или поздно произойдет переполнение стека - а как с этим бороться?

Перед "Return", вручную восстанавливайте предварительно сохраненные регистры, скидывайте флаг случившегося прерывания и прыгайте куда надо (Goto W)

Отредактировано sasha_1973 (2013-09-17 11:47:02)

0

13

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

Перед "Return", вручную восстанавливайте предварительно сохраненные регистры, скидывайте флаг случившегося прерывания и прыгайте куда надо (Goto W)

Отредактировано sasha_1973 (Сегодня 12:47:02)

И точка возврата в стеке умрет навсегда, потом следующая и сл, пока не закончится стек. Для возврата из прерывания существует специальная команда RETI .  Компилятор ее подставит вместо Return если адрес этой подпрограммы указан в "On ".

Команда RETI

Команда "возврат из прерывания" выгружает старший и младший байты счетчика команд из стека и устанавливает "логику прерываний", разрешая прием других прерываний с уровнем приоритета, равным уровню приоритета только что обработанного прерывания. Указатель стека уменьшается на 2. Слово состояния программы (PSW) не восстанавливается автоматически. Выполнение основной программы продолжается с команды, следующей за командой, на которой произошел переход к обнаружению запроса на прерывание. Если при выполнении команды RETI обраружено прерывание с таким же или меньшим уровнем приоьритета, то одна команда основной программы успевает выполниться до обработки такого прерывания.

Отредактировано IgorL (2013-09-17 12:06:57)

0

14

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

И точка возврата в стеке умрет навсегда, потом следующая и сл, пока не закончится стек. Для возврата из прерывания существует специальная команда RETI .  Компилятор ее подставит вместо Return если адрес этой подпрограммы указан в "On ".

Конкретно, как оно должно выглядеть в коде?

Отредактировано sasha_1973 (2013-09-17 12:07:32)

0

15

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

Ему не нужна точка возврата!

Отредактировано sasha_1973 (Сегодня 13:03:51)

Даже если точка не нужна ему нужен указатель в стеке. По Goto W он уйдет на точку W и указатель стека никогда не вернется ни Return ни Reti.

0

16

Вот это правильно:

Код:
enable interrapts
enable int1
on int1 in1

do
       основное тело программы
       if .......... then goto q
loop

q:
.............
goto q


in1
........
return

Return компилятор переделает в reti

0

17

Ему надо попасть из прерывания на метку W:

Enable Interrupts
Enable int1
On int1 in1

do
       основное тело программы

     W:
       if .......... then goto q
loop

q:
.............
goto q

in1:
........
как попасть на метку W:

return

Отредактировано sasha_1973 (2013-09-17 12:41:24)

0

18

дада... вот я и спросил - как из прерывания попасть в точку W (назовем ее именно так=) ), что бы не запороть стек

0

19

Смотрите личку.

0

20

Ему надо попасть из прерывания на метку W:

Правильно вот так:

Код:
Dim Flag as Byte

Enable Interrupts
Enable int1
On int1 in1
do
       основное тело программы
     W:
       If Flag=1 Then
       ...
       ....
       ....
        Flag=0
      End if
       if .......... then goto q
loop
q:
.............
goto q

in1:
........
Flag=1
return

0