Приветствую всех. ...Пару строчек проги, а работать не хочет толком (вместо импульсов от внешнего источника использую временно кнопку. Подтяжка на + через резистор. Если медленно нажимать (>1 сек), то вроде все ок, если "быстрее", то индикация на LCD и сама программа сбивается. Максимально постарался закомментить для читабельности/наглядности.
On Timer1 Uphigh 'переход по переполнению On Int1 Change_Front 'переход по изменению фронта
sek=0 imp=0
Enable Interrupts ' включить прерывания Enable Int1 'по импульсу на ножке d.3 Enable Timer1 ' ... по переполнению
Cursor Off Noblink ' курсор OFF
Do 'основной цикл Locate 1 , 1 Lcd "sek:";Sek ;" Tim1:"; timer1 ' секунды и таймер цикла Waitms 100 Loop
Uphigh: 'секунды Incr sek Incr sek ' дважды,т.к. не хоцца умножать на 2 Return
Change_Front: ' кол-во импульсов и вывод на LCD incr imp Locate 2 , 6 Lcd imp;" Impulse" return
p.s. ... как сей текст проги "вложить в разворачивающийся текст, т.к. скоро меня терпеливые модераторы забанят за ламерство!?! (Code/Spoiler) p.s.s Спасибо за внимание
как сей текст проги "вложить в разворачивающийся текст, т.к. скоро меня терпеливые модераторы забанят за ламерство!?!
При создании сообщения есть BB коды и "Code" и "spoiler". Находятся прямо под полем "Заголовок".
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
я бы еще увеличил стеки и команду разрешения прерываний поставил после настройки всех прерываний
Увеличил: $hwstack=80 $swstack=32 ------ Увеличение не исправило кривизну моей проги ) Enable Interrupts '(команда разрешения прерываний и так вроде стоит после настройки всех прерываний... Или как нужно?)
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
для данной программы скорость не влияет. Сделайте генератор на другом МК или любой микросхеме, частота от 1 до 100 герц и посмотрите как работает. Пока считаю, что проблема автора в дребезге контактов выключателя, которым он имитирует работу внешнего источника сигналов
а можно и так сделать: в подпрограмме прерывания добавить команду отключения прерываний (или именно аппаратного внешнего), добавить паузу в 50-100uS, затем включить ранее отключенное прерывание.
а пи чем тут фузы?вы компилятору сообщили частоту мк? $crystal = 8000000
Данный дефайн используется для расчета задержек при использовании тех же функций DELAY (wait, waitms, waitus) и прочей времязависимой периферии типа UART. В данном случае оно совершенно не играет никакой роли.
aleksandr-zh писал(а):
а можно и так сделать: в подпрограмме прерывания добавить команду отключения прерываний (или именно аппаратного внешнего), добавить паузу в 50-100uS, затем включить ранее отключенное прерывание.
В обработчике и так все прерывания запрещаются глобально и хардварно, независимо от языка программирования. А вот флаги прерываний продолжают выставляться исправно, и вот их стоит сбрасывать. Про задержки в прерываниях говорить не буду.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
а пи чем тут фузы?вы компилятору сообщили частоту мк? $crystal = 8000000
Данный дефайн используется для расчета задержек при использовании тех же функций DELAY (wait, waitms, waitus) и прочей времязависимой периферии типа UART. В данном случае оно совершенно не играет никакой роли.
то есть Waitms 100 всегда будет 100 мсек если в программе не выставить частоту мк,а мк прошить хоть 1,хоть 2,хоть 4,хоть 8 МГц? всегда думал что для Waitms 100 нужно указывать компилятору частоту мк вот попробуйте Спойлер$Regfile = "m8adef.dat" $crystal = 8000000 '$hwstack = 40 '$swstack = 16 '$framesize = 32 Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.2 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 Config Lcd = 16 * 2 Cursor Off Noblink ' êóðñîð OFF 'Config Debounce = 10 Dim sek As long dim imp as Word dim flag as bit 'Config Portd.3 = Input Portd.3 = 1 Config Int1 = Falling ' 'âíåøíåå ïðåðûâàíèå - ïî ñïàäó èìïóëüñà CHANGE (ïðè èçìåíåíèè ôðîíòà) Config Timer1 = timer , Prescale = 256 On Timer1 Uphigh 'ïåðåõîä ïî ïåðåïîëíåíèþ On Int1 Change_Front 'ïåðåõîä ïî èçìåíåíèþ ôðîíòà Enable Interrupts ' âêëþ÷èòü ïðåðûâàíèÿ Enable Int1 'ïî èìïóëüñó íà íîæêå d.3 Enable Timer1 ' ... ïî ïåðåïîëíåíèþ sek = 0 imp = 0 flag = 0 Do 'îñíîâíîé öèêë Locate 1 , 1 Lcd "sek:" ; Sek ; " Tim1:" ; timer1 ' ñåêóíäû è òàéìåð öèêëà if flag = 1 then Locate 2 , 6 Lcd imp ; " Impulse" flag = 0 end if Waitms 100 Loop
Разумеется, эта задержка не будет всегда равна 100 мс при разной частоте тактирования, я же и написал про DELAY, просто немного некорректно выразился. Но здесь по сути это частота обновления дисплея, так что не особо важно.
Если что и может быть важным, то это библиотека дисплея. Там запросто могут быть софтварные задержки.
Novice user писал(а):
нужно указывать компилятору частоту мк
Она на самом деле всегда указана, даже если в коде нет упоминания. "Options - Compiler - Communications". Вот "Frequency" и есть тот самый кристалл, а директива в коде эту настройку отменяет.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
понятно,спасибо!раз вы уж здесь давно хотел спросить у знающего человека реально ли сделать чисто программный I2C? у меня 2 устройства с одинаковым адресом обращения,общение к ним только по I2C,вывода CS у них нет,а надо управлять обоими по раздельности,то есть для одного устойства свои выводы sda scl,для второго-свои это реально?
на одно устройство подаются только команды,на второе помимо команд надо считывать регистры(поправил)
Это именно два одинаковых устройства? То бишь у них одинаковые адреса? У некоторых железяк можно буквально запаивая перемычки на плате изменить адрес устройства. Если же действительно одинаковые, то реализовать софтварный I2C совсем не сложно. Как средствами баском, так и своими руками.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
нет-у них одинаковые адреса-tda6508 и rda5807 у tda6508 адрес &B1100 0000 ,у rda5807 &B0010 0000,думал все хорошо,но после сборки (линии SDA SCL объединил),но при обращении к tda6508 в rda5807 все сбивалось-оказывается rda5807 переходит в режим совместимости с tea5767,адрес которой TEA5767 MODE CHIP ID = &B1100 0000 даташит tda6508 http://p-45.narod.ru/files/TDA6508_6508 ... 509A_1.pdf rda5807 в режиме совместимости http://www.i-biznes.com/datasheets/RDA/ ... al_1.0.pdf -на второй ст внизу написан адресс
Не знаю кого перецитировать, но перенеся строки из отработки прерывания в основную программу: Locate 2 , 6 Lcd imp;" Impulse" ...задействовав еще одну переменную 'imp_old' всё вроде стало на свои места. НО, по сути, вопрос для меня не остался закрытым, т.к. не уверен, что это "дребезг контактов" или находясь в прерывании началась обработка прерывания по выводу инфы на LCD или какую-нить паузу нужно поставить или еще хз что... Я не уверен полностью в этой проге, что при каких-то стечениях обстоятельств не глюканет Спойлер$Regfile="m8adef.dat" $crystal = 8000000 $hwstack=40 $swstack=16 $framesize=32
On Timer1 Uphigh 'переход по переполнению On Int1 Change_Front 'переход по изменению фронта
sek=0 imp=0 imp_old=0
Enable Interrupts ' включить прерывания Enable Int1 'по импульсу на ножке d.3 Enable Timer1 ' ... по переполнению
Cursor Off Noblink ' курсор OFF
Do 'основной цикл Locate 1 , 1 Lcd "sek:";Sek ;" Tim1:"; timer1 ' секунды и таймер цикла Waitms 100 if imp<>imp_old then Locate 2 , 6 Lcd imp;" Impulse" end if Loop
Uphigh: 'секунды Incr sek Incr sek ' дважды,т.к. не хоцца умножать на 2 Return
Change_Front: ' кол-во импульсов и вывод на LCD incr imp return
Я выше предложил подобное можно и как у вас,только добавить if imp<>imp_old then Locate 2 , 6 Lcd imp;" Impulse" imp_old=imp end if
Суть не в том, чтоб программа заработала, суть в том, чтоб понять из-за чего она не захотела работать в первом варианте. Не факт, что во втором варианте проги не проскочит "прерывание, паразитный импульс" и т.д., а этого на данном этапе не было осознанно, проконтролировано, учтено и, вследствие перечисленного, не собьёт работоспособность.
так у вас там в прерывании вывод на жки допустим в какой то момент начала выводиться строка Lcd "sek:";Sek ;" Tim1:"; timer1 ' секунды и таймер цикла вышло в жки sek:;Sek ;" T",то есть "im1:" еще не загрузилось а у вас сработало прерывание,там как написано отработалось и уже потом продолжается отправка в жки "im1:",в итоге на экране абра-кадабра в принципе можно запрещать и разрешать прерывания во время общения с жки,тоже должно работать disable Int1 -запрещаем Locate 1 , 1 Lcd "sek:";Sek ;" Tim1:"; timer1 ' секунды и таймер цикла enable Int1-снова разрешаем
и прерывание срабатывает 2 раза,т к Config Int1 = Change...
так у вас там в прерывании вывод на жки допустим в какой то момент начала выводиться строка Lcd "sek:";Sek ;" Tim1:"; timer1 ' секунды и таймер цикла вышло в жки sek:;Sek ;" T",то есть "im1:" еще не загрузилось а у вас сработало прерывание,там как написано отработалось и уже потом продолжается отправка в жки "im1:",в итоге на экране абра-кадабра в принципе можно запрещать и разрешать прерывания во время общения с жки,тоже должно работать disable Int1 -запрещаем Locate 1 , 1 Lcd "sek:";Sek ;" Tim1:"; timer1 ' секунды и таймер цикла enable Int1-снова разрешаем
и прерывание срабатывает 2 раза,т к Config Int1 = Change...
Возможно. Надеюсь, что это так. Поэтому и вынес вывод на ЖКИ за пределы прерывания в основную программу.
Новая фишка: tim1=tim1+65535+sek2*65535 'tim1, sek2 as Long ошибка переписываю: tim1=tim1+65535 tim1=tim1+sek2*65535 ошибка во второй строке переписываю: tim1=tim1+65535 tim1=sek2*65535 t1=tim1+t1 'добавляю переменную t1 as long ok Bascom avr не умеет считать "в одну строку?"
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения