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

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

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

Сообщение FreshMan »

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

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

Сообщение Goodefine »

Не плодите сущностей без необходимости. Та строка делает именно то что я написал, а именно - ничего. Вот когда вы напишете anod_min_l; тогда и выполнится (PORTD|=(1<<4)); Что приведет к установке соответствующего бита. Это всего лишь формализованная эквивалентная логическая запись установки бита, из которой компилятор сделает
SBI PORTD,4
Это не маска. Под маской понимают обычно маскирование (сокрытие) определенной информации неким числом, блокированием если хотите - например x=PORTD&0b00001111; В данном случае "замаскированными' окажутся старшие 4-ре бита (на переменную х они влияния не окажут).
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Реклама
Аватара пользователя
signum
Встал на лапы
Сообщения: 84
Зарегистрирован: Ср июн 22, 2011 20:41:57
Откуда: Харьков

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

Сообщение 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 в десятичной форме.
Аватара пользователя
signum
Встал на лапы
Сообщения: 84
Зарегистрирован: Ср июн 22, 2011 20:41:57
Откуда: Харьков

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

Сообщение signum »

За более оптимальный вариант буду 8) благодарен!!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

мне нужно нулевой таймер настроит на 1мс
если я сделаю вот такие настройки......, будет ли данный таймер начинать свой расчет с числа 82h ?
Изображение
Tell Me The Truth
Реклама
Аватара пользователя
Eprinter
Опытный кот
Сообщения: 802
Зарегистрирован: Сб дек 19, 2009 14:51:11
Откуда: Нашенский

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

Сообщение Eprinter »

FreshMan писал(а):мне нужно нулевой таймер настроит на 1мс
если я сделаю вот такие настройки......, будет ли данный таймер начинать свой расчет с числа 82h ?
А можно вот так? Проверено, работает:
Изображение
Ваш вариант не совсем хорош - нужно каждый раз программно выставлять таймеру стартовое значение.
Вложения
timer0.gif
(3.58 КБ) 748 скачиваний
[color=#006699]In der großen Familie nicht kluven klatz-klatz![/color]
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Eprinter ,попробуйте так же на меге 8 таймер ноль настроить.
и экран пришлите
В поисках истины человек развивается.
Аватара пользователя
Eprinter
Опытный кот
Сообщения: 802
Зарегистрирован: Сб дек 19, 2009 14:51:11
Откуда: Нашенский

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

Сообщение Eprinter »

Ну да, на меге8 таймер ноль так не настроишь. Зато есть таймер 1 или 2. Кстати, в вопросе тип МК не прозвучал.

Впрочем согласен, ответил не совсем в тему :oops:
[color=#006699]In der großen Familie nicht kluven klatz-klatz![/color]
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

Eprinter писал(а):А можно вот так? Проверено, работает:
этот приемчик я знаю :))
Eprinter писал(а):нужно каждый раз программно выставлять таймеру стартовое значение.
это делается в фоновой задаче ?
Tell Me The Truth
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

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

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

Сообщение FreshMan »

странно......., пробовал но не помогло :dont_know:
Tell Me The Truth
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Имеется ввиду менять значение в самой подпрограмме обработки прерывания при переполнении.
Docendo discimus
Аватара пользователя
Eprinter
Опытный кот
Сообщения: 802
Зарегистрирован: Сб дек 19, 2009 14:51:11
Откуда: Нашенский

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

Сообщение Eprinter »

FreshMan писал(а):странно......., пробовал но не помогло :dont_know:
Посмотреть бы, как пробовали, может какой нюанс упущен.

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

UPD можно просто прибавлять начальное значение для таймера к текущему.
[color=#006699]In der großen Familie nicht kluven klatz-klatz![/color]
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение 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;

}
Tell Me The Truth
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

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

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

Сообщение 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;
}
Аватара пользователя
Eprinter
Опытный кот
Сообщения: 802
Зарегистрирован: Сб дек 19, 2009 14:51:11
Откуда: Нашенский

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

Сообщение 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)
[color=#006699]In der großen Familie nicht kluven klatz-klatz![/color]
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

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

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

Сообщение vitalik_1984 »

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

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

Сообщение FreshMan »

а ты лично этот алгоритм юзал на практике ? или это просто теоретические рассуждения ? :wink:
Tell Me The Truth
Ответить

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