Например TDA7294

Форум РадиоКот • Просмотр темы - Управление 24 реле с помощью AtMega32 и 74hc595
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 22:30:02

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 13:27:38 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 49
Зарегистрирован: Чт ноя 21, 2013 14:05:26
Сообщений: 342
Откуда: Україна
Рейтинг сообщения: 0
Привет.
Вот, озадачился такой, на первый взгляд, простой ерундой. Как подключить 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!!!!!!
Вопрос, что я делаю не так??? :cry:
В архиве схема и прошивка


Вложения:
proyeck.rar [18.94 KiB]
Скачиваний: 177
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 13:37:59 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 41
Рейтинг сообщений: 1209
Зарегистрирован: Ср фев 23, 2011 12:12:31
Сообщений: 2352
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Я бы попробовал привести 1 к лонгу. Или вместо 1 использовать переменную unsigned long int
if ((((long)1 << i) & __led_state) == ((long)1 << i))

_________________
Глупый не задает вопросы. Глупый и так все знает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 13:48:13 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
а вы бы выводили 3 байта, а не одно многобитное число... опреции с донгами ресурсоемки и неоптимальны, а с байтами как-то оно проще...
я так вообще через аппаратный SPI это делаю - скорость бешеная!

Добавлено after 3 minutes 37 seconds:
AndTer писал(а):
Я бы попробовал привести 1 к лонгу. Или вместо 1 использовать переменную unsigned long int
if ((((long)1 << i) & __led_state) == ((long)1 << i))

как бы 1L куда красивше (long)1

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

Мой уютный бложик... заходите!


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 13:54:05 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 49
Зарегистрирован: Чт ноя 21, 2013 14:05:26
Сообщений: 342
Откуда: Україна
Рейтинг сообщения: 0
Попробовал этот код... Работает.
:dont_know:
Но как?? Почему тот не работал? Вроде одно и то же

