Артём__ 0 9 мая, 2012 Опубликовано 9 мая, 2012 · Жалоба А я не знаю, вот и спрашиваю. Разный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pavel-pervomaysk 0 9 мая, 2012 Опубликовано 9 мая, 2012 · Жалоба // 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 // Выход из подпрограммы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 9 мая, 2012 Опубликовано 9 мая, 2012 · Жалоба Разный. ОК. А то я интуитивно чувствую что то-то не так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lol483 0 9 мая, 2012 Опубликовано 9 мая, 2012 (изменено) · Жалоба Это походу ассемблер, я в нём очень плохо разбираюсь к сожалению, не понял от куда берется "Data". Это в роли функции здесь? Совсем ничего не понял( Изменено 10 мая, 2012 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 9 мая, 2012 Опубликовано 9 мая, 2012 · Жалоба Это в роли функции здесь? Совсем ничего не понял( Да это функция посылки байта по пррограммному spi. Вызывать нужно так (как вариант): call out_byte от куда берется "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 новым значением. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lol483 0 9 мая, 2012 Опубликовано 9 мая, 2012 (изменено) · Жалоба Ребята, кажется я понял в чем дело. Оказывается работа с 74HC595 была правильной, весь ступор был с К155ИД1. Вот опытным путём составил его таблицу истинности, отличается от даташита, не пойму в чем дело опять, но работает. (Проверял на трёх К155ИД1 - всё одинаково). Изменено 9 мая, 2012 пользователем lol483 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 10 мая, 2012 Опубликовано 10 мая, 2012 · Жалоба Вот опытным путём составил его таблицу истинности, отличается от даташита, не пойму в чем дело опять, но работает. Фантастика Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 10 мая, 2012 Опубликовано 10 мая, 2012 · Жалоба Ребята, кажется я понял в чем дело. Оказывается работа с 74HC595 была правильной, весь ступор был с К155ИД1. Вот опытным путём составил его таблицу истинности, отличается от даташита, не пойму в чем дело опять, но работает. (Проверял на трёх К155ИД1 - всё одинаково). Ссылочку на даташит... просто ради того чтобы посмотреть... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lol483 0 10 мая, 2012 Опубликовано 10 мая, 2012 (изменено) · Жалоба Ссылочку на даташит... просто ради того чтобы посмотреть... Например вот - http://www.chipinfo.ru/dsheets/ic/155/id1.html Я сам не знаю как так получается, много раз перепроверил. Вот ещё - http://cxem.net/beginner/beginner19.php Изменено 10 мая, 2012 пользователем lol483 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 10 мая, 2012 Опубликовано 10 мая, 2012 (изменено) · Жалоба Вы смотрели, что появляется на ноге 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 Изменено 10 мая, 2012 пользователем hd44780 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lol483 0 10 мая, 2012 Опубликовано 10 мая, 2012 (изменено) · Жалоба Вообщем попробовал так: подключил К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); } } } Изменено 10 мая, 2012 пользователем lol483 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 10 мая, 2012 Опубликовано 10 мая, 2012 (изменено) · Жалоба А 74HC595 вообще зачем? Ноги проца экономишь :) ? Регистр можно проверить просто записывая в него цифры 0000..1111 по какой-то кнопке и смотреть обычным вольтметром, что вылезает у него на выходах. Изменено 10 мая, 2012 пользователем hd44780 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lol483 0 10 мая, 2012 Опубликовано 10 мая, 2012 (изменено) · Жалоба А 74HC595 вообще зачем? Ноги проца экономишь :) ? Регистр можно проверить просто записывая в него цифры 0000..1111 по какой-то кнопке и смотреть обычным вольтметром, что вылезает у него на выходах. Честно говоря сейчас тоже сижу и думаю нужно ли мне использовать 74HC595. Делать часы хочу на ATmega16, будут 6 ламп - то есть нужно будет занять два порта чисто на индикацию. Один порт для I2C DS1307 и на этот же порт можно управление временем на кнопки посадить, остается один порт. Хз хватит ли для всего остального. Изменено 10 мая, 2012 пользователем lol483 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 10 мая, 2012 Опубликовано 10 мая, 2012 (изменено) · Жалоба Про 2 порта я не понял :( . 4 ноги - код цифры, а остальное куда? И как у тебя задаётся в какой разряд индикации какая цифра выводится? Прости, я с газоразрядными дисплеями не работал, только о светодиодными. C регистром у тебя 3 ноги занято (судя по последней версии кода), без регистра - 4. Выгадал немного, зато куча заморочек в коде. - циклы, маски и пр. И зачем для I2C один порт? У этого интерфейса всего 2 ноги. Остаётся ещё 6. И что у тебя "всё остальное"? Изменено 10 мая, 2012 пользователем hd44780 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 10 мая, 2012 Опубликовано 10 мая, 2012 · Жалоба PORTD.0=bin_digits[dig] & 1<<i; Скобок не хватает. Первой будет выполнена операция &, а автор, видимо, ожидает, что первой выполнится <<. Правильно так: PORTD.0=bin_digits[dig] & (1<<i) ? 1 : 0; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться