У таймера 0 в меге8 нет режимов Phase Correct PWM и CTC. Считает только вперед. Предделитель один на два таймера, но у него 4 выхода и для каждого таймера можно выбрать индивидуально частоту с предделителя: /8, /64, /256, /1024. Имелся ввиду, конечно, сброс предделителя - использовать с осторожностью.
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19745 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Да, речь конкретно про самый простой т/с0 в Мега8, соответствующий пруф (картинки из ДШ) представлен. Прескалер у т/с1 и т/с0 общий, а вот мультиплексоры источника тактирования у каждого свой. Интересно что он всегда считает с частотой clkI/O, даже ни один таймер не задействован. Хотя в процентном отношении по сравнению с ядром, он, наверное, жрёт не много.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19745 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
COKPOWEHEU писал(а):
Но в TCCR0 битов WGMx не предусмотрено.
Наверное, имеется в виду программный Надо же для пафоса побольше умных слов понаписать.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Вот только программный генератор частоты не хватало городить на этом убожестве. Ладно бы был хотя бы асинхронным, подобрать предделитель и считать секунды, так и этого нет. Я ему вижу всего несколько применений: - измерение частоты на выводе Т0 - переключение задач в RTOS или ее подобии - полупрограммный счет времени Программные ШИМы и CTC за применение именно этого таймера не считаю.
На ATmega8-то, с чего бы? Да и необходимость ОСРВ определяется не мощностью контроллера а задачей. Например, нужно опрашивать клавиатуру, выводить данные на дисплейчик, UART и SPI. При этом что-то регулировать. Можно, конечно, реализовать все это вручную, но и RTOS в данном случае не помешает. Сами задачи простые, но их много и надо отслеживать чтобы они друг другу не мешали.
а вот мультиплексоры источника тактирования у каждого свой.
А, что за мультиплексор такое (шо цэ такэ?!) Вы написали про источник тактирования - Источник тактирования -это генератор который выдаёт импульсы определённого времени и счётчик их считает. А что такое мультиплексор объясните пожалуйста и для чего он нужен в таймерах. Не раз слышал про про выражение -мультиплексор.
В таймерах он нужен для того, чтобы: а) иметь возможность выбора источника тактовых импульсов (внешний/внутренний) и б) иметь возможность выбора коэффициента деления (прескалера) оных.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Всем доброго времени суток, сильно не пинайте-первая самостоятельная работа с МК. Есть Мега2560, пишу прогу в ассамблере (С не владею), требуется внести байт настройки в TCCR1B (аналогично можно в любой другой регистр), компилятор ругается на превышение значения первого операнда:
out TCCR1B, TEMP1 ; НАСТРОЙКА ПРЕДДЕЛИТЕЛЯ НА 1024
и это понятно, ведь первым операндом в операции OUT может быть число от 0 до 63, а адресуемый регистр TCCR1B имеет адрес 0х81. Подскажите, как правильно кинуть в него данные? По аналогии и в любой другой регистр с адресом выше 0х3F (63 в дес.виде), если 0х3F предел адресации команды OUT.
Заголовок сообщения: Re: Знатоки ATMega, как настроить таймер?
Добавлено: Вс сен 22, 2013 16:37:21
Опытный кот
Карма: 3
Рейтинг сообщений: 43
Зарегистрирован: Вт апр 12, 2011 18:38:19 Сообщений: 838 Откуда: с Земли
Рейтинг сообщения:1
Известный косячек... Используйте инструкции STS/LDS вместо OUT/IN для регистров с адресом больше 63. У AVR все "лежит" в одном адресном пространстве. У Атмелов был даже аппнот с макросом, который сам подсовывал нужную инструкцию. Щас уже не помню какой, тк на AVR забил. UPD: нашел http://www.atmel.com/Images/doc2550.pdf и http://www.atmel.com/Images/AVR001.zip
_________________ Все будет только лучше, в крайнем случае - хуже.
Вот спасибо большое! Все пошло сразу! Не учел,дурья голова,что адреса старше 63 располагаются в RAM))) А насчет скрипта,он ведь на СИ,разве я могу его вставить в программу на ассамблере? Огромное спасибо за подсказку!
Понятно,будем пробовать И попутный вопросик: что где требуется прописать,чтоб заработали внешние (и внутренние) прерывания. В регистр TCCR я внес настройки режима СТС. В регистр EIMSK пытаюсь внести 0b00000001 для разрешения работы INT0 :
LDI TEMP1, 0b00000001 STS EIMSK, TEMP1
Но при прогоне в симуляторе AVRStudio моя единичка ну никак не хочет записываться в EIMSK В чем может быть беда? И нужно-ли настраивать регистры EIСRA, EIСRB и MCUCR для запуска работы INT0? Поборол я его)) Так вот он заработал:
LDI TEMP1, 0b00000001 OUT EIMSK, TEMP1
Таймер запустить удалось,но не происходит прерывание по совпадению((( В OCR1A внес требуемый интервал, настроил предделитель на CLK/1024 в TIMSK внес 2 - установил бит OCIE1A в единицу (прерывание по равенству TCNT1 и OCR1A), включил глобальные прерывания SEI, но чуда не случилось. Счетный регистр переполняется свыше OCR1A а прерывание не поступает В чем я ошибся? Включил глобальные прерывания командой SEI. Подпрограмма запуска таймера у меня вызывается обработчиком прерывания с лапки INT0, но при прижатии ноги INT0 к земле прерывания не возникло И на будущее,как настроить прерывания по ногам PCINTn? Ну и совсем нубский вопрос: что означает запись (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0) или (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)? Как расшифровать эти иероглифы? Ну и остальные на них похожие)) Я верно понимаю, что это операции установки отдельных битов регистров портов ввода-вывода в единицу?
Последний раз редактировалось Ghostgkd777 Вс сен 22, 2013 22:36:13, всего редактировалось 2 раз(а).
Заголовок сообщения: Re: Знатоки ATMega, как настроить таймер?
Добавлено: Вс сен 22, 2013 20:33:07
Опытный кот
Карма: 3
Рейтинг сообщений: 43
Зарегистрирован: Вт апр 12, 2011 18:38:19 Сообщений: 838 Откуда: с Земли
Рейтинг сообщения:0
По XMega не подскажу. Я, как уже писал, забил на AVR уже пару лет назад. Те я использую пока только "малоногие" тиньки, и в будущем, скорее всего, откажусь и от них. Скажем, XMega не может тягаться с ARM ни по производительности, ни по цене. Однако не стоит начинать холивар.
Ghostgkd777 писал(а):
Ну и совсем нубский вопрос: что означает запись (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0) или (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)? Как расшифровать эти иероглифы? Ну и остальные на них похожие)) Я верно понимаю, что это операции установки отдельных битов регистров портов ввода-вывода в единицу?
А (1<<PB7) означает единичку, сдвинутую на позицицю PB7. (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0) - это объединенные операцией ИЛИ такие единички, что в результате даст 0b11000011 или 0xC3. Все эти конструкции вычисляются компилятором на стадии сборки и представляют собой ничто инное, как константы. Такая запись просто улучшает читабельность текста программы.
_________________ Все будет только лучше, в крайнем случае - хуже.
Спасибо,я примерно так и понял)) Я мучаю не ХМегу а обычную ATMega2560. Понимаю,что не с того "жука" начал освоение АВР, но обстоятельства диктуют свои правила)) Чтож,может еще кто подскажет, почему в EIMSK не хотят писаться байтики... С EIMSK разобрался. Требовалось заносить данные командой OUT, а не STS, как я пытался. После занесения единички в нулевой разряд EIMSK мои прерывания заработали, но почему-то не INT0, а INT1! Если выставить единичку в первый бит EIMSK, начинает работать прерывание INT3! почему не по порядку,как должно было быть?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения