Страница 30 из 628
Добавлено: Чт июл 31, 2008 14:19:57
Барсик
Krik99 писал(а):Скажите как настроить таймер на tiny2313 чтобы срабатывал каждую 1 секунду
BerZerK-ku писал(а)://4Мгц/1024 = 3906,25Гц.
А почему бы не использовать прескалер = 256 ? Там же есть такой. Тогда вообще всё получается шоколадно: 4Мгц/256 = 15625 Гц. Загнать таймер в режим "Clear Timer on Compare Match (CTC) Mode", и в регистр сравнения (Output Compare Register) прописать 15625 ... И никаких ошибок в сутки.
Добавлено: Чт июл 31, 2008 18:44:58
Krik99
Интересно... Спасибо! А не моглибы вы поделится формулой для подсчёта на разных частотах МК ?

Добавлено: Чт июл 31, 2008 22:31:32
Барсик
Если насчёт формулы Вы обратились ко мне, то никакой формулы у меня нет. Всё написано в datasheet. Надо просто изучить, как работают таймеры и включить здравый смысл. Перед каждым таймером можно включить счётчик, который делит тактовую частоту контроллера. Этот счётчик называется "Prescaler". Смотрите в datasheet раздел "Timer/Counter0 and Timer/Counter1 Prescalers". К сожалению, для этого счётчика нельзя установить произвольный коэффициент деления. Можно только выбрать одно из значений: "The prescaled clock has a frequency of either fCLK_I/O/8, fCLK_I/O/64, fCLK_I/O/256, or fCLK_I/O/1024." Остальное можно "доделить" уже на самом таймере. Если использовать таймер 0, то он может делить, максимум, на 256. Ели таймер1, то можно делить уже на 65536.
Главная задача - представить частоту кварца в виде произведения множителей, а эти множители распределить между счётчиками - прескалером, таймером, и можно также организовать счётчик программно.
Добавлено: Пт авг 01, 2008 06:32:43
BerZerK-ku
Барсик писал(а):А почему бы не использовать прескалер = 256 ? Там же есть такой. Тогда вообще всё получается шоколадно: 4Мгц/256 = 15625 Гц. Загнать таймер в режим "Clear Timer on Compare Match (CTC) Mode", и в регистр сравнения (Output Compare Register) прописать 15625 ... И никаких ошибок в сутки.
умная мысля приходит опосля

Добавлено: Пт авг 01, 2008 08:18:53
Krik99
Примерно как считать я понял. Говорят что можно ещё после переполнения не с нуля начинать, а с определённого знчения. Я так понял что с начало считают 4000000/256=15625, а потом ставят значение Output Compare Register = 15625... Output Compare Register в него пишеш любое значение какое тебе нужно, лижбы без десятичных, правильно я понял? Вот хочу ещё подсчитать для 100 раз в секунду. Можно былобы 4000000/256=15625/100=156,25 но тут будет не точно изза десятичных оставшихся. А вот так 4000000/64=62500/100=625 и можно ставить Output Compare Register = 625 , и если я не ошибаюсь частота должна быть 100 прерываний в секунду? Правильно ли я думаю?
Добавлено: Пт авг 01, 2008 09:23:42
BerZerK-ku
Krik99 писал(а):Говорят что можно ещё после переполнения не с нуля начинать, а с определённого знчения.
Можно. Достаточно в TCNTx записать нужное значение.
Krik99 писал(а):А вот так 4000000/64=62500/100=625 и можно ставить Output Compare Register = 625 , и если я не ошибаюсь частота должна быть 100 прерываний в секунду? Правильно ли я думаю?
Верно.
При использовании прерывания (флага прерывания) сравнения надо не зыбывать про TCNTx. Например: если счет идет от о до 625, то надо его обнулять.
Добавлено: Пт авг 01, 2008 13:05:57
Барсик
BerZerK-ku писал(а):...При использовании прерывания... надо не зыбывать про TCNTx ...надо его обнулять.
Лучше как раз забыть об этом раз и навсегда. Для этого надо использовать режим таймера "Clear Timer on Compare Match (CTC) Mode", о котором я писал выше. В этом режиме не требуется обнулять счётчик. Он обнуляется сам, когда достигнет значения, которое находится в регистре сравнения (Output Compare Register). Таким образом, при инициализации таймера, вы задаёте режим "CTC", и только один раз загружаете значение коэффициента пересчёта в регистр сравнения. Дальше таймер сам молотит как миленький без Вашего участия.
P.S. Да, и прерывание надо использовать не по переполнению счётчика, а по совпадению с регистром сравнения:
5 0x0004 TIMER1 COMPA Timer/Counter1 Compare Match A
Добавлено: Сб авг 02, 2008 18:16:01
BerZerK-ku
Вот, уже что-то новое узнал. Всегда в этом прерываниии обнулял счетчик таймера

