Преобразование числа в строку и обратно (DS18B20 + 7 сегм.)

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Преобразование числа в строку и обратно (DS18B20 + 7 сегм.)

Сообщение mr_smit »

Значит так: ATMega8, DS18B20, двойной 7-ми сегм. индикатор.

Что надо: показывать целую часть температуры.

Один индикатор повесил на порт В, второй на порт D. Хочу измерить температуру ds18b20_temperature(0). Получим число (например 20 т.е 20 градусов). Число перевести в строку. Взять первое значение (2) перевести обратно в число и отобразить на 7 сегм. индик. Потом взять второе число (0) и т.д.
Никак не могу разобраться. Перерыл уже все примеры на Си - ни один не работает.

Что делаю (CVAVR):

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


...........

int temp;
char temp_str;

char Indicator_1 [10] = {      // массив для отображения на индикаторе

0b01111110,    // 0
0b00001100,    // 1
0b10110110,    // 2
0b10011110,    // 3
0b11001100,    // 4
0b11011010,    // 5
0b11111010,    // 6
0b00001110,    // 7
0b11111110,    // 8
0b11011110,    // 9
};

char Indicator_2 [10] = {      // массив для отображения на индикаторе

0b01111110,    // 0
0b00001100,    // 1
0b10110110,    // 2
0b10011110,    // 3
0b11001100,    // 4
0b11011010,    // 5
0b11111010,    // 6
0b00001110,    // 7
0b11111110,    // 8
0b11011110,    // 9
};

...

w1_init();

ds18b20_init(0,-30,120,0);

.........

while (1)
      {
      temp=ds18b20_temperature(0);

      //itoa(temp, temp_str);
      itoa(temp,temp_str,10);
      
      //PORTB=Indicator_1 [2];
      //PORTD=Indicator_2 [5];
      
      };
Пробовал так
char *temp_str = new char[17]; - не знает что такое new

Посмотрел библиотеку DS18B20 - там у функции ds18b20_temperature тип float. Посмотрел справку CVAVR - там есть ftoa - что с ней только не делал, безполезно.

Что ещё сделать не знаю. Поэтому обращаюсь к мудрейшим. :cry:
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
Pippeytz
Потрогал лапой паяльник
Сообщения: 396
Зарегистрирован: Ср май 28, 2008 19:30:31
Откуда: Донецк
Контактная информация:

Сообщение Pippeytz »

Вот, можеш посомтреть , только здесь 4х разрядный индикатор , поудаляеш индикацию на другие два разряда если разберешся

Никаких преобразований тут делать не нужно, за тебя все ето здеално в библиотеках , просто нужна перменная типа int
куда ты сохраниш результат
temp=ds18b20_temperature(0);
после етой команды все будет в temp уже в реальном виде
float- обычное число с палвяющей запятой
Вложения
untitled.c
(3.42 КБ) 670 скачиваний
Полный пипеутз.
Реклама
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Pippeytz писал(а): нужна перменная типа int куда ты сохраниш результат
temp=ds18b20_temperature(0);
после етой команды все будет в temp уже в реальном виде
float- обычное число с палвяющей запятой
Это я понимаю. Не понимаю как вывести результат на индикатор. Сейчас посмотрю твой пример.

P.S. А ds18b20_temperature(0) в каком виде возвращает значение?
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Хочу вывести 2-х значное число на 2-х значный индикатор. Есть KingBright DA04-11SRWA. Но для начала хочу попробовать в Proteus. Индикатор с общим анодом.

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

flash char digits [] = {      // массив для отображения на индикаторе
0b10000001,    // 0
0b11110011,    // 1
0b01001001,    // 2
0b01100001,    // 3
0b00110011,    // 4
0b00100101,    // 5
0b00000101,    // 6
0b11110001,    // 7
0b00000001,    // 8
0b00100001,    // 9
};
char digit_out[2], cur_dig=0;     //переменные для работы с LED
unsigned int indicator=23;        //переменная для вывода
void cifri_v_massiv (void) {           // функция для перекодировки
  digit_out[0]=indicator%10;           // Делим на 10 остаток в масив, 1-разряд  (справа налево)
  digit_out[1]=indicator/10;           // 2 разряд                      
} 
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
  cifri_v_massiv ();
  switch (cur_dig){
  case 0:{PORTC.2=1; PORTC.1=0; break;};  //подаём питание на разряд 0 (справа налево)
  case 1:{PORTC.1=1; PORTC.2=0; break;};  //подаём питание на разряд 1 (справа налево)
  }
  PORTD=digits[digit_out[cur_dig]];    
  cur_dig++;                                           
  if(cur_dig==2) {cur_dig=0;}                 
}
Получается какая то абракабабра. Целый день сегодня бьюсь. Никак не выходит.

Изображение

