Форум РадиоКот • Просмотр темы - Управление 24 реле с помощью AtMega32 и 74hc595
Сообщения без ответов | Активные темы
Страница 1 из 1
[ Сообщений: 13 ]
Автор
Сообщение
DJZEM
Заголовок сообщения: Управление 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!!!!!!
Вопрос, что я делаю не так???
В архиве схема и прошивка
Вернуться наверх
Реклама
AndTer
Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
Добавлено: Ср мар 29, 2017 13:37:59
Поставщик валерьянки для Кота
Карма: 41
Рейтинг сообщений: 1209
Зарегистрирован: Ср фев 23, 2011 12:12:31Сообщений: 2352
Рейтинг сообщения: 0
Медали: 1
Я бы попробовал привести 1 к лонгу. Или вместо 1 использовать переменную unsigned long int if ((((long)1 << i) & __led_state) == ((long)1 << i))
_________________ Глупый не задает вопросы. Глупый и так все знает.
Вернуться наверх
Реклама
ARV
Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
Добавлено: Ср мар 29, 2017 13:48:13
Ум, честь и совесть. И скромность.
Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56Сообщений: 18030Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
а вы бы выводили 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
_________________если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...Мой уютный бложик ... заходите!
Вернуться наверх
Реклама
DJZEM
Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
Добавлено: Ср мар 29, 2017 13:54:05
Потрогал лапой паяльник
Карма: 3
Рейтинг сообщений: 49
Зарегистрирован: Чт ноя 21, 2013 14:05:26Сообщений: 342Откуда: Україна
Рейтинг сообщения: 0
Попробовал этот код... Работает.
Но как?? Почему тот не работал? Вроде одно и то же
Аппаратный SPI, задействовать не могу, плата давно разведена и распаяна, не мною.
Вернуться наверх
Реклама
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Подробнее>>
pyzhman
Заголовок сообщения: 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-устройств.
Подробнее>>
ARV
Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
Добавлено: Ср мар 29, 2017 14:21:46
Ум, честь и совесть. И скромность.
Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56Сообщений: 18030Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Ну, SPI и не обязательно... просто с байтами работать как-то привычнее. А засада была в integer promotion rules, можете погуглить, да и тут писалось 100500 раз
_________________если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...Мой уютный бложик ... заходите!
Вернуться наверх
Реклама
DJZEM
Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
Добавлено: Ср мар 29, 2017 14:38:03
Потрогал лапой паяльник
Карма: 3
Рейтинг сообщений: 49
Зарегистрирован: Чт ноя 21, 2013 14:05:26Сообщений: 342Откуда: Україна
Рейтинг сообщения: 0
Учиться еще, не переучиться.
Спасибо вам
Пойдем рисовать другую функцию дабы избавиться от
Код:
0b000000000000000000000000;
А как ни будь
Код:
vivod(kanal_1,ON); vivod(kanal_2,OFF);
Вернуться наверх
Реклама
ARV
Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
Добавлено: Ср мар 29, 2017 15:17:03
Ум, честь и совесть. И скромность.
Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56Сообщений: 18030Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
заведите себе массив из нужного количества байтов, манипулируйте битами в этом массиве, как заблагорассудится, а потом функцией сбрасывайте эти байты из массива в регистры. вот так делал я (правда, у меня еще и ввод из 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];
_________________если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...Мой уютный бложик ... заходите!
Вернуться наверх
Реклама
DJZEM
Заголовок сообщения: 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();
И самое главное, этот г**вно код работает
Вернуться наверх
Реклама
ARV
Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
Добавлено: Ср мар 29, 2017 21:43:37
Ум, честь и совесть. И скромность.
Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56Сообщений: 18030Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
вот с последним утверждением согласен полностью: говнокод эталонный!
_________________если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...Мой уютный бложик ... заходите!
Вернуться наверх
DJZEM
Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
Добавлено: Ср мар 29, 2017 21:49:49
Потрогал лапой паяльник
Карма: 3
Рейтинг сообщений: 49
Зарегистрирован: Чт ноя 21, 2013 14:05:26Сообщений: 342Откуда: Україна
Рейтинг сообщения: 0
Вы же сами говорили что лучше три байта отправлять в функцию вывода. Как придумал, так и написал,
Вернуться наверх
ARV
Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
Добавлено: Ср мар 29, 2017 22:02:15
Ум, честь и совесть. И скромность.
Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56Сообщений: 18030Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
блин, ну вместо одного массива из 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();
_________________если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...Мой уютный бложик ... заходите!
Вернуться наверх
DJZEM
Заголовок сообщения: Re: Управление 24 реле с помощью AtMega32 и 74hc595
Добавлено: Ср мар 29, 2017 22:23:44
Потрогал лапой паяльник
Карма: 3
Рейтинг сообщений: 49
Зарегистрирован: Чт ноя 21, 2013 14:05:26Сообщений: 342Откуда: Україна
Рейтинг сообщения: 0
Вы еще не видели как я считываю регистры ввода hc165. При чем на одной линии данных
Вернуться наверх
Страница 1 из 1
[ Сообщений: 13 ]
Кто сейчас на форуме
Сейчас этот форум просматривают: Paktok и гости: 48
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения