|
74HC595, Помогите с пониманием |
|
|
|
May 12 2007, 15:24
|

Местный
  
Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254

|
Народ подскажите как должен выглядеть код чтобы можно было зажеч второй св.диод на 1 регистре и 3 на втором. привожу код который написал для работы с одним регистром Код void sr_w(unsigned char ch ) { unsigned char counter = 8;
ISP_ST_CP = 0; ISP_SH_CP = 0; while (counter--) { ISP_SH_CP = 0; if ( ch & 0x80 ) ISP_DS = 1; else ISP_DS = 0; #asm("nop") ISP_SH_CP = 1; ch <<= 1; }
ISP_ST_CP = 1; } Зарание всем благодарен.
|
|
|
|
|
 |
Ответов
|
May 12 2007, 16:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Похоже, TamTam хочет, чтобы если число меньше или равно 255, то все светилось в "первом" регистре, а всё, что больше - во "втором", т.е. что-то типа sr_w(258-255); sr_w(255); Цитата не вижу смысла логичекое выражение дважды инвертировать ch & 0x80 - это побитовое И, т.е. результат будет равен 0 или 0x80. Т.е. Вы просто ошиблись. Логическое выражение же возвращает в Си 0 или 1, т.е. если число не 0, то даст 1. Получается, чтобы получить именно 1, нужно дважды проинвертировать и всё. А варианты с Цитата Чтобы сохранить алгоритм надо писать , можете использовать, но это не то, что Вы до того написали, и никак не может отвергнуть за неправильностью мою поправку.
--------------------
aka Vit
|
|
|
|
|
May 12 2007, 16:59
|
Местный
  
Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017

|
Цитата(sensor_ua @ May 12 2007, 19:41)  ch & 0x80 - это побитовое И, т.е. результат будет равен 0 или 0x80. Т.е. Вы просто ошиблись. Полностью согласен, ступил немного. Правда, ошибку заметил раньше Вашего указания и уже успел подкорректировать свой пост. Цитата unsigned int i = 258;//0x0102 sr_w((unsigned char)(i>>8));//0x01 sr_w((unsigned char)(i));//0x02 можно и так. Но ISP_ST_CP = 1; все равно вынеси за функцию, так как это строб на перезапись из сдвигового регистра на выход ИМС. Если не вынести, данные 2-го регистра будут подсвечивать на 1-м.
|
|
|
|
|
May 12 2007, 17:27
|
Местный
  
Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017

|
Цитата(TamTam @ May 12 2007, 20:08)  Чето я так и неврубился как должна выглядеть процедура. Вариант 1: Смотри выше мой пост (там, где counter=16 и тип переменной ch - unsigned int) Процедуру вызываем так: sr_w(258); Только для того, чтобы засвеить все диоды, нужно писать sr_w(0х3FF); Вариант 2: Код void sr_w(unsigned char ch ) { unsigned char counter = 8;
// ISP_ST_CP = 0; - убрали, но можно и оставить ISP_SH_CP = 0; while (counter--) { ISP_SH_CP = 0; if ( ch & 0x80 ) ISP_DS = 1; else ISP_DS = 0; #asm("nop") ISP_SH_CP = 1; ch <<= 1; }
// ISP_ST_CP = 1; - убрали } и вызывать unsigned int i = 258; //0x0102 ISP_ST_CP = 0; sr_w((unsigned char)(i>>8));//0x01 sr_w((unsigned char)(i));//0x02 ISP_ST_CP = 1; // после этой команды новые данные появляются на выходе.
Сообщение отредактировал Александр Куличок - May 12 2007, 17:32
|
|
|
|
|
May 12 2007, 17:40
|

Местный
  
Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254

|
Цитата(Александр Куличок @ May 12 2007, 20:27)  Вариант 1: Смотри выше мой пост (там, где counter=16 и тип переменной ch - unsigned int) Процедуру вызываем так: sr_w(258); Только для того, чтобы засвеить все диоды, нужно писать sr_w(0х3FF); Вариант 2: Код void sr_w(unsigned char ch ) { unsigned char counter = 8;
// ISP_ST_CP = 0; - убрали, но можно и оставить ISP_SH_CP = 0; while (counter--) { ISP_SH_CP = 0; if ( ch & 0x80 ) ISP_DS = 1; else ISP_DS = 0; #asm("nop") ISP_SH_CP = 1; ch <<= 1; }
// ISP_ST_CP = 1; - убрали } и вызывать unsigned int i = 258; //0x0102 ISP_ST_CP = 0; sr_w((unsigned char)(i>>8));//0x01 sr_w((unsigned char)(i));//0x02 ISP_ST_CP = 1; // после этой команды новые данные появляются на выходе. Все равно не получается светятся два диода 2 на 1 регистре и 1 на второмю Есть два варианта глюк Протеуса или хз
|
|
|
|
Сообщений в этой теме
TamTam 74HC595 May 12 2007, 15:24 sensor_ua О чем речь? Вроде по коду старшим битом вперёд выд... May 12 2007, 15:37 Александр Куличок Вроде все правильно, только ISP_ST_CP = 1; вынес... May 12 2007, 15:52 defunct Цитата(Александр Куличок @ May 12 2007, 17... May 12 2007, 15:59 sensor_ua Цитататолько ISP_ST_CP = 1; вынеси за функцию
п... May 12 2007, 16:04 TamTam Народ сори затупил, Вопрос должен звучать так
Ест... May 12 2007, 16:06 Александр Куличок Если быстро, тогда так:
Кодvoid sr_w(unsigned... May 12 2007, 16:12 TamTam Цитата(sensor_ua @ May 12 2007, 19:41) По... May 12 2007, 16:44 sensor_ua unsigned int i = 258; //0x0102
sr_w((unsigned char... May 12 2007, 16:48 sensor_ua ЦитатаISP_ST_CP = 1; все равно вынеси за функцию,... May 12 2007, 17:41 Александр Куличок ЦитатаВсе равно не получается светятся два диода 2... May 12 2007, 17:44 TamTam Цитата(Александр Куличок @ May 12 2007, 20... May 12 2007, 17:52 Александр Куличок Цитатасветятся два диода 2 на 1 регистре и 1 на вт... May 12 2007, 18:13 TamTam Цитата(Александр Куличок @ May 12 2007, 21... May 12 2007, 19:02 TamTam Родился еще один вопрос, можноли при помощи этойже... May 12 2007, 20:47 rezident Цитата(TamTam @ May 13 2007, 02:47) Родил... May 12 2007, 21:18  TamTam Цитата(rezident @ May 13 2007, 00:18) Тол... May 12 2007, 22:19 Александр Куличок Цитата(TamTam @ May 12 2007, 23:47) Родил... May 13 2007, 07:52 sensor_ua http://www.telesys.ru/electronics/projects.php?do=... May 12 2007, 22:41
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|