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

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

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

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


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


Проблема с прерываниями ATMEGA16

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

1

Всем привет , возникла такая задача . Есть два шаговых двигателя (№1 , №2  ноги первого portb бит 1-4 , ноги второго portb бит 5-8) и два концевика (№1, №2, Btna , Btnb) .
- После того как включили микроконтроллер нужно заставить вращаться шаговый двигатель  №1;
- После того как замкнется концевик  №1 шаговый двигатель №1 должен остановиться а шаговый двигатель №2 должен начать врвщаться;
- После того как замкнется канцевик №2 , шаговый двигатель №2 должен остановиться.

У меня не работает второе прерывание  т.е. не останавливается второй шд после срабатывания второго концевика .

Вот код:

$regfile = "m16def.dat"
$crystal = 4000000

On Int0 Btna
On Int1 Btnb

Config Portc = Output

Enable Int0
Enable Int1

Config Int0 = Falling
Config Int1 = Falling

Enable Interrupts

Dim X As Byte
X = 1
Dim Y As Byte
Y = 1

Do

Xx:
Incr X
If X = 5 Then
X = 1
End If
Select Case X
Case 1 : Portc = &B00000110
Case 2 : Portc = &B00000101
Case 3 : Portc = &B00001001
Case 4 : Portc = &B00001010
End Select
Waitms 25
Goto Xx

'Loop

Yy:
Incr Y
If Y = 5 Then
Y = 1
End If
Select Case Y
Case 1 : Portc = &B01100000
Case 2 : Portc = &B01010000
Case 3 : Portc = &B10010000
Case 4 : Portc = &B10100000
End Select
Waitms 25
Goto Yy

Loop

Btna:
Goto Yy
Return

Btnb:
Stop

Return

End

0

2

Ну, по моему, Return возвращает Вас в тот участок программы в котором произошло прерывание,
а это Yy:, поэтому и двигатель продолжает крутиться.

0

3

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

Ну, по моему, Return возвращает Вас в тот участок программы в котором произошло прерывание,
а это Yy:, поэтому и двигатель продолжает крутиться.


Если закоментировать

Return после Goto Yy

Goto Yy
'Return

то всеравно не останавливается.

Даже если возвращает прерывание ведь всеравно должно отработать , разве нет ?

0

4

Направьте прерывание в пустой цикл
Btnb:
Goto Пустой

Пустой:
Do
Loop

0

5

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

Направьте прерывание в пустой цикл
Btnb:
Goto Пустой

Пустой:
Do
Loop


Пардон , не понял.
Создать еще один цикл в любом месте ?

0

6

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

Отредактировано Adagumer (2015-03-29 14:20:57)

0

7

вообще не понял, зачем для такого линейного алгоритма вообще использовать прерывание
один цикл программы
одно последовательное действие

0

8

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

вообще не понял, зачем для такого линейного алгоритма вообще использовать прерывание
один цикл программы
одно последовательное действие


Прерывания для того тчоб двигатель останавливался сразу после срабатывания концевика (чтоб небыло лишних шагов , они могут навредить механизму)

0

9

Вообще нельзя из подпрограммы уходить по GOTO. Должно обязательно быть RETURN, а то не сварение желудка будет. Используйте флаги.

Отредактировано kip (2015-03-29 16:01:01)

+1

10

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

Вообще нельзя из подпрограммы уходить по GOTO. Должно обязательно быть RETURN, а то не сварение желудка будет. Используйте флаги.

Отредактировано kip (Сегодня 16:01:01)


Флаги это как ?

0

11

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

а то не сварение желудка

будет переполнение стека и порча всех регистров/данных в ОЗУ

+1

12

Можно ближе к делу ?

0

13

dim fl as bit
--------

--------
Select Case X
Case 1 : Portc = &B00000110
Case 2 : Portc = &B00000101
Case 3 : Portc = &B00001001
Case 4 : Portc = &B00001010
End Select
Waitms 25
if fl=1 then Goto Yy
Goto Xx

'Loop

Yy:
Incr Y
If Y = 5 Then
Y = 1
End If
Select Case Y
Case 1 : Portc = &B01100000
Case 2 : Portc = &B01010000
Case 3 : Portc = &B10010000
Case 4 : Portc = &B10100000
End Select
Waitms 25
Goto Yy

Loop

Btna:
set fl
Return
-------
-------

Отредактировано kip (2015-03-29 21:39:31)

+1

14

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

dim fl as bit
--------

--------
Select Case X
Case 1 : Portc = &B00000110
Case 2 : Portc = &B00000101
Case 3 : Portc = &B00001001
Case 4 : Portc = &B00001010
End Select
Waitms 25
if fl=1 then Goto Yy
Goto Xx

'Loop

Yy:
Incr Y
If Y = 5 Then
Y = 1
End If
Select Case Y
Case 1 : Portc = &B01100000
Case 2 : Portc = &B01010000
Case 3 : Portc = &B10010000
Case 4 : Portc = &B10100000
End Select
Waitms 25
Goto Yy

Loop

Btna:
set fl
Return
-------
-------

Отредактировано kip (Сегодня 21:39:31)


СПАСИБООО!!!!
я думал в эту сторону но дмал, что это одно и тоже.
Работает по крайней мере в протеусе , буду пробовать на реальной жлезяке.

0

15

Кстати, для шаговых двигателей, действительно прерывание не нужно. Если повесить, к примеру, концевик на PORTD.1, то  if fl=1 then Goto Yy меняете на if portd.1=1 then Goto Yy, и все прерывания вообще убираете, в работе ни чего не изменится. Прерывание использовать, если двигатель обычный, коллекторный к примеру.

+1

16

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

Кстати, для шаговых двигателей, действительно прерывание не нужно. Если повесить, к примеру, концевик на PORTD.1, то  if fl=1 then Goto Yy меняете на if portd.1=1 then Goto Yy, и все прерывания вообще убираете, в работе ни чего не изменится. Прерывание использовать, если двигатель обычный, коллекторный к примеру.

Спасибо , попробую и этот вариант

0


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