Перейти к содержанию

Vit@lik

Members
  • Постов

    493
  • Зарегистрирован

  • Посещение

Весь контент Vit@lik

  1. два внешних прерывания уже задействованы для реализации wiegand интерфейса. и больше никаких внешних прерываний у него нет это ATmega8 поздно уже ну все кнопки вместе не получится, они на различных портах МК. Я могу прочитать все кнопки на одном порту за одну команду. И таких действия будет три, по одному для каждого отдельного порта. Далее я придумал так - для каждого прочитанного значения состояния пинов порта нужно сделать НЕ а затем И с маской отслеживаемых пинов. Так можно узнать есть ли на етом порту нажата хоть какая либо кнопка. И если есть то для определения какой именно это пин будет уже около 5-10 проверок. Это как бы лучше. Возможно еще как-то можно код оптимизировать и улучшить. @IMXO с вашим кодом еще не разобрался, но изучу его подробно
  2. Логическое AND и еще есть простая защита от дребезга это код для одной кнопки void buttons_handler(){ #define DNUM 1000 //D3 PRESS if ( (!btn_block[3]) && (~PIND & 0b00010000) ){ if (btn_count[3] < DNUM){btn_count[3]++;} else{btn_block[3]++; } } //D3 UNPRESS if ( (btn_block[3]) && (PIND & 0b00010000) ){ if (btn_count[3]){btn_count[3]--;} else{btn_block[3] = 0; USART_Transmit('3'); } } //.... }
  3. Здравствйте. Посоветуйте как правильно (самые правильные способы) опроса большого количества кнопок или датчиков (работающих также как и кнопка) в количестве около 15-20 штук (не матрица). У меня есть свои проверенные способы но я не хочу использовать их для такого большого количества кнопок так как будет большое количество проверок и если я размещу этот код в прерывные одного из таймеров то в нем будет около 30-40 if-ов что не есть хорошо. Как правильно сделать? Чтобы еще остался ресурс и для других задач. Как делают профессионалы?
  4. как по мне это самый лучший вариант. Лучше может быть разве что запирать мосфет, напряжением с подключенного программатора Так круче. я выше писал
  5. это лишнее действие которые нужно каждый раз делать перед прошивкой, и ставить дополнительный выключатель и отверстие для него. А если один раз забыл про выключатель тогда все - светодиод сгорел, нужен ремонт. Такое устройство нельзя считать надежным и законченным. В моем варианте процессор из своего отдельного порта не задействованного для прошивки, после рестарта подает сигнал "разрешение" и светодиод работает . Во время прошивки программатор подает reset на процессор, и сигнал "разрешение" пропадает с порта и светодиод отключен. просто в том, что моей схеме нет ошибок не уверен..
  6. @Огонёк удобство, практичность, технологичность,и желания не иметь механические контакты в устройстве и не добавлять в устройство лишнюю большую кнопку, автоматизация процесса прошивки и защита от дурака. Плата будет стоять в закрытом корпусе, а с наружи только разъем. Пусть устройств будет 20шт. И надо добавить фикс или фичу в прошивку и обновить ее. И что все 20 шт разбирать чтобы нажать кнопку...
  7. @andrusha152 , @Falconist Микроконтроллер будет управлять светодиодом TSAL6200 или похожим, очень короткими вспышками. У него прямой ток в таком режиме до 1,5А (100мкс). Для генерации вспышек использована нога микроконтроллера которая привязана к таймеру OC2. И та самая нога используется для внутрисхемного программирования по SPI. И может такое быть, а уже бывало, что во время такого программирования светодиод сгорал. А каждый раз его отключать во время прошивки а потом включать не удобно. Поэтому и решил сделать так, чтобы импульсы от программатора не доходили до затвора ключа. будет ли хорошо работать схема которую я нарисовал? или как лучше сделать?
  8. Здравствуйте. Делаю схему управления светодиодом. Нужно управлять мощным светодиодом ШИМ-ом от МК. Решил применить мосфет. Но еще нужно в схему управления добавить сигнал "EN -разрешение", без логической 1 или 0 на нем, светодиод всегда будет выключен и на вход шим никак не реагировать. Я схему придумал, но есть подозрение что она не будет работать. Планирую шунтировать затвор мосфета на землю с помощью биполярного транзистора. Но подозреваю что ток потечет там где меньше сопротивление, то есть ток все равно потечет через полевой. И если на входе ШИМ будет лог 1, то биполярный его не закроет?
  9. Делаю что-то похожее на ИК пульт. Использовал атмегу8 и 8МГц кварц. Настроил Таймер_2 в режим СТС. Настроил Таймер 2 на частоту 36кГц. И проверил осциллографом - все работает. 36кГц есть на порте. Была у меня идея первый таймер использовать для генерации частоты а второй для того чтобы им первый включать и выключать с определенными задержками для создания "пакетов" данных. Но подумал немного и что-то мне стало жалко использовать аж целых два таймера только для одного этого задания. И решил попробовать сделать на одном таймере. Написал функцию которая посылает сначала стартовый длинный пакет импульсов, а потом берет массив в котором находятся 1 и 0 (код который нужно отправить), и в зависимости от того 1 или 0 отправляет пачки импульсов определенной длины добавляя задержки между ними. For и Loop не использовал чтобы процессор "не зависал" в прерывании на долго и успевал выполнять другие задачи. Все сделано проверками IF и еще несколько статических переменных и там же в векторе ISR(TIMER0_OVF_vect) инвертирую порт. Правильно ли я поступил? На время разработки я запустил таймер_2 который генерирует несущую частоту 36кГц на постоянно. Но в дальнейшем когда программа будет закончена буду запускать его кнопкой только на время передачи импульсов и по он окончанию самостоятельно выключиться. Таймер_2 работает на прямую от генератора 8МГц то есть - на частоте процессора. void timer2_init () { TIMSK |= (1<<OCIE2); //Timer/Counter2 Output Compare Interrupt Enable //Разрешение прерывания по совпадению таймера/счетчика2 TCCR2 |= (1<<CS20) | (1<< WGM21); // clkT2S/1024 (From prescaler) AND Clear Timer On Compare - CTC OCR2 = 110; // Output Compare Register – OCR2 continuously compared with the counter value (TCNT2) } А таймер 0 для других заданий так clkT2S/128 (From prescaler) void timer0_init(){ TIMSK |= (1<<TOIE0); TCCR0 |= (1<<CS00) | (1 << CS02) ; //TCNT0 = 60; //PORTD |= (1<<7); } Так вот код в OVF таймера _0 не выполняется когда запущен таймер_2 ISR(TIMER0_OVF_vect){ //code //code } То есть если превысить некий лимит команд в прерывании таймера_2 то код в прерывании таймера_0 не выполняется. Я все правильно понимаю? Это потому что таймер_2 работает на частоте процессора и забирает все его время и производительность на себя? И код в основном цикле тогда тоже не будет выполняться если таймер_0 будет все время прерываться с частотой тактирования процессора? Если i < 11 таймер_0 не работает. Если i < 10 то еще работает. ISR(TIMER2_COMP_vect){ //fire_act(); for(int i = 0; i < 11; i++){asm("nop");} }//ISR Я понимаю это так. Что время выполнения кода прерывания или равно или превышает время между вызовами этого же прерывания. Правильно? Только что заметил что ошибся с темой. А удалить сообщение уже нельзя ...
  10. можна, но хотелось бы чтобы устройством можно было и пользоваться когда он подключен к USB. И тогда надо будет как-то дополнительно отслеживать включена ли кнопка или нет , чтобы МК мог вернуться к работе по нажатию, и тогда вообще получается что МК будет работать постоянно (или переводить его в спящий режим ....) должно сработать VCCIO - +1.8V to +5.25V supply to the UART Interface and CBUS group pins. VCCIO брать от VDD. Тогда можно и FT232_VCC отключать и питать от того же VDD что и МК. Потому что если питание МК отключено то и FT232 не нужна. а от USB нужно только питание для зарядки внутреннего аккумулятора Наверное что бы я по TX и RX использовал какой-нибудь "буферный логический элемент" с питанием от VDD то не было с паразитного питания. Наверно буду менять точку питания для ft232, запитаю от vdd. А что думал можно решить это диодами с резисторами..
  11. Здравствуйте. В проектируемом устройстве стоит атмега и преобразователь FT232RL для возможности обновления прошивки через USB. Также в устройстве будет аккумулятор который может заряжаться через тот же USB порт. И есть кнопка которая отключает питание от процессора. Но преобразователь FT232RL работает и аккумулятор должен заряжаться даже если устройство выключено етой кнопкой. Схему придумал уже и заказал платы и даже начал паять. И вот заметил что если устройство выключить кнопокой, на атмеге есть около 2.2В. Я так понимаю это паразитное питание через TX и RX ? и защитные диоды порт-ов? Так как на линиях TX RX есть 2.5В. Как-то можно это убрать? Какой самый правильный способ? Все что я придумал пока что - это поставить резистор (47 - 100 ом) и диод на линии tx rx на плате устройства очень тоненькие дорожки и все на маленьких smd, если начну експерементировать на нем то все испорчу.. подскажите пожалуйста решение
  12. @IMXO так как на рисунку? А если перед резистором на 1К стоит супрессор ("в обратном включении") то диод на оптопару все равно ставить? и конденсатор параллельно оптопаре оставить или убрать? если параллельно светодиода оптопары будет стоять еще резистор на 470 ом, то может надо уменьшить 1к например до 680 оМ, и увеличить ток, чтобы его хватало для светодиода, а то если я не ошибаюсь то какая-то часть тока буду течь через резистор и на светодиоде будет уже не 5мА а где-то 3мА забыл еще попробовать экранированным проводом подключать датчики и посмотреть осциллографом что будет((
  13. добавил конденсатор 100-150нф к светодиоду И микроконтроллер уже не видит что контакты замыкаются а подобие синусоиды из сети вообще исчезло
  14. такое на светодиоде оптопары все время. думаю ето наводки от сети а такое если включить катушку с искрами вблизи проводов датчика концевика. микроконтроллер видит что контакты замыкаются
  15. Как источник наводок использовал катушку зажигания и свечу - и сработало. Позже добавлю описание и фото. на светодиоде оптопары Даже без длинных проводов есть синусоида, и "иглы" от наводок ЛБП что стоит сбоку но все же их не достаточно что бы светодиод подмигивал а вот от работы катушки зажигания начали приходить ложные данные. Но конденсатор на 150 нФ параллельно светодиоду подавил почти все, ложных срабатываний с ним не было.
  16. конвертер здесь ни к чему. Он работает стабильно, легко переносит КЗ. И выдает в почти 2 раза большую мощность от паспортной далее перходит в защиту и виходит самостоятельно.
  17. @IMXO при подаче питания на светодиод оптопары на входе МК из 5в меняется на 100мВ. Ток в цепи транзистора оптопары мультиметр показывает 625 микроампер (там где 0,55мА). Что-то не так? Нужно уменьшить R7 и резистор подтяжки (тот что на 10K)? В оптопары Continuous Forward Current = 50мА. i Forward Voltage max 1.4V, по расчетам если я не ошибся то можно ставить резистор и 70 (а лучше 100оМ). Но я думаю с таким током для долговечность светодиода сильно сократится.
  18. 47К - 100К зависит от модели. Внешняя подтяжка возле микроконтроллера есть на 10К к +5В. в МК на порте я измерял то около 0,7В если он настроен на выход. Для того чтобы МК видел сигнал лог.нулем 0... 1,5В В этой схеме протекает 5-6 мА через светодиод оптопары. Пробовали подключать последовательно R7 переменный резистор и увеличивалидо 8К - работает, после уже нет
  19. коротит разве что через резистор и светодиод оптопары. а супрессор подключен верно
  20. Нет не я. Ее придумал другой человек и связи с ним нет. Ето плата с микроконтроллером который посылает на компьютер информацию о состоянии датчиков, датчики ето или механические кнопки (концевик) или геркон. Установлены в разных комнатах помещения к которым идут длинные провода. Иногда компьютер фиксирует ложные срабатывания в больших количествах. Защита от дребезга контактов есть (программная). Питание есть свое отдельное через источник бесперебойного питания и еще есть встроенный аккумулятор в сигнализацию. Часть схемы которая обрабатывает датчики была показана ранее. Хотим воспроизводить по команде похоже явление в офисных условиях на столе. А на обычные бытовые устройства такие как паяльник, фен или микроволновая печь оно не реагирует
  21. @IMXO ответ ни о чем. да концевик. на схеме как кнопка показан установлены на дверях, окнах, некоторые работают как механическая кнопка другие как герконы
×
×
  • Создать...