Страница 273 из 304
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт май 02, 2017 15:55:32
edm2007
Ну отлично, Вы все правильно делаете, значит.

А теперь поставьте точку останова в исходнике там, где идет обработка нажатой при включении кнопки (брекпоинт ставится двойным нажатием по строке исходника). Теперь при запуске симуляция остановится на этой точке. Или не остановится, если туда не попадет. А далее можно будет пошагово (кнопка с ботинком) пройти по коду, смотря что творится.
Ну и можете проект с протеусом прикрепить, ежели чего...

Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт май 02, 2017 16:12:56
KOTик
[uquote="edm2007",url="/forum/viewtopic.php?p=3095790#p3095790"]А теперь поставьте точку останова в исходнике там, где идет обработка нажатой при включении кнопки (брекпоинт ставится двойным нажатием по строке исходника). Теперь при запуске симуляция остановится на этой точке. Или не остановится, если туда не попадет. А далее можно будет пошагово (кнопка с ботинком) пройти по коду, смотря что творится.[/uquote]
Поставил красную точку break point. Запускаю симуляцию (F12)и она останавливается в указанной точке (строка, где происходит проверка кнопки до подачи питания).
Далее нажимаю на ботинок(и) (пошагово) - происходит проверка Debounce кнопок и всех условий If внутри цикла Do...Loop
Ну и можете проект с протеусом прикрепить, ежели чего...

исходник и протеус на предыдущей странице, 2-3 постами выше.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт май 02, 2017 16:38:24
edm2007
А почему Вы перед изменением режима, не считываете его номер из EEPROM? Ведь
всегда равна 1. Эта единица и будет всегда записываться в EEPROM, при попытке изменить режим.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт май 02, 2017 17:16:12
KOTик
[uquote="edm2007",url="/forum/viewtopic.php?p=3095838#p3095838"]А почему Вы перед изменением режима, не считываете его номер из EEPROM? Ведь
всегда равна 1. Эта единица и будет всегда записываться в EEPROM, при попытке изменить режим.[/uquote]
Ой. А вот и первый баг

Исправил, но все равно не фурычит. И даже режим не переключается.
Привожу кусочек код опроса кнопки до включения:
Код: Выделить всё
If Btn = 0 Then
Mmode = S ---->> ДОБАВИЛ ТОЛЬКО ЭТУ СТРОЧКУ.
Waitms 500
Mmode = Mmode + 1 'инкрементируем
Waitms 500
S = Mmode 'сохраняем в S Eram
Waitms 500
Led = 1 'мигаем 1 раз
Waitms 100
Led = 0
Waitms 100
If Mmode >= 2 Then 'Сбрасывам в ноль, если Mmode больше или равно 2.
Mmode = 0
Else 'в противном случае
If Btn = 1 Then 'если кнопку не нажимали
Waitms 500
Mmode = S 'считываем раннее записанное значение Mmode (режима)
End If 'конец условия
Wait 3
End If 'конец условия
End If 'конец условия
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт май 02, 2017 17:33:08
edm2007
Второй нюанс работы с EEPROM: изначально по всем адресам записано значение FF. А значит при первом включении нужно инициализировать нужные ячейки. Вообще в Вашем случае при первой попытке изменить режим должно считаться 255, далее 255 +1 = 0. И этот 0 запишется в память. При следующей попытке изменить режим уже будет 1. Далее - 2. А значит выполнится условие
Код: Выделить всё
If Mmode >= 2 Then 'Сбрасывам в ноль, если Mmode больше или равно 2.
Mmode = 0
Но тут нет сохранения в EEPROM. А значит Mmode будет при зажатой кнопке равна 2 (и сразу 0), и так далее. Проще говоря, Mmode всегда будет 0 (а в EEPROM при этом счетчик будет шагать, переменную S ведь никто не обнулял в этом условии).
Добавлено after 5 minutes 44 seconds:
Кстати, для того чтобы полностью сбросить МК в протеусе (и EEPROM в том числе), при остановленной симуляции выберите "Отладка -> Сброс постоянных данных модели".
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт май 02, 2017 17:35:49
KOTик
Сделал так:
В эмуляторе в этом случае переменная Mmode каждый раз увеличивается, при смене режима. А вместе с ней и значение в еепром.
Почему то Mmode не сбрасывается в 0, ведь стоит следующее условие:
Код: Выделить всё
If Mmode >= 2 Then 'Сбрасываем в ноль, если Mmode больше или равно 2.
Mmode = 0
Таким образом Mmode не равно 1, следовательно, режим сменить не получается
Вот-вот!
Я как раз об этом. Вы меня опередили.
Как решить эту проблему?

Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт май 02, 2017 17:46:10
edm2007
Смотрите, как сейчас дело обстоит у Вас.
1. Включаем агрегат с зажатой кнопкой. Из EEPROM считывается 255.
2. Mmode = 255 + 1 = 0
3. Этот 0 сохраняется в EEPROM.
4. В итоге Mmode = 0 и S = 0, идем в основной цикл.
//----------------------------------------
1. Включаем агрегат с зажатой кнопкой. Из EEPROM считывается 0.
2. Mmode = 0 + 1 = 1
3. Эта 1 сохраняется в EEPROM.
4. В итоге Mmode = 1 и S = 1, идем в основной цикл.
//----------------------------------------
1. Включаем агрегат с зажатой кнопкой. Из EEPROM считывается 1.
2. Mmode = 1 + 1 = 2
3. Эта 2 сохраняется в EEPROM.
4. Теперь выполняется условие If Mmode >= 2 Then, и Mmode становится равна нулю.
5. В итоге Mmode = 0, а S = 2 (ее-то никто не сбросил), идем в основной цикл.
//----------------------------------------
1. Включаем агрегат с зажатой кнопкой. Из EEPROM считывается 2.
2. Mmode = 2 + 1 = 3
3. Эта 3 сохраняется в EEPROM.
4. Снова выполняется условие If Mmode >= 2 Then, и Mmode становится равна нулю.
5. В итоге Mmode = 0, а S = 3, идем в основной цикл.
Таким образом, значение в EEPROM увеличивается при каждой попытке изменить режим, а вот переменная Mmode так и будет равна 0. Так будет до тех пор, пока S не станет равна 255, потом снова перевалится в 0, и вот тогда на один раз Mmode станет равна 1. А потом все повторится снова...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт май 02, 2017 18:49:49
KOTик
А как записать 255 в еепром?
В самом начале кода
прописал так: Mmode = 255
При нажатии на кнопку увеличивается на 1 и как бы сохраняется. А вот при повторном включении все-равно Mmode = 255 и так по кругу. Я чего-то не догоняю, туплю

Пойду отдохну маленко, обмозгую...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт май 02, 2017 18:53:35
edm2007
Вы не о том думаете, запутывая себя же самого. Зачем записывать 255? Перечитайте
edm2007 писал(а):изначально по всем адресам записано значение FF
Оно там уже есть у чистого контроллера. Я расписал
как работает сейчас программа, я не писал
что нужно сделать. 
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт май 04, 2017 10:40:08
KOTик
[uquote="edm2007",url="/forum/viewtopic.php?p=3095994#p3095994"]я не писал
что нужно сделать. 
[/uquote]
Учитель
Может быть завести еще одну переменную Flag?
Не пинайте сильно.
Код: Выделить всё
Dim S As Eram Byte
Dim Mmode As Byte
Dim Flag As Byte
If Btn = 0 Then
Flag = S
Waitms 500
Flag = Mmode + 1 'инкрементируем
Waitms 500
S = Flag 'сохраняем в S Eram
Waitms 500
Led = 1 'мигаем 1 раз
Waitms 100
Led = 0
Waitms 100
If Flag >= 2 Then 'Сбрасывам в ноль, если Flag больше или равно 2.
Flag = 0
Else 'в противном случае
If Btn = 1 Then 'если кнопку не нажимали
Waitms 500
Flag = S 'считываем раннее записанное значение Mmode (режима)
End If 'конец условия
Wait 3
End If 'конец условия
End If 'конец условия
Do
....
Loop
...
...
'================= О Б Р А Б О Т Ч И К П Р Е Р Ы В А Н И Й ==
'/// ---> ВЫКЛЮЧАЕМ ДХО
Drl_off: 'метка
If Flag = 1 And Turn = 1 Then 'Если выбран Flag=1 и включен поворотник, тогда
Pwm0a = 255 'Включаем ШИМ на полную яркость
Else 'В противном случае, Flag=0 + включен поворотник, тогда
Pwm0a = 0 'Выключаем ШИМ вовсе
End If 'конец условия
Bitwait Turn , Reset 'ждем когда поворотник перестанет мигать
Return 'выходим
Поправьте, если не так.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт май 04, 2017 10:46:02
edm2007
Хе. Давайте с самого начала, режим должен переключаться как? 0 - 1 - 0 - 1? Вы в условии
Код: Выделить всё
If Mmode >= 2 Then 'Сбрасывам в ноль, если Mmode больше или равно 2.
Mmode = 0
сбрасываете режим в ноль, но при этом оставляете его в переменной S, хотя это копия режима. Как минимум, должно быть так
Код: Выделить всё
If Mmode >= 2 Then 'Сбрасывам в ноль, если Mmode больше или равно 2.
Mmode = 0
S = Mmode 'сохраняем в S Eram
Только без Ваших новшеств с флагами...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт май 04, 2017 11:11:01
KOTик
[uquote="edm2007",url="/forum/viewtopic.php?p=3097224#p3097224"]сбрасываете режим в ноль, но при этом оставляете его в переменной S, хотя это копия режима. Как минимум, должно быть так
Код: Выделить всё
If Mmode >= 2 Then 'Сбрасывам в ноль, если Mmode больше или равно 2.
Mmode = 0
S = Mmode 'сохраняем в S Eram
[/uquote]
Спасибо!
Сделал так:
Код: Выделить всё
'/// ---> НАСТРОЙКА РЕЖИМА РАБОТЫ
'До подачи питания нажимаем кнопку и держим до тех пор,
'Значение Mmode не изменится
'LED мигнет 1раз сигнализируя о том, что настройка сохранилась
Mmode = S
If Btn = 0 Then
Waitms 500
Mmode = Mmode + 1 'инкрементируем
Waitms 500
S = Mmode 'сохраняем в S Eram
Waitms 500
Led = 1 'мигаем 1 раз
Waitms 100
Led = 0
Waitms 100
If Mmode >= 2 Then 'Сбрасывам в ноль, если Mmode больше или равно 2.
Mmode = 0
S = Mmode ------> 'ВОТ ЭТА СТРОЧКА, из-за которой вся головная боль началась :)
Else 'в противном случае
If Btn = 1 Then 'если кнопку не нажимали
Waitms 500
Mmode = S 'считываем раннее записанное значение Mmode (режима)
End If 'конец условия
Wait 3
End If 'конец условия
End If 'конец условия
В симуляторе работает просто замечательно

Гляжу в окна AVR Variables и AVR EPROM Memory = Переменные Mmode и S меняются одинаково: 1 и 0; 0 и 1.
Вечером в железе попробую.
Еще раз спасибо, учитель!
Эта строка мне столько крови выпила вы прошлый уик-энд. Да и из головы что-то вылетело условие, что если Mmode = 0 его тоже нужно сохранять.
Урааа!

Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 28, 2017 06:51:40
rojnov
Приветствую всех, кто не спит, и прошу посильной помощи. Написал малюсенькую, но очень
нужную, программульку, а она не хочет работать, хотя по идее должна была. Задача такая: в
рабочем режиме контакты на входе замкнуты( использую INT0 у Tiny13 на 6 ноге). На выходе МК
(PB.2) стоит оптореле, которое далее по схеме включает силовую часть. Периодичести раз в 2
мин контакты на входе размыкаются на 1 сек, и надо, чтобы выход на эти размыкания не
реагировал. Но если вход разомкнут более чем на 2 сек, устройство на выходе выключается.
Прошу посмотреть свежим взглядом, чего ему не хватает. Собрал на макетке, вместо оптореле
воткнул светодиод.
Код: Выделить всё
$regfile = "attiny13a.dat"
$crystal = 4800000
$hwstack = 8
$swstack = 16
$framesize = 32
Config Pinb.1 = Input
Config Portb.2 = Output
Config Int0 = Falling
On Int0 Pr
Enable Interrupts
Enable Int0
Dim A As Long
Hrom Alias Pinb.1
Rele Alias Portb.2
A = 0 : Reset Rele
Do
If Hrom = 1 Then Incr A
If A = 1200000 Then
Reset Rele
Powerdown
End If
Loop
Pr:
A = 0 : Set Rele
Return
End
Добавлено after 9 hours 25 minutes 37 seconds:
Понял, что через Int0 работать не будет. Сделал еще проще. Но светик, вместо того, чтобы
спокойно гореть, очень часто мигает. На размыкание кнопки на входе реакции тоже нет. Пока
думаю.
Код: Выделить всё
$regfile = "attiny13a.dat"
$crystal = 4800000
$hwstack = 8
$swstack = 16
$framesize = 32
Config Pinb.3 = Input
Config Portb.1 = Output
Hrom Alias Pinb.3
Rele Alias Portb.1
Dim A As Long
A = 0 : Reset Rele
Do
If Hrom = 0 Then Set Rele
If Hrom = 1 Then
Incr A
If A = 1200000 Then
Reset Rele : A = 0
End If
End If
Loop
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 28, 2017 08:09:38
Gordon Shumway
[uquote="rojnov",url="/forum/viewtopic.php?p=3114941#p3114941"]светик, вместо того, чтобы
спокойно гореть, очень часто мигает. На размыкание кнопки на входе реакции тоже нет. Пока
думаю.
If A = 1200000 Then
Reset Rele : A = 0[/uquote]
Ну, логично. Здесь светик должен моргать примерно 4 раза в секунду. При такой тактовой частоте A становится равна 1200000 за 0,25 секунд.
Для решения вашей задачи проще не считать тики на такой частоте, а использовать встроенный таймер для замера времени и считать его переполнения.
2 секунды на частоте 4,8 мгц - это 37 переполнений 8-битного таймера c делителем 1024
Код: Выделить всё
$regfile = "attiny13a.dat"
$crystal = 4800000
$hwstack = 8
$swstack = 16
$framesize = 32
Config Pinb.3 = Input
Config Portb.1 = Output
Hrom Alias Pinb.3
Rele Alias Portb.1
Dim A As byte
A = 0 : Reset Rele
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
Enable interrupts
On Timer0 Incr_a
Stop Timer0
Do
If Hrom = 0 Then Set Rele
If Hrom = 1 Then
Start timer0
While Hrom = 1
If A > 37 Then
Stop Timer0
A = 0
Reset Rele
Exit While
End If
Wend
Stop Timer0
A = 0
End If
Loop
Incr_a:
incr a
return
End 'end program
Пока Hrom = 0 - светик горит, таймер стоит. На Hrom стал 1 - таймер затикал, переполнения считаются в подпрограмме Incr_a. Стало 37 переполнений - остановили таймер, сбросили А, cбросили Rele. Если На Hrom уже не 1, а A еще не стало 37 - остановили таймер, сбросили А, Rele не трогаем.
Проверить не на чем, но вроде компилится. Проверяйте. Обратите внимание на фузы установки частоты кристалла, так как таймер рассчитывается исходя из этой частоты.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 28, 2017 08:34:00
rojnov
Спасибо, вечером попробую. Вообще-то я начинал с использования таймера, но почему-то решил, что проще считать тики МК чем возиться с таймером. В итоге мысль пошла не в ту сторону.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 28, 2017 20:05:39
rojnov
Добрый вечер всем! Попробовал в железе (на макетке) и ничего не могу понять. По идее, все должно работать. Попробовал на 2-х разных МК: на одном светик горит нормально, на другом- мигает очень часто. Причем на нажатие кнопки на входе оба не реагируют. Специально перепроверил фьюзы - у обоих одинаково. Попробовал в Протеусе - все работает, как надо. Может быть, с камнями что-то не так?
Наверное, буду делать на печатной плате с МК в SO-8. Они точно новые.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 28, 2017 20:53:27
Gordon Shumway
[uquote="rojnov",url="/forum/viewtopic.php?p=3115510#p3115510"]Попробовал в железе (на макетке) и ничего не могу понять. По идее, все должно работать.[/uquote]
Про сопротивление Pinb.3 на плюс 4,7к не забыли ? Протеусу все равно, а в реальных схемах нужно подтягивать. И емкость 0,1 мкф Pinb.3 на землю. Фузы проверяйте, делитель на 8 должен быть выключен.
Я не знаю что у вас за кнопка, может "звенит". Попробуйте вставить задержку:
If Hrom = 1 Then
waitms 200
Start timer0
...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт июн 15, 2017 10:02:39
Tankor
Может кто сталкивался с алгоритмами предсказания погоды по изменению давления и влажности? Есть алгоритм Zambretti, но реализация только на php, а я в нём ни бум-бум. Что скажете? Может кто уже делал?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 16, 2017 19:25:36
IDok
друзья, подскажите кто что может. есть программа, надо управлять режимами одной кнопкой. проблема в том, что по нажатию кнопки возврат из прерывания приходит в самую гущу длинного и долгого цикла и пока он не докрутится - переходов нет. надо каким-то макаром попадать из прерывания кнопки в начало программы. Goto не предлагать - не работает
$Regfile="attiny85.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32
Config Portb.0 = Output 'R
config portb.1 = output 'G
config portb.4 = output 'B
Config PORTB.3 = output 'белый свет
Config PINB.2 = input 'кнопка
Config Int0 = Falling : On INT0 Button
Config Timer1 = Timer , Prescale = 1 : On Timer1 Pwm_prog : Enable Timer1 : Enable Interrupts : start timer1 : Enable Int0
Dim S As Byte , A as Byte , C(3) as byte , B as Byte
B=0
for A=0 to 63 'увеличиваем красный
C(1)=lookup(A , TAB_PWM)
waitms 20
next
Do
if B=1 then goto 1
if B=2 then goto 2
loop
2:
do
If B=2 then
тут длинный и долгий ШИМ для светодиодов
End if
Loop
1:
Do
If B=1 Then
PORTB.0 = 0 : PORTB.1 = 0 : PORTB.4 = 0 : PORTB.3 = 1 'включаем белый свет
End if
Loop
end
Pwm_prog:
Return
Button:
Incr B
waitms 10
if B>2 then B = 0
Return
5
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб июн 17, 2017 15:30:59
serg_svd
IDok , на мой взгляд программа неправильно написана. Вижу ДВА бесконечных цикла без выхода из них. Бесконечный цикл должен быть один. в нем и крутится основная программа.
Сделайте в нем switch - case по переменной В и будет вам счастье/