программа микроконтроллера AtTiny2313

Статус: Offline
Реєстрація: 02.06.2009
Повідом.: 316
программа микроконтроллера AtTiny2313

Подскажите что изменить в программе микроконтроллера AtTiny2313,
чтоб если кнопку нажать и отпустить отключались все ключи, а то получается что если нажать и отпустить кнопку, то один из ключей остается включенным:

взято отсюда
Тільки зареєстровані користувачі бачать весь контент у цьому розділі


Код в Bascom-AVR:

Код:
$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);
}

Синтаксис Сишный, но я думаю все понятно.
ЗЫ. В примере считается что кнопка нажата когда на входе низкий уровень, отжата - подтяжка к питанию.
 
например, допиши после Led = 0

Portb = &B00000000

Делал так, в таком варианте двигатель начинает заметно шуметь, т.к. у меня стоит Waitus 200, т.е. оболроты больше чем как в приведенном коде, что не хотелось бы....

Использование секундных задержек в прерываниях - моветон. Можно было все сделать в основном цикле. Ветвление по состоянию кнопок. Например так:

if (Knopka1 & Knopka2) portb=0x00; else
{
if(Knopka1==0) {bla bla bla};
if(Knopka2==0) {bla bla bla};
delay_us(1000);
}

Синтаксис Сишный, но я думаю все понятно.
ЗЫ. В примере считается что кнопка нажата когда на входе низкий уровень, отжата - подтяжка к питанию.

Синтаксис понял(в php пишу частенько),
но не совсем вкурю как его превратить в удобоваримый код BASCOM-AVR
синтаксис AVR пока не весь понял - это первый микроконтроллер у меня)))
 
Останнє редагування:
Делал так, в таком варианте двигатель начинает заметно шуметь, что не хотелось бы
В таком варианте все обмотки выключены и двигатель должен молчать как рыба об лед. Есть мнение что не все в порядке с транзисторами. И схема включения оных заставляет непроизвольно фейспалмировать.
Варианты решения проблемы:
1. Найти какой из транзисторов не запирается (может и не один)
2. Выкинуть этот боян из КТ829 и поставить православные IRF530, например, на забыв в отличие от автора притянуть затворы к земле резистором килоом в 5-10
 
В таком варианте все обмотки выключены и двигатель должен молчать как рыба об лед. Есть мнение что не все в порядке с транзисторами. И схема включения оных заставляет непроизвольно фейспалмировать.
Варианты решения проблемы:
1. Найти какой из транзисторов не запирается (может и не один)
2. Выкинуть этот боян из КТ829 и поставить православные IRF530, например, на забыв в отличие от автора притянуть затворы к земле резистором килоом в 5-10

на выходах стят irf640, к ним еще напаял светодиоды чтоб видеть как работает ключ и если сгорит то видно сразу какой(уже палил один ключ),

Так вот если после Led = 0 написать
Portb = &B00000000
тогда все работает, как надо,
но двигатель заметно шумнее работает, когда крутится без остановки (скорость у меня примерно 3 оборота в сек)
я так понимаю из-за того что тогда изза кода каждый 9 шаг мотор останавливается и потом снова крутится 8 шагов...
 
Останнє редагування:
на выходах стят irf640
Тоже хорошо.

я так понимаю из-за того что тогда изза кода каждый 9 шаг мотор останавливается и потом снова крутится 8 шагов...
Правильно понимаешь. Рекомендую сделать проверку нажатия кнопки в основном цикле и в случае обеих отпущенных выставлять нули в порт.
Еще не вредно почитать даташит на движок и узнать с какой максимальной скоростью он вообще может двигаться.
 
Рекомендую сделать проверку нажатия кнопки в основном цикле и в случае обеих отпущенных выставлять нули в порт.
можно конкретный код? т.е. как это написать в моем примере?

я так понимаю что то такое вставить надо:

If чтотутписатьвообщенепойму Then
Portb = &B00000000
End If
 
Останнє редагування:
в басике есть оператор DEBOUNCE- он как раз с кнопками работает, умеет подавлять дребезг. может, его заюзать?
 
в басике есть оператор DEBOUNCE- он как раз с кнопками работает, умеет подавлять дребезг. может, его заюзать?

нет это точно не нужно, нужно именно проверять нажата ли кнопка и если не нажата тогда посылать
Portb = &B00000000

я с синтаксисом не разберусь...
 
еще есть аткая засада, что запись 1 в ногу порта у 2313 не выставлякет там 1 гарантированно, а тупо меняет ее состояние. был 0 -стало 1, и наоборот, была 1 - стала 0.

гарантированно покасить ногу порта можно так:

Reset Portb.pb0 - установить в 0 ножку РB.0
Set Portb.pb0 - установить ее в 1
 
Так я ж выше писал эту проверку уже. :)
if (Knopka1 & Knopka2) portb=0x00;

еще есть аткая засада, что запись 1 в ногу порта у 2313 не выставлякет там 1 гарантированно, а тупо меняет ее состояние. был 0 -стало 1, и наоборот, была 1 - стала 0.
Это на бейсике?

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

ЗЫ. Они там в Атмеле вообще умом ебанулись? Мало того что идиотский по сути механизм работы с портом, так еще что прикажете делать людям у которых тиражируются проекты разработаные под этот кристалл, исходники править?
 
это ж Сишный синтаксис. Я не в курсе как там оператор "И" обозначается, как работать с битовыми переменными, особенно если они пины порта.

Операторные скобки If Then EndIf не забыл?

присвой какойнить переменной состояние порта, а потом ее в IF ставь
Как вариант. Считать сосотояние порта, маской убрать ненужные пины, и сравнивать с нулем.
 
да в том то и дело что я не вкрую что ставить в этом:

If чтотутписатьвообщенепойму Then
Portb = &B00000000
End If

пробовал написать:
If Led = 0 Then
Portb = &B00000000
End If

но это тоже самое что если после
Led = 0
написать
Portb = &B00000000

меня по всем техпараметрам движения шаговика, устраивает код что я в первом посте привел, хоть он может и не совершенен, НО то что какая-то обмотка если кнопка нажата и отпущена не выключается - меня напрягает...
 
еще косяк: в начале проги порты (оба) конфигурируются на выход - и соотв. на кнопку реагировать не будут, т.к. надо чтоб пин кнопки был сконфигурен как инпут

а, и кстати: нигде в тексте проги не приписываются все нули в порт В - ессно, что оджна обмотка постоянно остается под напряжением.
однако, тут надо учесть, что оставленнй без питания шаговик не может удерживать вал, и при прикладывании внешнего момента будет крутиться..

а как выполненна аппаратная часть? драйвера шаговика?
 
еще косяк: в начале проги порты (оба) конфигурируются на выход - и соотв. на кнопку реагировать не будут, т.к. надо чтоб пин кнопки был сконфигурен как инпут

Наверное не внимательно прочли или я Вас не понял, все работает...
Есть один минус: неотключение обмотоки после нажатия и отпускания кнопки
Да можно написать
после Led = 0
Portb = &B00000000

НО когда двигатель крутится без отсановки он проходит точку при которой все обмотки выключены из за чего повышается шум двигателя, чего не хотелось бы...

Так или иначе нужно где то вписать

If чтотутписатьвообщенепойму Then
Portb = &B00000000
End If

Аппаратная часть как тут
Тільки зареєстровані користувачі бачать весь контент у цьому розділі

за исключением что ключи это IRF
 
Назад
Зверху Знизу