v000va 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Подскажите плз, как можно организовать вывод в последовательный регистр, например 74hc595? Есть 2 включенных последовательно регистра, нужно вывести на первый 8 бит, включить выходы регистра, замтем выводим 16 на оба и тоже включаем выходы. Может подскажите алгоритм или ссылочку или кусочек кода на ассемблере (под AVR) будет просто супер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vesago 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Все просто. Регистры соединяются последовательно. Есть два байта - образ данных в регистрах. Если нужно изменить соостояние какого выхода регистра, меняем соответсвующее значение в слове образе и по 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();} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v000va 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Все просто. Регистры соединяются последовательно. Есть два байта - образ данных в регистрах. Если нужно изменить соостояние какого выхода регистра, меняем соответсвующее значение в слове образе и по 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 бит с подсчетом выведенных бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Вы ж не бойтесь этого Си. Все равно когда-нить придеццо. Сам заядлый асмщик...был :) .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 теперь только настроить соответствия имен и реальных пинов/регистров Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v000va 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Вы ж не бойтесь этого Си. Все равно когда-нить придеццо. Сам заядлый асмщик...был :) теперь только настроить соответствия имен и реальных пинов/регистров Спасибо, так яснее. По поводу Си согласен абсолютно с Вами, язык универсальный, осваивать нужно, соберусь силами и временем - займусь. Пока что asm проще для меня :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 29 января, 2009 Опубликовано 29 января, 2009 · Жалоба если есть возможность - можно использовать SPI (MOSI и SCK для записи в регистр) и одну дополнительную линию (строб активации выходного регистра в 74НС595), в этом случае скорость записи в регистры повыше будет, чем программная реализация (конечно, польза от этой скорости лишь тогда, когда работа с SPI ведется по прерываниям). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться