Ну отлично, Вы все правильно делаете, значит. А теперь поставьте точку останова в исходнике там, где идет обработка нажатой при включении кнопки (брекпоинт ставится двойным нажатием по строке исходника). Теперь при запуске симуляция остановится на этой точке. Или не остановится, если туда не попадет. А далее можно будет пошагово (кнопка с ботинком) пройти по коду, смотря что творится.
Ну и можете проект с протеусом прикрепить, ежели чего...
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
А теперь поставьте точку останова в исходнике там, где идет обработка нажатой при включении кнопки (брекпоинт ставится двойным нажатием по строке исходника). Теперь при запуске симуляция остановится на этой точке. Или не остановится, если туда не попадет. А далее можно будет пошагово (кнопка с ботинком) пройти по коду, смотря что творится.
Поставил красную точку break point. Запускаю симуляцию (F12)и она останавливается в указанной точке (строка, где происходит проверка кнопки до подачи питания). Далее нажимаю на ботинок(и) (пошагово) - происходит проверка Debounce кнопок и всех условий If внутри цикла Do...Loop
Цитата:
Ну и можете проект с протеусом прикрепить, ежели чего...
исходник и протеус на предыдущей странице, 2-3 постами выше.
А почему Вы перед изменением режима, не считываете его номер из EEPROM? Ведь
Код:
Mmode = Mmode + 1 'инкрементируем
всегда равна 1. Эта единица и будет всегда записываться в EEPROM, при попытке изменить режим.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
А почему Вы перед изменением режима, не считываете его номер из EEPROM? Ведь всегда равна 1. Эта единица и будет всегда записываться в EEPROM, при попытке изменить режим.
Ой. А вот и первый баг Исправил, но все равно не фурычит. И даже режим не переключается. Привожу кусочек код опроса кнопки до включения:
Код:
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 'конец условия
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Второй нюанс работы с 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 в том числе), при остановленной симуляции выберите "Отладка -> Сброс постоянных данных модели".
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
В эмуляторе в этом случае переменная Mmode каждый раз увеличивается, при смене режима. А вместе с ней и значение в еепром. Почему то Mmode не сбрасывается в 0, ведь стоит следующее условие:
Код:
If Mmode >= 2 Then 'Сбрасываем в ноль, если Mmode больше или равно 2. Mmode = 0
Таким образом Mmode не равно 1, следовательно, режим сменить не получается
Вот-вот! Я как раз об этом. Вы меня опередили. Как решить эту проблему?
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. А потом все повторится снова...
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
А как записать 255 в еепром? В самом начале кода прописал так: Mmode = 255 При нажатии на кнопку увеличивается на 1 и как бы сохраняется. А вот при повторном включении все-равно Mmode = 255 и так по кругу. Я чего-то не догоняю, туплю Пойду отдохну маленко, обмозгую...
Вы не о том думаете, запутывая себя же самого. Зачем записывать 255? Перечитайте
edm2007 писал(а):
изначально по всем адресам записано значение FF
Оно там уже есть у чистого контроллера. Я расписал как работает сейчас программа, я не писал что нужно сделать.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Учитель Может быть завести еще одну переменную 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 'выходим
Хе. Давайте с самого начала, режим должен переключаться как? 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
Только без Ваших новшеств с флагами...
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
сбрасываете режим в ноль, но при этом оставляете его в переменной S, хотя это копия режима. Как минимум, должно быть так
Код:
If Mmode >= 2 Then 'Сбрасывам в ноль, если Mmode больше или равно 2. Mmode = 0 S = Mmode 'сохраняем в S Eram
Спасибо! Сделал так:
Код:
'/// ---> НАСТРОЙКА РЕЖИМА РАБОТЫ 'До подачи питания нажимаем кнопку и держим до тех пор, 'Значение 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
Встал на лапы
Зарегистрирован: Вс мар 27, 2011 07:48:48 Сообщений: 127 Откуда: г. Екатеринбург
Рейтинг сообщения:0
Приветствую всех, кто не спит, и прошу посильной помощи. Написал малюсенькую, но очень
нужную, программульку, а она не хочет работать, хотя по идее должна была. Задача такая: в
рабочем режиме контакты на входе замкнуты( использую INT0 у Tiny13 на 6 ноге). На выходе МК
(PB.2) стоит оптореле, которое далее по схеме включает силовую часть. Периодичести раз в 2
мин контакты на входе размыкаются на 1 сек, и надо, чтобы выход на эти размыкания не
реагировал. Но если вход разомкнут более чем на 2 сек, устройство на выходе выключается. Прошу посмотреть свежим взглядом, чего ему не хватает. Собрал на макетке, вместо оптореле
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 работать не будет. Сделал еще проще. Но светик, вместо того, чтобы
спокойно гореть, очень часто мигает. На размыкание кнопки на входе реакции тоже нет. Пока
светик, вместо того, чтобы спокойно гореть, очень часто мигает. На размыкание кнопки на входе реакции тоже нет. Пока думаю.
If A = 1200000 Then Reset Rele : A = 0
Ну, логично. Здесь светик должен моргать примерно 4 раза в секунду. При такой тактовой частоте A становится равна 1200000 за 0,25 секунд. Для решения вашей задачи проще не считать тики на такой частоте, а использовать встроенный таймер для замера времени и считать его переполнения. 2 секунды на частоте 4,8 мгц - это 37 переполнений 8-битного таймера c делителем 1024
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
Встал на лапы
Зарегистрирован: Вс мар 27, 2011 07:48:48 Сообщений: 127 Откуда: г. Екатеринбург
Рейтинг сообщения:0
Спасибо, вечером попробую. Вообще-то я начинал с использования таймера, но почему-то решил, что проще считать тики МК чем возиться с таймером. В итоге мысль пошла не в ту сторону.
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 28, 2017 20:05:39
Встал на лапы
Зарегистрирован: Вс мар 27, 2011 07:48:48 Сообщений: 127 Откуда: г. Екатеринбург
Рейтинг сообщения:0
Добрый вечер всем! Попробовал в железе (на макетке) и ничего не могу понять. По идее, все должно работать. Попробовал на 2-х разных МК: на одном светик горит нормально, на другом- мигает очень часто. Причем на нажатие кнопки на входе оба не реагируют. Специально перепроверил фьюзы - у обоих одинаково. Попробовал в Протеусе - все работает, как надо. Может быть, с камнями что-то не так? Наверное, буду делать на печатной плате с МК в SO-8. Они точно новые.
Попробовал в железе (на макетке) и ничего не могу понять. По идее, все должно работать.
Про сопротивление Pinb.3 на плюс 4,7к не забыли ? Протеусу все равно, а в реальных схемах нужно подтягивать. И емкость 0,1 мкф Pinb.3 на землю. Фузы проверяйте, делитель на 8 должен быть выключен. Я не знаю что у вас за кнопка, может "звенит". Попробуйте вставить задержку:
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт июн 15, 2017 10:02:39
Встал на лапы
Карма: 7
Рейтинг сообщений: 28
Зарегистрирован: Вт май 03, 2011 10:13:12 Сообщений: 139 Откуда: Россия, Татарстан
Рейтинг сообщения:0
Может кто сталкивался с алгоритмами предсказания погоды по изменению давления и влажности? Есть алгоритм Zambretti, но реализация только на php, а я в нём ни бум-бум. Что скажете? Может кто уже делал?
друзья, подскажите кто что может. есть программа, надо управлять режимами одной кнопкой. проблема в том, что по нажатию кнопки возврат из прерывания приходит в самую гущу длинного и долгого цикла и пока он не докрутится - переходов нет. надо каким-то макаром попадать из прерывания кнопки в начало программы. Goto не предлагать - не работает
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
IDok , на мой взгляд программа неправильно написана. Вижу ДВА бесконечных цикла без выхода из них. Бесконечный цикл должен быть один. в нем и крутится основная программа. Сделайте в нем switch - case по переменной В и будет вам счастье/
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Сейчас этот форум просматривают: veso74 и гости: 33
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения