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

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


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

@Alex, дык на радиокоте я практически 1 в 1 такой код топикстартеру и нарисовал, разве что вместо битовых полей функции для доступа к битам по номеру. Увы, он же непонимэ...

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

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

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

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

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

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

Да, действительно. Просто не заходил в ту тему, не видел...

В принципе, если оперировать с байтами, то юнионы со структурой, по большому счёту, и не нужны. Достаточно обычного массива байтов. Разве, что для отладки, в watсh'е смотреть удобнее.
 

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

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

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

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

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

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

Лень перечитывать всю тему, выкладываю пример из рабочего проекта. Расширение ввода-вывода. Входные регистры 74HC165 (3 штука), выходные 74HC595 (2 штука). Проект старый, больше не причесывал.

Модераторы, не знаю как под спойлер прятать на этом форуме.

proc_in_out.h

Скрытый текст



// Заготовка. Расширение ввода-вывода. SPI. Сдвиговые регистры. Мультиплексоры, дешифраторы (блоки IO термопластавтоматов).

#ifndef PROC_IN_OUT_H

#define PROC_IN_OUT_H

//========================================================================
#include "proc_in_out.h"

#include "avrlibtypes.h"

#include "main_def_func.h"

#include "sys_timer.h"
//========================================================================

//========================================================================
#define IN_OUT_BYTES 3
//========================================================================

//========================================================================
/*
typedef enum num_inputs
{
   INPUT_1 = 0,
   INPUT_2,
   INPUT_3,
   INPUT_4,
   INPUT_5,
   INPUT_6,
   INPUT_7,
   INPUT_8,

   INPUT_9,
   INPUT_10,
   INPUT_11,
   INPUT_12,
   INPUT_13,
   INPUT_14,
   INPUT_15,
   INPUT_16,

   INPUT_17,
   INPUT_18,
   INPUT_19,
   INPUT_20,
   INPUT_21,
   INPUT_22,
   INPUT_23,
   INPUT_24,
} num_inputs;
*/

#define INPUT_1   0
#define INPUT_2   1
#define INPUT_3   2
#define INPUT_4   3
#define INPUT_5   4
#define INPUT_6   5
#define INPUT_7   6
#define INPUT_8   7

#define INPUT_9   3
#define INPUT_10  2
#define INPUT_11  1
#define INPUT_12  0
#define INPUT_13  4
#define INPUT_14  5
#define INPUT_15  6
#define INPUT_16  7

#define INPUT_17  3
#define INPUT_18  2
#define INPUT_19  1
#define INPUT_20  0
#define INPUT_21  4
#define INPUT_22  5
#define INPUT_23  6
#define INPUT_24  7
//========================================================================

//========================================================================
#define KEY_STOP                 INPUT_1
#define KEY_MANUAL               INPUT_2
#define KEY_AUTOMAT              INPUT_3
#define KEY_RUN                  INPUT_4

#define EMERG_STOP               INPUT_5
//========================================================================

//========================================================================
#define KEY_MOULD                INPUT_12
#define KEY_HEAT                 INPUT_11
#define KEY_FORMOVKA             INPUT_10
#define KEY_PNEVMOSYEM           INPUT_9
#define KEY_PODACHA              INPUT_13
#define KEY_PRIGIM               INPUT_14
#define KEY_PEREHVAT             INPUT_15
#define KEY_KNIFE                INPUT_16
//------------------------------------------------------------------------
#define KEY_MOULD_BIT            1<<KEY_MOULD
#define KEY_HEAT_BIT             1<<KEY_HEAT
#define KEY_FORMOVKA_BIT         1<<KEY_FORMOVKA
#define KEY_PNEVMOSYEM_BIT       1<<KEY_PNEVMOSYEM
#define KEY_PODACHA_BIT          1<<KEY_PODACHA
#define KEY_PRIGIM_BIT           1<<KEY_PRIGIM
#define KEY_PEREHVAT_BIT         1<<KEY_PEREHVAT
#define KEY_KNIFE_BIT            1<<KEY_KNIFE
//========================================================================

//========================================================================
#define SENSOR_1                 INPUT_20
#define SENSOR_2                 INPUT_19
#define SENSOR_3                 INPUT_18
#define SENSOR_4                 INPUT_17
//========================================================================

//========================================================================
extern u08 _proc_in_out;

extern u08 inputs_buf [];
extern u08 outputs_buf [];
//========================================================================

