реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Помогите разобраться с кодом для 74HC595
_Артём_
сообщение May 9 2012, 14:36
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(zombi @ May 9 2012, 16:03) *
А я не знаю, вот и спрашиваю.

Разный.
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение May 9 2012, 15:09
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 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 // Выход из подпрограммы



Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
zombi
сообщение May 9 2012, 15:47
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(_Артём_ @ May 9 2012, 17:36) *
Разный.

ОК.
А то я интуитивно чувствую что то-то не так.
Go to the top of the page
 
+Quote Post
lol483
сообщение May 9 2012, 19:57
Сообщение #19


Участник
*

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



Цитата(Павлик @ May 9 2012, 18:09) *

Это походу ассемблер, я в нём очень плохо разбираюсь к сожалению, не понял от куда берется "Data". Это в роли функции здесь? Совсем ничего не понял(

Сообщение отредактировал IgorKossak - May 10 2012, 06:59
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 9 2012, 20:23
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 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 новым значением.
Go to the top of the page
 
+Quote Post
lol483
сообщение May 9 2012, 21:28
Сообщение #21


Участник
*

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



Ребята, кажется я понял в чем дело. Оказывается работа с 74HC595 была правильной, весь ступор был с К155ИД1. Вот опытным путём составил его таблицу истинности, отличается от даташита, не пойму в чем дело опять, но работает. (Проверял на трёх К155ИД1 - всё одинаково).

Сообщение отредактировал lol483 - May 9 2012, 21:32
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
zombi
сообщение May 10 2012, 05:17
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(lol483 @ May 10 2012, 00:28) *
Вот опытным путём составил его таблицу истинности, отличается от даташита, не пойму в чем дело опять, но работает.

Фантастика biggrin.gif
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 10 2012, 06:46
Сообщение #23


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(lol483 @ May 10 2012, 01:28) *
Ребята, кажется я понял в чем дело. Оказывается работа с 74HC595 была правильной, весь ступор был с К155ИД1. Вот опытным путём составил его таблицу истинности, отличается от даташита, не пойму в чем дело опять, но работает. (Проверял на трёх К155ИД1 - всё одинаково).

Ссылочку на даташит... просто ради того чтобы посмотреть...
Go to the top of the page
 
+Quote Post
lol483
сообщение May 10 2012, 07:16
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
hd44780
сообщение May 10 2012, 08:03
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 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 года выпуска. Могу всю книжку дать, может ещё чего-то полезного найдёте.
Советские инженеры, видать плохо её ободрали с чего-то забугорного, либо не сумели её до ума довести, если сами разрабатывали biggrin.gif .
И даташиты не ищите, ну не было в СССР такого понятия ...

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
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
lol483
сообщение May 10 2012, 09:03
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
hd44780
сообщение May 10 2012, 10:34
Сообщение #27


Профессионал
*****

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



А 74HC595 вообще зачем? Ноги проца экономишь sm.gif ?

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

Сообщение отредактировал hd44780 - May 10 2012, 10:36


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
lol483
сообщение May 10 2012, 10:52
Сообщение #28


Участник
*

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



Цитата(hd44780 @ May 10 2012, 13:34) *
А 74HC595 вообще зачем? Ноги проца экономишь sm.gif ?

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

Честно говоря сейчас тоже сижу и думаю нужно ли мне использовать 74HC595. Делать часы хочу на ATmega16, будут 6 ламп - то есть нужно будет занять два порта чисто на индикацию. Один порт для I2C DS1307 и на этот же порт можно управление временем на кнопки посадить, остается один порт. Хз хватит ли для всего остального.

Сообщение отредактировал lol483 - May 10 2012, 10:52
Go to the top of the page
 
+Quote Post
hd44780
сообщение May 10 2012, 11:38
Сообщение #29


Профессионал
*****

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



Про 2 порта я не понял sad.gif . 4 ноги - код цифры, а остальное куда?
И как у тебя задаётся в какой разряд индикации какая цифра выводится? Прости, я с газоразрядными дисплеями не работал, только о светодиодными.

C регистром у тебя 3 ноги занято (судя по последней версии кода), без регистра - 4. Выгадал немного, зато куча заморочек в коде. - циклы, маски и пр.

И зачем для I2C один порт? У этого интерфейса всего 2 ноги. Остаётся ещё 6.
И что у тебя "всё остальное"?

Сообщение отредактировал hd44780 - May 10 2012, 11:41


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
gerber
сообщение May 10 2012, 11:51
Сообщение #30


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Код
PORTD.0=bin_digits[dig] & 1<<i;

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


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 17:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01515 секунд с 7
ELECTRONIX ©2004-2016