|
|
  |
помогите с регистром сдвига |
|
|
|
Feb 15 2011, 18:18
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 7-10-10
Пользователь №: 59 988

|
Всем привет, подключил регистр сдвига 74HC164 к меге8535, но никак не удаётся управлять им....мучаюсь уже 3тий день..... подключал как сдесь  только вместо индикатора у меня табло 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); }; } } помогите пожалуста!
|
|
|
|
|
Feb 15 2011, 18:42
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 7-10-10
Пользователь №: 59 988

|
Цитата(Палыч @ Feb 15 2011, 21:31)  Что-то я не понял... На рисунке, ведь, наоборот! Или как? у меня мега8535, там тини, я подключил так.....
|
|
|
|
|
Feb 15 2011, 21:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 329
Регистрация: 6-12-08
Из: Москва
Пользователь №: 42 252

|
Добрый вечер! По моему мнению, в момент вывода надо на выход 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[i]- биты данных Учитывая параллельную работу 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); } Как то так
|
|
|
|
|
Feb 16 2011, 05:22
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
У меня это реализуется примерно так: Код #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 - Feb 16 2011, 05:28
|
|
|
|
|
Feb 16 2011, 10:26
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата только вместо индикатора у меня табло 8х8 У 'табло 8х8' должно быть как минимум 16 входов (8 столбцов + 8 строк). С HC164 идет 8, куда подсоединены остальные 8? Кроме того, ваша прога вообще делает непонятно что. Цитата а иногда регистр ведет себя странно, вписывает левые значения Что вы в него записываете, то он и 'вписывает'  Вы что от него хотели получить?
|
|
|
|
|
Feb 16 2011, 17:11
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 7-10-10
Пользователь №: 59 988

|
Цитата(XVR @ Feb 16 2011, 14:26)  У 'табло 8х8' должно быть как минимум 16 входов (8 столбцов + 8 строк). С HC164 идет 8, куда подсоединены остальные 8?
Вы что от него хотели получить? PORTB - тут висят плюсы от матрицы, минусы идут на регистр.... хочу попрактиковаться с регистром сдвига......
|
|
|
|
|
Feb 16 2011, 18:18
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 7-10-10
Пользователь №: 59 988

|
Всем спасибо, нашел ошибку, вы не поверите но такое не с каждым случается, если присмотреться, то можно увидеть что я вместо 0b00000011 написал 0x00000011, ну что ж поделаешь....но зато есть другая проблема,
вчера от злости начал менять фьюзы.....думал что то с кварцем нето) доменялся, теперь 8535 не перепрошивается, менял фьюзы
cksel sut ckopt (просто от фанаря в них вбивал значения) у меня стоял кварц мини версия на 16 МГц..... сейчас не перепрошивается....как я думаю, я поставил какую-то комбинацию, наверно на другой кварц, если кто сталкивался с таким пожалуста не дайте умереть меге!!! =)
не помню какие выставил фъюзы....я их сбил потом )))
|
|
|
|
|
Feb 16 2011, 19:02
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 7-10-10
Пользователь №: 59 988

|
Цитата(Палыч @ Feb 16 2011, 22:30)  Если воспользоваться поиском, то решение легко найдется - внешняя тактовая частота... посмотрел по форуму, пишут что можно взять частоту с программатора stk200, но не написано от куда....не подскажите где оно там?)
|
|
|
|
|
Feb 16 2011, 21:09
|
Группа: Новичок
Сообщений: 5
Регистрация: 1-02-11
Из: Запорожье
Пользователь №: 62 620

|
Насколько я знаю, на выходе LED в этом программаторе около 100 кГц Цитата(2891oleg @ Feb 16 2011, 23:00)  Насколько я знаю, на выходе LED в этом программаторе около 100 кГц Вроде как идет с пина 8 LPT через буфер. Но ты перепроверь, т.к. своей схемы под рукой сейчас нет. подключать на вывод XTAL1 МК.
|
|
|
|
|
Feb 18 2011, 15:19
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 7-10-10
Пользователь №: 59 988

|
Купил новый МК....) потом разберусь со старым.....
пишу прогу для бегущей строки, основу уже накатал, все движется все круто, но вот есть одна проблема. я обновляю ин-фо на табло вот так:
PORTA = текущий столбец; //записываем в буфер первый столбец справа PORTB.1 = 0; //впихиваем в регистр 0 PORTB.0 = 0; PORTB.0 = 1; //обновляем
тоесть сначала включаю плюсы матрицы от МК, а потом подключаю нужную ножку в регистре сдвига....
проблема в том, что из-за того что включение происходит не одновременно, наблюдается некая тень, тоесть столбец, который находится перед тем, что выводим, тоже слегка видно.....а хотелось бы, чтобы выводился только сам рисунок, без "тени"
может кто встречался с таким, подскажите плиз что делать?
|
|
|
|
|
Feb 18 2011, 17:00
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(sadfeel @ Feb 18 2011, 18:19)  подскажите плиз что делать? Не очень понятно объяснили проблему... Отвечаю как понял вопрос. Вывод на светодиодную матрицу осуществляется так: 1. Выдаём данные на столбец, соответствующие всем погашенным светодиодам столбца 2. Включаем\переключаем столбец 3. Выдаём данные на диоды столбца в соответствии с "рисунком" 4. Ничего не делаем некоторое время и - на п.1 При такой последовательности действий паразитных свечений диодов при переключении столбцов не будет
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|