//========================================================================
typedef enum num_outputs
{
   OUTPUT_1 = 0,
   OUTPUT_2,
   OUTPUT_3,
   OUTPUT_4,
   OUTPUT_5,
   OUTPUT_6,
   OUTPUT_7,
   OUTPUT_8,

   OUTPUT_9,
   OUTPUT_10,
   OUTPUT_11,
   OUTPUT_12,
   OUTPUT_13,
   OUTPUT_14,
   OUTPUT_15,
   OUTPUT_16,

   OUTPUT_17,
   OUTPUT_18,
   OUTPUT_19,
   OUTPUT_20,
   OUTPUT_21,
   OUTPUT_22,
   OUTPUT_23,
   OUTPUT_24,
} num_outputs;
//========================================================================

//========================================================================
typedef enum proc_in_out_states
{
   PROC_IN_OUT_INIT = 0,
   PROC_IN_OUT_SET_RUN,
   PROC_IN_OUT_RUN,
} proc_in_out_states;
//------------------------------------------------------------------------
void receive_send_in_out (void);
void proc_in_out (void);
//========================================================================

#endif


 

proc_in_out.c

Скрытый текст



// Заготовка. Расширение ввода-вывода. SPI. Сдвиговые регистры. Мультиплексоры, дешифраторы (блоки IO термопластавтоматов).

//========================================================================
#include "proc_in_out.h"
//========================================================================

//========================================================================
u08 _proc_in_out;

u08 inputs_buf [IN_OUT_BYTES];
u08 outputs_buf [IN_OUT_BYTES];

static u08 in_out_cnt;
//========================================================================

//========================================================================
void receive_send_in_out (void)
{
   sram_copy (spi_transf_buf, outputs_buf, IN_OUT_BYTES);

   in_out_cnt = 0;

   strob_latch_in ();

   while (in_out_cnt < IN_OUT_BYTES)
   {
      spi_transf (in_out_cnt);

      spi_receive_buf [in_out_cnt] = SPDR;

      in_out_cnt++;
   }

   strob_latch_out ();

   sram_copy (inputs_buf, spi_receive_buf, IN_OUT_BYTES);
}
//========================================================================

//========================================================================
void proc_in_out (void)
{
   switch (_proc_in_out)
   {
      case PROC_IN_OUT_INIT:
         spi_init ();

         receive_send_in_out ();

         _oe_enable ();

         set_timer (ST_PROC_IN_OUT, NO_RERUN_TIMER, 10);
         _proc_in_out = PROC_IN_OUT_RUN;
         break;

      case PROC_IN_OUT_RUN:
         if (wait (ST_PROC_IN_OUT))
         {
            receive_send_in_out ();

            set_timer (ST_PROC_IN_OUT, NO_RERUN_TIMER, 10);
         }
         break;

      default:
         break;
   }

}
//========================================================================


 

spi.h

Скрытый текст



//========================================================================
#ifndef SPI_H

#define SPI_H

#include "spi.h"
//========================================================================

//========================================================================
#include <ioavr.h>

#include "avrlibtypes.h"
#include "macros.h"

#include "proc_in_out.h"
//========================================================================

//========================================================================
#define SPI_PORT        PORTB
#define SPI_PIN         PINB
#define SPI_DDR         DDRB
//------------------------------------------------------------------------
#define _SC_PORT        PORTB
#define _SC_PIN         PINB
#define _SC_DDR         DDRB

#define _SC             PB4
//------------------------------------------------------------------------
#define MOSI_PORT       PORTB
#define MOSI_PIN        PINB
#define MOSI_DDR        DDRB

#define MOSI            PB5
//------------------------------------------------------------------------
#define MISO_PORT       PORTB
#define MISO_PIN        PINB
#define MISO_DDR        DDRB

#define MISO            PB6
//------------------------------------------------------------------------
#define SCK_PORT        PORTB
#define SCK_PIN         PINB
#define SCK_DDR         DDRB

#define SCK             PB7
//------------------------------------------------------------------------
#define _OE_PORT        PORTB
#define _OE_PIN         PINB
#define _OE_DDR         DDRB

#define _OE             PB0
//------------------------------------------------------------------------
#define LATCH_OUT_PORT  PORTB
#define LATCH_OUT_PIN   PINB
#define LATCH_OUT_DDR   DDRB

#define LATCH_OUT       PB1
//------------------------------------------------------------------------
#define LATCH_IN_PORT   PORTB
#define LATCH_IN_PIN    PINB
#define LATCH_IN_DDR    DDRB

#define LATCH_IN        PB2
//========================================================================

//========================================================================
extern u08 spi_receive_buf [];

extern u08 spi_transf_buf [];
//========================================================================

//========================================================================
void spi_init (void);
//------------------------------------------------------------------------
void spi_transf (u08 spi_cnt);
//------------------------------------------------------------------------
void strob_latch_in (void);
//------------------------------------------------------------------------
void strob_latch_out (void);
//------------------------------------------------------------------------
void strob_delay (void);
//------------------------------------------------------------------------
void _oe_enable (void);
void _oe_disable (void);
//========================================================================

#endif


 

spi.c

Скрытый текст



//========================================================================
#include "spi.h"
//========================================================================

//========================================================================
u08 spi_receive_buf [IN_OUT_BYTES];

u08 spi_transf_buf [IN_OUT_BYTES];
//========================================================================

//========================================================================
void spi_init (void)
{
   _OE_PORT |=       1<<_OE;
   LATCH_IN_PORT |=  1<<LATCH_IN;
   LATCH_OUT_PORT |= 1<<LATCH_OUT;

   _OE_DDR |=        1<<_OE;
   LATCH_IN_DDR |=   1<<LATCH_IN;
   LATCH_OUT_DDR |=  1<<LATCH_OUT;

   MOSI_PORT |=      1<<MOSI;
   MISO_PORT |=      1<<MISO;

   _SC_DDR |=        1<<_SC;
   MOSI_DDR |=       1<<MOSI;
   SCK_DDR |=        1<<SCK;

   SPCR = 1<<SPE | 1<<MSTR | 1<<SPR0 | 1<<SPR1;
}
//------------------------------------------------------------------------
void spi_transf (u08 spi_cnt)
{
   SPSR |= 1<<SPIF;

   SPDR = spi_transf_buf [spi_cnt];

   while (!(SPSR & (1<<SPIF)))
   {
      __watchdog_reset ();
   }
}
//------------------------------------------------------------------------
void strob_latch_in (void)
{
   clr_bit (LATCH_IN_PORT, LATCH_IN);
   strob_delay ();
   set_bit (LATCH_IN_PORT, LATCH_IN);
}

void strob_latch_out (void)
{
   clr_bit (LATCH_OUT_PORT, LATCH_OUT);
   strob_delay ();
   set_bit (LATCH_OUT_PORT, LATCH_OUT);
}
//------------------------------------------------------------------------
void strob_delay (void)
{
   u08 a = 16;

   while (a--);
}
//------------------------------------------------------------------------
void _oe_enable (void)
{
   _OE_PORT &= (~(1<<_OE));
}

void _oe_disable (void)
{
   _OE_PORT |= (1<<_OE);
}
//========================================================================


 

Работа со входами-выходами теперь осуществляется через ОЗУ.

Скрытый текст



//========================================================================
void mould_close (void)
{
   outputs_buf [2] |= (1<<MOULD);
}

void mould_open (void)
{
   outputs_buf [2] &= (~(1<<MOULD));
}
//------------------------------------------------------------------------


 

 

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

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

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

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

16 часов назад, demiurg1978 сказал:

Лень перечитывать всю тему

аж 2 с лишним страницы! Кошмар

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

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

за то узнали бы, что проблема уже давно решена и сейчас идет факультатив по программированию на С

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

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

20 минут назад, demiurg1978 сказал:

Две страницы ни о чем

Ага, и тут приходит человек и пишет всего один пост, который "о чем". При этом, с помощью телепатических умений знает, что остальные посты, по сравнению с его - отстой :lol:
Как раз, наоборот, Ваш пост - ни о чём. Во первых, вопрос уже решён и было множество предложений кода и советов для его его решения. Во вторых - в теме есть и поизящнее решения Вашей простыни.
Но Вы же - телепат, не читая тему, мгновенно оценили никчёмность постов в ней...:crazy:

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

Я быстро читаю. Если вижу, что информация  полезна и интересна, внимательно перечитываю. Если информация не очень полезна и интересна, читаю по диагонали. Вычленяю главное.

Тема топика - расширение ввода-вывода. ТС полез куда-то не в ту степь. Я дал пример из рабочего проекта. Как мой пример использует ТС - это его дело. Может мой пример поможет кому-нибудь в будущем.

Все.

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

Привет :D Не ругайтесь, ТС еще ничего не решил, времени не было... Работа, все такое. 

ТЕРМОПЛАСТ АВТОМАТЫ???:blink:

Вы не поверите, но у меня в руках  контроллер IO, с термопласт автомата KuASY 170 OMI, выпросил (выклянчил) у друга.

Так я и учусь на нем, пока детальки прилетят.

Я много примеров перепробовал, некоторые удавалось запустить.

demiurg1978, у вас хорошо читаемый код, но еще не разбирался в нем.

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

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

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

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

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

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

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

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

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

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

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

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