roboforum.ru

Технический форум по робототехнике.


Семисегментный светодиодный индикатор

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Семисегментный светодиодный индикатор

Сообщение HarryStar » 29 май 2011, 00:22

Вариант с itoa тоже имеет права на жизнь. Только что переписал для интереса - результат 484 байта, что конечно лучше чем вариант ТС, но хуже моего :)
Скорее всего эта функция прилично места занимает. Если она уже в коде где то используется, то наверно выигрыш будет. Она конечно проработана и оптимизирована, но она слишком универсальна и поэтому видимо не маленькая.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: Семисегментный светодиодный индикатор

Сообщение igel » 29 май 2011, 09:13

ну никто ж не мешает вытянуть библиотечную функцию и убрать лишнее
а кроме того itoa() работает от -32768 до +32768, а ваш пример был расчитан на диапазон 0...999 - разница большая
если еще определять знак и еще 2 разряда то где больше код получится? :)
а еще мне тут подумалось, а зачем для температуры int? температуры будут зашкаливать за +-254 градуса?
igel
 
Сообщения: 63
Зарегистрирован: 07 апр 2011, 20:52
Откуда: г.Трёхгорный

Re: Семисегментный светодиодный индикатор

Сообщение HarryStar » 29 май 2011, 16:20

Не думаю. Вы думаете как работает itoa? Она тоже делит на 10 и берет остаток от деления. Так что как минимум будет излишнее преобразование в строку и меньше код не будет никогда.

ТС-у: Дробная часть делается аналогичным образом. Для температуры, где значения ограничены естественными пределами можно получить значение умноженное на 10, т.е. 365 для 36.5 градусов и выводить на 7-ми сегментный индикатор. Точку после первого разряда зажечь аппаратно навечно. Или подключить ее к 8-му разряду и зажигать программно. Вариантов тут море. Что у вас хоть получается, напишите, а то мы начали уже без вас дискутировать на тему ненужной вам оптимизации :)
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: Семисегментный светодиодный индикатор

Сообщение Maxiik » 09 июн 2011, 00:10

то мы начали уже без вас дискутировать на тему ненужной вам оптимизации

Спасибо большое за помощь !!!!
Оптимизация очень даже нужна :)
Просто опыта у меня пока маловато чтобы ей заниматься...)
Вы правы - для температуры не нужны такие бешеные значения... Просто я хотел сделать для себя (и для нуждающихся) универсальную функцию семисегментного индикатора.
Вообще это маленькая частичка большого проекта, а именно http://roboforum.ru/forum35/topic8760.html
Очень мало времени на весь проект целиком, так что приходится чередовать задачи...
Сейчас и на службе зачёты учу, и двигатель перебераю, и вот с электроникой вожусь...
Температура нужна для контроллера управляющего включением компьютера, датчика в приборную панель, датчиков климат контроля и датчика внешней температуры.
Сейчас попробую написать финишную на данный момент прошивку и скину что получится :)
Аватара пользователя
Maxiik
 
Сообщения: 262
Зарегистрирован: 28 сен 2009, 21:54
Откуда: Петербург
прог. языки: С++
ФИО: Бирюк Максим Викторович

Re: Семисегментный светодиодный индикатор

Сообщение Maxiik » 09 июн 2011, 21:01

Всё, с датчиком разобрался, теперь трабл с выводом информации :oops:
Выводимое число мигает на индикаторах, а не горит постоянно...
Я думаю, что это связано с большим временем выполнения функции ds1820_temperature_10(0);
Нужно каким-то способом сделать так, чтобы во время вычислений на индикаторах оставалось число с прошлого замера...
Буду благодарен за совет !!!)
Прикладываю исходник, датчик подключен к нулевому биту порта С
Вложения
rt.c
(4.11 КиБ) Скачиваний: 280
Аватара пользователя
Maxiik
 
Сообщения: 262
Зарегистрирован: 28 сен 2009, 21:54
Откуда: Петербург
прог. языки: С++
ФИО: Бирюк Максим Викторович

Re: Семисегментный светодиодный индикатор

Сообщение boez » 10 июн 2011, 00:15

На прерываниях делать... Если конечно ф-я DS18... их не запрещает. Если запрещает - писать свою библиотеку 1-wire :)
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Семисегментный светодиодный индикатор

Сообщение HarryStar » 10 июн 2011, 10:40

ну зачем так сразу. на каждый индикатор по триггеру и все ок.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: Семисегментный светодиодный индикатор

Сообщение Maxiik » 10 июн 2011, 15:40

ну зачем так сразу. на каждый индикатор по триггеру и все ок.

