Форум Херсона. Форум Херсонской молодежи.

Форум Херсона. Форум Херсонской молодежи. (http://forum.norma4.net.ua/)
-   Программирование (http://forum.norma4.net.ua/programmirovanie/)
-   -   Динамическая и статическая индикация на 7сегмент. и 74hc595 (http://forum.norma4.net.ua/programmirovanie/82701-dinamicheskaya-i-staticheskaya-indikaciya-na-7segment-i-74hc595.html)

ДмитрийТ 09.01.2016 12:31

Динамическая и статическая индикация на 7сегмент. и 74hc595
 

Вложений: 1
Хочу собрать часы с разными функциями на 7ми сегментных индикаторах,
atmega 168 и сдвиговых регистрах.

В общем для отображения времени рассматриваю такой вариант через SPI:

Код:

#include <spi.h>
#define SS PORTB.2
 
typedef unsigned char byte;
typedef unsigned long ulong;
 
byte led_table[10]={0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111,0b00000001,0b00001001};
ulong show_data=12345678; //Отображаемая цифра
ulong dig_data=0;
byte dig_num=0; //Отображаемый разряд
 
void show_dig() {
SS=0; //Ни чего не кажем
if (dig_num==0) {
dig_data=show_data; //Если показываем первую цифру обнавляем переменную
dig_num++;
}
spi(dig_num); //Отправляем байт для отображения разряда
spi(led_table[dig_data%10]); //Получаем разряд из dig_data и отправляем байт с цифрой
dig_data/=10;
dig_num<<=1; //Смещаем бит для отображения следующего разряда
SS=1; //Показываем разряд

}
 
void main(void) {
PORTB=0;
DDRB=0x2C; //Настраиваем порт для SPI
ACSR=0x80; //Отключаем компаратор
//Включаем SPI
//Биты будем отправлять LSB-MSB, т.е. от младших к старшим
SPCR=0x70;
SPSR=0;
while (1) show_dig(); //Показываем разряды
}

Индикатор 4х разрядный будет.

Как можно переделать данный код, чтобы выводить часы и минуты из 2х переменных?

Debian 12.01.2016 14:15

Еще раз и помедленнее
И почему бы не использовать DS1307 например?

ДмитрийТ 16.01.2016 14:14

Эту микросхему я и использую. Данные этой микросхемы берутся в двух переменных hour и minut. Как их прикрутить к этой функции?

Debian 16.01.2016 20:17

Цитата:

Сообщение от ДмитрийТ (Сообщение 1258499)
Эту микросхему я и использую. Данные этой микросхемы берутся в двух переменных hour и minut. Как их прикрутить к этой функции?

как-то так:

PHP код:

#include <spi.h> 
#define SS PORTB.2 
 
typedef unsigned char byte
typedef unsigned long ulong
 
byte led_table[10]={0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111,0b00000001,0b00001001}; 
ulong dig_data=0
byte dig_num=0//Отображаемый разряд
//----------------------------------------------------//
char Hours 0x00;
char DesHours =0x00;

char Minutes 0x00;
char DesMinutes =0x00;

// тут забираем данные из часов DS1307
void GetTime (void){
Hours DsReadHours();
Minutes DsReadMinutes();
DesHours Hours & (~((1<<7)|(1<<6)));
DesHours >>=4// значения десятков часов
Hours &= (~((1<<7)|(1<<6)|(1<<5)|(1<<4))); // значения часов
DesMinutes Minutes >>4// Десятки минут
Minutes &= (~((1<<7)|(1<<6)|(1<<5)|(1<<4))); // Единицы минут
}

void show_dig() { 
SS=0//Ни чего не кажем 
if (dig_num==16) { // пятый разряд
dig_num++; 

spi(dig_num); //Отправляем байт для отображения разряда

if (dig_num == 1){
spi(led_table[DesHours]); //Получаем разряд из dig_data и отправляем 
}
if (
dig_num == 2){
spi(led_table[Hours]); //Получаем разряд из dig_data и отправляем 
}
if (
dig_num == 4){
spi(led_table[DesMinutes]); //Получаем разряд из dig_data и отправляем 
}
if (
dig_num == 8){
spi(led_table[Minutes]); //Получаем разряд из dig_data и отправляем байт с цифрой 

dig_num<<=1//Смещаем бит для отображения следующего разряда 
SS=1//Показываем разряд 


void main(void) { 
PORTB=0
DDRB=0x2C//Настраиваем порт для SPI 
ACSR=0x80//Отключаем компаратор 
//Включаем SPI 
//Биты будем отправлять LSB-MSB, т.е. от младших к старшим 
SPCR=0x70
SPSR=0
while (
1) {
GetTime ();
show_dig(); //Показываем разряды 
    
}


Ты только массив byte led_table подкорректируй под индикатор...ибо не понятно что там за какие знакоместа отвечает

хотя можно и без ДСки обойтись, повешать часовой кварц как тактирование таймера, поставить пред делитель, и по переполнению таймера в прерывание делать все черные дела

rezonat3 16.01.2016 22:04

Debian, сдвигом на 4 бита ты не получишь десятки, почему бы просто не взять целую часть от деления. И функция получения времени вызывается на отрисовку каждого разряда, поэтому время может измениться и разряды будут показывать значения для разного времени.

ДмитрийТ 17.01.2016 10:31

Вложений: 1
Начало проекта вот, чтобы было более понятно о чём речь.

Debian 17.01.2016 13:02

Цитата:

Сообщение от rezonat3 (Сообщение 1258553)
Debian, сдвигом на 4 бита ты не получишь десятки

это почему же? ааа....это не для ПК...сударь



Цитата:

Сообщение от rezonat3 (Сообщение 1258553)
И функция получения времени вызывается на отрисовку каждого разряда, поэтому время может измениться и разряды будут показывать значения для разного времени

пусть учится

Почесав затылок, юзер дописал через 1 минуту
Цитата:

Сообщение от ДмитрийТ (Сообщение 1258603)
Начало проекта вот, чтобы было более понятно о чём речь.

шо это за ересь?

ДмитрийТ 17.01.2016 15:58

Вложений: 3
Цитата:

Сообщение от Debian (Сообщение 1258626)
это почему же? ааа....это не для ПК...сударь





пусть учится

Почесав затылок, юзер дописал через 1 минуту


шо это за ересь?

Это не ересть. А сырой проект. Есть куча деталей которые нужно прикрутить к atmega 168.
4разрядный-время; 6 разрядный- дата, температура дом/улица, скорость ветра, влажность и др.

Вот я на индикации и застрял. С ЖК было бы проще, но мы простых путей не ищим!

Debian 17.01.2016 17:10

так поставь уже все защелки в ряд...
и еще вопрос: зачем тебе тут динамическая индикация? у тебя куча свободных ног на контроллере, хотя если индикаторы есть...

у 595 есть вывод /OE так что смело можно лепить все на одну шину...

ДмитрийТ 17.01.2016 18:05

Цитата:

Сообщение от Debian (Сообщение 1258673)
так поставь уже все защелки в ряд...
и еще вопрос: зачем тебе тут динамическая индикация? у тебя куча свободных ног на контроллере, хотя если индикаторы есть...

у 595 есть вывод /OE так что смело можно лепить все на одну шину...

Еще надо кнопки посадить, датчик освещенности, ик приемник, модуль- говорилка.

Debian 17.01.2016 18:44

все кнопки - один вывод контроллера
датчик - один вывод контроллера
ИК приемник? - один вывод контроллера
говорилка - ХЗ

шо это за фигня будет?
ты сначала с наворотами определись, а дпльше уже камень под задачи подбирать надо

ДмитрийТ 18.01.2016 06:07

Цитата:

Сообщение от Debian (Сообщение 1258701)
все кнопки - один вывод контроллера
датчик - один вывод контроллера
ИК приемник? - один вывод контроллера
говорилка - ХЗ

шо это за фигня будет?
ты сначала с наворотами определись, а дпльше уже камень под задачи подбирать надо

"Говорилка " от сюда http://www.getchip.net/posts/087-att...alking-device/
На схеме не дорисованы : анемометр + 1, датчик- влажности + 1, 1 выход шим, чтобы яркостью 6х разрядного индиктора в зависимости от времени суток управлять.

Debian 18.01.2016 09:27

Яркостью можно и так играться

Viper70 19.01.2016 00:09

В другом проекте смотрел, человек использовал микросхему mp3 плеера (такие в китайских поделках стоят) Там все также. мп3 или вав на карте СД. На вход микросхемы задается номер трека и громкость. И комманды плей, стоп :)

ДмитрийТ 19.01.2016 08:52

Цитата:

Сообщение от Viper70 (Сообщение 1258962)
В другом проекте смотрел, человек использовал микросхему mp3 плеера (такие в китайских поделках стоят) Там все также. мп3 или вав на карте СД. На вход микросхемы задается номер трека и громкость. И комманды плей, стоп :)

Валяется у меня где-то схема от китайского плеера. Там контроллер китайский с I2c интерфейсом, только даташитов китайцы не дают на них.

Viper70 19.01.2016 11:17

Вот ссылку на статью нашел https://www.drive2.ru/l/7499184/
Вроде тут читал :)

ДмитрийТ 19.01.2016 16:39

Вложений: 1
Цитата:

Сообщение от Viper70 (Сообщение 1259019)
Вот ссылку на статью нашел https://www.drive2.ru/l/7499184/
Вроде тут читал :)

Китайцы, это уже прохавали, и стали готовые модули выпускать.

ДмитрийТ 20.01.2016 17:12

Цитата:

Сообщение от Debian (Сообщение 1258538)
как-то так:

PHP код:

#include <spi.h> 
#define SS PORTB.2 
 
typedef unsigned char byte
typedef unsigned long ulong
 
byte led_table[10]={0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111,0b00000001,0b00001001}; 
ulong dig_data=0
byte dig_num=0//Отображаемый разряд
//----------------------------------------------------//
char Hours 0x00;
char DesHours =0x00;

char Minutes 0x00;
char DesMinutes =0x00;

// тут забираем данные из часов DS1307
void GetTime (void){
Hours DsReadHours();
Minutes DsReadMinutes();
DesHours Hours & (~((1<<7)|(1<<6)));
DesHours >>=4// значения десятков часов
Hours &= (~((1<<7)|(1<<6)|(1<<5)|(1<<4))); // значения часов
DesMinutes Minutes >>4// Десятки минут
Minutes &= (~((1<<7)|(1<<6)|(1<<5)|(1<<4))); // Единицы минут
}

void show_dig() { 
SS=0//Ни чего не кажем 
if (dig_num==16) { // пятый разряд
dig_num++; 

spi(dig_num); //Отправляем байт для отображения разряда

if (dig_num == 1){
spi(led_table[DesHours]); //Получаем разряд из dig_data и отправляем 
}
if (
dig_num == 2){
spi(led_table[Hours]); //Получаем разряд из dig_data и отправляем 
}
if (
dig_num == 4){
spi(led_table[DesMinutes]); //Получаем разряд из dig_data и отправляем 
}
if (
dig_num == 8){
spi(led_table[Minutes]); //Получаем разряд из dig_data и отправляем байт с цифрой 

dig_num<<=1//Смещаем бит для отображения следующего разряда 
SS=1//Показываем разряд 


void main(void) { 
PORTB=0
DDRB=0x2C//Настраиваем порт для SPI 
ACSR=0x80//Отключаем компаратор 
//Включаем SPI 
//Биты будем отправлять LSB-MSB, т.е. от младших к старшим 
SPCR=0x70
SPSR=0
while (
1) {
GetTime ();
show_dig(); //Показываем разряды 
    
}


Ты только массив byte led_table подкорректируй под индикатор...ибо не понятно что там за какие знакоместа отвечает

хотя можно и без ДСки обойтись, повешать часовой кварц как тактирование таймера, поставить пред делитель, и по переполнению таймера в прерывание делать все черные дела

Попробовал код, и что то not worked. :no:

Debian 20.01.2016 20:24

Вложений: 2
и что конкретно не работает?
вообще у тебя или код неправильный
или ты чего-то не договариваешь

я тут набросал специально, у меня все работает
и вообще правильнее делать прорисовку по прерыванию таймера, тогда играясь задержкой свечения сегмента можно управлять яркостью индикатора
прямо в лоб!
PHP код:

interrupt [TIM0_OVFvoid timer0_ovf_isr(void)
{
TIFR0 &= ~(<< TOV0); // reset interrupt flag
SS=0;
spi(0x08);
spi(DesHours);
SS=1;
delay_us(100);
SS=0;
spi(0x04);
spi(Hours);
SS=1;
delay_us(100);
SS=0;
spi(0x02);
spi(DesMinutes);
SS=1;
delay_us(100);
SS=0;
spi(0x01);
spi(Minutes);
SS=1;
delay_us(100);
SS=0;


в CodeVision есть библиотека работы с DS1307, которая сама собирает байты как надо...для ленивых!
тогда можно сделать еще проще

PHP код:

rtc_get_time(&hour, &min, &sec);
DesHours led_table[hour/10];
Hours = (led_table[hour%10]^0x01); // Надо же точечку нарисовать :)
DesMinutes led_table[min/10];
Minutes led_table[min%10]; 

Учись, Студент!

ДмитрийТ 21.01.2016 08:53

PHP код:

rtc_get_time(&hour, &min, &sec);
DesHours led_table[hour/10];
Hours = (led_table[hour%10]^0x01); // Надо же точечку нарисовать :)
DesMinutes led_table[min/10];
Minutes led_table[min%10]; 

При компиляции пишет declaration sintax error;

И как потом эту функцию прерываний выводить?

Debian 21.01.2016 10:35

Вложений: 1
Цитата:

Сообщение от ДмитрийТ (Сообщение 1259422)
PHP код:

rtc_get_time(&hour, &min, &sec);
DesHours led_table[hour/10];
Hours = (led_table[hour%10]^0x01); // Надо же точечку нарисовать :)
DesMinutes led_table[min/10];
Minutes led_table[min%10]; 

При компиляции пишет declaration sintax error;

И как потом эту функцию прерываний выводить?

Я понял, что с программизмом у тебя никак...
вот тебе проект ... смотри, изучай

ДмитрийТ 21.01.2016 15:00

Цитата:

Сообщение от Debian (Сообщение 1259443)
Я понял, что с программизмом у тебя никак...
вот тебе проект ... смотри, изучай

Да я и не говорил что программист.

Компилятор ругается на ассемблерный файл, не нравится ему переменная min заменил на minut.

Debian 21.01.2016 20:13

работает ?

ДмитрийТ 22.01.2016 07:37

Цитата:

Сообщение от Debian (Сообщение 1259557)
работает ?

Работает. А второй индикатор с 6 разрядами возможно посадить параллельно на isp?

Debian 22.01.2016 14:28

А что такое isp?

ДмитрийТ 22.01.2016 18:08

SPI - перепутал буквы местами.

Debian 22.01.2016 22:53

Вложений: 1
Цитата:

Сообщение от ДмитрийТ (Сообщение 1259618)
Работает. А второй индикатор с 6 разрядами возможно посадить параллельно на isp?

ну так же и вешаешь...
просто задвигаешь еще 6 байт перед 4мя байтами для часов и зажигаешь все...

PHP код:

void GetTime (void){
rtc_get_time(&hour, &min, &sec);
DesHours led_table[hour/10];
Hours = (led_table[hour%10]^0x01);
DesMinutes led_table[min/10];
Minutes led_table[min%10];

Digit1 hour/10;
Digit2 hour%10;
Digit3 min/10;
Digit4 min%10;
Digit5 sec/10;
Digit6 sec%10;


PHP код:

interrupt [TIM0_OVFvoid timer0_ovf_isr(void)
{
TIFR0 &= ~(<< TOV0); // reset interrupt flag
SS=0;
spi(led_table[Digit6]);
spi(led_table[Digit5]);
spi(led_table[Digit4]);
spi(led_table[Digit3]);
spi(led_table[Digit2]);
spi(led_table[Digit1]);
spi(0x08);
spi(DesHours);
SS=1;
delay_us(100);
SS=0;
spi(led_table[Digit6]);
spi(led_table[Digit5]);
spi(led_table[Digit4]);
spi(led_table[Digit3]);
spi(led_table[Digit2]);
spi(led_table[Digit1]);
spi(0x04);
spi(Hours);
SS=1;
delay_us(100);
SS=0;
spi(led_table[Digit6]);
spi(led_table[Digit5]);
spi(led_table[Digit4]);
spi(led_table[Digit3]);
spi(led_table[Digit2]);
spi(led_table[Digit1]);
spi(0x02);
spi(DesMinutes);
SS=1;
delay_us(100);
SS=0;
spi(led_table[Digit6]);
spi(led_table[Digit5]);
spi(led_table[Digit4]);
spi(led_table[Digit3]);
spi(led_table[Digit2]);
spi(led_table[Digit1]);
spi(0x01);
spi(Minutes);
SS=1;
delay_us(100);
SS=0;



ДмитрийТ 24.01.2016 15:11

А как по двумпроводам можно реализовать индикацию на 6 разрядов

Тут есть статья для 1го индикатора пример
http://kalobyte.com/upravlenie-regis...i-indikatorami

Debian 24.01.2016 17:43

А смысл???
так как и написано в статье...

Lukas 18.02.2016 08:37

Вложений: 2
Если тема еще не умерла - попробуйте MAX7219.
Пользовался таким экранчиком ссылка. и яркость регулируется и не нужно грузить контроллер. только говоришь по какому адресу какую цифру зажечь и все. управлять тоже просто им - с пол пинка заводится, главное не забыть сказать микрухе "Display On")))
А если же будете использовать 595, то советую делать статическую индикацию, чтобы не мучать контроллер динамикой. Начинать с печатной платы. Уверен, что у Вас будет миллион перемычек, зато в протеусе все по порядку.
У меня подключается так:
Вложение 261246
Вроде запутано, но зато печатная плата выглядит так:
Вложение 261247
Ну и в коде так:
Код:

unsigned char byCharacter[12] = {0xEB,    //0
                0x81,  //1
                0x73,  //2
                0xD3,        //3
                0x99,    //4
                0xDA,    //5
                0xFA,    //6
                0x83,    //7
                0xFB,      //8
                0xDB,      //9
                0x00,      //blank 
                0x10,    //-
}



Время на сервере: 08:56.

vBulletin 3, Copyright © 2000-2024, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co