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

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

Сообщение FreshMan »

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

Сообщение Goodefine »

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

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

Сообщение signum »

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

Сообщение FreshMan »

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

Сообщение Eprinter »

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

Сообщение vitalik_1984 »

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

Сообщение Eprinter »

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

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

Сообщение FreshMan »

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

Сообщение vitalik_1984 »

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

Сообщение FreshMan »

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

Сообщение pyzhman »

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

Сообщение Eprinter »

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

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

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

Сообщение 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
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

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

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

Сообщение 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]
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

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

Сообщение vitalik_1984 »

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

Сообщение FreshMan »

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

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