А это как ? :oops:
Можете рассказать если не сложно...
***
Прерывания эта функция запрещает ((((
Аватара пользователя
Maxiik
 
Сообщения: 262
Зарегистрирован: 28 сен 2009, 21:54
Откуда: Петербург
прог. языки: С++
ФИО: Бирюк Максим Викторович

Re: Семисегментный светодиодный индикатор

Сообщение Vit » 10 июл 2011, 07:42

Ваша занимает 688 байт, моя 426.

это только для того, чтобы циферки выводить?
"Я знал, что будет плохо, но не знал, что так скоро."(с)

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

вычисляй вместо задержки :)
It's too simple to make complicated thing, but much more complicated to make simple thing
Аватара пользователя
Vit
 
Сообщения: 26
Зарегистрирован: 10 мар 2011, 16:48
Откуда: Earth. Planet Earth
прог. языки: Труъ ASM
ФИО: Вит

Re: Семисегментный светодиодный индикатор

Сообщение d3xr » 17 июл 2011, 22:58

Понимаю что вопрос совсем простой, но я только с си знакомство свое начал.

Нужные мне цифры записаны в массиве
Код: Выделить всёРазвернуть
 unsigned char segment[10]= {
0b0000001, 0b1001111, //0,1
0b0010010, 0b0000110, //2,3
0b1001011, 0b0100100, //4,5
0b0100000, 0b0001111, //6,7
0b0000000, 0b0000100  //8,9
};


Я был бы рад извлечь нужное число путем
Код: Выделить всёРазвернуть
PORTC = segment[x];

Но получилось так, что последний знак в переменной у меня должен записаться не в PORTC.6, а в PORTD.7 (по схеме так вышло)

Как это провернуть, кто подскажет?
Аватара пользователя
d3xr
 
Сообщения: 201
Зарегистрирован: 01 июн 2010, 08:04
Откуда: Казань

Re: Семисегментный светодиодный индикатор

Сообщение HarryStar » 17 июл 2011, 23:23

PORTC = a;
PORTD = (a & 0b01000000) << 1;
Например так. (в случае, если вам не важно что на битах PORTC.6, PORTC.7 и битах PORTD.0-6)
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: Семисегментный светодиодный индикатор

Сообщение dccharacter » 17 июл 2011, 23:27

Надо просто PORTC.6 сделать в PORTD.7??? А то непонятно что такое"последний знак в переменной".

Добавлено спустя 2 минуты 14 секунд:
HarryStar писал(а):PORTC = a;
PORTD = (a & 0b01000000) << 1;
Например так. (в случае, если вам не важно что на битах PORTC.6, PORTC.7 и битах PORTD.0-6)


Это хрень :-))) Уж хотел так написать, так ограничился бы PORTD.7 = PORTC.6;
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Семисегментный светодиодный индикатор

Сообщение d3xr » 18 июл 2011, 10:05

Да да, PORTC.6 сделать в PORTD.7 :)

Т.е. пишу
Код: Выделить всёРазвернуть
PORTC = segment[x];
PORTD.7 = PORTC.6;

И все?
Аватара пользователя
d3xr
 
Сообщения: 201
Зарегистрирован: 01 июн 2010, 08:04
Откуда: Казань

Re: Семисегментный светодиодный индикатор

Сообщение dccharacter » 18 июл 2011, 11:39

Но ты учти, что там PORTC.6 будет тоже колбасится - если у тебя на нем что-то висит, то не пойдет... А так - да, все.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Семисегментный светодиодный индикатор

Сообщение d3xr » 18 июл 2011, 12:28

Вот какой код получился у меня, но он работает через одно место..
Если я отображаю число 42, то все отлично. Но если же хочу отображать числа от 0 до 99 с интервалом 0,5 сек, то выводятся корректно мне только десятки, разряды единичек вывести не получается.. Час уже с этим сижу

Код: Выделить всёРазвернуть
#include <mega16.h> //Включаем библиотеку для работы с микроконтроллером ATMega16

#include <delay.h> //Включаем библиотеку для организации задержек

int i,a, x1,x10, disp;


unsigned char segment[10]= {   
// gedcfab    gedcfab   
  0b1000000, 0b1110110, //0,1
  0b0001100, 0b0100100, //2,3
  0b0110010, 0b0100001, //4,5
  0b0000001, 0b1110100, //6,7
  0b0000000, 0b0100000  //8,9
};



void clr_all()
{
   
PORTD=0xFF;          //  Подтянуть порт D к 1
PORTC=0xFF;          // Подтянуть порт C  к 1
PORTA=0x00;          // Подтянуть порт A к 0

}



void main(void)         


{

while(1)
{

PORTD=0xFF;          //  Подтянуть порт D к 1
DDRD=0xFF;         // Все порты D - выходы

PORTC=0xFF;          // Подтянуть порт C  к 1
DDRC=0xFF;         // Все порты C - выходы     


PORTA=0x00;          // Подтянуть порт A к 0
DDRA=0xFF;         // Все порты A - выходы

//disp = 42;

for (disp=0; disp<99; disp++)
{
delay_ms(500);


x10=disp/10;
x1=disp-x10*10;
                 
PORTA.7 = 0;
PORTA.6 = 1;
PORTC = segment[x1];
PORTD.7 = PORTC.6;
delay_ms(5);                 
                 
PORTA.6 = 0;
PORTA.7 = 1;
PORTC = segment[x10];
PORTD.7 = PORTC.6;
delay_ms(5);
 


     



};
       
       
       

}; 
}



Добавлено спустя 4 минуты 19 секунд:
Даже вот так вывести ничего не получается (4 визуально горит постоянно, 2 бешено мигает)
Увеличение-уменьшение всех задержек delay_ms() ничего не дает.

Код: Выделить всёРазвернуть
for (i=0; i<99; i++)
{
delay_ms(500);
disp = 42;


x10=disp/10;
x1=disp-x10*10;
                 
PORTA.7 = 0;
PORTA.6 = 1;
PORTC = segment[x1];
PORTD.7 = PORTC.6;
delay_ms(5);                 
                 
PORTA.6 = 0;
PORTA.7 = 1;
PORTC = segment[x10];
PORTD.7 = PORTC.6;
delay_ms(5);   

};
Аватара пользователя
d3xr
 
Сообщения: 201
Зарегистрирован: 01 июн 2010, 08:04
Откуда: Казань

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14