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

Управление 24 реле с помощью AtMega32 и 74hc595


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

Привет. 
Вот, озадачился такой, на первый взгляд, простой ерундой. Как подключить 24 релюшки к одному микроконтроллеру. Да еще и ножки микросхемы сэкономить. Конечно же 74hc595!!!
Да не тут то было. Если с двумя регистрами проблем никаких не возникало, то с тремя, что то пошло не так.
Пишу в AtmelStudio на Си.

Макро

#define DS_PORT    	PORTD 
#define DS_PIN     	3
#define ST_CP_PORT 	PORTD 
#define ST_CP_PIN  	4
#define SH_CP_PORT 	PORTA
#define SH_CP_PIN  	4

#define DS_low()  	 DS_PORT&=~ (1 << DS_PIN)
#define DS_high() 	 DS_PORT|= (1 << DS_PIN)
#define ST_CP_low()  ST_CP_PORT&=~ (1 << ST_CP_PIN)
#define ST_CP_high() ST_CP_PORT|= (1 << ST_CP_PIN)
#define SH_CP_low()  SH_CP_PORT&=~ (1 << SH_CP_PIN)
#define SH_CP_high() SH_CP_PORT|= (1 << SH_CP_PIN)

А это функция вывода числа через три последовательно подключенных регистра

void output_led_state(unsigned long int __led_state)
{
   SH_CP_low();
   ST_CP_low();
   for (long int i=0;i<24;i++)
   {
      if (((1 << i) & __led_state) == (1 << i))
      DS_high();
      else
      DS_low();
      
      
      SH_CP_high();
      SH_CP_low();
   }
   ST_CP_high();
}

А тут, в майне, я передаю число.

output_led_state(0b000000010000000000000000);

Но выводится только 16 бит а не 24!!!!!!
Вопрос, что я делаю не так???  
В архиве схема и прошивка.

proyeck.rar

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 59
  • Создана
  • Последний ответ

Топ авторов темы

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

for (long int i=0;i<24;i++)

Нафига там long int, если хватит и unsigned char?

 

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

if (((1 << i) & __led_state) == (1 << i))

Зачем же так извращаться? Все делается гораздо проще:

if(__led_state & 0x01){
  DS_high();
}else{
  DS_low();
}
__led_state >>= 1;

 

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

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

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

(1 << i)

я уже не помню всех особенностей компилятора под AVR, но кмк проблема может быть где-то тут

вариант предложенный BARS-ом ИМХО более устойчив к багам

можно правда записать еще красивее

__led_state & 0x01?DS_high():DS_low();
__led_state >>= 1;

 

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

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

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

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

Топикстартер решение уже нашел, но я все-таки вставлю свои 5 копеек: если с long-ами охота возиться в цикле, то лучше тогда делать так:

   for (long int i=1;i<0x01000000UL;i<<=1)
   {
      if (i & __led_state)
      	DS_high();
      else
      	DS_low();

     SH_CP_high();
     SH_CP_low();
   }

Кстати, и без long-ов побитовый последовательный вывод по аналогии делать проще: зачем лишняя переменная-счетчик цикла, если ее можно использовать с пользой?

Изменено пользователем ARV

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

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

17 минут назад, ARV сказал:

Топикстартер решение уже нашел

ну так а в чем заключался то подвох в итоге?

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

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

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

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

ясно. Не корректно сравнил короткое с длинным без явного приведения типов. Довольно трудно отлавливаемая ошибка

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Цитата

зачем лишняя переменная-счетчик цикла, если ее можно использовать с пользой?

И где здесь польза? Контроллер очень фигово работает с многобайтными переменными, а тут вы заставляете сдвигать 4-байтное число, а потом ещё и выполнять логическую функцию над числом, а потом результат ещё и с нулём сравниваться будет - и каждый раз компилятор вынужден ворочать 4-байтными числами. Впустую расходуемые ресурсы!

Лучше завести счетчик размером в 1 байт, с которым контролер будет работать в один такт, и сдвигать число ОДИН раз, проверяя флаг переноса, в который будет вытолкнут очередной бит в процессе сдвига. Или если не охота возится с такой сложной логикой(проверить регистр флагов) - проверять младший бит числа перед сдвигом.

 

Учение - изучение правил. Опыт - изучение исключений.

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

21 минуту назад, Alexeyslav сказал:

И где здесь польза?

Ну вы, блин, даёте!

Я предлагаю сдвигаемую переменную поместить в параметр цикла, а вы предлагаете сдвигать другую, а в цикле отдельную инкрементировать! Разве в предложенном выше коде нет сдвига и логической операции над long-переменной? Что так, что этак - сдвиг есть, и будут все связанные с long навороты компилятора при всех операциях. Зато не будет одной байтовой переменной :) Код станет красивее. Ну и для навыка польза, ибо практически во всех доступных реализациях последовательного программного SPI присутствует счетчик цикла и отдельно сдвигаемая переменная.

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

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

Так что ль?

void output_schift(unsigned char *data)
{
   unsigned char msk;
   for(char i = 0; i < 3; i++)
   {
      msk = 0x80;
      for(char k = 0; k < 8; k++)
      {
         if(data[i] & msk)
         {
            DS_high();
            SH_CP_high();
            SH_CP_low();
         }
         else
         {
            DS_low();
            SH_CP_high();
            SH_CP_low();
         }
         msk = msk >> 1;
      }
   }
   ST_CP_high();
   ST_CP_low();
}

 

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

3 минуты назад, si4karuk сказал:

msk = 0x80;

for(char k = 0; k < 8; k++)

Это куда как красивее было бы так:

for(msk = 0x80; msk; msk >>= 1)

И конечно далее сдвиг msk уже не нужен...

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

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

1 минуту назад, BARS_ сказал:

Затем что код, написанный 3 раза, выполнится быстрее, чем цикл

А 23 раза? а 48 раз? И сколько правок надо будет сделать в тексте при изменении числа раз? И сколько ошибок можно при этом допустить?

На ЯВУ пишут для удобства человека, а не компьютера или микроконтроллера. Да и вообще, вы боитесь куда-то не успеть, что так за скоростью гонитесь?

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

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

Ровно то же самое, что и раньше делалось, но лишняя переменная-счетчик битов исключена.

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

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

во бадягу развели... так напиши, эдак напиши. Хватает памяти - пиши как хочешь. Хоть бубликами, хоть квадратиками лишь бы работало. Тут же не курсы по С )))

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Так ведь в моём варианте остаётся только одна операция над long. И это в процедуре критично, от времени выполнения тела цикла будет зависеть скорость вывода через SPI причем в разы и сразу же.

Помню на 486-м компе писалась программа для загрузки программы в большую машину АСУТП АЭС, так там добавление одного NOP-а в цикл загрузки уменьшал скорость загруки до неприличия - где-то в 10 раз. а без него PCI-адаптер глючил.

Поэтому "как хочешь" может оказаться просто некрасиво. Хоть и реле, но все равно на совесть давит такое бездарное просирание ресурсов.

Учение - изучение правил. Опыт - изучение исключений.

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

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

Так ведь в моём варианте остаётся только одна операция над long

Ну как же одна? Сдвиг и AND - две, как и в моем примере.

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

Поэтому "как хочешь" может оказаться просто некрасиво

Если вы обратили внимание, я начал свой "совет" со слов 

14 часа назад, ARV сказал:

если с long-ами охота возиться в цикле, то ...

Так что ваши претензии напрасны... -_-

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

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...