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

Vit@lik

Members
  • Постов

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

  • Посещение

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

  1. Здравствуйте. Есть светодиод который может работать только в режиме ШИМ. Если включить его по такой схеме, и как бы зашунтировать транзистором с резистором и на базу подать +питания, защитит ли такая цепь его при подаче постоянного безпрерывного сигнала на затвор?
  2. Здравствуйте, подскажите пожалуйста, сколько вблизи одновременно может работать bluetooth модулей HC-05/HC06 и им подобных не мешая друг другу?
  3. уже сделал, работает на 16 кнопок. Дело было не d типах данных, а в другом месте.
  4. @IMXO читал Белов А.В. Микроконтроллеры AVR. Спасибо сохранил закладку читал Б. Керниган, и Д. Ритчи немного, но пока еще не до конца. И статьи в интернете. Только читать скучно. Хочу и еще и делать и работать. Систему типов данных Си знаю, это же основа... да, пробовал unsigned int в первую очередь, а когда не сработало уже и даже unsigned long и другие варианты. ладно, попробую уже завтра разобраться самостоятельно
  5. @IMXO не работает на более чем 8 кнопок. пробовал указывать размерность char ... :16 не работает. мне Атмел Cтудия предлагала указать тип char16_е, я указал но потом выдает ошибку не распознает такой тип. подключал библиотеку stdlib ничего не изменило
  6. @IMXO это устройство почти аналог телевизионного пульта, сюда будет и этого достаточно. Посоветуйте алгоритм а еще лучше и пример, для опроса датчиков типа геркон (или механический концевик), около 10 шт. С защитой от дребезга, помех, важно уловить все срабатывания, (нажимания и отжимания) и последовательность, если два датчика сработали одновременно то тоже должны фиксировать два или три (или больше ) события
  7. я что-то думал что 8 битный процессор не способен нормально выполнять логические операции между 16 битными переменными, хорошо сделаю думал это делается сложнее
  8. @IMXO Только что отредактировал программу и сделал по вашей ссылке. Все заработало. Спасибо Понравилось что в прерывании минимум кода. Только это: ISR(TIMER0_OVF_vect){ send_procc(); timer0_tact+=1; static uint8_t cnt; if(cnt++ >= 10 ){cnt=0;tick_flag=1;} //флаг опроса кнопок }//end of ISR Да еще интересно что все значения задержек подошли для моей частоты процессора и прескалера таймера. дальше надо придумать как сделать на 16-17 кнопок, потому что эта функция только на 8 кнопок. Думаю сделать еще один такой же обработчик на вторую группу кнопок. Еще меня заинтересовала ваша цитата ранее А можете еще показать пример какого-то вашего кода например тот что для опроса пинов работающих в условиях сильных ЭМП. Мне такое пригодится. Или подойдет тот что вы отправляли ранее? Возможно имеется что-то лучше? Не буду задавать вопросов. А буду изучать самостоятельно.
  9. он на 4 вызов функции переполниться и станет 0
  10. Кто-то может ответить как может работать этот код? там черным по белому написано инкремент m_Buttons.ucJitter++; перед условием if. а это значит что m_Buttons.ucJitter++ в любом случае буде больше нуля тоесть - true, а потом скобах условия if делаем Логическое отрицание-НЕ только для одного m_Buttons.ucJitter, тоесть он всегда будет ЛОЖЬ, у нас в if два операнда для Логического умножения-И, и первый всегда ЛОЖЬ, а если у нас хотя бы один операнд ЛОЖЬ все выражение становиться ЛОЖЬ. Тоесть код в скобках после If не выполнится НЕКОГДА! как оно может работать? в чем я не прав? m_Buttons.ucJitter++; ucTemp = s_ucPort ^ m_Buttons.ucPressed;// Маска изменения состояние if (!m_Buttons.ucJitter && ucTemp) // Состояние изменилось, дребезг подавлен { //
  11. @IMXO у меня такое чувство что в коде по ссылке ошибка как выполнится условие if (!m_Buttons.ucJitter && ucTemp) если прямо перед ним мы инкрементируем m_Buttons.ucJitter++; тоесть он будет больше 0 а в скобках инверсия тогоже !m_Buttons.ucJitter значит первый операнд всегда лог0 возможно те две команды (или одну) что после самого первого if нужно в скобки и else перед ними // Можно задать до 8 кнопок #define pin_BUTTON0 RB0 #define pin_BUTTON1 RB1 #define pin_BUTTON2 RB2 #define pin_BUTTON3 RB3 #define pin_BUTTON4 RB4 #define pin_BUTTON5 RB5 #define pin_BUTTON6 RB6 #define pin_BUTTON7 RB7 typedef struct { unsigned char ucPressed; // Состояния кнопок unsigned char ucJitter : 2; // Для подавления дребезга unsigned char ucCounter : 6; // Для проверки удерживания unsigned char ucHold; // Состояние длительного удерживания // События: unsigned char ucShort; // Короткое нажатие и отпускание unsigned char ucJustPressed; // Кнопки только что нажаты unsigned char ucJustReleased; // Кнопки только что отпущены unsigned char ucChanged; // Состояние кнопок изменилось } TBUTTONS; volatile TBUTTONS m_Buttons; void Task_Buttons (void) { static unsigned char s_ucPort; // Предыдущее состояние портов unsigned char ucTemp; ucTemp = 0x00; if (!pin_BUTTON0) ucTemp |= 0x01; if (!pin_BUTTON1) ucTemp |= 0x02; if (!pin_BUTTON2) ucTemp |= 0x04; if (!pin_BUTTON3) ucTemp |= 0x08; if (!pin_BUTTON4) ucTemp |= 0x10; if (!pin_BUTTON5) ucTemp |= 0x20; if (!pin_BUTTON6) ucTemp |= 0x40; if (!pin_BUTTON7) ucTemp |= 0x80; ucTemp ^= s_ucPort; // Изменения с момента последнего выполнения s_ucPort ^= ucTemp; // Текущее состояние портов if (ucTemp) // Подавление дребезга { m_Buttons.ucJitter = 0; return; } //------------------------------------------------------------------------------ m_Buttons.ucJitter++; ucTemp = s_ucPort ^ m_Buttons.ucPressed;// Маска изменения состояние if (!m_Buttons.ucJitter && ucTemp) // Состояние изменилось, дребезг подавлен { //------------------------------------------------------------------------------ // Проверяем отпущенные кнопки //------------------------------------------------------------------------------ if (m_Buttons.ucPressed & ucTemp) // Есть отпущенные { m_Buttons.ucJustReleased |= ucTemp; m_Buttons.ucChanged |= ucTemp; m_Buttons.ucShort |= ucTemp; m_Buttons.ucShort &= ~m_Buttons.ucHold; m_Buttons.ucHold &= ~ucTemp; } // if released //------------------------------------------------------------------------------ // Проверяем нажатые кнопки //------------------------------------------------------------------------------ if ((m_Buttons.ucPressed ^ ucTemp) & ucTemp) // Есть нажатые { m_Buttons.ucChanged |= ucTemp; m_Buttons.ucJustPressed |= ucTemp; m_Buttons.ucShort &= ~ucTemp; } // if pressed m_Buttons.ucPressed = s_ucPort; m_Buttons.ucCounter = 0; } // if changed and debounced m_Buttons.ucCounter++; //------------------------------------------------------------------------------ // Проверяем длительное удерживание //------------------------------------------------------------------------------ if (m_Buttons.ucCounter == 50) { m_Buttons.ucChanged |= m_Buttons.ucHold ^ m_Buttons.ucPressed; m_Buttons.ucHold = m_Buttons.ucPressed; } }
  12. спасибо @IMXO , попробую свой код переписать. хотя для 15-17 кнопок объем будет большой.
  13. 9 вроде. я имел в виду что при сдвиге влево величина должна увеличиваться, а при достижении максимума переполниться. Но почему в вашем случае этого не происходит не понимаю у джитер 8 бит вы напишите как он обнуляется? как тогда сработает if(m_button1.Jitter==0x00) {m_button1.Pressed=0;}
  14. @IMXO у меня онлайн интерпретатор выдает 0xFF<<1 равно 510 как тогда джитер обнуляется? почему
  15. мы сдвигаем Джитер каждый раз когда заходим в прерывания независимо нажата ли кнопка или нет. И только когда кнопка нажата инкрементируем его... а то что я в сообщении выше написал верно?
  16. @IMXO что-то трудно мне ваш код дается,. Мы сдвигаем Джитер влево и если значение не ноль, (если я правильно понимаю) при сдвиге влево будет каждый раз умножаться на два). Ниже если кнопка нажата или отпущена мы его инкрементируем тоесть тоже увеличиваем .. зачем? если джиттер будет больше 255 (потому что 8 бит) он переполниться и счет начинаться с нуля а где Джитер обнуляется? и как функция в таймере взаимодействует с флагами в основном цикле, через какие переменные в общем не очень понимаю как работает ваш код... пытаюсь разобраться в начале программы у нас Джитер = 0, когда кнопка нажата, мы его умножаем сдвигая в лево и инкрементируем пока он не достигнет 255 тогда мы ставим флаг m_button2.Pressed=1 , после того когда он переполнился и кнопка уже не нажата он сам сдвигается влево пока не переполниться и не уйдет в ноль и тогда ставим флаг m_button2.Pressed=0; хм прикинул в голове вроде так оно работать должно, интересно еще посмотреть код что в основном цикле выполняется
  17. Зачем все время сдвигать по таймеру jitter?
  18. @IMXO что значат две точки ? может там = должно быть ? unsigned char Jitter :8;
  19. @IMXO не увидел почему-то раньше пример кода. А юарт там временно только для отладки что-то я не пойму где у вас опрос флагов, я вижу только функции
  20. @IMXO, лучше убрать else ? что можно сделать чтобы все работало стабильно пока что работает, я даже могу зажать кнопку на порту D6 и в то время нажимать D7, после чего отпустить D6 и все нажатия ловит
  21. хорошо если я не до конца понимаю как работает этот код то что в нем исправить чтобы не было непредсказуемого поведения
  22. почему автоматом влетаете в третье? там свой отдельный ИФ с проверкой там нет третьего условия а else перед каждым вторим if я добавил чтобы не делалась еще одна проверка второго условия если первый if == true думал что понимаю...
  23. @IMXO Почему жесть? уже проверил на 17 кнопок. Работает нормально
  24. у меня на один вход два if пока что делаю так как в прикрепленом коде уже изготовленная плата. while (1){ buttons_handler(); }//while void buttons_handler(){ int scand = 0; scand = PIND; //scand = ~scand; if (~scand & 0b11111100){ d_flag = 1; } } ISR(TIMER0_OVF_vect){ send_procc(); timer0_millis+=1; #define DEBDELAY 500 if (d_flag){ ////////////////PORTD7 if((~PIND & (1<<7)) && (!flag_buttons[7])){ if(count_buttons[7] < DEBDELAY){count_buttons[7]++;} else {flag_buttons[7]++;} } else if ((PIND & (1<<7)) && (flag_buttons[7])) { if(count_buttons[7]){count_buttons[7]--;} else{flag_buttons[7] = 0; d_flag = 0; usart_send_str("PORTD7");} }//////////////// ////////////////PORTD6 if((~PIND & (1<<6)) && (!flag_buttons[6])){ if(count_buttons[6] < DEBDELAY){count_buttons[6]++;} else {flag_buttons[6]++;} } else if ((PIND & (1<<6)) && (flag_buttons[6])) { if(count_buttons[6]){count_buttons[6]--;} else{flag_buttons[6] = 0; d_flag = 0; usart_send_str("PORTD6");} } //////////////// }//if d_flag } какие это ? кроме int0 и int1? в мега328 есть блоком на каждый порт PCINT, в мега 8 нет же
×
×
  • Создать...