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

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

Добавлено: Вт июн 12, 2012 19:04:58
FreshMan
хороший вопросик :)) я вот как бы понимать понимаю а обяснить немогу...... :(
хотя может я и вообще неправильно понимаю....., обясните плиз

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

Добавлено: Вт июн 12, 2012 19:13:20
Goodefine
Не плодите сущностей без необходимости. Та строка делает именно то что я написал, а именно - ничего. Вот когда вы напишете anod_min_l; тогда и выполнится (PORTD|=(1<<4)); Что приведет к установке соответствующего бита. Это всего лишь формализованная эквивалентная логическая запись установки бита, из которой компилятор сделает
SBI PORTD,4
Это не маска. Под маской понимают обычно маскирование (сокрытие) определенной информации неким числом, блокированием если хотите - например x=PORTD&0b00001111; В данном случае "замаскированными' окажутся старшие 4-ре бита (на переменную х они влияния не окажут).

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

Добавлено: Ср июн 13, 2012 12:28:28
signum
Вот обещанный код

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

void  METRIKKOD(void)      //
{
word Rj = 0, Ri = 0, Rg = 0, Rr; 
temp = 0; 
/*-- Мантисса  !--*/ 
/*-- Первый символ !--*/
temp =getchar();    //
switch (temp)
      {
    case '-':   neg = On; temp =getchar(); break;
    case ' ':   goto m1; 
    case '.':   goto m; 
    case 0x0D:  temp =getchar(); if(temp == 0x0A){};  break;
    default:
      }; Rj = temp -=0x30; Rj *= 1000; Ri = Rj; 

/*-- Второй символ !--*/  
temp =getchar();    //
switch (temp)
      {    
    case ' ': Ri = Ri /1000;  goto m1; 
    case '.': Ri = Ri /1000;  goto m; 
    case 0x0D:Ri = Ri /1000;  temp =getchar(); if(temp == 0x0A){};  break;
    default:
      }; Rj = temp -=0x30; Rj *= 100; Ri = Rj + Ri; 

/*-- Третий символ !--*/      
     temp = getchar(); 
switch (temp)
      {    
    case ' ': Ri = Ri /100;  goto m1; 
    case '.': Ri = Ri /100;  goto m; 
    case 0x0D:Ri = Ri /100;  temp = getchar(); if(temp == 0x0A){};  break;
    default:
      }; Rj = temp -=0x30; Rj *= 10; Ri = Rj + Ri;     
          
     
/*-- Четвертый символ !--*/       
     temp = getchar(); 
switch (temp)
      {    
    case ' ': Ri = Ri /10;  goto m1; 
    case '.': Ri = Ri /10;  goto m; 
    case 0x0D:Ri = Ri /10;  temp = getchar(); if(temp == 0x0A){};  break;
    default:
      };  Rj = temp -=0x30;  Ri = Rj + Ri;  
          temp = getchar(); 
          switch (temp)
                {   
          case  '.': putchar(temp); goto m;    
          case  ' ': putchar(temp); goto m1; 
          case  0x0D: temp = getchar(); if(temp == 0x0A){}; break;
          default:      
                }; 
/*-- Экспонента  !--*/      
m: 
temp = 0;  
/*-- Первый символ !--*/
     temp = getchar(); 
     if(temp == ' '){goto m1;};
     if(temp == 0x0D)temp = getchar(); if(temp == 0x0A){};    
     Rj = temp -=0x30; Rj *= 1000; Rg = Rj; 
/*-- Второй символ !--*/     
     temp =getchar(); 
     if(temp == ' '){Rg = Rg /1000; goto m1;};
     if(temp == 0x0D)Rg = Rg /1000;  temp = getchar(); if(temp == 0x0A){};
     Rj = temp -=0x30; Rj *= 100; Rg = Rj + Rg;  
/*-- Третий символ !--*/    
     temp =getchar();
     if(temp == ' '){Rg = Rg /100; goto m1;}; 
     if(temp == 0x0D)Rg = Rg /100;  temp = getchar(); if(temp == 0x0A){};
     Rj = temp -=0x30; Rj *= 10; Rg = Rj + Rg;  
/*-- Четвертый символ !--*/     
     temp = getchar(); 
     if(temp == ' '){Rg = Rg /10; goto m1;}; 
     if(temp == 0x0D)Rg = Rg /10;  temp = getchar(); if(temp == 0x0A){};
     Rj = temp -=0x30;  Rg = Rj + Rg;     
    
m1:
mant = Ri;
exsp = Rg; 

}


Пока не проверял но вроде рабочий, понимает значения 0-9(0x32, 0x36....) в кодах ASCII, пробел конец числа. Принимаются последовательно числа, например '2' '4' '6' '.' '0' '1'' ' по резултату работы подпрограммы получаются числа 246 и 01 в десятичной форме.

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

Добавлено: Ср июн 13, 2012 12:41:53
signum
За более оптимальный вариант буду 8) благодарен!!

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