Всё в архиве:
Нельзя всё знать, достаточно понимать.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Почему то если меняю частоту TCCR0=0x05 на TCCR0=0x03 и т.д. "абракабабра" тоже меняется. Иногда вовсе пропадает. Я совсем запутался...
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
Pippeytz
Потрогал лапой паяльник
Сообщения: 396
Зарегистрирован: Ср май 28, 2008 19:30:31
Откуда: Донецк
Контактная информация:

Сообщение Pippeytz »

Попробуй таймер завести так TCCR0=0x02; TCNT0=0x00;
И еще вот так поробуй...

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



#include <mega8>
#include <stdlib>


flash char digits [] = {      // массив для отображения на индикаторе

0b10000001,    // 0
0b11110011,    // 1
0b01001001,    // 2
0b01100001,    // 3
0b00110011,    // 4
0b00100101,    // 5
0b00000101,    // 6
0b11110001,    // 7
0b00000001,    // 8
0b00100001,    // 9
};

char digit_out[2], cur_dig=0;   
unsigned int indicator=0;        

void cifri_v_massiv (void) {           
  digit_out[0]=indicator%10;         
  digit_out[1]=indicator/10;                            
} 


interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
    PORTC=0x00;
    PORTD=digits[digit_out[cur_dig]];
  switch (cur_dig){
  case 0:{PORTC.2=1;  break;};  
  case 1:{PORTC.1=1;  break;};  
  }
  
  cur_dig++;                                           
  if(cur_dig==2) {cur_dig=0;}                 
}

void main(void)
{

PORTC=0x00;
DDRC=0x00;


PORTD=0xFF;
DDRD=0xFF;

             
TCCR0=0x02;
TCNT0=0x00;
TIMSK=0x41;


#asm("sei")

while (1)
      {  
        indicator=12;
        cifri_v_massiv ();
     
      };
}


[code/]
Полный пипеутз.
Реклама
Fallk
Мудрый кот
Сообщения: 1842
Зарегистрирован: Пт май 29, 2009 10:58:47
Откуда: Саратов

Сообщение Fallk »

Êàê ÿ ïîíÿë çàäà÷à áàíàëüíàÿ - èìåþùååñÿ ñëîæíîå ÷èñëî íóæíî ðàçáèòü íà ñîñòàâëÿþùèå?
Íàïðèìåð ÷èñëî 247 ðàçëîæèòü íà ÷èñëà 2, 4 è 7 ÷òîáû êàæäîå èç íèõ çàïèñàòü â ñîîòâåòñòâóþùåì 7-ìè ñåãìåíòíîì èíäèêàòîðå?
Аватара пользователя
Alex Medvedev
Встал на лапы
Сообщения: 95
Зарегистрирован: Сб мар 01, 2008 12:27:44
Контактная информация:

Сообщение Alex Medvedev »

Я замучался в свое время с этим.
Исходник прилагается. Все работает но вот тока индикаторов не два а четыре..
Изображение
Вложения
zzz.c
(2.19 КБ) 657 скачиваний
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Fallk - да.

Сделал так, заработало.

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

interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
  indicator=23;
  cifri_v_massiv ();

  PORTC=0x00;     //   < -- добавил

  if (cur_dig==0) {PORTC.2=1; PORTC.1=0;}
  else {PORTC.1=1; PORTC.2=0;}
  PORTD=digits[digit_out[cur_dig]];
  cur_dig++;                                           
  if(cur_dig==2) {cur_dig=0;}                 
}
Частота 1 МГц (от внутреннего RC). Главное интересно, если поставить TCCR0=0x01, то получим:
Изображение

А если поставить TCCR0=0x02, то:
Изображение

Почему?
Нельзя всё знать, достаточно понимать.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Советую посмотреть граф индикации.
А то нарветесь на неприятные приколы типа этого :
http://www.kaligraf.narod.ru/nedodellki.html
Fallk
Мудрый кот
Сообщения: 1842
Зарегистрирован: Пт май 29, 2009 10:58:47
Откуда: Саратов

Сообщение Fallk »

[quote="mr_smit"]Fallk - äà.

Îðãàíèçîâûâàåì 2 öèêëà äëÿ 3õ çíà÷íîãî ÷èñëà è íà÷èíàåì îòíèìàòü ñíà÷àëà 100, ïîòîì 10 è ñ÷èòàÿ êîëëè÷åñòâî îïåðàöèé.  ðåçóëüòàòå áóäåò ïîëó÷àòüñÿ îòâåò, åñëè îí áóäåò ìåíüøå íóëÿ, çíà÷èò îñòàòîê ìåíüøå 100, ïåðåõîäèì ñ îñòàòêîì â öèêë ãäå îòíèìàåòñÿ 10.  íåì òàê æå ñ÷èòàåòñÿ êîëëè÷åñòâî îïåðàöèé è ïîëó÷åííûé îòâåò ìåíüøå 10 áóäåò òðåòèì ÷èñëîì.  èòîãå ïîëó÷àåòñÿ 367=3*100+6*10+7
Ïîëó÷åííûå ÷èñëà 3,6,7 çàïèñûâàåì â îòäåëüíûå ðåãèñòðû ïàìÿòè. Èòîãî èìååì 3 ÿ÷åéêè ïàìÿòè ñ òðåìÿ ïðîñòûìè ÷èñëàìè.
Ïî êðàéíåé ìåðå ÿ òàê äåëàþ íà àñåìáëåðå äëÿ PICa
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18556
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ну сколько можно эту жвачку жевать?! :evil: каждый, кто берет в руки МК и 7-сегментые индикаторы тут же начинает задавать вопрос о выводе на него чисел!!! неужели поиском нельзя попользоваться?! просто тошнит от этого!!!

