Как отправить 40 бит на 7-ми сегментный индикатор

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Как отправить 40 бит на 7-ми сегментный индикатор

Сообщение urry »

ну и где криминал ?
1 байт программного кода в хексе представляется 2 байтами + начальный адрес каждых 16 байт + контрольная сумма каждых 16 байт - где -то так и наскребется.
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Как отправить 40 бит на 7-ми сегментный индикатор

Сообщение Мастер Ломастер »

koyodza писал(а):отдельно существует счётчик нужной длины (для дианазона 0..99999 нужен long), с ним делаете, что Вам нужно. Допустим, инкрементируете.
в некоторых случаях вместо счетчика long по объему кода получается выгоднее иметь массив из 5 символов и пару функций, которые увеличивают/уменьшают "число", там находящееся. что-то типа такого:

Код: Выделить всё

char counter[6] = {'0','0','0','0','0',0};

void inc_counter(void){
   char i;
   for(i=0; i<5; i++){
      if(++counter[4-i] <= '9') return;
      counter[4-i] = '0';
   }
}

void dec_counter(void){
   char i;
   for(i=0; i<5; i++){
      if(--counter[4-i] >= '0') return;
      counter[4-i] = '9';
   }
}
кстати, этот подход удобен как раз тем, что перед выводом счетчика не надо его преобразовывать в символы - он и так символьный, т.е. готовая строка для вывода.
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Аватара пользователя
koyodza
Собутыльник Кота
Сообщения: 2623
Зарегистрирован: Вс июл 17, 2011 11:51:52
Контактная информация:

Re: Как отправить 40 бит на 7-ми сегментный индикатор

Сообщение koyodza »

Мастер Ломастер писал(а):
koyodza писал(а):отдельно существует счётчик нужной длины (для дианазона 0..99999 нужен long), с ним делаете, что Вам нужно. Допустим, инкрементируете.
в некоторых случаях вместо счетчика long по объему кода получается выгоднее иметь массив из 5 символов и пару функций, которые увеличивают/уменьшают "число", там находящееся.
Бывает. Это если просто счётчик. Если же с этим числом могут производиться какие-то более сложные действия, то метод не годится.
Мастер Ломастер писал(а):кстати, этот подход удобен как раз тем, что перед выводом счетчика не надо его преобразовывать в символы - он и так символьный, т.е. готовая строка для вывода.
Для вывода на 7-сегментные индикаторы это мало поможет :)
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Re: Как отправить 40 бит на 7-ми сегментный индикатор

Сообщение alexey6522 »

С этим все понятно, мне подходит предложенный вариант urry, его код мне очень понравился тем что можно делать с числом что угодно! Как теперь состыковать два типа данных.
Есть функция она имеет тип const char необходимо ей передать переменную s тип которой unsigned long int.
В переменной - s содержится число, любое число unsigned long int, а вот const char понимает только текст в двойных кавычках
как мне преобразовать unsigned long int в const char что бы потом передать содержимое в другую функцию и работать дальше
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: Как отправить 40 бит на 7-ми сегментный индикатор

Сообщение IfoR »

Прекратить эту ерунду! Автору индикатор, по всей видимости, нужен числовой, вот так и надо сделать.

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

// составляем из сегментов цифры
#define   N0   (0x3F)      //0
#define   N1   (0x06)      //1
#define   N2   (0x5B)      //2
#define   N3   (0x4F)      //3
#define   N4   (0x66)      //4
#define   N5   (0x6D)      //5
#define   N6   (0x7D)      //6
#define   N7   (0x07)      //7
#define   N8   (0x7F)       //8
#define   N9   (0x6F)      //9

#define   _setBit(p,b,x) p = (x)?((p)|(1<<(b))):((p)&(~(1<<(b))))
#define   _clk(p,b) p|=(1<<(b)); p&=~(1<<(b))

void export_data (unsigned long i)
{
    const char indikator[10]={N0, N1, N2, N3, N4, N5, N6, N7, N8, N9};     
    unsigned char byte, bit, Char;
     
    for (byte=4; byte>=0; byte--)
    {
        Char = indikator[(i%100000)/10000]; i*=10;
        for (bit=7; bit>=0; bit--)
        {
            _setBit(PORTD, PD5, Char & (1<<bit)); // Устанавливаем бит
            _clk(PORTD,PD6); // Двигаем данные
        }
    }
     
    _clk(PORTD,PD7); // Копируем на внешний буфер.
}


int main(void)
{
  long int DS=0;   //переменная DS
  unsigned int i=0;    //переменная i
  PORTD=0x00; //Первоначально устанавливаем на всех выходах 0
  DDRD=0xff; //установить PD0-PD2 как выходы

  while (1)  //Бесконечный цикл
   {   
      export_data(61636L);   //Отправляем данные на сдвиговый регистр
   }
}
 
Кстати, предупреждаю: в случае этого кода, высвечиваемое на индикатор число может напугать вас.
Последний раз редактировалось IfoR Пн авг 22, 2011 20:21:06, всего редактировалось 3 раза.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Реклама
Аватара пользователя
koyodza
Собутыльник Кота
Сообщения: 2623
Зарегистрирован: Вс июл 17, 2011 11:51:52
Контактная информация:

Re: Как отправить 40 бит на 7-ми сегментный индикатор

Сообщение koyodza »

alexey6522 писал(а):С этим все понятно, мне подходит предложенный вариант urry, его код мне очень понравился тем что можно делать с числом что угодно! Как теперь состыковать два типа данных.
Есть функция она имеет тип const char необходимо ей передать переменную s тип которой unsigned long int.
В переменной - s содержится число, любое число unsigned long int, а вот const char понимает только текст в двойных кавычках
как мне преобразовать unsigned long int в const char что бы потом передать содержимое в другую функцию и работать дальше
Ну так его функция fnLongToStr это и делает. Только там немного злоупотребляется глобальными переменными, я стараюсь по-возможности этого избегать. Но Вам, как начинающему, так будет даже проще. Так что просмотрите код на предыдущей странице ещё раз
Реклама
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Re: Как отправить 40 бит на 7-ми сегментный индикатор

Сообщение alexey6522 »

koyodza как мне переделать функцию передачи строки в передачу числа в порт COM1

Код: Выделить всё

void USART_vSendBytes(const char *u8Data) {
  while (*u8Data) {
    while((UCSRA&(1<<UDRE)) == 0); // Wait if a byte is being transmitted
    UDR = *u8Data;
    u8Data++; // Transmit data
 }
}
вот как я ее вызываю
USART_vSendBytes("Hello world"); //Отправляем данные в порт
а теперь мне нужно сделать так что бы моя функция приняла число в виде
USART_vSendBytes(98543); //Отправляем данные в порт
знаю что в обычном Си есть много функций преобразования числа в строку IntToStr или FloatToStr
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: Как отправить 40 бит на 7-ми сегментный индикатор

Сообщение IfoR »

Может не стоит постить в двух темах параллельно одно и тоже? Я вам ответил в соседней теме.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Re: Как отправить 40 бит на 7-ми сегментный индикатор

Сообщение alexey6522 »

Спасибо IfoR, уже прочитал, только этот вариант не очень, честно, я читал
http://radiokot.ru/forum/viewtopic.php? ... view=print
там написано про эту функцию
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»