Свежие обсуждения
Микроконтроллеры

Вопросы по ATmega8

1 2 3

Конечно возвращается. И обработчикик прерываний, и sleep отрабатывает как обычно, единственное, что некоторые прерывания в режиме шумопонижения автоматически маскируются на время оцифровки (какие именно - см даташит, наизусть не помню).

 

понял, спасибо огромное за ответы пошел писать дальше...

 

В CodeVision есть процедура Delay_ms(100)
Откуда контроллер знает на какой частоте он работает т.е. кварц какой у него стоит? Чтобы правильно посчитать эти 100 мс ?
На время выполнения ее прерывания приостанавливаются?

 

Lerik: Откуда контроллер знает на какой частоте он работает
Думаю, не фига он не знает, Вы среде говорите это, где-нибудь в опциях проекта.

 

В CodeVision не работаю, а в WinAVR GCC частота задается в makefile константой F_CPU. И что значит "прерывания приостанавливаются"? Выполняется cli? Скорее всего нет - даже миллисекунды хватит, чтобы порастерять все прерывания. Так вообще-то не делается

 

chav1961: В CodeVision не работаю, а в WinAVR GCC частота задается в makefile константой F_CPU

Это совершенно не обязательно У меня, например, частота задаётся в файле

common.h

 

Где это записать в программе так и не нашел, но нашел, что частота процессора записывается в ini файле проекта CPUClock= .....

to chav1961 ◊
И что значит "прерывания приостанавливаются"? Выполняется cli? Скорее всего нет - даже миллисекунды хватит, чтобы порастерять все прерывания. Так вообще-то не делается

Это я спрашивал, что если я на Delay_ms организую подсчет времени (часы, минуты), но у меня же еще работает остальная часть программы, где есть свои таймера с прерываниями и другие всякие прерывания, какое влияние эта Delay_ms окажет на них? Может тупо дойдет до Delay_ms и будет сидеть ждать пока эта выдержка не закончится, а уже потом начнет прерывания обрабатывать? Как она себя ведет при работе программы?
И как лучше организовать подсчет времени (выдержка часы, минуты) для задачи таймера?

 

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

 

Ну как правильно делать я осознаю и как таймер работает тоже, просто на таймере по моему замороченнее хотелось попроще Сутки считать не будет, максимум 8 часов, если погрешность составит минуту, то это допустимо.
Но все таки как оно это Delay_ms работает совместно с программой? Нигде не нашел его текста, видимо это макрос зашитый в СИ и наверняка его работа тоже основана на таймере микроконтроллера. Если работает Delay_ms, остальные прерывания будут выполняться во время Delay_ms?

 

Lerik: Но все таки как оно это Delay_ms работает совместно с программой?

Обычно это глухой цикл, который крутится примерно 1мс. Если есть прерывания, то дольше.

Я делаю иначе. Настраиваю таймерное прерывание на 1КГц, в нём пишу:


if (timer_ticks) timer_ticks--;

и тогда :


void delay_ms(unsigned char ms)
{
timer_ticks = ms;
while (timer_ticks);
}

timer_ticks надо объявить как volatile.