Jump to content
aletuviilo04

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

Recommended Posts

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

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

 

fgr01.jpg

htr03.c kb10.c

Share this post


Link to post
Share on other sites

А если использовать вариант подключения кнопок к порту PC0 и через развязывающие диоды к выводам PC2...PC5?

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

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

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

Share this post


Link to post
Share on other sites

Вебинар «Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN» (26.01.2021)

Приглашаем 26 января на бесплатный вебинар, посвящённый преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре будут рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату. Рассмотрим новую группу продукции – встраиваемые источники питания в кожухе.

Подробнее

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

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

 

Share this post


Link to post
Share on other sites

Вебинар "Новый BlueNRG-LP с Bluetooth 5.2 и Long Range — волшебная палочка разработчика IoT" (04/02/2021)

Приглашаем 4 февраля на бесплатный вебинар о BlueNRG-LP - новом программируемом чипе SoC STMicroelectronics. На вебинаре будут детально рассмотрены новые возможности, особенности подключения, аппаратные и программные средства для разработки, а также практические примеры работы с микросхемой.

Подробнее

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

Share this post


Link to post
Share on other sites

Плата STEVAL-IDB011V1 – тестируем идеи на новом BLE 5.2-чипе BlueNRG-LP

Новая система на кристалле BlueNRG-LP производства STMicroelectronics предназначена для устройств интернета вещей(IoT ) и не только, отвечает стандарту BLE 5.2 и поддерживает MESH-сети. Микросхема содержит малопотребляющий MCU Cortex-M0+. Отладка STEVAL-IDB011V1 позволит сэкономить время на разработку новых устройств.

Подробнее

59 minutes ago, DrobyshevAlex said:

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

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

Share this post


Link to post
Share on other sites
Только что, _abk_ сказал:

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

Можно.

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

Share this post


Link to post
Share on other sites
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();
   }    
}

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

Share this post


Link to post
Share on other sites
1 час назад, _abk_ сказал:

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

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

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


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

Share this post


Link to post
Share on other sites
1 час назад, ruhi сказал:

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

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


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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
13 часов назад, Starichok сказал:

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

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

Ну и ладно.


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

Share this post


Link to post
Share on other sites
12.02.2020 в 11:57, ruhi сказал:

в 2мК секунды

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


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

Share this post


Link to post
Share on other sites

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


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

Share this post


Link to post
Share on other sites

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

938742157_.JPG.7d0d072df5fc75c88171cfe7cd239555.JPG

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

Share this post


Link to post
Share on other sites
19 часов назад, AL_smeu сказал:

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

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


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

Share this post


Link to post
Share on other sites
27.02.2020 в 15:22, Starichok сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

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


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

Share this post


Link to post
Share on other sites
28.02.2020 в 17:08, AL_smeu сказал:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Я настолько не знаю  языка , что даже сам не догадался бы, что это дистанционное управление. А далее чисто логика - если проектов несколько - значит они чем то отличаются . И на tn2313 скорее всего уже подобный , так как такое управление востребовано .  Для перевода у меня стоит закладка "переводчик" в браузере , куда скидываю нужный текст .  Есть более продвинутые системы , но  мне и так нормально.  Кстати код чеха не позволяет параллельно включать кнопки местного управления . С транзисторами можно, у них открытый выход (коллектор) . Открытый выход можно сделать и на МК .  Или как костыль использовать последовательные резисторы 1-10к . И как костыль же поставить после резисторов конденсаторы , чтоб была интегрирующая RC цепь , подправляющая особенности кода .    
    • Я как бы тоже, штука полезная или даже кайфовая. Только посмотрите на этом и соседних форумах, сколько конструкций с лимитером и без. Даже если мощности несколько сот Вт и необходимость в нем как и в слежинии за ОБР не обсуждается. В середине нулевых ВП только и твердил:... защита,... лимитер,... "... гарантировано хуже - нет защиты". А популярность получил только "упрощенный" поскребыш без этого всего. Оказалось что всем "для дома не нужен". Прошло более 15и лет. Можете привести пример форумных конструкций кроме Натали (ещё к ланзару какую то светомузыку приладиладили, и д-класс какой то помнится) в которых был изначально был лимитер и его не норовили кастрировать? 
    • не может быть такого, прошивка работает правильно, иначе бы и у меня показывало одинаковую температуру. а у тебя точно разная температура радиаторов? сразу после включения, да, температура одинаковая. потом начинает разбегаться. если пуск не давать, транзисторы начинают греться током утечки.
    • Конденсаторы получил,все хорошо, Алексею спасибо! 
    • обратноход без ОС? да в страшном сне такое привидеться не может ...

  • Дверной доводчик

×
×
  • Create New...