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

Вывод в последовательный регистр

Подскажите плз, как можно организовать вывод в последовательный регистр, например 74hc595? Есть 2 включенных последовательно регистра, нужно вывести на первый 8 бит, включить выходы регистра, замтем выводим 16 на оба и тоже включаем выходы. Может подскажите алгоритм или ссылочку или кусочек кода на ассемблере (под AVR) будет просто супер :biggrin:

Поделиться сообщением


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

Все просто. Регистры соединяются последовательно. Есть два байта - образ данных в регистрах. Если нужно изменить соостояние какого выхода регистра, меняем соответсвующее значение в слове образе и по SPI задвигаем, затем дергаем строб, чтобы данные из сдвигового регистра перкинуть в выходной регистр.

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
//
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void SPI_Init(void)
{
  SPI_PORT |= (1<<SCK)|(1<<MOSI)|(1<<MISO);

  SPI_DDR |= (1<<SCK)|(1<<MOSI);
  SPI_DDR &= ~(1<<MISO);

  SPSR = (1<<SPI2X);
  SPCR = (1<<SPE)|(1<<MSTR);  //Mode 0
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Записываем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void SPI_Write_Byte(u8_t b)
{
  SPDR = b;
  while ((SPSR & (1<<SPIF)) == 0);
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Читаем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
u8_t SPI_Read_Byte(void)
{
  SPDR = 0x00;
  while ((SPSR & (1<<SPIF)) == 0);
  return SPDR;
}

#define    Cell_Lock_Strob()               {PORTD |= (1<<CELL_LOCK_STROB); PORTD &= ~(1<<CELL_LOCK_STROB);}
#define    Cell_Lock_Clr()                   {PORTD &= ~(1<<CELL_LOCK_CLR); PORTD |= (1<<CELL_LOCK_CLR);}
#define    Cell_Load_Image(image)                   {SPI_Write_Byte((u8_t)(image>>8)); SPI_Write_Byte((u8_t)image);}
#define    Cell_Lock_ON(i)                  {cell_lock_image |= (1<<i); Cell_Load_Image(cell_lock_image); Cell_Lock_Strob();}
#define    Cell_Lock_OFF(i)    {cell_lock_image &= ~(1<<i); Cell_Load_Image(cell_lock_image); Cell_Lock_Strob();}

Поделиться сообщением


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

Все просто. Регистры соединяются последовательно. Есть два байта - образ данных в регистрах. Если нужно изменить соостояние какого выхода регистра, меняем соответсвующее значение в слове образе и по SPI задвигаем, затем дергаем строб, чтобы данные из сдвигового регистра перкинуть в выходной регистр.

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
//
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void SPI_Init(void)
{
  SPI_PORT |= (1<<SCK)|(1<<MOSI)|(1<<MISO);

  SPI_DDR |= (1<<SCK)|(1<<MOSI);
  SPI_DDR &= ~(1<<MISO);

  SPSR = (1<<SPI2X);
  SPCR = (1<<SPE)|(1<<MSTR);  //Mode 0
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Записываем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void SPI_Write_Byte(u8_t b)
{
  SPDR = b;
  while ((SPSR & (1<<SPIF)) == 0);
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Читаем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
u8_t SPI_Read_Byte(void)
{
  SPDR = 0x00;
  while ((SPSR & (1<<SPIF)) == 0);
  return SPDR;
}

#define    Cell_Lock_Strob()               {PORTD |= (1<<CELL_LOCK_STROB); PORTD &= ~(1<<CELL_LOCK_STROB);}
#define    Cell_Lock_Clr()                   {PORTD &= ~(1<<CELL_LOCK_CLR); PORTD |= (1<<CELL_LOCK_CLR);}
#define    Cell_Load_Image(image)                   {SPI_Write_Byte((u8_t)(image>>8)); SPI_Write_Byte((u8_t)image);}
#define    Cell_Lock_ON(i)                  {cell_lock_image |= (1<<i); Cell_Load_Image(cell_lock_image); Cell_Lock_Strob();}
#define    Cell_Lock_OFF(i)    {cell_lock_image &= ~(1<<i); Cell_Load_Image(cell_lock_image); Cell_Lock_Strob();}

 

 

Ээээ, это ж на Си, я в этом языке не силен, может на асме что-то подскажите? А алгоритм управления регистром мне понятен, не совсем понятно как выводить данные в порт, 8 и 16 бит с подсчетом выведенных бит.

Поделиться сообщением


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

Вы ж не бойтесь этого Си. Все равно когда-нить придеццо. Сам заядлый асмщик...был :)

 

.equ Max_bit_capacity = 16
.def bit_cnt=r16
Write_595:
ldi bit_cnt, Max_bit_capacity
Write_595_1:
        lsl  Data_Out_Reg_L
        rol Data_Out_Reg_H
        cbi Port_Data_Output,Port_Data_Pin
        brcc  PC+2
        sbi Port_Data_Output,Port_Data_Pin
        sbi  Port_CLC_output, Port_CLC_pin
        cbi  Port_CLC_output, Port_CLC_pin
        dec bit_cnt
        brne Write_595_1
        ret

 

теперь только настроить соответствия имен и реальных пинов/регистров

Поделиться сообщением


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

Вы ж не бойтесь этого Си. Все равно когда-нить придеццо. Сам заядлый асмщик...был :)

 

теперь только настроить соответствия имен и реальных пинов/регистров

 

Спасибо, так яснее. По поводу Си согласен абсолютно с Вами, язык универсальный, осваивать нужно, соберусь силами и временем - займусь. Пока что asm проще для меня :rolleyes:

Поделиться сообщением


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

если есть возможность - можно использовать SPI (MOSI и SCK для записи в регистр) и одну дополнительную линию (строб активации выходного регистра в 74НС595), в этом случае скорость записи в регистры повыше будет, чем программная реализация (конечно, польза от этой скорости лишь тогда, когда работа с SPI ведется по прерываниям).

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

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