Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18: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 ... И никаких ошибок в сутки.
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

Интересно... Спасибо! А не моглибы вы поделится формулой для подсчёта на разных частотах МК ? :)
Изображение
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Если насчёт формулы Вы обратились ко мне, то никакой формулы у меня нет. Всё написано в 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.
Главная задача - представить частоту кварца в виде произведения множителей, а эти множители распределить между счётчиками - прескалером, таймером, и можно также организовать счётчик программно.
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Барсик писал(а):А почему бы не использовать прескалер = 256 ? Там же есть такой. Тогда вообще всё получается шоколадно: 4Мгц/256 = 15625 Гц. Загнать таймер в режим "Clear Timer on Compare Match (CTC) Mode", и в регистр сравнения (Output Compare Register) прописать 15625 ... И никаких ошибок в сутки.


умная мысля приходит опосля :)
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение 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 прерываний в секунду? Правильно ли я думаю?
Изображение
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Krik99 писал(а):Говорят что можно ещё после переполнения не с нуля начинать, а с определённого знчения.


Можно. Достаточно в TCNTx записать нужное значение.

Krik99 писал(а):А вот так 4000000/64=62500/100=625 и можно ставить Output Compare Register = 625 , и если я не ошибаюсь частота должна быть 100 прерываний в секунду? Правильно ли я думаю?


Верно.

При использовании прерывания (флага прерывания) сравнения надо не зыбывать про TCNTx. Например: если счет идет от о до 625, то надо его обнулять.
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18: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
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Вот, уже что-то новое узнал. Всегда в этом прерываниии обнулял счетчик таймера :)
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

Что-то запутался. А может показать как это 4Мгц/256 = 15625 Гц и (Output Compare Register) = 15625 будет смотрется в настройках таймера для Timer1 в tiny2313. За ранние спасибо.
Изображение
Аватара пользователя
Pippeytz
Потрогал лапой паяльник
Сообщения: 396
Зарегистрирован: Ср май 28, 2008 19:30:31
Откуда: Донецк
Контактная информация:

Сообщение Pippeytz »

а можно где-нибдуь скачать имеджКрафт про безплатно? чертовы буржуины просят за ImageCraft pro на официальном сайте 500 баков :shock:, а все безплатное только на 30 дней
Полный пипеутз.
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение 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
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

BerZerK-ku писал(а):TIFR=0xFF; // сброс флагов прерываний таймера

А зачем устанавливать регистр флагов прерываний?

У меня получилось примерно то же самое:

Код: Выделить всё

// установка режимов и прескалера
TCCR1A=0x00;
TCCR1B=0x0C;

// загрузка регистра сравнения
OCR1A=15625;

// разрешаем прерывания по совпадению с регистром сравнения
TIMSK=0x40;


Krik99 писал(а):Что-то запутался...

Дык надо взять datasheet и тупо присвоить значения соотвествующим управляющим регистрам.
А в CodeVisionAVR можно вызвать автоматический генератор программ и просто расставить галки в настройках таймера.
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Барсик писал(а):
BerZerK-ku писал(а):TIFR=0xFF; // сброс флагов прерываний таймера

А зачем устанавливать регистр флагов прерываний?


Это сброс флагов прерываний, черт его знает что в регистре по включению сидит.
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

Всем спасибо! Всё понял.
Изображение
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

BerZerK-ku писал(а):... черт его знает что в регистре по включению сидит.

Я по простоте душевной всегда думал, что при включении или сбросе в регистрах сидит то, что в datasheet называют "Initial Value". Для регистра TIFR это значение = 00000000. Или я не прав?
Кроме того, я всегда считал, что установленному флагу соответствует логическая 1, а сброшенному - 0. А Вы говорите, что сбрасываете флаги, а сами присваиваете регистру значение 0xFF. Или я что-то не догоняю ?
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Барсик писал(а):
BerZerK-ku писал(а):... черт его знает что в регистре по включению сидит.

Я по простоте душевной всегда думал, что при включении или сбросе в регистрах сидит то, что в datasheet называют "Initial Value". Для регистра TIFR это значение = 00000000. Или я не прав?

Первый раз слышу об этом. Запомню. Просто всегда перестраховывался.
Барсик писал(а):Кроме того, я всегда считал, что установленному флагу соответствует логическая 1, а сброшенному - 0. А Вы говорите, что сбрасываете флаги, а сами присваиваете регистру значение 0xFF. Или я что-то не догоняю ?

OCF0 is cleared by writing a logic one to the flag

Вроде бы все флаги прерываний в AVR сбрасываются так програмным образом.
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

BerZerK-ku писал(а):Вроде бы все флаги прерываний в AVR сбрасываются так програмным образом.

В смысле, "клин клином вышибают"? :) Т.е. значение флага равно лог.1. Чтобы его сбросить, надо в тот же флаг записать тоже лог.1, и получится значение лог.0 ?
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

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

Так уж сделано.
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Да. Хорошее у них чувство юмора. Чтобы сбросить флаг - пиши единицу. Чтобы установить фьюз - пиши ноль. :shock:
Аватара пользователя
Radio_Master
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу
Контактная информация:

Сообщение Radio_Master »

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

Вернуться в «Разные вопросы по МК»