|
|
  |
Помогите разобраться с кодом для 74HC595 |
|
|
|
May 9 2012, 15:09
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
CODE // Internal SPI .equ spi_ddr = DDRB // .equ spi_port = PORTB // .equ spi_p = PINB // .equ ss = PB0 // .equ sck = PB1 // .equ mosi = PB2 // .equ miso = PB3 //
// SPI Master Init // Set MOSI and SCK output, all others input ldi tmp,(0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0) // DORD=1 lsb first DORD=0 msb first // MSTR=1 SPI master mode MSTR=0 SPI slave mode // CPOL=1 SCK по спаду CPOL=0 SCK по фронту // SPR1 SPR0 0 0 (F/4) 0 1 (F/16) 1 0 (F/64) 1 1 (F/128) out SPCR,tmp // Enable SPI, Master, set clock rate fck/16 ldi tmp,(1<<SPI2X) // SPI freq * 2 out SPSR,tmp //
;Запись байта в регистр с помощью апаратного SPI
74HC595: sbi d_port,EN // out SPDR,xh // OUT anod_m wt_stx1: // Wait for transmission complete in tmp1,SPSR // sbrs tmp1,SPIF // rjmp wt_stx1 // cbi d_port,EN // ret
;Запись байта в регистр с помощью програмного SPI
74HC595: sbi d_port,en // Переводим выходы регистров в третье состояние rcall out_byte // cbi d_port,en // Включаем выходы 74НС595 ret
out_byte: // Вывод байта в 74HC595 ldi loop,8 // Счетчик битов otd: // Cycle clc // Очищаем CARY Flag rol data // Сдвигаем данные в лево на 1 (data<<1) brcc d_z // Если CARY Flag сброшен , идем сюда -----| sbi d_port,dat // Если CARY Flag установлен то DATA=1 | rjmp d_ok // | d_z : // Data zero <----| cbi d_port,dat // Если CARY Flag сброшен то DATA=0 d_ok: // Импульс CLK sbi d_port,clk // CLK -> 1 cbi d_port,clk // CLK -> 0 dec loop // Счетчик битов - 1 brne otd // Если счетчик не равен 0 то переходим кциклу otd ret // Выход из подпрограммы
Эскизы прикрепленных изображений
|
|
|
|
|
May 9 2012, 19:57
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 8-05-12
Пользователь №: 71 734

