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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Помогите разобраться с кодом для 74HC595
lol483
сообщение May 8 2012, 13:13
Сообщение #1


Участник
*

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



Здравствуйте, прошу помощи в следующей проблеме: написал кусочек кода для будущих часов на газоразрядных индикаторах с применением регистра последовательного сдвига 74HC595
и столкнулся с непонятным моментом, на осциллографе на соответствующих ножках МК: DS-постоянно 1, SH_CP-постоянно 1, ST_CP-постоянно 0. В соответствии с прикрепленной прошивкой там должны быть определенные колебания. Расскажите что в коде не так, в чем проблема?


Сообщение отредактировал lol483 - May 8 2012, 13:14
Прикрепленные файлы
Прикрепленный файл  __________74HC595.rar ( 26.06 килобайт ) Кол-во скачиваний: 33
 
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 8 2012, 14:01
Сообщение #2


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

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



В строке
Цитата
выводим "текущий бит" в линию DS

1) попробуйте вот так: PORTD.0=(bin_digits[dig] & 1<< i) != 0;
2) Выводятся числа 0..8, а не 0.9
Go to the top of the page
 
+Quote Post
lol483
сообщение May 8 2012, 20:26
Сообщение #3


Участник
*

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



Цитата(Genadi Zawidowski @ May 8 2012, 17:01) *
В строке

1) попробуйте вот так: PORTD.0=(bin_digits[dig] & 1<< i) != 0;
2) Выводятся числа 0..8, а не 0.9


1) - не помогло, всё так же.
2) - там идет перебор с нулевого элемента строки по девятый, то есть всего 10 чисел (0-9). Разве не так ?

В обоих случаях в итоге на выходах Q0-Q3 74HC595 постоянно логические 1.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 8 2012, 21:06
Сообщение #4


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Интересно , а что на OE?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
lol483
сообщение May 8 2012, 21:13
Сообщение #5


Участник
*

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



Цитата(ILYAUL @ May 9 2012, 00:06) *
Интересно , а что на OE?

OE постоянно и намертво присоединена к 0.
MR постоянно присоединена к 1 (5 v).

