BASCOM AVR в вопросах и ответах
- Сообщения: 602
- Зарегистрирован: Пн дек 29, 2008 01:40:28
- Откуда: (Украина, г. Стаханов, Луганская обл.) теперь Кемерово :)
Всем привет! Нащёл интересную статью, может для кого то это и не новость, но я был приятно удивлён. (ОС реального времени AQUA RTOS для МК AVR в среде BASCOM AVR) https://habr.com/ru/post/453708/ Думаю многим пригодится
- Реклама
Приветствую всех.
Такая проблемка.Никак не могу победить концевики. Суть в
следующем. Есть аппарат, в нем ходит каретка влево-вправо.С обоих
сторон - концевики. Время движения от края до края примерно 15
сек. Вместе с включением мотора привода каретки включается мотор
вентилятора, и работает ( в режиме отладки) 1 мин. Потом -
длинная пауза (в режиме отладки - 3 мин, а реально будет 2 часа).
За второй и третий временные интервалы отвечает Timer1- с этим
проблем нет. Вся загвоздка в первом интервале. Пробовал тоже
посадить его на таймер - нестабильно работает. То недокрутит, то
перекрутит. Решил установить концевики, и бьюсь с ними целый день.
Прога работает так: на Int0 висит геркон, на стрелке часов -
магнит. По прерыванию запускается таймер и моторы с индикаторами.
А в основном цикле концевики выключают мотор привода каретки. Все
работает до срабатывания первого концевика. И все.
Вот с этим бьюсь целый день.
Может, у кого-то есть опыт общения с концевиками? Подскажите, как
с ними бороться.
На всякий случай прикладываю схему и код, конечно.
Такая проблемка.Никак не могу победить концевики. Суть в
следующем. Есть аппарат, в нем ходит каретка влево-вправо.С обоих
сторон - концевики. Время движения от края до края примерно 15
сек. Вместе с включением мотора привода каретки включается мотор
вентилятора, и работает ( в режиме отладки) 1 мин. Потом -
длинная пауза (в режиме отладки - 3 мин, а реально будет 2 часа).
За второй и третий временные интервалы отвечает Timer1- с этим
проблем нет. Вся загвоздка в первом интервале. Пробовал тоже
посадить его на таймер - нестабильно работает. То недокрутит, то
перекрутит. Решил установить концевики, и бьюсь с ними целый день.
Прога работает так: на Int0 висит геркон, на стрелке часов -
магнит. По прерыванию запускается таймер и моторы с индикаторами.
А в основном цикле концевики выключают мотор привода каретки. Все
работает до срабатывания первого концевика. И все.
Вот с этим бьюсь целый день.
Может, у кого-то есть опыт общения с концевиками? Подскажите, как
с ними бороться.
На всякий случай прикладываю схему и код, конечно.
Код: Выделить всё
$regfile = "2313def.dat"
$crystal = 4000000
$hwstack = 32
$swstack = 8
$framesize = 16
Dim V As Word
Dim M As Bit
Dim L As Bit
Config Pind.2 = Input
Config Pind.0 = Input
Config Pind.1 = Input
Config Portd.6 = Output
Config Portb.0 = Output
Config Portd.5 = Output
Config Portd.4 = Output
Config Debounce = 30
Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1
Compare1a = 62500
On Oc1a Timecount
Config Int0 = Falling
On Int0 Count
Red Alias Portb.0
Blue Alias Portd.6
Motor1 Alias Portd.4
Motor2 Alias Portd.5
L_end Alias Pind.0
R_end Alias Pind.1
Enable Interrupts
Enable Timer1
Enable Oc1a
Stop Timer1
Enable Int0
V = 0 : M = 0
Do
If L_end = 0 Or R_end = 0 Then 'сработал концевик
Reset Red
Reset Motor1
End If
If V = 60 Then
Reset Blue
Reset Motor2
End If
If V = 180 Then
Stop Timer1
Timer1 = 0
V = 0 : M = 0
End If
Loop
Count:
If M = 0 Then
Start Timer1
Set Motor1
Set Motor2
Set Red
Set Blue
End If
M = 1
Return
Timecount:
Incr V
Return
End- Вложения
-
- Схема.jpg
- (77.14 КБ) 392 скачивания
- Сообщения: 602
- Зарегистрирован: Пн дек 29, 2008 01:40:28
- Откуда: (Украина, г. Стаханов, Луганская обл.) теперь Кемерово :)
Признаться не работал с "цыфровым" компаратором и тонкостей настройки не знаю, но здается мне, что в прирывании Timecount не сбрасывается значение таймера, либо компаратора и весь счет сбивается.
Я сделал бы следуюзим образом.
Настраиваем таймер 1 на счёт.
Config Timer1 = Timer , prescale = 64
On Timer1 Timecount
Stop Timer1
Timer1 = 3036 (нам остаётся как раз 62500 отсчётов до переполнения)
А в прерывании обязательно задаём стартовое значение таймеру
Timecount:
Incr V
Timer1 = 3036
Return
И, чтоб не пропустить событие лучше писать так
If V >= 60 Then...
If V >= 180 Then..
Иначе рискуем просчитать и переполнить переменную V
Я сделал бы следуюзим образом.
Настраиваем таймер 1 на счёт.
Config Timer1 = Timer , prescale = 64
On Timer1 Timecount
Stop Timer1
Timer1 = 3036 (нам остаётся как раз 62500 отсчётов до переполнения)
А в прерывании обязательно задаём стартовое значение таймеру
Timecount:
Incr V
Timer1 = 3036
Return
И, чтоб не пропустить событие лучше писать так
If V >= 60 Then...
If V >= 180 Then..
Иначе рискуем просчитать и переполнить переменную V
То, что вы написали, примерно понятно. Но дело то не в этом, к этой части кода вопросов у меня нет. Тем более, что высокая точность отработки этих интервалов не требуется. Мне надо решить вопрос, как работать с концевиками. Я уперся именно в это, и пока не могу ничего придумать. Может быть, у кого-то есть образец кода, где обрабатываются концевики. В инете я не нашел.
- Сообщения: 132
- Зарегистрирован: Пт окт 19, 2012 05:54:55
Что значит фраза "работать с концевиками". Ты работаешь с портами. Тобишь, проверяешь их состояние.
И наплевать что там, концевик или 3.14здовик.
Рискну предположить что дело в монтаже. О влиянии сработок(отпусканий) реле и прочих индуктивных пакостей (особенно для AVR) написано туева хуча войнов и миров.
И наплевать что там, концевик или 3.14здовик.
Рискну предположить что дело в монтаже. О влиянии сработок(отпусканий) реле и прочих индуктивных пакостей (особенно для AVR) написано туева хуча войнов и миров.
- Реклама
Моя фраза "работа с концевиками" означала логику работы с ними. Но, кажется, я нашел выход. Попробую сделать так: сделаю 2 геркона рядом, чтобы срабатывали от 1 магнита. Первый будет стоять в цепи питания мотора, будет шунтировать сработавший концевик. А второй будет запускать схему, как и было раньше. Примерно так. Но это пока в голове. Проверить в железе смогу только через пару дней, т.к. нахожусь на работе.
- Сообщения: 602
- Зарегистрирован: Пн дек 29, 2008 01:40:28
- Откуда: (Украина, г. Стаханов, Луганская обл.) теперь Кемерово :)
Ну какая может быть логика работы, так или иначе вам необходимо проверять состояние "порта". Естественно на контактах концевиков у вас присутствует дребезг, его устраняем как в железе (RC цепочки) так и програмно, делаем выборку из состояний пина либо используем оператор Debounce
А если так-
..........
L_end Alias Pind.0
R_end Alias Pind.1
Pord.0=1
Pord.1=1
...........
..........
If V = 180 Then
Stop Timer1
Timer1 = 0
V = 0 : M = 0
Enable Int0
End If
Loop
Count:
If M = 0 Then
Disable Int0
Start Timer1
Set Motor1
Set Motor2
Set Red
Set Blue
End If
M = 1
Return
..........
L_end Alias Pind.0
R_end Alias Pind.1
Pord.0=1
Pord.1=1
...........
..........
If V = 180 Then
Stop Timer1
Timer1 = 0
V = 0 : M = 0
Enable Int0
End If
Loop
Count:
If M = 0 Then
Disable Int0
Start Timer1
Set Motor1
Set Motor2
Set Red
Set Blue
End If
M = 1
Return
- Сообщения: 615
- Зарегистрирован: Вс дек 28, 2014 21:54:05
Когда Ваш мотор выключится если отгниёт/ оборвётся провод концевика? Что будет если сработают оба концевика? Подсказка: Контакты должны быть НЗ.
После срабатывания концевика запретить его опрос не на 30 мс. а поболе. 100 или даже 200
А по схеме- не мешало бы и по резюку в базы. И диод к реле.
После срабатывания концевика запретить его опрос не на 30 мс. а поболе. 100 или даже 200
А по схеме- не мешало бы и по резюку в базы. И диод к реле.
Я всё-всё узнAю и стану профессором.
Насчет диода для реле - обычно я ставлю. Но в данном случае я специально проверил - при включении или при выключении реле нет скачка тока в цепи, поэтому я не стал ставить реле.
Насчет второго геркона - посидел, подумал и решил, что такой вариант не прокатит.
Насчет предложенного варианта кода - буду пробовать завтра.
Добавлено after 57 minutes 33 seconds:
Насчет диода для реле - обычно я ставлю. Но в данном случае я специально проверил - при включении или при выключении реле нет скачка тока в цепи, поэтому я не стал ставить реле.
Насчет второго геркона - посидел, подумал и решил, что такой вариант не прокатит.
Насчет предложенного варианта кода - буду пробовать завтра.
Насчет второго геркона - посидел, подумал и решил, что такой вариант не прокатит.
Насчет предложенного варианта кода - буду пробовать завтра.
Добавлено after 57 minutes 33 seconds:
Насчет диода для реле - обычно я ставлю. Но в данном случае я специально проверил - при включении или при выключении реле нет скачка тока в цепи, поэтому я не стал ставить реле.
Насчет второго геркона - посидел, подумал и решил, что такой вариант не прокатит.
Насчет предложенного варианта кода - буду пробовать завтра.
Всем привет. В итоге вернулся к старому коду - выключение мотора по времени. Только заменил геркон на датчик Холла - заколебался подбирать подходящий магнит. Тему концевиков отложил до лучших времен. Так что будем считать тему закрытой.
Потихоньку осваиваю BASCOM, не могу понять как написать сообщение первому по списку сохранённому номеру из сим Карты.
Какой командой пользоваться?
ATD>1 это вызов абоненту первому из списка, а как сообщение написать первому?
Какой командой пользоваться?
ATD>1 это вызов абоненту первому из списка, а как сообщение написать первому?
Почти у цели, но не могу понять почему появляется лишний знак кавычки при вызове номера и попытке отправить смс или совершить вызов...
Программа следущая, при отправке сообщения nomer в память сохраняется номер телефона с которого пришло это смс., но почему то сохраняется с ковычкой в конце, то есть 89хххххххх"
Соответсвенно при Попытке достать из памяти и совершить звонок на сохранённый номер получается ERROR
Добавлено after 6 minutes 33 seconds:
Вот тут видно лишнюю кавычку.

Программа следущая, при отправке сообщения nomer в память сохраняется номер телефона с которого пришло это смс., но почему то сохраняется с ковычкой в конце, то есть 89хххххххх"
Соответсвенно при Попытке достать из памяти и совершить звонок на сохранённый номер получается ERROR
Добавлено after 6 minutes 33 seconds:
Вот тут видно лишнюю кавычку.

- Вложения
-
- 5026AD12-2B7C-49DA-83A2-68DED3058704.jpeg
- (53.06 КБ) 333 скачивания
- Сообщения: 291
- Зарегистрирован: Ср май 26, 2010 20:40:47
Как вычислить необходимое значение для $timeout? Чтобы долго не ожидать и успевать принимать сообщения.
[uquote="AlekseyV",url="/forum/viewtopic.php?p=3926830#p3926830"]Как вычислить необходимое значение для $timeout? Чтобы долго не ожидать и успевать принимать сообщения.[/uquote]
В описании каждой команды дано максимальное время выполнения - Max Response Time
В описании каждой команды дано максимальное время выполнения - Max Response Time
- Сообщения: 9
- Зарегистрирован: Сб дек 09, 2017 20:02:50
Здравствуйте, коллеги!
подскажите пож-та есть исходный код подпрограммы звука, программа BASCOM AVR
zvuk1:
pwm3a=127
do
incr zvuk
toggle portb.6
waitus 150
loop until zvuk=2000
portb.6=0
zvuk=0
pwm3a=0
return
это я так понимаю генерация определённой частоты для пассивного пьезо зуммера, хочу поменять его на активный, что мне надо переписать чтоб вместо шима шёл просто лог уровень 1 200мсек? Как мне думается тут надо переписать какие-то цифры чтоб ШИМ с имитировать 100% это и будет типо лог 1
подскажите пож-та есть исходный код подпрограммы звука, программа BASCOM AVR
zvuk1:
pwm3a=127
do
incr zvuk
toggle portb.6
waitus 150
loop until zvuk=2000
portb.6=0
zvuk=0
pwm3a=0
return
это я так понимаю генерация определённой частоты для пассивного пьезо зуммера, хочу поменять его на активный, что мне надо переписать чтоб вместо шима шёл просто лог уровень 1 200мсек? Как мне думается тут надо переписать какие-то цифры чтоб ШИМ с имитировать 100% это и будет типо лог 1
- Сообщения: 615
- Зарегистрирован: Вс дек 28, 2014 21:54:05
Попробуйте убрать toggle. А перед циклом установите ногу в 1.
Я всё-всё узнAю и стану профессором.
- Сообщения: 9
- Зарегистрирован: Сб дек 09, 2017 20:02:50
Если можно, напишите как должно быть, цельный код, если не сложно. Я в программировании ничего не понимаю. тугл ещё убрать можно, а вот что такое цикл- это уже загадка:)
- Сообщения: 615
- Зарегистрирован: Вс дек 28, 2014 21:54:05
zvuk1:
pwm3a=127
portb.6=1
do
incr zvuk
waitus 150
loop until zvuk=2000
portb.6=0
zvuk=0
pwm3a=0
return
......
Цикл - всё что между DO и LOOP
pwm3a=127
portb.6=1
do
incr zvuk
waitus 150
loop until zvuk=2000
portb.6=0
zvuk=0
pwm3a=0
return
......
Цикл - всё что между DO и LOOP
Я всё-всё узнAю и стану профессором.
- Сообщения: 291
- Зарегистрирован: Ср май 26, 2010 20:40:47
Можно ли реализовать загрузку прошивки по rs485 во внешнюю EEPROM, а потом прошиться?