|
Цитата(Павлик @ May 9 2012, 18:09)  Это походу ассемблер, я в нём очень плохо разбираюсь к сожалению, не понял от куда берется "Data". Это в роли функции здесь? Совсем ничего не понял(
Сообщение отредактировал IgorKossak - May 10 2012, 06:59
Причина редактирования: бездумное цитирование
|
|
|
|
|
May 9 2012, 20:23
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(lol483 @ May 9 2012, 22:57)  Это в роли функции здесь? Совсем ничего не понял( Да это функция посылки байта по пррограммному spi. Вызывать нужно так (как вариант): Код call out_byte Цитата(lol483 @ May 9 2012, 22:57)  от куда берется "Data". Учитывая Код rol data можно заключить что data - регистр. P.S. Код out_byte: // Вывод байта в 74HC595 ldi loop,8 // Счетчик битов otd: // Cycle clc // Очищаем CARY Flag rol data // Сдвигаем данные в лево на 1 (data<<1) Непонятно зачем делать clc, если следующая команда rol data заполняет CARRY новым значением.
|
|
|
|
|
May 9 2012, 21:28
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 8-05-12
Пользователь №: 71 734

|
Ребята, кажется я понял в чем дело. Оказывается работа с 74HC595 была правильной, весь ступор был с К155ИД1. Вот опытным путём составил его таблицу истинности, отличается от даташита, не пойму в чем дело опять, но работает. (Проверял на трёх К155ИД1 - всё одинаково).
Сообщение отредактировал lol483 - May 9 2012, 21:32
Эскизы прикрепленных изображений
|
|
|
|
|
May 10 2012, 07:16
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 8-05-12
Пользователь №: 71 734

|
Цитата(Genadi Zawidowski @ May 10 2012, 09:46)  Ссылочку на даташит... просто ради того чтобы посмотреть... Например вот - http://www.chipinfo.ru/dsheets/ic/155/id1.htmlЯ сам не знаю как так получается, много раз перепроверил. Вот ещё - http://cxem.net/beginner/beginner19.php
Сообщение отредактировал lol483 - May 10 2012, 07:19
|
|
|
|
|
May 10 2012, 08:03
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Вы смотрели, что появляется на ноге PD0? Конструкция PORTD.0=bin_digits[dig] & 1<<i; //выводим "текущий бит" в линию DS слишком сложная. CvAVR часто на таких спотыкается. Да и не только он. Я когда-то такими наворотами ухитрился и VC6 в ступор загнать. В итоге у меня простейший if вообще не отрабатывал - было вечно ложное условие. А ведь VC6 на порядки мощнее этого CvAVR.... Это раз. Второе. Вы наверное имели в виду PORTD.0=bin_digits[dig] & (1<<i); Не поленитесь, раздробите это, например, так: unsigned char c, mask; ....... mask=0x01<<i; c=bin_digits[dig]; c&=mask; if (c!=0) PORTD.0=1; else PORTD.0=0; Если заработает, группируйте операции. И ещё. Корявая она какая-то эта К155ИД1. Там надо сигналы инвертировать, и ещё какой-то элемент ИЛИ добавлять - см. вложение. Это скан книжки Бирюкова 1991 года выпуска. Могу всю книжку дать, может ещё чего-то полезного найдёте. Советские инженеры, видать плохо её ободрали с чего-то забугорного, либо не сумели её до ума довести, если сами разрабатывали  . И даташиты не ищите, ну не было в СССР такого понятия ... PS. Ну не работает у меня кнопка CodeBox - Сведения об ошибке на веб-странице Агент пользователя: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) штамп времени: Thu, 10 May 2012 07:56:33 UTC Сообщение: Недопустимый аргумент. Строка: 1225 Символ: 3 Код: 0 URI-код: http://electronix.ru/forum/jscripts/ips_text_editor.jsСообщение: Недопустимый аргумент. Строка: 1225 Символ: 3 Код: 0 URI-код: http://electronix.ru/forum/jscripts/ips_text_editor.js
Сообщение отредактировал hd44780 - May 10 2012, 08:21
Эскизы прикрепленных изображений
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
May 10 2012, 09:03
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 8-05-12
Пользователь №: 71 734

|
Вообщем попробовал так: подключил К155ИД1 (с газоразрядным индикатором ИН-14) напрямую к порту С (от 74HC595 - отрезал дорожки управления К155ИД1) и согласно выше приведенной таблице истиности изменил прошивку (конкретнее - массив чисел и кое что в цикле что бы через порт С всё выводилось) и всё работает - на индикаторе последовательно от нуля и до девяти выводятся числа. Подозреваю что Q3 у регистра последовательного сдвига перестала работать. Наверное придется перепаивать новый и снова проверять. Возможно ли что так могло случиться ? Буду пробовать отладить как то функцию для работы с 74HC595. Вот ссылка на видео: ВидеоКод #include <mega16.h> #include <delay.h>
unsigned char dig; unsigned char bin_digits[10]= { 0b10000000, //0 0b00000000, //1 0b10010000, //2 0b00010000, //3 0b11100000, //4 0b01100000, //5 0b10100000, //6 0b00100000, //7 0b11000000, //8 0b01000000, //9 };
void HC595_write(unsigned char dig) //функция записи данных в регистр 74HC595 (используя PORTD.0=DS, PORTD.1=SH_CP, PORTD.2=ST_CP) { unsigned int i; for(i=0; i<7; i++) //цикл для последовательного вывода 8 бит данных из массива { PORTD.0=bin_digits[dig] & (1<<i); //выводим "текущий бит" в линию DS PORTD.1=1; //выводим "0" в линию SH_CP PORTD.1=0; //выводим "1" в линию SH_CP - считываем бит на входе регистра (считывание происходит по переднему фронту импульса на SH_CP) } PORTD.2=1; //выводим "1" в линию ST_CP - "защелкиваем данные" ("защелкивание" происходит по переднему фронту импульса на ST_CP) PORTD.2=0; //выводим "0" в линию ST_CP }
void main(void) { DDRD=0xFF; //конфигурируем порт "D" на вывод DDRC=0xFF; while(1) { for(dig=0; dig<10; dig++) //цикл для чередования числел (0-9) записываемых в регистр 74HC595 { PORTC=bin_digits[dig]; //подключаю К155ИД1 напрямую к порту C в обход регистра последовательного сдвига //HC595_write(dig); //функция записи данных в регистр 74HC595 delay_ms(400); } } }
Сообщение отредактировал lol483 - May 10 2012, 09:13
|
|
|
|
|
May 10 2012, 10:52
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 8-05-12
Пользователь №: 71 734

|
Цитата(hd44780 @ May 10 2012, 13:34)  А 74HC595 вообще зачем? Ноги проца экономишь  ? Регистр можно проверить просто записывая в него цифры 0000..1111 по какой-то кнопке и смотреть обычным вольтметром, что вылезает у него на выходах. Честно говоря сейчас тоже сижу и думаю нужно ли мне использовать 74HC595. Делать часы хочу на ATmega16, будут 6 ламп - то есть нужно будет занять два порта чисто на индикацию. Один порт для I2C DS1307 и на этот же порт можно управление временем на кнопки посадить, остается один порт. Хз хватит ли для всего остального.
Сообщение отредактировал lol483 - May 10 2012, 10:52
|
|
|
|
|
May 10 2012, 11:38
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Про 2 порта я не понял  . 4 ноги - код цифры, а остальное куда? И как у тебя задаётся в какой разряд индикации какая цифра выводится? Прости, я с газоразрядными дисплеями не работал, только о светодиодными. C регистром у тебя 3 ноги занято (судя по последней версии кода), без регистра - 4. Выгадал немного, зато куча заморочек в коде. - циклы, маски и пр. И зачем для I2C один порт? У этого интерфейса всего 2 ноги. Остаётся ещё 6. И что у тебя "всё остальное"?
Сообщение отредактировал hd44780 - May 10 2012, 11:41
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
May 10 2012, 11:51
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Код PORTD.0=bin_digits[dig] & 1<<i; Скобок не хватает. Первой будет выполнена операция &, а автор, видимо, ожидает, что первой выполнится <<. Правильно так: Код PORTD.0=bin_digits[dig] & (1<<i) ? 1 : 0;
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|