человек, который хоть что-то смыслит в программировании, просто не может не знать основ арифметики!!! зачатки систем счисления так же нынче изучают в школе на информатике... неужели нельзя чуть-чуть подумать?! на крайний случай, просто 5-10 минут порыться в форуме - ну куча советов!!!

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

Мой уютный бложик... заходите!
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

ARV писал(а):ну сколько можно эту жвачку жевать?! :evil: каждый, кто берет в руки МК и 7-сегментые индикаторы тут же начинает задавать вопрос о выводе на него чисел!!! неужели поиском нельзя попользоваться?! просто тошнит от этого!!!

человек, который хоть что-то смыслит в программировании, просто не может не знать основ арифметики!!! зачатки систем счисления так же нынче изучают в школе на информатике... неужели нельзя чуть-чуть подумать?! на крайний случай, просто 5-10 минут порыться в форуме - ну куча советов!!!

в конце концов, это просто надоедает :evil:
Ага, везде только и слышишь: "Ищите, ищите, 100 раз обсуждалось". Толком никто ничего не говорит, даже если знает.

Вопросы у начинающих всегда будут, даже если всё уже обсуждалось. Смиритесь. Ну вот не укладываются в маленьких головках котят всё премудрости этого дела...

Чуть выше вопрос задал: Почему сектор "е" на индикаторе при изменении частоты засвечивается? Он же даже не участвует в отображении цифры "3".
Последний раз редактировалось mr_smit Вт июн 02, 2009 19:10:43, всего редактировалось 2 раза.
Нельзя всё знать, достаточно понимать.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

а я с ARV согласен. зачем поднимать еще одну новую тему, если этот вопрос уже обсуждался, даже тема была такая(!!!!) если кому то лень посидеть немного с поиском...
Ставим плюсы: )
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

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

temp=ds18b20_temperature(0);
что в temp будет? В каком виде? Ну там 21,5 или 215 или 21,500

потому что:

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

while (1)
      {
      //temp=ds18b20_temperature(0);
      indicator=25.6;
      cifri_v_massiv ();
      };
}
На индикатор выводится 25. А если так:

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

while (1)
      {
      temp=ds18b20_temperature(0);
      indicator=temp;
      cifri_v_massiv ();
      };
}
На индикатор выводится 1. Хотя температура выставлена 27 (Proteus).
Нельзя всё знать, достаточно понимать.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

mr_smit писал(а): Чуть выше вопрос задал: Почему сектор "е" на индикаторе при изменении частоты засвечивается? Он же даже не участвует в отображении цифры "3".
Я же тебе ответил ссылкой... :)))
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

dosikus писал(а):
mr_smit писал(а): Чуть выше вопрос задал: Почему сектор "е" на индикаторе при изменении частоты засвечивается? Он же даже не участвует в отображении цифры "3".
Я же тебе ответил ссылкой... :)))
Причина в том, что при переключении разрядов в программе динамической индикации(переключение идёт слева направо) транзистор разряда, выводимого на индикацию не успевал закрываться. Часть времени(несколько микросекунд) цифра следующего разряда отображалась в разряде предыдущем.
Транзисторов здесь нет. Загораются строго определенные числа. То есть 3, 3, 3, 3, 3 .... почему "е" засвечивается всё равно не понимаю.

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

indicator=25.6;
и TCCR0=0x01; - на индикаторе вообще 88. Я так понимаю что просто слишком быстро смена происходит. Ладно, будем считать что разобрались. С температурой что?
Нельзя всё знать, достаточно понимать.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Не мне это положительно нравится ...
Ты читаешь не больше двух слов на странице ? Или так спешишь что них.. не видишь ?
Причем здесь транзисторы ?! Засветка и без транзисторов обеспечена тебе...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18556
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

мне лень все читать...
1. перед тем, как вывести НОВЫЙ символ на НОВЫЙ разряд индикатора, надо ПОГАСИТЬ текущий индикатор. я всегда гашу ВСЕ индикаторы (вывожу 1 на общие катоды или 0 на андоы).
2. почитайте статью- возможно, вопросы пропадут... а ясность появится...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Всё разобрался. Спасибо.

Про температуру ещё скажите что нибудь. В каком виде возвращает?
Нельзя всё знать, достаточно понимать.
Закрыто

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