Страница 208 из 421

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

Добавлено: Вт июн 05, 2012 11:58:42
hubble
to a_skr
благодарю

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

Добавлено: Ср июн 06, 2012 18:49:59
signum
Добрый день! вопросик как интерпретировать например значение '2' '5' '5'(0х32, 0х35, 0х35)
в 0хff ? и второй как правильно сделать массив переменного размера например
mas = data, где i номер, data значение, в зависимости от условий выполнения программы значения и размер масива могут меняться?

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

Добавлено: Ср июн 06, 2012 20:05:27
vitalik_1984
Вот тут прикольный для ржача пример
А вообще если серьезно, то нужно подробнее

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

Добавлено: Ср июн 06, 2012 20:09:21
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;
} 

Это по второму вопросу?

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

Добавлено: Ср июн 06, 2012 20:30:49
vitalik_1984
А что разве форматтед вывод не помощник?

Вот еще нашел пример ftoa

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

Добавлено: Ср июн 06, 2012 20:36:16
signum
vitalik_1984 писал(а):А что разве форматтед вывод не помощник?

Вот еще нашел пример ftoa
Подробней пож что такое форматтед, а то невехал?

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

Добавлено: Ср июн 06, 2012 20:48:21
vitalik_1984
Вот например
sprintf
<cstdio>
int sprintf ( char * str, const char * format, ... );
Write formatted data to string

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

Добавлено: Ср июн 06, 2012 21:01:23
signum
На сколько я понял это формат getchar and putchar functions, Каким боком мне это подключить к моей функции имеющей ктомуже разную размерность мантиссы и экспоненты?
или я туплю?

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

Добавлено: Ср июн 06, 2012 21:49:10
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;
}
 
Проверить только пока не на чем.Хотя... сейчас в прот загоню

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

Добавлено: Чт июн 07, 2012 11:34:52
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 ну как то так.

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

Добавлено: Чт июн 07, 2012 11:47:39
signum
По поводу массива, полагаю размерность указывать необходимо обязательно и за ранние, переменный размер не получиться ? это по другому вопросу.

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

Добавлено: Чт июн 07, 2012 17:06:18
vitalik_1984
signum писал(а):кстати я придумал другой вариант, проверю напишу измененный код.
Другой это типа обратный результат?
signum писал(а):По поводу массива, полагаю размерность указывать необходимо обязательно и за ранние, переменный размер не получиться ? это по другому вопросу.
Массив для чего заранее указывать?
Вообще си вроде можно заранее не объявлять размер.

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

Добавлено: Чт июн 07, 2012 22:08:39
signum
vitalik_1984 писал(а):
signum писал(а):кстати я придумал другой вариант, проверю напишу измененный код.
Другой это типа обратный результат?
signum писал(а):По поводу массива, полагаю размерность указывать необходимо обязательно и за ранние, переменный размер не получиться ? это по другому вопросу.
Массив для чего заранее указывать?
Вообще си вроде можно заранее не объявлять размер.
Да вроде можно но CV ругается, другой это иной, по другому реализованный, думаю мой вариант будет менее ресурсоемким.

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

Добавлено: Пт июн 08, 2012 09:34:41
vitalik_1984
похоже все таки обратный.я сначала подумал,что вы на вывод готовите.
если что есть форматированный прием синтаксис примерно такой же как у вывода.

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

Добавлено: Вт июн 12, 2012 18:21:18
FreshMan
данная операция #define anod_min_l (PORTD|=(1<<4)) называется наложение маски на порт D с последующим присвоением имени ? я правильно понимаю ?

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

Добавлено: Вт июн 12, 2012 18:34:09
Goodefine
Это не операция. Это определение операции записи единицы в 4-й разряд регистра PORTD, к чему это приводит в зависимости от состояния одноименного бита регистра DDRD, найдите сами...

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

Добавлено: Вт июн 12, 2012 18:48:58
FreshMan
Goodefine писал(а):Это не операция.
почему ?

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

Добавлено: Вт июн 12, 2012 18:56:19
Goodefine
Потому что операция это некое активное действие. От того что оно описано через #define.. оно не выполнится. Устанвка бита наступит на строчке

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

anod_min_l;
где то в программе (там где напишете). Поэтому указанная строчка кода это именно ОПРЕДЕЛНИЕ операции, а не сама операция, с точки зрения программного функционала

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

Добавлено: Вт июн 12, 2012 19:01:59
FreshMan
значит #define anod_min_l (PORTD|=(1<<4)) - это просто наложение маски на порт D с последующим присвоением ей имени ?

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

Добавлено: Вт июн 12, 2012 19:02:29
Goodefine
Что вы называете маской?