хотя может я и вообще неправильно понимаю....., обясните плиз
CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
хороший вопросик
я вот как бы понимать понимаю а обяснить немогу......
хотя может я и вообще неправильно понимаю....., обясните плиз
хотя может я и вообще неправильно понимаю....., обясните плиз
Tell Me The Truth
- Реклама
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: CodeVision AVR в вопросах и ответах
Не плодите сущностей без необходимости. Та строка делает именно то что я написал, а именно - ничего. Вот когда вы напишете anod_min_l; тогда и выполнится (PORTD|=(1<<4)); Что приведет к установке соответствующего бита. Это всего лишь формализованная эквивалентная логическая запись установки бита, из которой компилятор сделает
SBI PORTD,4
Это не маска. Под маской понимают обычно маскирование (сокрытие) определенной информации неким числом, блокированием если хотите - например x=PORTD&0b00001111; В данном случае "замаскированными' окажутся старшие 4-ре бита (на переменную х они влияния не окажут).
SBI PORTD,4
Это не маска. Под маской понимают обычно маскирование (сокрытие) определенной информации неким числом, блокированием если хотите - например x=PORTD&0b00001111; В данном случае "замаскированными' окажутся старшие 4-ре бита (на переменную х они влияния не окажут).
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Re: CodeVision AVR в вопросах и ответах
Вот обещанный код
Пока не проверял но вроде рабочий, понимает значения 0-9(0x32, 0x36....) в кодах ASCII, пробел конец числа. Принимаются последовательно числа, например '2' '4' '6' '.' '0' '1'' ' по резултату работы подпрограммы получаются числа 246 и 01 в десятичной форме.
Код: Выделить всё
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 в вопросах и ответах
За более оптимальный вариант буду
благодарен!!
Re: CodeVision AVR в вопросах и ответах
мне нужно нулевой таймер настроит на 1мс
если я сделаю вот такие настройки......, будет ли данный таймер начинать свой расчет с числа 82h ?

если я сделаю вот такие настройки......, будет ли данный таймер начинать свой расчет с числа 82h ?

Tell Me The Truth
- Реклама
Re: CodeVision AVR в вопросах и ответах
А можно вот так? Проверено, работает:FreshMan писал(а):мне нужно нулевой таймер настроит на 1мс
если я сделаю вот такие настройки......, будет ли данный таймер начинать свой расчет с числа 82h ?
Ваш вариант не совсем хорош - нужно каждый раз программно выставлять таймеру стартовое значение.
- Вложения
-
- timer0.gif
- (3.58 КБ) 749 скачиваний
[color=#006699]In der großen Familie nicht kluven klatz-klatz![/color]
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Eprinter ,попробуйте так же на меге 8 таймер ноль настроить.
и экран пришлите
и экран пришлите
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
Ну да, на меге8 таймер ноль так не настроишь. Зато есть таймер 1 или 2. Кстати, в вопросе тип МК не прозвучал.
Впрочем согласен, ответил не совсем в тему
Впрочем согласен, ответил не совсем в тему
[color=#006699]In der großen Familie nicht kluven klatz-klatz![/color]
Re: CodeVision AVR в вопросах и ответах
этот приемчик я знаюEprinter писал(а):А можно вот так? Проверено, работает:
это делается в фоновой задаче ?Eprinter писал(а):нужно каждый раз программно выставлять таймеру стартовое значение.
Tell Me The Truth
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
как таковых фоновых задач в АВР нет,есть имитация.так вот смену значения таймера производят во время прерывания самыми первыми тактами.(первые команды в подпрограмме)
В поисках истины человек развивается.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Имеется ввиду менять значение в самой подпрограмме обработки прерывания при переполнении.
Docendo discimus
Re: CodeVision AVR в вопросах и ответах
Посмотреть бы, как пробовали, может какой нюанс упущен.FreshMan писал(а):странно......., пробовал но не помогло
Таким способом ни разу не делал, но по логике возникает один нехороший камушек - если непосредственно перед переполнением таймера произойдёт другое прерывание, то таймер до установки начального значения успеет какое-то время посчитать с нуля. Это значит, что в момент прерывания по переполнению нужно проверять состояние счётчика и корректировать его начальное значение, иначе временной интервал будет гулять. В принципе задача не сложная, но требует дополнительной мышиной возни.
UPD можно просто прибавлять начальное значение для таймера к текущему.
[color=#006699]In der großen Familie nicht kluven klatz-klatz![/color]
Re: CodeVision AVR в вопросах и ответах
опосля очередной попытки и тсчательной проверки все заработало......, слава Богу !
и Вам спасибо, товарищи !
и Вам спасибо, товарищи !
Код: Выделить всё
// 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 в вопросах и ответах
Это значит, что в момент прерывания по переполнению нужно проверять состояние счётчика и корректировать его начальное значение, иначе временной интервал будет гулять. В принципе задача не сложная, но требует дополнительной мышиной возни.
ну если приложение критично,то конечно нужно.
а так в принципе не особо страшно,если цифра на пару микросекунд позже включится при динамической индикации
ну если приложение критично,то конечно нужно.
а так в принципе не особо страшно,если цифра на пару микросекунд позже включится при динамической индикации
В поисках истины человек развивается.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
signum, Вы чему-то плохому детей учите...
Перевод символьного asс массива десятичных чисел
Перевод символьного 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 в вопросах и ответах
Судя по коду, у вас секундомер? Если нужна хорошая точность и в программе есть другие прерывания, то лучше записать так:FreshMan писал(а):Код: Выделить всё
// Reinitialize Timer 0 value TCNT0=0x82; if (++ms>=1000){ms=0;sec++;}; if (sec>=60)sec=0; flag=1;
TCNT0 += 0x82;
vitalik_1984, согласен полностью
[color=#006699]In der großen Familie nicht kluven klatz-klatz![/color]
Re: CodeVision AVR в вопросах и ответах
понял, спасибо
а какие есть еще методы чтобы добиться максимальной точности хода ?
а какие есть еще методы чтобы добиться максимальной точности хода ?
Tell Me The Truth
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
алгоритм брезенхейма позволяет использовать любой кварц для точного отсчета времени.
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
а ты лично этот алгоритм юзал на практике ? или это просто теоретические рассуждения ? 
Tell Me The Truth


