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

Atmega8. Нужна помощь.


aletuviilo04

Рекомендуемые сообщения

Atmega8. Нужна помощь.
Использование одного вывода для чтения
и записи одновременно, другими словами,
быстрое переключение из режима чтения
в режим записи и наоборот.
 
Есть схема. На порт D подключены кнопки
клавиатуры, 4 шт. Эти же выводы порта D
используются как выходы на семисегментный индикатор
E40561.
Исходники. В исходнике htr03.c в обработчике прерывания
таймера2 есть функция DynSwitch(). В ней происходит
чтение клавиатуры и динамическая индикация. По отдельности
чтение и индикация работают нормально. Вместе не работают,
чтение кнопок не происходит.
Для выяснения причин делал упрощенный исходник kb10.c.
В нем вывод на индикаторы через порт D не используется,
используется только переключение порта C, т.е. переключаются
только номера 4-х индикаторов, сегменты не используются.
Клавиатура проверяется звучанием саунда.
При этом выяснилось, путем добавления в программу по одной
строчке, что, когда переключается только один первый индикатор,
то клавиатура считывается и саунд работает(саунд работает
через порт C), при переключении только двух индикаторов,
первого и второго, частота саунда меняется. При добавлении
третьего индикатора саунд отключается. При этом непонятно,
чтение клавиатуры не работает, или клавиатура работает,
а саунд не работает.
Больше всего интересует в этой ситуации, есть ли какое-либо
каноническое программное решение на языке C для быстрого переключения
режима порта с чтения на запись и наоборот.

Схема и исходники в приложении.

 

fgr01.jpg

htr03.c kb10.c

Ссылка на комментарий
Поделиться на другие сайты

У вас весь код выполняется в прерываниях, в основном цикле вообще нет кода, это странное решение, в прерывании делают как можно меньше действий.  Вы на 100% уверены что весь ваш код выполниться за 1 срабатывание прерывания? Зачем такой подход?

Это как раз может быть причиной смены частоты звука и тд

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Посмотрел код, не, проще свой заново написать.

Не должно быть проблем никаких, времени опросить 4 кнопки надо очень мало.  Опрос  кнопок и отображение не совместимы во времени,  потому как  порты на сегменты  при дин. индикации (ДИ) задействованы всегда. Значит, надо делать паузу между циклами ДИ, когда  1)гасим  текущий разряд,  2)стоп таймер ДИ, 3)пины кнопок переконфигурируются на входы, 4)опрос, выставление флагов нажатых кнопок, 5)обратная переконфигурация пинов, 6)выставить и включить следующий разряд, 7)перезапустить таймер.  Или делать один опрос после полного цикла ДИ на все разряды. Обрабатывать нажатия в основном цикле.

 

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Тут вопрос у меня еще к схеме. Зачем столько ног отдавать под индикаторы, если их не хватает на кнопки потом? Какие нибудь 74HC164, 74HC595 и тд, три провода, хоть на 1000 индикаторов и светодиодов.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

59 minutes ago, DrobyshevAlex said:

Зачем столько ног отдавать

Да ладно вам, нормальное решение. Зачем корпуса плодить и разводку усложнять, если можно решить программно.

Ссылка на комментарий
Поделиться на другие сайты

Только что, _abk_ сказал:

. Зачем корпуса плодить и разводку усложнять, если можно решить программно.

Можно.

А потом решил что нужен еще один светодиод, или индикатор, или выход управляющий на мотор или еще куда, и все... 

Я ставил 595 себе на инкубатор, цена 5 рублей) Если индикаторы ставить отдельные по 1 то еще и не надо бесконечно гонять мк чтобы цифры отрисовывать)

Ну, дело хозяйское... я просто предложил один из вариантов.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо за помощь.

Есть вопрос к _abk_(Завсегдатай). Стоп таймер и перезапуск таймера надо делать в самом обработчике прерывания?

Как это правильно делается? Можете ли скинуть примерчик из двух строк или ссылку?

 

Ссылка на комментарий
Поделиться на другие сайты

8 hours ago, aletuviilo04 said:

Стоп таймер и перезапуск таймера надо делать в самом обработчике прерывания?

Да, конечно. Вам надо приостановить динамическую индикацию на период опроса кнопок. В это время на индикаторе не будет гореть ни один разряд. Т.к. это ничтожно малое время, заметно ничего не будет. Можно это делать после отображения каждого разряда, а можно один раз после всех четырех.

8 hours ago, aletuviilo04 said:

Как это правильно делается?

Не совсем понял. Таймер останавливается отключением тактирования (нули в биты CS), включается  прописыванием туда же комбинации, соответствующей выбранной частоте тактирования. Ну и режим таймера задать. Вот, например, для T2 ATmega8 расписано в деталях,  таймер в режиме сброса при совпадении:

void flash_T2_ON(void) 
 {                                                                          
  stop_T2_flag = 0;
 // Timer Period: 10 ms
  ASSR=0<<AS2;
  TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (1<<CTC2) | (1<<CS22) | (1<<CS21) | (1<<CS20);
  TCNT2=0x00;
  OCR2=0x23;
 }

// ==========================================================
void flash_T2_OFF(void) 
 {
  ASSR=0<<AS2;
  TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
  TCNT2=0x00;
  OCR2=0x23;
 }

 А вот обработчик для него:

interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
  unsigned char i,a,mask;
  if(T2_int_count == flash_dlit){stop_T2_flag = 1; T2_int_count = 0;}
  else {++T2_int_count; return;}
  
  if(flash_mask != 0)   // задано мигание:изменить нужные разряды и перезапустить таймер
   { 
    mask = flash_mask;
    for(i=0;i<4;i++)
     {
      if(mask & 1) {a=dark[i]; dark[i]=!a;}
      else dark[i] = save_dark;
      mask = mask>>1;
     }
    flash_T2_ON();
   }    
}

Не знаю, это ли вы спросили. После ообработки нажатия не забыть сбросить флаг.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, _abk_ сказал:

Вам надо приостановить динамическую индикацию на период опроса кнопок

А зачем индикацию приостанавливать? если прерывания таймера достаточно короткие то они не должны влиять на опрос кнопок, вроде?

Что, опрос кнопок должен потом запускать индикацию? Какая там логика - @aletuviilo04 вы бы написали словами сначала коротенько, трудно разобраться с кодом если не известно что хотел получить автор!

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, ruhi сказал:

А зачем индикацию приостанавливать?

чтобы на время опроса кнопок выходы превратить во входы.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

Еще раз благодарю участников форума за помощь. Спасибо _abk_ за предоставленные коды. Это поможет сделать обработчики прерываний более надежно.

Ссылка на комментарий
Поделиться на другие сайты

13 часов назад, Starichok сказал:

чтобы на время опроса кнопок выходы превратить во входы.

Ага вижу, но таймер я бы не отключал, опрос кнопок уберется в 2мК секунды, можно оставить в прерывании при периоде в 10 милисекунд.

Ну и ладно.

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

12.02.2020 в 11:57, ruhi сказал:

в 2мК секунды

это что такое? миллиКило секунды?

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

Милли-Кельвин-секунды. И не спрашивайте, что это.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

@aletuviilo04  Если у тебя есть хоть один свободный пин (по схеме вроде есть РС0) установи его входом с подтяжкой к 0, поставь кнопки к нему и желательно  через диоды  на выхода для твоих 4-х цыфр (ind1... ind4). Они у тебя работают по очереди если делал классическую динамику. При каждой смене значения ind  читай РС0 и будет тебе счастье. Вот как то так:

938742157_.JPG.7d0d072df5fc75c88171cfe7cd239555.JPG

 А  вообще я соглашусь с @DrobyshevAlex  потому как динамика слабо светит при номинальном токе индикаторов а при повышении тока быстро "стареют " сегменты. Она хороша для вакуумно-люминесцентных.

Ссылка на комментарий
Поделиться на другие сайты

19 часов назад, AL_smeu сказал:

потому как динамика слабо светит при номинальном токе индикаторов

у меня в термометре ток сегмента 3 (ТРИ) мА, что намного меньше номинального тока. еще подели на 4 в динамической индикации. но мне такой яркости хватает "за глаза". даже при дневном свете.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

27.02.2020 в 15:22, Starichok сказал:

у меня в термометре ток сегмента 3 (ТРИ) мА, что намного меньше номинального тока. еще подели на 4 в динамической индикации. но мне такой яркости хватает "за глаза". даже при дневном свете.

Это дело вкуса, возможностей и типа индикаторов. Я собирал на макетке  динамику мне не понравилось по двум причинам: 1 -я занимает больше времени на выполнение кода 2-я этот код должен постоянно "крутиться", что не везде может быть приемлемо, если нужно больше 7-ми индикаторов к примеру 15 (пример часы(4) + дата(число(2), месяц(2) , год(4)) + день недели(1) + температура(2)) нужно усложнять код, где по очереди ставятся сегменты, а цифры выставляются там, где этот сегмент должен светить, и это ещё предварительно вычислять.

Я пробовал оба способа, во втором случае было больше яркости и меньше подсветки (остаточного свечения).  Не комментируйте, я понимаю паузой можно все это отрегулировать, задача ставилась определить какой режим лучше.

Для опыта не стал покупать индикаторы взял от дохлого спутникового ресивера, там они тоже были в динамическом режиме. И у них оказалась слабое свечение, поэтому не все индикаторы хорошо светят, думаю зависит от марки.

И ещё при использовании регистров с последовательным вводом (к примеру sct2026 ), можно освободить при 4-х цифрах как минимум один порт.

Ссылка на комментарий
Поделиться на другие сайты

это точно, что дело вкуса. а о вкусах не спорят ...

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

28.02.2020 в 17:08, AL_smeu сказал:

И ещё при использовании регистров с последовательным вводом (к примеру sct2026 ), можно освободить при 4-х цифрах как минимум один порт.

Ещё проще использовать специализированные драйвера,  микроконтроллер загрузил данные и занялся другими делами.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...