$regfile = "2313def.dat"
$crystal = 4000000
Dim S As Byte 'эта переменная следит за номером шага двигателя
S = 1
On Int0 Knopka1 'даем имена обработчикам внешних прерываний
On Int1 Knopka2
Config Portb = Output 'конфигурируем порт на выход
Config Portd.5 = Output 'конфигурируем ногу для подключения светодиода
Led Alias Portd.5 'присваиваем имя LED выводу 5 порта D
'прерывания будут генерироваться пока на ноге низкий уровень, то есть пока кнопка будет нажата
Config Int0 = Low Level
Config Int1 = Low Level
'разрешаем прерывания
Enable Interrupts
Enable Int0
Enable Int1
'основной цикл программы, просто ждем прерывания
Do
Loop
Knopka1: 'обработчик прерывания первой кнопки
Led = 1 'зажигаем светодиод
Incr S 'увеличим номер шага
If S = 9 Then 'максимально возможный номер шага = 8
S = 1
End If
Select Case S 'выбираем какие обмотки включать в зависимости от номера шага
Case 1 : Portb = &B00000001
Case 2 : Portb = &B00000011
Case 3 : Portb = &B00000010
Case 4 : Portb = &B00000110
Case 5 : Portb = &B00000100
Case 6 : Portb = &B00001100
Case 7 : Portb = &B00001000
Case 8 : Portb = &B00001001
End Select
Waitus 1000 'задержка между шагами
Led = 0 'гасим светодиод
Return
Knopka2: 'обработчик прерывания второй кнопки
Led = 1 'зажигаем светодиод
Decr S 'тут все тоже самое, только в обратном направлении
If S = 0 Then 'минимально возможный номер шага = 1
S = 8
End If
Select Case S
Case 1 : Portb = &B00000001
Case 2 : Portb = &B00000011
Case 3 : Portb = &B00000010
Case 4 : Portb = &B00000110
Case 5 : Portb = &B00000100
Case 6 : Portb = &B00001100
Case 7 : Portb = &B00001000
Case 8 : Portb = &B00001001
End Select
Waitus 1000
Led = 0 'гасим светодиод
Return
End
например, допиши после Led = 0
Portb = &B00000000
Использование секундных задержек в прерываниях - моветон. Можно было все сделать в основном цикле. Ветвление по состоянию кнопок. Например так:
if (Knopka1 & Knopka2) portb=0x00; else
{
if(Knopka1==0) {bla bla bla};
if(Knopka2==0) {bla bla bla};
delay_us(1000);
}
Синтаксис Сишный, но я думаю все понятно.
ЗЫ. В примере считается что кнопка нажата когда на входе низкий уровень, отжата - подтяжка к питанию.
В таком варианте все обмотки выключены и двигатель должен молчать как рыба об лед. Есть мнение что не все в порядке с транзисторами. И схема включения оных заставляет непроизвольно фейспалмировать.Делал так, в таком варианте двигатель начинает заметно шуметь, что не хотелось бы
В таком варианте все обмотки выключены и двигатель должен молчать как рыба об лед. Есть мнение что не все в порядке с транзисторами. И схема включения оных заставляет непроизвольно фейспалмировать.
Варианты решения проблемы:
1. Найти какой из транзисторов не запирается (может и не один)
2. Выкинуть этот боян из КТ829 и поставить православные IRF530, например, на забыв в отличие от автора притянуть затворы к земле резистором килоом в 5-10
Тоже хорошо.на выходах стят irf640
Правильно понимаешь. Рекомендую сделать проверку нажатия кнопки в основном цикле и в случае обеих отпущенных выставлять нули в порт.я так понимаю из-за того что тогда изза кода каждый 9 шаг мотор останавливается и потом снова крутится 8 шагов...
можно конкретный код? т.е. как это написать в моем примере?Рекомендую сделать проверку нажатия кнопки в основном цикле и в случае обеих отпущенных выставлять нули в порт.
в басике есть оператор DEBOUNCE- он как раз с кнопками работает, умеет подавлять дребезг. может, его заюзать?
if (Knopka1 & Knopka2) portb=0x00;
Это на бейсике?еще есть аткая засада, что запись 1 в ногу порта у 2313 не выставлякет там 1 гарантированно, а тупо меняет ее состояние. был 0 -стало 1, и наоборот, была 1 - стала 0.
это в чипе етом, в новой редакции. в даташите на микруху написано. сам, пока разобрался, чуть ен двинулся мозгомЭто на бейсике?
BASCOM пишет Assignment errorif (Knopka1 & Knopka2) portb=0x00;
присвой какойнить переменной состояние порта, а потом ее в IF ставь. напрямую там port не прохавает компиляторBASCOM пишет Assignment error
Как вариант. Считать сосотояние порта, маской убрать ненужные пины, и сравнивать с нулем.присвой какойнить переменной состояние порта, а потом ее в IF ставь
еще косяк: в начале проги порты (оба) конфигурируются на выход - и соотв. на кнопку реагировать не будут, т.к. надо чтоб пин кнопки был сконфигурен как инпут