У меня осциллограф до 7 МГц берет, так что я фьюзы поставил на тактирование от внутреннего генератора на 1 МГц, так что должен видеть уж точно колебания хотя бы на SH_CP и ST_CP но их нет :-(

Сообщение отредактировал lol483 - May 8 2012, 21:13
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 8 2012, 21:26
Сообщение #6


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Код
{
        PORTD.0=bin_digits[dig] & 1<<i;         //выводим "текущий бит" в линию DS
        PORTD.1=0;                              //выводим "0" в линию SH_CP
        PORTD.1=1;                              //выводим "1" в линию SH_CP
    }

Не нравится мне это . Я бы между этими действиями задержки хотя бы по микросекунде добавил. А то он может и сообразить ничего не успевает .
Ну и конечно далее по тексту


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
lol483
сообщение May 8 2012, 21:29
Сообщение #7


Участник
*

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



Цитата(ILYAUL @ May 9 2012, 00:26) *
Код
{
        PORTD.0=bin_digits[dig] & 1<<i;         //выводим "текущий бит" в линию DS
        PORTD.1=0;                              //выводим "0" в линию SH_CP
        PORTD.1=1;                              //выводим "1" в линию SH_CP
    }

Не нравится мне это . Я бы между этими действиями задержки хотя бы по микросекунде добавил. А то он может и сообразить ничего не успевает .
Ну и конечно далее по тексту

Это не имеет значения так как считывание бита в регистр происходит по переднему фронту импульса на SH_CP.
И к тому же частота работы 74HC595 по моему около 100 МГц.

Сообщение отредактировал lol483 - May 8 2012, 21:34
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 8 2012, 22:01
Сообщение #8


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(lol483 @ May 9 2012, 01:29) *
Это не имеет значения так как считывание бита в регистр происходит по переднему фронту импульса на SH_CP.
И к тому же частота работы 74HC595 по моему около 100 МГц.

Т.е абсолютно наплевать когда возникает этот самый фронт , так? И весь раздел DS Waveforms дан что бы заполнить пустые страницы.
Кстати там и указана максимально возможная частота , и она несколько ниже Вашей


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
lol483
сообщение May 9 2012, 06:46
Сообщение #9


Участник
*

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



Я думаю что по сути всё равно когда возникает импульс на SH_CP, главное что бы синхронно с ним на DS подавались нужные данные (вернее что бы бит там уже был раньше чем возникнет 1 на SH_CP). В даташите указана частота 100МГц. Сейчас попробую переделать так что бы с некой задержкой дергалась SH_CP.
Go to the top of the page
 
+Quote Post
lol483
сообщение May 9 2012, 08:49
Сообщение #10


Участник
*

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



Ну значит так: после добавления задержек в код на осциле стали видны колебания, но газоразрядный индикатор подключенный при помощи К155ИД1 ничего не показывает.
Схема и код прилагается.
CODE
#include <mega16.h>
#include <delay.h>

unsigned char dig;
unsigned char bin_digits[10]=
{
0b11111111, //0
0b11111110, //1
0b11111101, //2
0b11111100, //3
0b11111011, //4
0b11111010, //5
0b11111001, //6
0b11111000, //7
0b11110111, //8
0b11110110, //9
};

void HC595_write(unsigned char dig)
//функция записи данных в регистр 74HC595 (используя PORTD.0=DS, PORTD.1=SH_CP, PORTD.2=ST_CP)
{
unsigned char i;
for(i=0; i<7; i++) //цикл для последовательного вывода 8 бит данных из массива
{
PORTD.0=bin_digits[dig] & 1<<i; //выводим "текущий бит" в линию DS
PORTD.1=0; //выводим "0" в линию SH_CP
delay_ms(5);
PORTD.1=1;
//выводим "1" в линию SH_CP - считываем бит на входе регистра
//(считывание происходит по переднему фронту импульса на SH_CP)
delay_ms(5);
}
PORTD.2=1;
//выводим "1" в линию ST_CP - "защелкиваем данные"
// ("защелкивание" происходит по переднему фронту импульса на ST_CP)
delay_ms(5);
PORTD.2=0; //выводим "0" в линию ST_CP
}

void main()
{
DDRD=0xFF; //конфигурируем порт "D" на вывод
while(1)
{
for(dig=0; dig<9; dig++)
//цикл для чередования числел (0-9) записываемых в регистр 74HC595
{
HC595_write(dig); //функция записи данных в регистр 74HC595
delay_ms(500);
}
}
}


Сообщение отредактировал IgorKossak - May 9 2012, 10:00
Причина редактирования: [codebox], форматирование

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


Гуру
******

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



Цитата(lol483 @ May 9 2012, 00:13) *
У меня осциллограф до 7 МГц берет, так что я фьюзы поставил на тактирование от внутреннего генератора на 1 МГц, так что должен видеть уж точно колебания хотя бы на SH_CP и ST_CP но их нет :-(

А они должны быть!!! И Вы их должны видеть!!!
И до тех пор пока Вы их не увидите дальнейшие движения бессмысленны.
Ищите косяк.
Код
delay_ms(5);

После добавления задержки 5000 тактов Вы заметили колебания!? Какие частоты? Длительности? Действительно ли 5ms?

Цитата(lol483 @ May 9 2012, 00:29) *
И к тому же частота работы 74HC595 по моему около 100 МГц.

Зависит от питания и температуры. При 5В и 25С я бы больше 25MHz не подавал (для серийного изделия).

Цитата(lol483 @ May 9 2012, 11:49) *
unsigned char bin_digits[10]=
{
0b11111111, //0
0b11111110, //1
0b11111101, //2
0b11111100, //3
0b11111011, //4
0b11111010, //5
0b11111001, //6
0b11111000, //7
0b11110111, //8
0b11110110, //9
};

А почему инверсные значения 0-9?

Цитата(lol483 @ May 9 2012, 11:49) *
PORTD.0=bin_digits[dig] & 1<<i; //выводим "текущий бит" в линию DS

В СИ не силён, но чтото мне это не нравится.
Go to the top of the page
 
+Quote Post
adnega
сообщение May 9 2012, 10:29
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(zombi @ May 9 2012, 13:06) *
В СИ не силён, но чтото мне это не нравится.


PORTD.0= (bin_digits[dig] >> i) & 1;

А так?
Go to the top of the page
 
+Quote Post
zombi
сообщение May 9 2012, 11:06
Сообщение #13


Гуру
******

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



Цитата(adnega @ May 9 2012, 13:29) *
PORTD.0= (bin_digits[dig] >> i) & 1;

А так?

Так нравится.

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

А что на СИ эти строки дают абсолютно одинаковый результат?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 9 2012, 12:28
Сообщение #14


Гуру
******

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



Цитата(zombi @ May 9 2012, 14:06) *
Код
PORTD.0=bin_digits[dig] & 1<<i;
PORTD.0=(bin_digits[dig] >> i) & 1;

А что на СИ эти строки дают абсолютно одинаковый результат?

А что - нет?
Go to the top of the page
 
+Quote Post
zombi
сообщение May 9 2012, 13:03
Сообщение #15


Гуру
******

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



Цитата(_Артём_ @ May 9 2012, 15:28) *
А что - нет?

А я не знаю, вот и спрашиваю.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение 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
lol483
сообщение May 10 2012, 12:06
Сообщение #31


Участник
*

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



Цитата(hd44780 @ May 10 2012, 14:38) *
Про 2 порта я не понял sad.gif . 4 ноги - код цифры, а остальное куда?
И как у тебя задаётся в какой разряд индикации какая цифра выводится? Прости, я с газоразрядными дисплеями не работал, только о светодиодными.

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

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

у газоразрядного индикатора в общем случае 11 ног (общий анод и катоды-цифры от 0 до 9), если всего будет 6 ламп (часы, минуты, секунды) то через что бы управлять всеми шестью через К155ИД1 нужно будет задействовать 4*6 ног. (Кстати я ошибся написав что два порта, на самом деле целых три, только сейчас понял). По любому надо будет разбираться с 74HC595, так как их можно соединить последовательно, очень сэкономив ноги МК. "И как у тебя задаётся в какой разряд индикации какая цифра выводится?" - просто в цепочку последовательно соединенных 74YC595 - проталкивается число времени, например, 234002 - (23:40:02).
Go to the top of the page
 
+Quote Post
hd44780
сообщение May 10 2012, 13:47
Сообщение #32


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

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



Понятно. Фактически классическая статическая индикация sm.gif .
Тогда да, придётся разбираться с регистрами sad.gif .

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


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


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Можно начать экономить отказавшись от секунд. Баловоство это.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
lol483
сообщение May 11 2012, 07:12
Сообщение #34


Участник
*

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



Цитата(ILYAUL @ May 10 2012, 20:59) *
Можно начать экономить отказавшись от секунд. Баловоство это.

Тоже правда.

А кто нибудь знает различия во внешнем виде между динамической и статической индикацией газоразрядных индикаторов. И есть ли они ? По идее их использовали со статической индикацией.
Go to the top of the page
 
+Quote Post
hd44780
сообщение May 11 2012, 08:41
Сообщение #35


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

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



Не знаю.
Когда-то давно, когда я ещё был маленьким, и на эти вещи смотрел исключительно как на красивые игрушки, мне в руки попал некий блок индикации на каких-то лампах. Одна лампа-одна цифра. Там было порядка 20 таких ламп. И куча каких-то микросхем (сколько именно, не помню). Но, как мне теперь кажется, это была статическая индикация (по воспоминаниям, исходя из равного (или примерно равного) кол-ва микросхем и ламп).

Вообще, для динамической индикации цифры надо всё время включать-выключать (как минимум раз 20-25 в секунду). Газовые лампы, по-моему, очень инерционная штука для подобных вещей.

А зачем именно газовые лампы?


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


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

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата(hd44780 @ May 11 2012, 12:41) *
Вообще, для динамической индикации цифры надо всё время включать-выключать (как минимум раз 20-25 в секунду). Газовые лампы, по-моему, очень инерционная штука для подобных вещей.

Так это же очень хорошо, что инерционные, Вы уже питаете следующую лампу, а предыдущая все еще светится. Мне кажется, что раньше не применяли динамическую индикацию исключительно из соображений сложности реализации на простой логике. Сейчас же в век дешевых микроконтроллеров нет причин не использовать.
Цитата(hd44780 @ May 11 2012, 12:41) *
А зачем именно газовые лампы?

Это нынче модный тренд. Из разряда "теплый ламповый звук", Steam Punk и т.д.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
sKWO
сообщение May 11 2012, 08:57
Сообщение #37


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(hd44780 @ May 11 2012, 11:41) *
Вообще, для динамической индикации цифры надо всё время включать-выключать (как минимум раз 20-25 в секунду). Газовые лампы, по-моему, очень инерционная штука для подобных вещей.

нету времени, посмотрите здесь


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
lol483
сообщение May 12 2012, 12:01
Сообщение #38


Участник
*

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



Всё, я разобрался! Оказалось что я не правильно работал с регистром последовательного сдвига, а именно он смещал всё на бит в сторону. Вот поправил функцию и всё поехало как надо:
Код
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
}


Вот что именно изменил: "for(i=0; i<=7; i++)" , а вот как было "for(i=0; i<7; i++)".

Сообщение отредактировал lol483 - May 12 2012, 13:22
Go to the top of the page
 
+Quote Post
GDI
сообщение May 12 2012, 12:49
Сообщение #39


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

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Ничего себе заявочки!
Цитата
регистр последовательного сдвига неправильно работал
, Вы бы еще написали что нашли "баг в компиляторе". Как Вы думаете, сколько раз будет выполнен код
Код
for(i=0; i<7; i++)
и какой будет подставлен последний индекс в Вашу конструкцию по выводу бита в порт?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
lol483
сообщение May 12 2012, 13:23
Сообщение #40


Участник
*

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



Цитата(GDI @ May 12 2012, 15:49) *
Ничего себе заявочки! , Вы бы еще написали что нашли "баг в компиляторе". Как Вы думаете, сколько раз будет выполнен код
Код
for(i=0; i<7; i++)
и какой будет подставлен последний индекс в Вашу конструкцию по выводу бита в порт?

По идее всего 6 раз и как раз последний бит не дописывался. Так ?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 12 2012, 13:28
Сообщение #41


Гуру
******

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



Цитата(lol483 @ May 12 2012, 16:23) *
По идее всего 6 раз и как раз последний бит не дописывался. Так ?

Нет не так. 7 раз.
Go to the top of the page
 
+Quote Post
lol483
сообщение May 12 2012, 15:18
Сообщение #42


Участник
*

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



Цитата(_Артём_ @ May 12 2012, 16:28) *
Нет не так. 7 раз.

Да, точно 7, всего то их восемь, вот последний то и не дописывался. Но сейчас всё отлично.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 12 2012, 15:28
Сообщение #43


Гуру
******

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



Ещё сомнительная конструкция:
Код
PORTD.0=bin_digits[dig] & (1<<i);

Лучше как-то так:
Код
PORTD.0= (bin_digits[dig] & (1<<i)) ? (1) : (0);


или
прочитать bin_digits[dig] в байт и сдвигать его:
Код
tmp=bin_digits[dig];

for(.....
PORTD.0= (tmp&1) ? (1) : (0);
....
tmp>>=1;
....
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 - 04:15
Рейтинг@Mail.ru


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