Добавлено: Ср июн 13, 2012 21:57:11
FreshMan
мне нужно нулевой таймер настроит на 1мс
если я сделаю вот такие настройки......, будет ли данный таймер начинать свой расчет с числа 82h ?
Изображение

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

Добавлено: Чт июн 14, 2012 08:58:40
Eprinter
FreshMan писал(а):мне нужно нулевой таймер настроит на 1мс
если я сделаю вот такие настройки......, будет ли данный таймер начинать свой расчет с числа 82h ?
А можно вот так? Проверено, работает:
Изображение
Ваш вариант не совсем хорош - нужно каждый раз программно выставлять таймеру стартовое значение.

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

Добавлено: Чт июн 14, 2012 09:27:47
vitalik_1984
Eprinter ,попробуйте так же на меге 8 таймер ноль настроить.
и экран пришлите

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

Добавлено: Чт июн 14, 2012 10:28:20
Eprinter
Ну да, на меге8 таймер ноль так не настроишь. Зато есть таймер 1 или 2. Кстати, в вопросе тип МК не прозвучал.

Впрочем согласен, ответил не совсем в тему :oops:

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

Добавлено: Чт июн 14, 2012 14:36:58
FreshMan
Eprinter писал(а):А можно вот так? Проверено, работает:
этот приемчик я знаю :))
Eprinter писал(а):нужно каждый раз программно выставлять таймеру стартовое значение.
это делается в фоновой задаче ?

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

Добавлено: Чт июн 14, 2012 18:11:30
vitalik_1984
как таковых фоновых задач в АВР нет,есть имитация.так вот смену значения таймера производят во время прерывания самыми первыми тактами.(первые команды в подпрограмме)

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

Добавлено: Чт июн 14, 2012 18:25:26
FreshMan
странно......., пробовал но не помогло :dont_know:

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

Добавлено: Чт июн 14, 2012 18:44:52
pyzhman
Имеется ввиду менять значение в самой подпрограмме обработки прерывания при переполнении.

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

Добавлено: Чт июн 14, 2012 23:10:31
Eprinter
FreshMan писал(а):странно......., пробовал но не помогло :dont_know:
Посмотреть бы, как пробовали, может какой нюанс упущен.

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

UPD можно просто прибавлять начальное значение для таймера к текущему.

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

Добавлено: Пт июн 15, 2012 18:09:37
FreshMan
опосля очередной попытки и тсчательной проверки все заработало......, слава Богу ! :))
и Вам спасибо, товарищи ! :beer:

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

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x82;

if (++ms>=1000){ms=0;sec++;};
if (sec>=60)sec=0;
flag=1;

}

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

Добавлено: Пт июн 15, 2012 21:30:06
vitalik_1984
Это значит, что в момент прерывания по переполнению нужно проверять состояние счётчика и корректировать его начальное значение, иначе временной интервал будет гулять. В принципе задача не сложная, но требует дополнительной мышиной возни.
ну если приложение критично,то конечно нужно.
а так в принципе не особо страшно,если цифра на пару микросекунд позже включится при динамической индикации :)))

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

Добавлено: Пт июн 15, 2012 22:29:16
urry
signum, Вы чему-то плохому детей учите...
Перевод символьного asс массива десятичных чисел

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

unsigned long fn_AtoL(unsigned char *arr)
{
	unsigned long lRez=0;
	while(*arr > 0x2F)
	{
		lRez = lRez*10+(*arr-'0');
		*arr++;
	}
	return lRez;
}

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

Добавлено: Пт июн 15, 2012 23:04:39
Eprinter
FreshMan писал(а):

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

// Reinitialize Timer 0 value
TCNT0=0x82;

if (++ms>=1000){ms=0;sec++;};
if (sec>=60)sec=0;
flag=1;
Судя по коду, у вас секундомер? Если нужна хорошая точность и в программе есть другие прерывания, то лучше записать так:
TCNT0 += 0x82;


vitalik_1984, согласен полностью 8)

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

Добавлено: Пт июн 15, 2012 23:07:49
FreshMan
понял, спасибо :beer:
а какие есть еще методы чтобы добиться максимальной точности хода ?

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

Добавлено: Пт июн 15, 2012 23:24:40
vitalik_1984
алгоритм брезенхейма позволяет использовать любой кварц для точного отсчета времени.

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

Добавлено: Сб июн 16, 2012 08:31:15
FreshMan
а ты лично этот алгоритм юзал на практике ? или это просто теоретические рассуждения ? :wink: