реклама на сайте
подробности

 
 
> Вывод в последовательный регистр, работа с 74hc595
V000va
сообщение Jan 28 2009, 10:10
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503



Подскажите плз, как можно организовать вывод в последовательный регистр, например 74hc595? Есть 2 включенных последовательно регистра, нужно вывести на первый 8 бит, включить выходы регистра, замтем выводим 16 на оба и тоже включаем выходы. Может подскажите алгоритм или ссылочку или кусочек кода на ассемблере (под AVR) будет просто супер biggrin.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
vesago
сообщение Jan 28 2009, 10:53
Сообщение #2


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Все просто. Регистры соединяются последовательно. Есть два байта - образ данных в регистрах. Если нужно изменить соостояние какого выхода регистра, меняем соответсвующее значение в слове образе и по 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();}
Go to the top of the page
 
+Quote Post
V000va
сообщение Jan 28 2009, 11:29
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503



Цитата(vesago @ Jan 28 2009, 12:53) *
Все просто. Регистры соединяются последовательно. Есть два байта - образ данных в регистрах. Если нужно изменить соостояние какого выхода регистра, меняем соответсвующее значение в слове образе и по 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 бит с подсчетом выведенных бит.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 28 2009, 12:03
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

Код
.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


теперь только настроить соответствия имен и реальных пинов/регистров
Go to the top of the page
 
+Quote Post
V000va
сообщение Jan 28 2009, 12:39
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503



Цитата(_Pasha @ Jan 28 2009, 14:03) *
Вы ж не бойтесь этого Си. Все равно когда-нить придеццо. Сам заядлый асмщик...был smile.gif

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


Спасибо, так яснее. По поводу Си согласен абсолютно с Вами, язык универсальный, осваивать нужно, соберусь силами и временем - займусь. Пока что asm проще для меня rolleyes.gif
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 29 2009, 07:34
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 14:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.0138 секунд с 7
ELECTRONIX ©2004-2016