Есть вопросик чисто теоретический (да бы потом не вылезли грабли на практике).
Хочу использовать i2c для работы с датчиком температуры. Но также, хочу использовать прерывания int0, int1 для кнопок. Известно, что во время срабатывания прерывания, весь код прерывается и начинает выполняться код, который прописан для прерывания. Также, известно, что невозможно выполнить два прерывания одновременно. Так вот вопрос то... Не нарушат ли мои прерывания от кнопок работу протокола i2c и, соответственно, не получу ли я зависание или сбой при работе с датчиком? Ведь я не знаю как это все работает... А вдруг у датчика таймаут есть какой при ожидании ответа от МК (а МК в это время не ответит т. к. занят прерыванием от кнопки), а когда ответит, то уже датчик не поймет что от него хочет МК. Или это все учтено и все будет работать? Или же для такого обязательно нужно использовать аппаратную i2c (TWI) (ведь аппаратный i2c работает сам по себе и не зависит от программы на низком уровне).
P. S.: Вот например в Ардуино если использовать Analog Write(), говорят, что занят какой-то таймер... То есть, этот таймер уже никак нельзя использовать. А что по i2c в Баскоме?
Спасибо.
_________________ The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Здравствуйте! Хочу использовать i2c для работы с датчиком температуры. Но также, хочу использовать прерывания int0, int1 для кнопок.
если протокол подразумевает жесткие временные интервалы, то нарушит.
1. если решать "в лоб", то запрещать прерывание в момент обмена (на всё время), 2. убрать кнопки с прерываний, разницы в сотую долю секунды не заметно, 3. аппаратный I2C в АВР (да и не только в оном) кривой и не имеет никакого особого смысла. Делайте программный, особой разницы ни в скорости, ни в простоте кода не будет.
Здравствуйте, написал программу под камень ATmega328, программа имеет два прерывания по таймерам и сторожевой пёс", общение с внешними устр.ми по протоколам I2C и 1Wire. Было замечено, что устройство перезагружается (зависает и "пёс" его ресетит). Эти перезагрузки проявляются спонтанно. может раз в неделю, может несколько раз в день. время и дату и кол.во раз я посчитываю. Вопрос. Как найти место зависания? На устройстве есть UART, может можно метку какую сохранять... Кто имел дело с похожей ситуацией, как решали проблему. Как вариант отключить watchdog и посмотреть где повиснет...
А watchdog на сколько настроен? Не факт ведь, что программа без него виснет, ей всего лишь достаточно где-то задержаться дольше чем положено. Отключите для начала пса конечно, и посмотрите, как устройство себя поведет. И если действительно будут зависания то хоть станет понятнее, в какие моменты они происходят. А так watchdog затирает все улики...
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Ну 4 секунды это конечно уже много. Похоже и правда виснет, вряд ли выполнение где-то шляется такое время...
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Ср июн 30, 2021 16:17:19
Поставщик валерьянки для Кота
Карма: 4
Рейтинг сообщений: 26
Зарегистрирован: Ср сен 17, 2008 14:32:15 Сообщений: 2106 Откуда: Старые Васюки
Рейтинг сообщения:0
Кстати, о watchdog. Обнаружил, что некоторые устройства с ним всё равно ухитряются намертво зависнуть. В упор не понимаю причины. Такое ощущение, что в них останавливается внутренний тактовый генератор (а такое вообще может быть??). Также наблюдаются "отвалы" последовательного порта. Когда МК работает, реагирует на остальные прерывания, но перестаёт что-либо принимать или передавать на UART. Правда там ещё драйвер 485 порта висит, может быть это его фокусы.
_________________ Даже остановленные часы два раза в сутки показывают правильное время.
Всем доброго дня. Пытаюсь запустить прогу, найденную когда-то давно в сети. Управление LCD-индикатором на двух драйверах КР1820ВГ1. С этим кодом отображаются только нули и точка: "000000.00". Хотя это по сути частотомер. Но никакую частоту он не меряет. Что в коде исправить, чтобы измерял частоту? Спойлер$regfile = "m8535.dat" $crystal = 11059200 $hwstack = 32 $swstack = 32 $framesize = 40 $baud = 38400
$lib "mcsbyte.lbx" $lib "mcsbyteint.lbx"
Config Portb = Output
Signal Alias Pind.6 Kn Alias Pind.2 Knr Alias Pind.3 Dn Alias Portb.5 Cl Alias Portb.4 Csml Alias Portb.3 Csst Alias Portb.2
' Dim I As Byte Dim Cifri(9) As Byte Dim A As Word Dim Overflow As Byte Dim X As Byte Dim Cnt As Word Dim Fr As Long Dim Flag As Bit Dim Ph As Word Dim Pl As Word Config Timer0 = Timer , Prescale = 1 Enable Interrupts Enable Timer0
If Flag = 1 Then X = Counter1 Gosub Indicator Reset Flag Counter1 = 0 Overflow = 0 Cnt = 31250 Start Timer0 Start Counter1 End If Debounce Kn , 0 , Pmetr Loop
'***********Timer0 Zero Interrupt**************** Tm0_intsub: If Cnt <> 0 Then Decr Cnt Else Stop Counter1 Stop Timer0 Set Flag End If
Return
'************End of interrupt********************* Indicator: Fr = Overflow * 65536 Fr = Fr + X I = 0 While I < 7 Incr I Cifri(i) = Fr Mod 10 Fr = Fr / 10 Wend 'Set Csst 'Set Csml Reset Csst Reset Csml I = Lookup(cifri(1) , Dta) Gosub Ind I = Lookup( , Dta) Gosub Ind I = Lookup(cifri(3) , Dta) Gosub Ind I = Lookup(cifri(4) , Dta) Gosub Ind I = Lookup(10 , Dta) Gosub Ind 'Reset Csst 'Reset Csml 'Set Csst Set Csst Set Csml Reset Csst I = Lookup(cifri(5) , Dta) Gosub Ind I = Lookup(cifri(6) , Dta) I = I - &H80 Gosub Ind I = Lookup(cifri(7) , Dta) Gosub Ind I = Lookup(cifri(8) , Dta) Gosub Ind I = Lookup(11 , Dta) I = I + Cifri(9) Gosub Ind 'Reset Csst Set Csst Return
Dta: Data &HC0 , &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H82 , &HF8 , &H80 , &H90 , &HF0 , &HFF , &H8C , &H8E , &H89 , &HC7 , &H94 ' 0 1 2 3 4 5 6 7 8 9 Cs_ml Cs_st P F 14 H 15 L o
Ind: I = Not I Shiftout Dn , Cl , I , 1 Return
Reg: Incr A If A > 3 Then A = 1 Return Даташит по КР1820ВГ1 искурил весь напрочь, но что то не особо помогло.
Добавлено after 12 minutes 18 seconds: Уточнение по теме: индикатор от кассового аппарата "ЭКР-2102". На плате индикатора еще был впаян инвертор К561ЛН2. Я его выпаял и закоротил перемычками входы и выходы бывших инверторов на плате. То есть теперь сигнал получился прямой. Для этого в коде добавлена инверсия: I = Not I в подпрограмме передачи данных в КР1820ВГ1. Есть подозрение, что надо бы прерывание TIMER1 переделать на захват по входу ICP1. Или как то по-другому можно? Например вход T1 использовать? Как тогда сконфигурировать таймеры? Может быть вот так сделать? СпойлерConfig Timer1 = Timer , Prescale = 64 , Capture Edge = Rising
Dim Tmrcnt As Word Dim Period As Single Dim F1 As Single Dim F As Word
Const T = 5.88e-6
On Capture1 Freqin
Tmrcnt = 0 Waitms 50 Enable Interrupts Enable Capture1 . . . . . . Do If Tmrcnt = 0 Then F = 0 Else Period = Tmrcnt * T F1 = 1 / Period F = Abs(f1) End If '
' тут будет вызов подпрограммы вывода на индикацию Loop
Freqin: Tmrcnt = Timer1 Timer1 = 0 Return
End Вот теперь бы надо как то эти два куска кода подружить между собой
_________________ Цапу крутить надо!!! Ку или не ку?
Всем доброго времени суток. Кто-нибудь имел дело с Китайским модулем MP3-TF-16P. Хочу сделать манок на птицу на Atmega8 и Oled дисплее. Мне-бы хоть пример какой нибудь, пытался с даташита отсылать команды не какой реакции.ПОМОГИТЕ!!!
Здравствуйте, искал на просторах интернета готовые библиотеки для дисплея на контроллере GC9A01. Не нашел. Переделал найденную для SSD1351. Решил поделиться, берите кому надо. Использован аппаратный SPI, подключение следующее - DIN - MOSI контроллера CLK - CLK контроллера CS - Portb.0 (можно менять на любой другой) DC- Portl.0 (можно менять на любой другой) RST - Portl.1 (можно менять на любой другой)
Цель - использование круглых дисплеев, очень они красиво показывают.
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб мар 26, 2022 14:52:18
Встал на лапы
Зарегистрирован: Вс мар 27, 2011 07:48:48 Сообщений: 127 Откуда: г. Екатеринбург
Рейтинг сообщения:0
Всем привет. Хочу снова поднять одну тему, которой я занимался
года два назад. Суть проблемы. Есть аппарат, каретка приводится
в движение мотором и ходит поочередно влево-вправо. В конце
движения - концевики на замыкание.Каретка идет влево, концевик
выключает мотор. Через 30 сек таймер запускает мотор, каретка
идет вправо, правый концевик его выключает. И так по кругу.
Проблема в том, что в момент включения мотора концевик
находится в разомкнутом положении. Никак не могу это победить.
Привожу основной цикл кода. Может, кто посмотрит свежим
взглядом.
Код:
Do
If V = 30 Then 'таймер отсчитал заданное время If L_end = 0 Then 'сработал левый концевик If R_end = 1 Then 'правый концевик разомкнут Set Rele 'реле включило мотор Set Red 'загорелся светодиод End If End If
If R_end = 0 Then 'сработал правый концевик If L_end = 1 Then ' левый концевик разомкнут Set Rele 'реле включило мотор Set Red 'загорелся светодиод End If End If
If L_end = 1 Then 'каретка - в промежуточном положении If R_end = 1 Then Set Rele Set Red End If End If V = 0 End If
If L_end = 0 Then 'сработал левый концевик Reset Rele 'выключение мотора и диода Reset Red End If
If R_end = 0 Then 'сработал правый концевик Reset Rele 'выключение мотора и диода Reset Red End If
так разные ж концевики.... Режим 1. Ждем таймер. Режим 2. Начинаем движение вправо, левый концевик игнорируем, мониторим состояние только правого концевика. Крутим, пока правый разомкнут. Режим 3. Ждем таймер. Режим 4. Начинаем движение влево, правый концевик игнорируем, мониторим состояние только левого концевика. Крутим, пока левый разомкнут. Идем в режим 1.
в движение мотором и ходит поочередно влево-вправо. В конце
движения - концевики на замыкание.Каретка идет влево, концевик
выключает мотор. Через 30 сек таймер запускает мотор, каретка
идет вправо, правый концевик его выключает. И так по кругу.
Ваша проблема решается без всяких МК одной релюшкой на переключение, двумями концевиками на размыкание и 555 таймером..
зы.. Вроде как можно использовать прерывания - есть некоторые "настройки" - прерывание по перепаду из 0 в 1 или наоборот- перепад из 1 в 0.. Тогда, если у вас с концевика идёт 0 или 1- программа на это не реагирует.
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн мар 28, 2022 16:40:46
Встал на лапы
Зарегистрирован: Вс мар 27, 2011 07:48:48 Сообщений: 127 Откуда: г. Екатеринбург
Рейтинг сообщения:0
Цитата:
Ваша проблема решается без всяких МК одной релюшкой на переключение, двумями концевиками на размыкание и 555 таймером..
Идея интересная. Хотелось бы увидеть схему.
Добавлено after 35 minutes 18 seconds: Переделал я немного код, убрал все лишнее. В принципе у меня
теперь так и есть - запуск мотора после проверки разомкнутости
концевика. Но все равно при замкнутом концевике мотор не хочет
запускаться. Инж дикаторный светик коротко моргнет и тухнет. И все. Никак не
могу понять, чего ему не хватает.
Код:
Do
If V = 30 Then 'таймер отсчитал заданное время If R_end = 1 Then 'правый концевик разомкнут Set Rele 'реле включило мотор Set Red 'загорелся светодиод End If
If L_end = 1 Then ' левый концевик разомкнут Set Rele 'реле включило мотор Set Red 'загорелся светодиод End If
If L_end = 1 Then 'каретка - в промежуточном положении If R_end = 1 Then Set Rele Set Red End If End If V = 0 End If
If L_end = 0 Then 'сработал левый концевик Reset Rele 'выключение мотора и диода Reset Red End If
If R_end = 0 Then 'сработал правый концевик Reset Rele 'выключение мотора и диода Reset Red End If
А так? для примера взял аттини2313,добавил зеленый светодиод для отладки
Код:
$Regfile="attiny2313a.dat" $Crystal=4000000 $hwstack=40 $swstack=16 $framesize=32 L_end alias pinb.0:config PORTB.0=input:portb.0=1 R_end alias pinb.1:config PORTB.1=input:portb.1=1 Rele alias portb.2:config PORTB.2=output Red alias portb.3:config PORTB.3=output green alias portb.4:config PORTB.4=output 'светодиод,пока идет отсчет времени горит,по истечении 30 сек гаснет-для отладки ' настраиваем таймер Config Timer1 = Timer , Prescale = 64 On Timer1 Timecount timer1=3036 Enable Timer1 Enable Interrupts dim v as byte
Do 'обнуляем время,выключаем реле и светодиод v=0 Reset Rele 'выключение мотора и диода Reset Red set green 'ждем когда истечет время while v<30 wend
'время истекло reset green 'выключаем светодиод зеленый Set Rele 'реле включило мотор Set Red 'загорелся светодиод 'ждем замыкания концевиков while R_end = 1 and L_end=1 wend
Loop Timecount: 'счетчик времени таймера timer1=3036 Incr V Return
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения