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

помогите с регистром сдвига

Всем привет, подключил регистр сдвига 74HC164 к меге8535, но никак не удаётся управлять им....мучаюсь уже 3тий день..... подключал как сдесь 395_6973.gif

только вместо индикатора у меня табло 8х8

 

проблема в том что не наблюдаю никаких изменений, а иногда регистр ведет себя странно, вписывает левые значения) привожу текст проги :

 

#include <MEGA8535.h>

char i;

void main(void)
{
  DDRA = 0b11111111;
  PORTA = 0b11111111;            //тут висят + матрицы  (плюсы включают строки)
  
  DDRB = 0x00000011;             
  PORTB = 0b00000010;           //PORTB.0 - C1, PORTB.1 - Data (регистр)
                   

   for (i = 0; i<= 7; i++) {       //очищаем регистр (записываем во все выводы 1)
      PORTB.0 = 0;
      PORTB.0 = 1;
    }; 
   
while (1)
{  
   PORTB.1 = 0;                      //включаем первый столбец
   PORTB.0 = 0;
   PORTB.0 = 1;
   delay_ms(100);
   PORTB.1 = 1;

   for (i = 0; i<= 6; i++) {       //как-бы выводим каждый раз новый столбец матрицы справа налево
      PORTB.0 = 0;
      PORTB.0 = 1;
      delay_ms(100);
    }; 
}
}

 

 

помогите пожалуста!

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


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

PORTB.0 - C1, PORTB.1 - Data (регистр)
Что-то я не понял... На рисунке, ведь, наоборот! Или как?

 

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


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

Что-то я не понял... На рисунке, ведь, наоборот! Или как?

 

 

у меня мега8535, там тини, я подключил так.....

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


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

Добрый вечер!

По моему мнению, в момент вывода надо на выход CLK давать меандр, типа такого:

PORTB.1 = 1;
delay_ms(100);
PORTB.1 = 0;
delay_ms(100);

А на вход данных - DATA собственно последовательность данных

if (d[i])
{
PORTB.0 = 1;
}
delay_ms(100);
PORTB.0 = 0;
delay_ms(100);

где d- биты данных

Учитывая параллельную работу DATA/CLK, должно получится что то типа

for (i=0;i<7;i++)
{
if (d[i])
{
PORTB.0 = 1;
}
PORTB.1 = 1;
delay_ms(100);
PORTB.0 = 0;
PORTB.1 = 0;
delay_ms(100);
}

Как то так :laughing:

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


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

У меня это реализуется примерно так:

#define  tb_clock_hi()     PORTB.1=1
#define  tb_clock_lo()     PORTB.1=0
#define  tb_data_hi()      PORTB.0=1
#define  tb_data_lo()      PORTB.0=0

void shift_byte(byte byt)
{
  byte i=0x01;
  while(i)
   {
    if(byt & i) tb_data_hi ();
      else      tb_data_lo ();
    tb_clock_hi ();
    tb_clock_lo ();
    i <<=1;
   }
}

 

P.S. Максимальная частота HC164 при V=5В равна 24 МГц, поэтому никаких задержек не надо!

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

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


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

только вместо индикатора у меня табло 8х8
У 'табло 8х8' должно быть как минимум 16 входов (8 столбцов + 8 строк). С HC164 идет 8, куда подсоединены остальные 8?

 

Кроме того, ваша прога вообще делает непонятно что.

а иногда регистр ведет себя странно, вписывает левые значения
Что вы в него записываете, то он и 'вписывает' :)

 

Вы что от него хотели получить?

 

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


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

У 'табло 8х8' должно быть как минимум 16 входов (8 столбцов + 8 строк). С HC164 идет 8, куда подсоединены остальные 8?

 

Вы что от него хотели получить?

 

 

PORTB - тут висят плюсы от матрицы, минусы идут на регистр....

 

хочу попрактиковаться с регистром сдвига......

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


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

Что вы в него записываете, то он и 'вписывает' Вы что от него хотели получить?
Очевидно, что человек только учится работать со сдвиговым регистром. Также очевидно, что получить хотел "бегущий" ноль на выходах...

 

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


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

Всем спасибо, нашел ошибку, вы не поверите но такое не с каждым случается, если присмотреться, то можно увидеть что я вместо 0b00000011 написал 0x00000011, ну что ж поделаешь....но зато есть другая проблема,

 

 

вчера от злости начал менять фьюзы.....думал что то с кварцем нето) доменялся, теперь 8535 не перепрошивается, менял фьюзы

 

cksel sut ckopt (просто от фанаря в них вбивал значения) у меня стоял кварц мини версия на 16 МГц..... сейчас не перепрошивается....как я думаю, я поставил какую-то комбинацию, наверно на другой кварц, если кто сталкивался с таким пожалуста не дайте умереть меге!!! =)

 

не помню какие выставил фъюзы....я их сбил потом )))

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


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

не дайте умереть меге!!!
Если воспользоваться поиском, то решение легко найдется - внешняя тактовая частота...

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


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

Если воспользоваться поиском, то решение легко найдется - внешняя тактовая частота...

 

 

посмотрел по форуму, пишут что можно взять частоту с программатора stk200, но не написано от куда....не подскажите где оно там?)

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


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

Насколько я знаю, на выходе LED в этом программаторе около 100 кГц

 

Насколько я знаю, на выходе LED в этом программаторе около 100 кГц

Вроде как идет с пина 8 LPT через буфер. Но ты перепроверь, т.к. своей схемы под рукой сейчас нет.

 

подключать на вывод XTAL1 МК.

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


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

Купил новый МК....) потом разберусь со старым.....

 

 

пишу прогу для бегущей строки, основу уже накатал, все движется все круто, но вот есть одна проблема. я обновляю ин-фо на табло вот так:

 

PORTA = текущий столбец; //записываем в буфер первый столбец справа

PORTB.1 = 0; //впихиваем в регистр 0

PORTB.0 = 0;

PORTB.0 = 1; //обновляем

 

тоесть сначала включаю плюсы матрицы от МК, а потом подключаю нужную ножку в регистре сдвига....

 

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

 

может кто встречался с таким, подскажите плиз что делать?

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


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

подскажите плиз что делать?
Не очень понятно объяснили проблему... Отвечаю как понял вопрос. Вывод на светодиодную матрицу осуществляется так:

1. Выдаём данные на столбец, соответствующие всем погашенным светодиодам столбца

2. Включаем\переключаем столбец

3. Выдаём данные на диоды столбца в соответствии с "рисунком"

4. Ничего не делаем некоторое время и - на п.1

При такой последовательности действий паразитных свечений диодов при переключении столбцов не будет

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


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

Мне кажется здесь красиво было бы использовать SPI интерфейс. Зачем заниматься ногодрыганьем когда есть уже готовый контроллер, только управляй им.

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


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

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

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

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

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

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

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

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

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

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