Добавлено: Вс авг 03, 2008 11:05:24
Krik99
Что-то запутался. А может показать как это 4Мгц/256 = 15625 Гц и (Output Compare Register) = 15625 будет смотрется в настройках таймера для Timer1 в tiny2313. За ранние спасибо.
Добавлено: Вс авг 03, 2008 11:24:03
Pippeytz
а можно где-нибдуь скачать имеджКрафт про безплатно? чертовы буржуины просят за ImageCraft pro на официальном сайте 500 баков

, а все безплатное только на 30 дней
Добавлено: Вс авг 03, 2008 11:40:06
BerZerK-ku
Krik99 писал(а):Что-то запутался. А может показать как это 4Мгц/256 = 15625 Гц и (Output Compare Register) = 15625 будет смотрется в настройках таймера для Timer1 в tiny2313. За ранние спасибо.
Код: Выделить всё
TIFR=0xFF; // сброс флагов прерываний таймера
TIMSK|= 1<<OCIE1A; // установка прерывания по совпадению
TCNT1=0; //установка счетчика таймера
//4Мгц/256 = 15625Гц.
OCR1=15625; //утсановка регистра сравнения
TCCR1B=0x04; //запуск таймера с делителем 256
Добавлено: Вс авг 03, 2008 16:08:10
Барсик
BerZerK-ku писал(а):TIFR=0xFF; // сброс флагов прерываний таймера
А зачем устанавливать регистр флагов прерываний?
У меня получилось примерно то же самое:
Код: Выделить всё
// установка режимов и прескалера
TCCR1A=0x00;
TCCR1B=0x0C;
// загрузка регистра сравнения
OCR1A=15625;
// разрешаем прерывания по совпадению с регистром сравнения
TIMSK=0x40;
Krik99 писал(а):Что-то запутался...
Дык надо взять datasheet и тупо присвоить значения соотвествующим управляющим регистрам.
А в CodeVisionAVR можно вызвать автоматический генератор программ и просто расставить галки в настройках таймера.
Добавлено: Пн авг 04, 2008 06:39:03
BerZerK-ku
Барсик писал(а):BerZerK-ku писал(а):TIFR=0xFF; // сброс флагов прерываний таймера
А зачем устанавливать регистр флагов прерываний?
Это сброс флагов прерываний, черт его знает что в регистре по включению сидит.
Добавлено: Пн авг 04, 2008 07:57:57
Krik99
Всем спасибо! Всё понял.
Добавлено: Пн авг 04, 2008 14:23:39
Барсик
BerZerK-ku писал(а):... черт его знает что в регистре по включению сидит.
Я по простоте душевной всегда думал, что при включении или сбросе в регистрах сидит то, что в datasheet называют "Initial Value". Для регистра TIFR это значение = 00000000. Или я не прав?
Кроме того, я всегда считал, что установленному флагу соответствует логическая 1, а сброшенному - 0. А Вы говорите, что сбрасываете флаги, а сами присваиваете регистру значение 0xFF. Или я что-то не догоняю ?
Добавлено: Пн авг 04, 2008 14:55:21
BerZerK-ku
Барсик писал(а):BerZerK-ku писал(а):... черт его знает что в регистре по включению сидит.
Я по простоте душевной всегда думал, что при включении или сбросе в регистрах сидит то, что в datasheet называют "Initial Value". Для регистра TIFR это значение = 00000000. Или я не прав?
Первый раз слышу об этом. Запомню. Просто всегда перестраховывался.
Барсик писал(а):
Кроме того, я всегда считал, что установленному флагу соответствует логическая 1, а сброшенному - 0. А Вы говорите, что сбрасываете флаги, а сами присваиваете регистру значение 0xFF. Или я что-то не догоняю ?
OCF0 is cleared by writing a logic one to the flag
Вроде бы все флаги прерываний в AVR сбрасываются так програмным образом.
Добавлено: Пн авг 04, 2008 15:46:50
Барсик
BerZerK-ku писал(а):Вроде бы все флаги прерываний в AVR сбрасываются так програмным образом.
В смысле, "клин клином вышибают"?

Т.е. значение флага равно лог.1. Чтобы его сбросить, надо в тот же флаг записать тоже лог.1, и получится значение лог.0 ?
Добавлено: Вт авг 05, 2008 06:50:06
BerZerK-ku
Барсик писал(а):В смысле, "клин клином вышибают"?

Т.е. значение флага равно лог.1. Чтобы его сбросить, надо в тот же флаг записать тоже лог.1, и получится значение лог.0 ?
Так уж сделано.
Добавлено: Вт авг 05, 2008 15:36:04
Барсик
Да. Хорошее у них чувство юмора. Чтобы сбросить флаг - пиши единицу. Чтобы установить фьюз - пиши ноль.

Добавлено: Сб авг 09, 2008 16:02:50
Radio_Master
здраствуйте товарисчи!!!Подскажите,пожалуйста,какой датчик можно прицепить к мк что бы измерять маленький вес,или хотя бы фиксировать изменение веса или давления на какую нить пластинку.
Зараннее благодарен.