Аппаратный SPI, задействовать не могу, плата давно разведена и распаяна, не мною.


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 14:19:25 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 390
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7010
Откуда: Ижевск
Рейтинг сообщения: 0
Засада здесь:
Код:
output_led_state(0b

_________________
Docendo discimus


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

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 14:21:46 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Ну, SPI и не обязательно... просто с байтами работать как-то привычнее.

А засада была в integer promotion rules, можете погуглить, да и тут писалось 100500 раз

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 14:38:03 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 49
Зарегистрирован: Чт ноя 21, 2013 14:05:26
Сообщений: 342
Откуда: Україна
Рейтинг сообщения: 0
:facepalm: Учиться еще, не переучиться.
Спасибо вам :kiss:
Пойдем рисовать другую функцию дабы избавиться от
Код:
 0b000000000000000000000000;

А как ни будь
Код:
vivod(kanal_1,ON);
vivod(kanal_2,OFF);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 15:17:03 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
заведите себе массив из нужного количества байтов, манипулируйте битами в этом массиве, как заблагорассудится, а потом функцией сбрасывайте эти байты из массива в регистры. вот так делал я (правда, у меня еще и ввод из 573-их регистров одновременно с выводом в 595-е):
Код:
static volatile uint8_t   out_buf[BUF_OUT_SZ];
static volatile uint8_t   inp_buf[BUF_INP_SZ];

// inline-функция для обмена данными с регистрами
inline static void spi_io(void){
   for(uint8_t i=0; i<REGISTER_595_CNT; i++){
      SPDR = out_buf[i];
      while(bit_is_clear(SPSR, SPIF));
      if(i < REGISTER_597_CNT)
         inp_buf[i] = SPDR;
      else
         SPDR;
   }
   // импульс загрузки в регистры
   PORT(REGISTER_UPDATE_PORT) &= ~_BV(REGISTER_UPDATE_PIN);
   PORT(REGISTER_UPDATE_PORT) |= _BV(REGISTER_UPDATE_PIN);
}



Добавлено after 2 minutes 5 seconds:
в догонку: у вас вместо работы с аппаратным SPI будет функция вывода 1 байта там, где у меня SPDR = out_buf[i];

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 18:48:39 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 49
Зарегистрирован: Чт ноя 21, 2013 14:05:26
Сообщений: 342
Откуда: Україна
Рейтинг сообщения: 0
Думаю разобрался в этой проблеме...
Макро
Код:
#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)

_Bool __o[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
   
#define ON   1
#define OFF   0

#define OUT_1   __o[0]
#define OUT_2   __o[1]
#define OUT_3   __o[2]
#define OUT_4   __o[3]
#define OUT_5   __o[4]
#define OUT_6   __o[5]
#define OUT_7   __o[6]
#define OUT_8   __o[7]
#define OUT_9   __o[8]
#define OUT_10   __o[9]
#define OUT_11   __o[10]
#define OUT_12   __o[11]
#define OUT_13   __o[12]
#define OUT_14   __o[13]
#define OUT_15   __o[14]
#define OUT_16   __o[15]
#define OUT_17   __o[16]
#define OUT_18   __o[17]
#define OUT_19   __o[18]
#define OUT_20   __o[19]
#define OUT_21   __o[20]
#define OUT_22   __o[21]
#define OUT_23   __o[22]
#define OUT_24   __o[23]


Глобально обьявил для инициализации
Код:
 unsigned char s[3] = {0,0,0};



Функции
Код:
void output_schift(unsigned char *data)
{
   
   unsigned char msk,i;
   
   for(i = 0; i < 3; i++)
   {
      msk = 0x80;
      
      for(char k = 0; k < 8; k++)
      {
         // сравниваем каждый бит с единицей
         if(data[i] & msk)
         {
            DS_high(); // DATA 1
            SH_CP_high(); // CLK 1
            SH_CP_low(); // CLK 0
         }
         else
         {
            DS_low(); // DATA 0
            SH_CP_high(); // CLK 1
            SH_CP_low(); // CLK 0
         }
         msk = msk >> 1; // сдвигаем биты
      }
   }
   // защелкиваем регистр
   ST_CP_high();
   ST_CP_low();
}

void vivod()
{
   s[0] = 0;s[1] = 0;s[2] = 0;
   unsigned char b0 = 0,b1 = 0,b2 = 0;
   b2 = __o[0]|(__o[1]<<1)|(__o[2]<<2)|(__o[3]<<3)|(__o[4]<<4)|(__o[5]<<5)|(__o[6]<<6)|(__o[7]<<7);
   b1 = __o[8]|(__o[9]<<1)|(__o[10]<<2)|(__o[11]<<3)|(__o[12]<<4)|(__o[13]<<5)|(__o[14]<<6)|(__o[15]<<7);
   b0 = __o[16]|(__o[17]<<1)|(__o[18]<<2)|(__o[19]<<3)|(__o[20]<<4)|(__o[21]<<5)|(__o[22]<<6)|(__o[23]<<7);
   s[2] = ~b2;
   s[1] = ~b1;
   s[0] = ~b0;
   output_schift(s);
}

void out_init()
{
   s[0]=0xFF;s[1]=0xFF;s[2]=0xFF;
   output_schift(s);
   
   PORTA &= ~(1 << 3); Это тот самый оут энейбл!!!
   _delay_ms(500);
}


А так обращаюсь к функциям чтобы управлять тем или иным выводом одной из трех микросхем.
Код:
OUT_1 = ON;
      OUT_2 = OFF;
      OUT_3 = ON;
      
      OUT_15 = ON;
      OUT_24 = ON;
       vivod();



:love: И самое главное, этот г**вно код работает :)))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 21:43:37 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
вот с последним утверждением согласен полностью: говнокод эталонный!

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 21:49:49 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 49
Зарегистрирован: Чт ноя 21, 2013 14:05:26
Сообщений: 342
Откуда: Україна
Рейтинг сообщения: 0
Вы же сами говорили что лучше три байта отправлять в функцию вывода. Как придумал, так и написал, :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 22:02:15 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
блин, ну вместо одного массива из 3 байт вы используете дополнительно массив из 24 байт, и потом страшнейшими операциями с ними манипуляции магические делаете - этого я вам не советовал! руки у вас золотые, но ведь и голову надо напрягать!

Добавлено after 7 minutes 27 seconds:
Код:
#define BUF_SZ    3

unsigned char buf[BUF_SZ];

void set_bit(unsigned char bit){
   if(bit >= (BUF_SZ * 8)) return;
   
   buf[bit / 8] |= 1 << (bit % 8);
}

void clr_bit(unsigned char bit){
   if(bit >= (BUF_SZ * 8)) return;
   
   buf[bit / 8] &= ~(1 << (bit % 8));
}

static void shift(unsigned char byte){
   unsigned char mask;

   for(mask = 1; mask; mask <<= 1){
      if(byte & mask)
         DS_high();
      else
         DS_low();

      SH_CP_high();
      SH_CP_low();
   }
}

void shift_to_register(void){
   unsigned char i;

   for(i=0; i<BUF_SZ; i++)
      shift(buf[i]);
}


как-то так...

Добавлено after 1 minute 32 seconds:
Код:
set_bit(12);
clr_bit(8);
shift_to_register();

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
СообщениеДобавлено: Ср мар 29, 2017 22:23:44 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 49
Зарегистрирован: Чт ноя 21, 2013 14:05:26
Сообщений: 342
Откуда: Україна
Рейтинг сообщения: 0
Вы еще не видели как я считываю регистры ввода hc165. При чем на одной линии данных


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y