Заголовок сообщения: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 09:14:07
Встал на лапы
Зарегистрирован: Пт мар 19, 2021 08:58:45 Сообщений: 105
Рейтинг сообщения:0
Всем привет! Потребовалось обуздать стеклоподьеники в авто, управление по средствам ацп мк attiny13, т.к. есть уже провода в дверях по одному и не нужно ни чего прокладывать по новой это важно. Накидал схему в протусе для отладки , светодиоды как бы взамен соленоидам реле, схема подключения кнопок резистивно-параллельная. Столкнулся с тем - что есть коротковременные срабатывания других портов выхода, которые в данный момент времени должны оставаться в покое. К примеру на картинке изображен случай когда нажатие коротковременно кнопки водительского стекла ВВЕРХ - почем то сработал еще порт для команды ВНИЗ вод.стекла. Так же может сработать и порты для пассажирского стекла... пример следующий - где нажимал кнопка водительского стекла ВНИЗ и были коротковременные срабатывания портов выхода для пассажирского стекла. Принципиально использую два порта АЦП для обработки нажатий кнопок, один для вод. двери другой для пассажирской. Попытался побороть с помошью флагов событий но без успешно. Прошу помощи как правильней обработать нажатие кнопки.
unsigned int adc0, adc2; unsigned int adc_tmp0, adc_tmp2; char adc_counter0, adc_counter2; bit f1, f2, f3, f4, f5, f6;
#define FIRST_ADC_INPUT 0 #define LAST_ADC_INPUT 2 unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1]; // Bandgap Voltage Reference: Off #define ADC_VREF_TYPE ((0<<REFS0) | (0<<ADLAR))
// ADC interrupt service routine // with auto input scanning interrupt [ADC_INT] void adc_isr(void) { static unsigned char input_index=0; // Read the AD conversion result adc_data[input_index]=ADCW; // Select next ADC input if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) input_index=0; ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index; // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=(1<<ADSC); }
Вы смещаете ноль на какое-то количеств разрядов, значение этого количества в ADC0D и т.д. Затем делаете ИЛИ с нулём В итоге всю кучу также ИЛИ с DIDR0. Это всё - бессмысленные действия. Изучите логические и битовые операции.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Вдобавок к ST7FOX даю ответ развёрнутей некуда: нулевой бит, сколько и куда его ни двигай, по ИЛИ не меняет ни-че-го. Как сбрасывать определённый бит регистра - по моей ссылке + 1 пост выше от slav0n Совет правильный: для понимания сути нужно изучить элементарные логические операции (с арифметическими, надеюсь, проблем нет? хотя в целочисленной арифметике тоже нужно иметь в виду определённые нюансы) .
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Вдобавок к ST7FOX даю ответ развёрнутей некуда: нулевой бит, сколько и куда его ни двигай, по ИЛИ не меняет ни-че-го. Как сбрасывать определённый бит регистра - по моей ссылке + 1 пост выше от slav0n Совет правильный: для понимания сути нужно изучить элементарные логические операции (с арифметическими, надеюсь, проблем нет? хотя в целочисленной арифметике тоже нужно иметь в виду определённые нюансы) .
Не так давно сидел перечитывал лог.операции, со шпаргалкой разбираюсь что и куда. В чем соль с нолем мне понятна. Как это отражается на работе кода не могу понять, и это ли вносит такие проблемы что я описал в первом своем сообщение? Из вашей подсказки делаю вывод что ту строку правильнее было бы писать так: DIDR0&=~((1<<ADC0D) | (1<<ADC2D) | (1<<ADC3D) | (1<<ADC1D)); Но что это мне даст, по даташиту это буфер цифрового входа, рекомендует биты ставить в лог 1 в том случае когда используется аналоговый вход, тем самым снижает потребление энергии. Проблема моя этим никак не решилась((
У ATTINY13 памяти мало, всего 1кБайт. Вот как пример, кое как уместилСпойлер#include <tiny13.h> #include <delay.h>
volatile unsigned int adc0, adc2; volatile bit f1, f2, f3, f4, f5, f6;
#define FIRST_ADC_INPUT 0 #define LAST_ADC_INPUT 2 volatile unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1]; // Bandgap Voltage Reference: Off #define ADC_VREF_TYPE ((0<<REFS0) | (0<<ADLAR))
// ADC interrupt service routine // with auto input scanning interrupt [ADC_INT] void adc_isr(void) { static unsigned char input_index=0; // Read the AD conversion result adc_data[input_index]=ADCW; // Select next ADC input if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) input_index=0; ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index; // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=(1<<ADSC); }
kote52, всё просто: Вы должны знать битовые и логические операции сами по себе, без применения к чему-либо. Например, необходимо знать, что 1 & 0 = 0, а 1 | 0 = 1 и т.д. То есть, разницу между И и ИЛИ. Что число в микроконтроллере, а точнее, некая переменная, или некая область в памяти, на которую указывает переменная и где хранится число, представляет собой некий набор битов. Переменная типа byte - это 8 битов, и в этом случае, если в ней хранится 1, то полная запись 00000001, а когда Вы пишите, например, 0 << 5, то Вы приказываете контроллеру в 0000000 пять раз сдвинуть правый ноль влево, то есть, бессмысленно. Регистры в микроконтроллере, как правило, такие же байты. То есть, регистр АЦП может выглядеть как 01111111, где левый (старший бит) - управляет вкл-выкл преобразованием (я описываю мифический микроконтроллер), а следующие - номер канала, какие-то опции. Непосредственно изменить бит не всегда возможно (например, можно в ассемблере, нельзя в Си), но можно изменить весь байт, добавив к нему такой байт и таким образом, что нужные биты изменять значения, а ненужные - не изменят.
Это всё описано в куче книжек. Это надо читать в них. Написание здесь очередной книги не имеет смысла, приведенный выше текст показывает лишь, что всё надо изучать с азов. Отсутствие элементарных знаний делает невозможным объяснить Вам суть Вашей ошибки.
Добавлено after 1 minute 44 seconds: Dimon456, 1 кБ - это очень много. И код просто ужасный, примером быть не может ни в коем разе.
Добавлено after 10 minutes 51 second: kote52, и что касается аппаратной части: у Вас 6 кнопок, 4 повесили на один АЦП, а 2 на другой... Что мешало посадить 3 на один и 3 на другой? С точки зрения программной части разницы не будет, но Вы получаете гораздо большую дельту в напряжении для определения кнопки, а значит, минимизируете ложные срабатывания, когда контакты начнут окисляться.
kote52, и что касается аппаратной части: у Вас 6 кнопок, 4 повесили на один АЦП, а 2 на другой... Что мешало посадить 3 на один и 3 на другой? С точки зрения программной части разницы не будет, но Вы получаете гораздо большую дельту в напряжении для определения кнопки, а значит, минимизируете ложные срабатывания, когда контакты начнут окисляться.
Спасибо за теорию, многое знал, на чем расширили мои представления для понимания процессов в мк. Но что в коде дает ложные срабатывания на других портах? Проводка в авто, писал в самом начале, в одной двери два переключателя пассажиркое и водительское стекло(т.е. 4 кнопки) заложен один провод, в пассажирской двери один переключатель т. е. Две кнопки, тоже заложен один провод.
В машине всё это будет дичайше глючить. Особенно весело будет, когда контакты кнопок чуть-чуть подзасрутся и их сопротивление будет непредсказуемым. Ну и дребезг. Здесь есть защита от него? Я бы смотрел в сторону оптопар и сдвигового регистра, если не хочется ставить жирный МК.
Я бы смотрел в сторону "как разрабатывать электронику для автомобилей", а не оптопар и сдвиговых регистров, они тут примерно так же нужны, как мясорубка и чулки.
Я бы смотрел в сторону "как разрабатывать электронику для автомобилей", а не оптопар и сдвиговых регистров, они тут примерно так же нужны, как мясорубка и чулки.
Есть уже готовые решения на лог микросхемах... Но мне диктует то что уже есть в машине, и разбирать дверь и тянуть проводку там где это не возможно еще та задача!
В машине всё это будет дичайше глючить. Особенно весело будет, когда контакты кнопок чуть-чуть подзасрутся и их сопротивление будет непредсказуемым. Ну и дребезг. Здесь есть защита от него? Я бы смотрел в сторону оптопар и сдвигового регистра, если не хочется ставить жирный МК.
В машине был условно тупой код, на delay_ms когда то собран... Я думаю вы в своей теории больше боитесь, чем в практику применять! подобное я смотрел осциллографом, дребезга там столько, как в нормальной тактовой кнопке! Посмотрите мой код в самом первом сообщение, как вам подобный аля антидребезг?
kote52, дребезг есть везде, как и решений по нему. Но это не главное и легко устранимое. Главное - помехи в автомобиле вообще, и температурные условия (показания напряжения могут плавать). В приложенном файле описаны основные моменты (необязательно даже знать английский, достаточно глянуть картинки). Это не сильно влияет на Вашу текущую проблему с кодом, но знать необходимо.
1) в условиях четко расставь очерёдность операций - расставь скобки. ты уверен, что, например, команда: if(adc2 > 490 && adc2 < 515) разворачивается в if((adc2 > 490) && (adc2 < 515)) а не в if(((adc2 > 490) && adc2) < 515) ? лучше жестко закрепи нужный порядок скобками.
2) добавь фильтрацию измерений: на каждый ацп добавь буфер и счётчик, если новое измерение отличается от буфера не больше, чем на Х - то инкрементируй счётчик (с проверкой на переполнение), если больше - сбрасывай счётчик и обновляй буфер. А потом принимай решение о нажатии только когда счётчик достигнет величины У (Х и У - константы)
3) чтоб код стал компактней используй АЦП в 8битном режиме - операции с 8 битами занимают меньше места. (регистр ADLAR).
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
kote52, дребезг есть везде, как и решений по нему. Но это не главное и легко устранимое. Главное - помехи в автомобиле вообще, и температурные условия (показания напряжения могут плавать). В приложенном файле описаны основные моменты (необязательно даже знать английский, достаточно глянуть картинки). Это не сильно влияет на Вашу текущую проблему с кодом, но знать необходимо.
Еще раз спасибо вам за файл, и информацию. Но мое направление как раз и связано с диагостикой автомобилей автоосцилографом(мотортестором), я представляю как выглядят помехи... И могу вам сказать, практически посмотрев как отрабатывают кнопки и что помех нет... Погонял печку, кондей и т.д. то что дейсвительно в борт сеть дает мусор. Катушки зажигания больше под капотом вредят. Было принято решение доделать эту штуку поумному.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения