Обсуждаем контроллеры компании Atmel.
Пт ноя 29, 2019 11:30:06
Вы объявили режим CTC, а ждете прерывание по переполнению, которое никогда не запустится, т.к. счетчик не доходит до MAX.
- Код:
Enable OC1 'Timer1
Пт ноя 29, 2019 20:43:01
Я подозревал, что тут дело в неправильной организации таймера. У меня в этом деле мало опыта. Подскажите, как правильно запустить таймер1 по переполнению. Мне это пригодится в будущем.
Добавлено after 44 minutes 9 seconds:
С таймером разобрался - нашел пример в инете. ШД включается и останавливается через 3 сек, как мне и надо. Осталось только понять, почему МК вновь не просыпается при срабатывании геркона.
Пт ноя 29, 2019 21:22:46
- Код:
Config Int0 = Falling
У вас прерывание происходит по спаду сигнала, т. е. при переходе c высокого уровня на низкий. В программе подтяжки нет. Как подключен геркон?
Сб ноя 30, 2019 07:42:35
Геркон подтянут к плюсу через R=10к. Не стал возиться со схемой, т.к. она очень простая. Переделал нижнюю часть кода. Теперь команда Спать - внутри цикла Do-Loop. Но все равно МК не просыпается от геркона. Пока не могу понять причину. Вот основная часть кода:
- Код:
Do
If F = 1 Then 'ñðàáîòàë ãåðêîí
Led = 1 'çàãîðåëñÿ ñâåòîäèîä
Decr S
If S = 0 Then 'ðàññ÷åò íîìåðîâ îáìîòîê ØÄ
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
End If
If A = 5 Then 'A=5 - ïðîøëî 5 ñåêóíä
Stop Timer1
Led = 0 : F = 0 : A = 0
Powerdown 'ÌÊ óñíóë
End If
Loop
End
Pusk: 'íàæàòà êíîïêà ïóñêà
Start Timer1
F = 1
Return
Timecount: 'ïîäñ÷åò âðåìåíè
Incr A
Return
Добавлено after 31 minute 40 seconds:Заменил Powerdown на Idle. МК засыпает и нормально просыпается при срабатывании геркона. НО! Померил потребление в разных режимах. В режиме сна потребление-260ма, в режиме вращения ШД - 120ма. Т.е. в режиме сна схема кушает в 2 раза больше. Почему - не могу понять. Не сталкивался с этим раньше. Хотя, конечно, практической пользы для меня от засыпания МК нет, т.к. питание будет от сети. Но все равно что-то здесь неправильно, учитывая то, что МК будет спать по 12 часов и включаться на 3-5 сек.
Сб ноя 30, 2019 20:24:57
В хелпе Баскома указано "When an END statement is encountered, all interrupts are disabled and a never-ending loop is generated".
У Вас имеется комбинация
Ex:
Stop Timer1
Led = 0 : F = 0 : A = 0
Powerdown
End - не в этом ли дело?
Сб ноя 30, 2019 23:02:18
- Код:
Config Int0 = Falling
Думаю, дело в этой строке. Т.к. INT0 выводит камень из POWER DOWN только по низкому уровню, а по спаду нет. Студия 3.21 дизассемблирует .hex и, при прогоне в симуляторе, не даёт завестись камню. Закомментировал эту строку и становится что-то похожее на правду.
Вс дек 01, 2019 08:52:50
Ну вреде бы со всем почти разобрался. Избавился от безусловного перехода на метку Ex, теперь все работает в цикле Do-Loop. Вместо команды Powerdown сделал Idle- МК просыпается нормально. Но самое главное - сделал подачу питания не ULN2003 через герконовое реле, используя еще один порт. Так что ШД теперь вообще не греется.
Остался один непонятный момент. Я решил добавить в схему реверс ШД, используя Config Int1=Low_level. Написано вроде, что прерывание в таком случае генерируется, пока держится низкий уровень. Добавил еще одну кнопку для реверса. Я рассчитывал, что ШД будет работать, пока нажата кнопка реверса, а при отпускании должен остановиться. Но ШД почему-то не хочет останавливаться при отпускании кнопки. Может быть, все это должно работать как-то по другому? В принципе, это не смертельно, в крайнем случае буду использовать Timer1. Просто непонятно.
Чт дек 05, 2019 07:33:18
Всем привет, есть задача.
На вход АЦП подключен переменный резистор, при вращении от начальной до конечной меняется значение АЦП от значения 1 до 10, то есть в минимальном положении 1, в середину крутнули 5, в крайнее положение - 10
Необходимо:
Допустим, крутанули резистор так, что значение АЦП у нас 4, выключили питание, включили.
Как задать как бы гистерезис +/-2, то есть, ключили питание, значение АЦП у нас 4, крутим резистор, пока значение АЦП не вышло за пределы 2 или 6 то светодиодом мы не светим.
То же самое если например было значение АЦП 5, включаем питание, при вращении резистора пока значение АЦП не будет 3 или 7 светодиод не включаем.
Получается, надо при включении питания к текущему значению АЦП применить условие сравнения, что ли
типа считали АЦП, оно = 5,
Тогда если оно не выходит за пределы <3 and >7 then
ничего не делаем
else
включаем диод.
НО, не распишешь же такое условия для каждого значения АЦП от 1 до 10,
помогите плз.
Добавлено after 1 minute 8 seconds:
то есть, считал значение ацп, и добавляешь к нему гистерезис, плюс минус 2 вольта к примеру, если через какое то время это значенеи вышло за пределы - включаем диод, если покрутили резистор к примеру.
Чт дек 05, 2019 08:04:46
Считываем АЦП, две переменные min_ и max_. К одной +2, к другой -2. И сравнение значения с этими переменными.
Чт дек 05, 2019 08:08:23
Хорошо,а как реализовать именно этот участок кода, где идет сравнение? Если кто согласен помочь, напишите почту, могу благодарность на телефон кинуть, понимаю, что благотворительностью не все хотят заниматься)
Чт дек 05, 2019 16:53:17
Хорошо,а как реализовать именно этот участок кода, где идет сравнение?
Исходя из описания, как-то, видимо, так.
- Код:
...
OnStartADVar = GetADC(0);
OnStartMax = OnStartADVar + 2
OnStartMin = OnStartADVar – 2
Do
CurADVar = GetADC(0)
If CurADVar => OnStartMin AND CurADVar <= OnStartMax Then
'do something
Esle
'do something else
End If
Loop
...
Или мимо?
Пт дек 06, 2019 12:59:22
- Код:
...
OnStartADVar = GetADC(0);
OnStartMax = OnStartADVar + 2
OnStartMin = OnStartADVar – 2
Do
CurADVar = GetADC(0)
If CurADVar => OnStartMin AND CurADVar <= OnStartMax Then
'do something
Esle
'do something else
End If
Loop
...
Вроде то, что надо. За наводку спасибо, буду колдовать. О результатах сообщу.
Пн дек 16, 2019 14:47:11
Здравствуйте. Не натыкался кто на библиотеку для работы с дисплеем на контроллере - st7586?
Вс янв 12, 2020 19:32:43
Странный глюк штатного прошивальщика в BascomAvr 2.0.7.1
Захотел прошить Attiny2313A. В исходнике указал
$regfile = "ATtiny2313A.DAT"
Вставляю Attiny2313A в USBASP, жму F4 - идентификация. Он ругается, что найденная 2313 не соответствует указанной 2313A
Если указываю
$regfile = "ATtiny2313.DAT", то не ругается, заявляет, что нашел 2313A и дальше прошивается нормально.
Пока баг вылечил просто тем, что переименовал рег.файл 2313 в 2313A.
Может, я что-то не так делаю?
Чт янв 16, 2020 00:19:24
Вопрос.
Если мне нужно выбрать из общего потока цифробуквенных данных только цифры от 0 до 9, то писать
If I >= 0 And I <= 9 Then
или есть более правильные варианты?
Чт янв 16, 2020 00:26:26
I это string*1?
Если да то
If ASC(I) >= 30 And ASC(I) <= 39 Then
https://avrhelp.mcselec.com/index.html?asc.htm
Чт янв 16, 2020 00:34:05
I это string*1?
Если да то
If ASC(I) >= 30 And ASC(I) <= 39 Then
https://avrhelp.mcselec.com/index.html?asc.htmByte, просто я предполагал, что вместо >= AND <= есть другие варианты. Кстати, я сначала вообще думал >= Or <= но оно не работало!
Чт янв 16, 2020 00:35:52
Откуда в Byte - буквы? Это 8 битовая переменная. Там может быть только 0-255
Чт янв 16, 2020 00:59:56
Откуда в Byte - буквы? Это 8 битовая переменная. Там может быть только 0-255
В потоке данных там и буквы и цифры в коде ASCII. Вот мне и надо взять из потока только цифры.
то есть это соответственно
If I >= 48 And I <= 57 Then (если в коде ASCII)
Чт янв 16, 2020 16:02:23
goldskif писал(а):Вставляю Attiny2313A в USBASP, жму F4 - идентификация. Он ругается, что найденная 2313 не соответствует указанной 2313A
МК куплены в Китае?
Может перемаркировка?
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.