CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 13
Зарегистрирован: Вс июн 14, 2009 00:34:38

Сообщение hubble »

to a_skr
благодарю
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 84
Зарегистрирован: Ср июн 22, 2011 20:41:57
Откуда: Харьков

Сообщение signum »

Добрый день! вопросик как интерпретировать например значение '2' '5' '5'(0х32, 0х35, 0х35)
в 0хff ? и второй как правильно сделать массив переменного размера например
mas = data, где i номер, data значение, в зависимости от условий выполнения программы значения и размер масива могут меняться?
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Вот тут прикольный для ржача пример
А вообще если серьезно, то нужно подробнее
В поисках истины человек развивается.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 84
Зарегистрирован: Ср июн 22, 2011 20:41:57
Откуда: Харьков

Сообщение signum »

Такая подпрограмма принимает значения с плав точкой с USART необходимо полученые значения переводить в конкретное значение, например значения могут быть 203.4055 или 23.0001 и тп. прием в кодах '0x32' и тд. Это по первому вопросу (против GOTO не имею ничего против, привык с Асм и иногда применяю )

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

/**/
void  METRIKKOD(void)      //
{
Long Rj = 0, Ri = 0, Rg = 0; temp = 0; 

temp = '2';//getchar();    // Первый символ
        if(temp == '.'){goto m;}
                else{ Rg = temp; Rg = (Rg << 24);}// 
                if(temp == ' '){goto m1;}   // Конец значения            
                
                
temp = '3';//getchar();    // Второй
        if(temp == '.'){goto m;}
                else{Rj |=Rg; Rg = temp; Rg = (Rg << 16); Rj |=Rg;} // 
                if(temp == ' '){goto m1;}   // Конец значения 
               
                
temp ='0'; //getchar();    // Третий 
        if(temp == '.'){temp = 0; Rg |= Rj; goto m;}
                else{Rj |=Rg; Rg = temp; Rg = (Rg << 8); Rj |=Rg;}
                if(temp == ' '){temp = 0; Rg |= Rj; goto m1;}   // Конец значения 
                
                
temp ='1'; //getchar();    // Четвертый
        if(temp == '.'){temp = 0; Rg |= Rj; goto m;}
                else{ Rg = temp; Rg |= Rj;} 
                if(temp == ' '){temp = 0; Rg |= Rj; goto m1;}   // Конец значения 
                 
                
temp = '.';//getchar();    // 
        if(temp == '.'){temp = 0; Rg |= Rj; goto m;}else{}   
        if(temp == ' '){temp = 0; Rg |= Rj; goto m1;}else{}   // Конец значения 
Rj = 0; temp = 0;                                       

goto m1;
m:
Rj = 0; 

temp ='2'; //getchar();    // Первый символ 
        if(temp == ' '){goto m1;}   // Конец значения            
                else{ Ri = temp; Ri = (Ri << 24);}
         
temp = '5';//getchar();    // Второй 
        if(temp == ' '){goto m1;}   // Конец значения            
                else{Rj |=Ri;  Ri = temp; Ri = (Ri << 16); Rj |=Ri;}
        
temp = ' ';//getchar();    // Третий 
        if(temp == ' '){temp = 0; Ri |= Rj; goto m1;}   // Конец значения            
                else{ Rj |=Ri; Ri = temp; Ri = (Ri << 8); Rj |=Ri;}
              
temp = '2';//getchar();    // Четвертый  
        if(temp == ' '){temp = 0; Ri |= Rj; goto m1;}   // Конец значения            
                else{ Ri = temp; Ri |= Rj;}
         
Rj = 0;        
temp = 0;        
m1: 

} 
По поводу массива не хочу загружать проц вычислениями с плавющей точкой и кучей делений в каждом прерывании таймера, по этому планирю зарание просчитывать и зансить в массив данные которые менют значения TCNT0

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

void Freq(word Freq)// Задатчик частоты для таймера Т0
{

if(Freq <= 450)// Частота 
            {TCNTx = 0x101 - (((flo)1/Freq)*(Freq_MC/1024)); SLCx = SLC1024;} // Меньше или равно 450 Гц. мин. 29 Гц, для кварца 7372800 Гц и делителя 1024.
        else{TCNTx = 0x101 - (((flo)1/Freq)*(Freq_MC/64));   SLCx = SLC64;}   // Больше 450 Гц. макс. 57600 Гц, для кварца 7372800 Гц и делителя 64.
        
TCNT0 = TCNTx;
TCCR0 = SLCx;
} 

Это по второму вопросу?
Последний раз редактировалось signum Ср июн 06, 2012 21:04:41, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

А что разве форматтед вывод не помощник?

Вот еще нашел пример ftoa
В поисках истины человек развивается.
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 84
Зарегистрирован: Ср июн 22, 2011 20:41:57
Откуда: Харьков

Сообщение signum »

vitalik_1984 писал(а):А что разве форматтед вывод не помощник?

Вот еще нашел пример ftoa
Подробней пож что такое форматтед, а то невехал?
Последний раз редактировалось signum Ср июн 06, 2012 21:07:29, всего редактировалось 1 раз.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Вот например
sprintf
<cstdio>
int sprintf ( char * str, const char * format, ... );
Write formatted data to string
В поисках истины человек развивается.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 84
Зарегистрирован: Ср июн 22, 2011 20:41:57
Откуда: Харьков

Сообщение signum »

На сколько я понял это формат getchar and putchar functions, Каким боком мне это подключить к моей функции имеющей ктомуже разную размерность мантиссы и экспоненты?
или я туплю?
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Берем пример из 1 функции
изменяем под свои нужды
Добавляем пример из 2 функции

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

/* sprintf example */
#include <stdio.h>

int main ()
{
  char buffer [50];
  int n, a=5, b=3;
  n=sprintf (buffer, "%d delit %d is %f", a, b, (double)a/(double)b);//тут ответ - результат с плавающей точкой должен получиться
  for (c = 0 ; c <= n ; c++) {
    putchar (buffer[c]);
    }
  return 0;
}
 
Проверить только пока не на чем.Хотя... сейчас в прот загоню
В поисках истины человек развивается.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 84
Зарегистрирован: Ср июн 22, 2011 20:41:57
Откуда: Харьков

Сообщение signum »

Ок спасибо попробую, кстати я придумал другой вариант, проверю напишу измененный код. Там берем первое значение допустим '2'(0x32) делаем так

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

 temp -= 0x30; Rg = temp; Rg = Rg*1000;
потом так

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

Rj |=Rg; temp -= 0x30; Rg = temp;  Rg = Rg*100;Rg +=Rj; Rj = Rg;
и так далие Rg,Rj тип int итд получится типа такого '2' '2' '2' '2' на выходе 2222 или 0х8AE, если 3начение 222 там или 93, нужный разряд делим 100, 10 ну как то так.
Встал на лапы
Аватара пользователя
Сообщения: 84
Зарегистрирован: Ср июн 22, 2011 20:41:57
Откуда: Харьков

Сообщение signum »

По поводу массива, полагаю размерность указывать необходимо обязательно и за ранние, переменный размер не получиться ? это по другому вопросу.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

signum писал(а):кстати я придумал другой вариант, проверю напишу измененный код.
Другой это типа обратный результат?
signum писал(а):По поводу массива, полагаю размерность указывать необходимо обязательно и за ранние, переменный размер не получиться ? это по другому вопросу.
Массив для чего заранее указывать?
Вообще си вроде можно заранее не объявлять размер.
В поисках истины человек развивается.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 84
Зарегистрирован: Ср июн 22, 2011 20:41:57
Откуда: Харьков

Сообщение signum »

vitalik_1984 писал(а):
signum писал(а):кстати я придумал другой вариант, проверю напишу измененный код.
Другой это типа обратный результат?
signum писал(а):По поводу массива, полагаю размерность указывать необходимо обязательно и за ранние, переменный размер не получиться ? это по другому вопросу.
Массив для чего заранее указывать?
Вообще си вроде можно заранее не объявлять размер.
Да вроде можно но CV ругается, другой это иной, по другому реализованный, думаю мой вариант будет менее ресурсоемким.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

похоже все таки обратный.я сначала подумал,что вы на вывод готовите.
если что есть форматированный прием синтаксис примерно такой же как у вывода.
В поисках истины человек развивается.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

данная операция #define anod_min_l (PORTD|=(1<<4)) называется наложение маски на порт D с последующим присвоением имени ? я правильно понимаю ?
Tell Me The Truth
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Это не операция. Это определение операции записи единицы в 4-й разряд регистра PORTD, к чему это приводит в зависимости от состояния одноименного бита регистра DDRD, найдите сами...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Goodefine писал(а):Это не операция.
почему ?
Tell Me The Truth
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Потому что операция это некое активное действие. От того что оно описано через #define.. оно не выполнится. Устанвка бита наступит на строчке

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

anod_min_l;
где то в программе (там где напишете). Поэтому указанная строчка кода это именно ОПРЕДЕЛНИЕ операции, а не сама операция, с точки зрения программного функционала
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

значит #define anod_min_l (PORTD|=(1<<4)) - это просто наложение маски на порт D с последующим присвоением ей имени ?
Последний раз редактировалось FreshMan Вт июн 12, 2012 19:02:49, всего редактировалось 1 раз.
Tell Me The Truth
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Что вы называете маской?
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Ответить

Вернуться в «AVR»