Чт мар 12, 2015 10:32:29
Чт мар 12, 2015 10:56:32
Чт мар 12, 2015 11:05:07
А чем они будут отличаться от тех, которые "возможно у кого то есть" ?djrec писал(а):Те что находил были заточены под конкретное устройство
Чт мар 12, 2015 11:12:03
Чт мар 12, 2015 11:20:07
Чт мар 12, 2015 11:22:50
А Вы посмотрите на его другие посты. Сплошные неоднозначные глупые вопросы, на которые нет однозначных ответов. Ни в одном вопросе нет описания конкретных проблем, только одни хотелки и сплошное "дайте" и "подайте".в чем проблема у вас? разве все, что я написал - непосильно?!
Чт мар 12, 2015 11:23:53
Чт мар 12, 2015 11:28:39
djrec писал(а):сделал бы отдельно под предложенный вариант.
В чём проблема ? Делайте !djrec писал(а):те что находил были заточены под конкретное устройство
Чт мар 12, 2015 11:32:03
ARV писал(а):любая задача разделяется на ряд подзадач. в частности, ваша делится на:
1. вывод информации на 595-е регистры. характер информации роли не играет, поэтому эта часть может быть взята из любого проекта и сводится в сущности к использованию аппаратного или программного SPI-подобного протокола.
2. преобразование числа в соответствующие символы. задача не связана с индикацией вообще. решается либо использованием стандартных функций типа itoa или sprintf, либо самодельных. решение этой задачи так же можно взять из любого проекта.
3. преобразование символа в соответствующие сегменты индикаторов. задача сводится к выбору из массива: в самом массиве хранятся представления символа в виде "сегментов" (т.е. байты, каждый бит которого отвечает за свечение определенного сегмента), номер элемента массива соответствует номеру соответствующего символа. для вывода чисел, соответственно хватит массива из 10 байтов. решение задачи очень простое, можно самому сделать, или поискать решения "два в одном" - для этого и предыдущего пункта одновременно.
4. последняя задача - вывод подготовленных байтов с сегментами в регистры. решение заключается в использоваии решения 1 пункта нужное количество раз для отправки в регистры байтов из решения 3-го пункта.
в чем проблема у вас? разве все, что я написал - непосильно?!
Чт мар 12, 2015 11:38:20
djrec писал(а):функцию которой пользуются многие
Чт мар 12, 2015 11:40:37
ARV писал(а):во-первых, пока схемы у вас не будет - не пойдет дело.
во-вторых, вы сами что умеете делать? любой ножкой самостоятельно программно можете дрыгнуть?
Чт мар 12, 2015 11:47:29
djrec писал(а):Проблема наверное в плохом понимании работы регистров.
djrec писал(а): при их изучении, вывод бегущего огонька, так и не смог добиться стабильной работы. По этому ищу проверенную функцию которой пользуются многие с описанием.
Чт мар 12, 2015 13:08:16
Чт мар 12, 2015 13:28:20
Чт мар 12, 2015 14:16:41
djrec писал(а):По тому что я разрабатываю устройства с нуля, а не просто копирую как многие. По этому и получается много не ясностей, и в процессе обсуждения с Вами и рождается истина. Зачем же так пинать, ведь я так полагаю форум и сделан для того что бы не знающий смог разобраться, пойти по дороге которую многие уже давно знают, а не каждый раз изобретать велосипед. Спасибо за понимание.
Пт мар 13, 2015 00:12:09
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile unsigned int temperature;
// Массив значениий для семисегментного индикатора
//----------
char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D,
//----------
0x7D, 0x07, 0x7F, 0x6F, 0x00, 0x01, 0x02, 0x04};
// Функция вывода данных через регистр
void write_display(unsigned char *data, unsigned char nbytes)
{
unsigned char mask,i;
for(i = 0; i < nbytes; i++)
{
mask = 0x80;
for(char k = 0; k < 8; k++)
{
// сравниваем каждый бит с единицей
if(data[i] & mask)
{
PORTC |= (1 << PC0); // DATA 1
PORTC |= (1 << PC2); // CLK 1
PORTC &= ~(1 << PC2); // CLK 0
}
else
{
PORTC &= ~(1 << PC0); // DATA 0
PORTC |= (1 << PC2); // CLK 1
PORTC &= ~(1 << PC2); // CLK 0
}
mask = mask >> 1; // сдвигаем биты
}
}
// защелкиваем регистр
PORTC |= (1 << PC1);
PORTC &= ~(1 << PC1);
}
int main(void)
{
DDRC = 0b00000111;
PORTC = 0b00000000;
sei(); // Глобально разрешаем прерывания
unsigned char display[6];
while(1)
{
/*// Если температура меньше 100 градусов гасим незначащий ноль
if(temperature < 100)
{
display[0] = SEGMENTE[temperature % 10];
display[1] = SEGMENTE[(temperature / 10) % 10];
display[2] = SEGMENTE[10];
}
// Иначе показываем все разряды
else */
{
temperature=123;
display[0] = SEGMENTE[11];
display[1] = SEGMENTE[temperature % 10];
display[2] = SEGMENTE[12];
display[3] = SEGMENTE[(temperature / 10) % 10];
display[4] = SEGMENTE[13];
display[5] = SEGMENTE[(temperature / 100) % 10];
}
// Отправляем данные на индикатор
write_display(display,6);
}
}
Пт мар 13, 2015 06:57:23
Пт мар 13, 2015 08:15:51
А почему 6 байт отправляете ? Регистров то всего 2, по одному байту.djrec писал(а):// Отправляем данные на индикатор
write_display(display,6);
}
void write_data(unsigned char data){
unsigned char i=8;
while(i--){
if(data & 0x80) PORTB |= (1 << PB0); // DATA 1
else PORTB &= ~(1 << PB0); // DATA 0
PORTB |= (1 << PB2); // CLK 1
PORTB &= ~(1 << PB2); // CLK 0
data<<=1;
}
// защелкиваем регистр
PORTB |= (1 << PB1);
PORTB &= ~(1 << PB1);
}
.................
.................
write_data(aaaa); // Выводим байт со сдвинутым нулём на позицию, соответствующей текущему индикатору
write_data(bbbb); // Выводим байт данных, соответствующих текущему индикатору
Пт мар 13, 2015 08:41:49
Аlex писал(а):С частотой. 30-100 Гц будет маловато. Частота вызовов должны быть не менее 50Гц * кол-во индикаторов. Т.е. в Вашем случае = 200 раз в секунду.
Пт мар 13, 2015 08:44:58