Перейти к содержанию
    

Помогите разобраться с кодом для 74HC595

// 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                    // Выход из подпрограммы 


post-33716-1336575754_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это в роли функции здесь? Совсем ничего не понял(

Да это функция посылки байта по пррограммному 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 новым значением.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

post-71734-1336598879_thumb.jpg

Изменено пользователем lol483

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот опытным путём составил его таблицу истинности, отличается от даташита, не пойму в чем дело опять, но работает.

Фантастика :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Ссылочку на даташит... просто ради того чтобы посмотреть...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ссылочку на даташит... просто ради того чтобы посмотреть...

Например вот - http://www.chipinfo.ru/dsheets/ic/155/id1.html

Я сам не знаю как так получается, много раз перепроверил. Вот ещё - http://cxem.net/beginner/beginner19.php

Изменено пользователем lol483

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы смотрели, что появляется на ноге 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: .

И даташиты не ищите, ну не было в СССР такого понятия ...

 

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

post-7980-1336637037_thumb.png

post-7980-1336637489_thumb.png

post-7980-1336637495_thumb.png

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем попробовал так: подключил К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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Изменено пользователем lol483

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про 2 порта я не понял :( . 4 ноги - код цифры, а остальное куда?

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

 

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

 

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

И что у тебя "всё остальное"?

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Скобок не хватает. Первой будет выполнена операция &, а автор, видимо, ожидает, что первой выполнится <<.

Правильно так:

PORTD.0=bin_digits[dig] & (1<<i) ? 1 : 0;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...