| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > [avr] помогите с таймером на tiny 13 |
| Автор: hawk3500 24.4.2011, 20:15 |
| Здравствуйте. Делаю таймр под avr tiny 13 Подскажите как сделать функцию(подпрограмму) которая будет просто ожидать указанное время минут и секунд. Как работать с таймерами? Читал много мануала, но до конца всё равно не понял как допустим просто сделать паузу в 1 секунду. Заранее благодарен. |
| Автор: Курсант 24.4.2011, 20:33 | ||
| Я конечно не претендую на правильность, но у меня тупая задержка времени стоит... Я поставил три вложенных счетчика... точно в асме не помню как, но примерно так:
смысл такой, что пройдет целая куча тактов, прежде чем программа доберется до метки "4". Но это конечно жуткий быдлокод, а вот чтобы программировать в реальном времени - это наверное сложнее, может какой watchdog применить или считать такты - тут не знаю... Сам пока не дошел... |
| Автор: hawk3500 24.4.2011, 20:41 |
| да такого рода я делал, но высоая погрешность.... копаю в сторону TCCNT...как я поняял это банальный счётчик команд.. но как с ним совладать я не знаю...... Если кто в курсе отзавитесь) Заранее благодарен. |
| Автор: Mazzi 24.4.2011, 20:55 |
| Используй библиотечную функцию delay для требуемой задержки. |
| Автор: hawk3500 25.4.2011, 06:40 |
| А где эту функцию взять? |
| Автор: UniBomb 25.4.2011, 08:23 | ||||
| hawk3500, где, где... Вот ты не указал, чем ты пользуешся (avr-gcc, iar, icc, avrstudio), и Mazzi решил промолчать Ну а вообще для задержек (если действительно нужно задержка без выполнения других действий) можно использовать "бесполезный" цикл. В простейшем случае он выглядит так:
Данный код не делает ничего полезного, но при этом он занимает систему на определённое время. Была даже выведенная формула, по которой можно было определить на сколько тактов он займёт систему, но за давностью лет я её не помню Если максимально-возможная задержка окажется недостаточной (из-за ограничения на аргумент в 255), то можно использовать аналогичные вложенные циклы:
С учётом вложенности циклов формула расчёта итоговой задержки будет немного отличаться от предыдущей. В качестве домашнего задания предлагаю вывести формулу для этого "двойного" цикла самостоятельно. Ну и далее по наитию - этот цикл можно наворачивать до тех пор, пока регистры общего назначения не кончатся. Но и при этом следует помнить, что полученная задержка будет измеряться тактами. Что бы сделать задержку по времени нужно время перевести в количество тактов, и это количество тактов передать в качестве аргумента в эти подпрограммы f(cpu) - это частота, на которой работает мк. Иными словами за одну секунду мк выполнит f тактов. А нам нужно t секунд. Тогда количество тактов будет равно t(сек)*f(такт/сек). Только не забудь время задержки перевести в секунды |
| Автор: hawk3500 26.4.2011, 14:58 | ||
я делаю вот так. Пишу в avr studio. Хотелось бы сделать так как вы гоорите: " Настроить прерывание от его (таймера) переполнения и в обработчике прерывания увеличивать (или уменьшать) счетчик." Но как это сделать я не знаю. Подскажите пожалуйста. |
| Автор: xvr 26.4.2011, 20:57 |
| Писать на С. |
| Автор: UniBomb 27.4.2011, 08:21 | ||||
| И всё равно мне не понятен сакральный смысл применения в этом случае таймера. Ведь программа (как я понял) всё равно ничего не будет делать, пока таймер не отсигнализирует о прошествии необходимого времени. Ведь лезвие достопочтенного Уильяма Оккамы не зря гласит "не следует плодить сущности без крайней на то необходимости". Таймер он ведь может понадобится в другом месте. Ну да ладно. hawk3500, во-первых на какой частоте работает твой мк? Именно от этой частоты нужно плясать при настройке таймера. Настрой его на период срабатывания в 1 миллисекунду. Без знания частоты и без даташита (не использую я тиньки
Далее - заводишь ещё одну переменную под миллисекунды (.def msec=r17) и в обработчике прерывания от таймера пишешь нечто подобное:
Хотя обработчик наверное можно и более красиво написать, но у меня давно не было практики в ассемблере |
| Автор: UniBomb 27.4.2011, 08:39 |
| А, пока писал забыл о чём вопрос |
| Автор: smalcom 1.5.2011, 09:35 |
| >>но до конца всё равно не понял как допустим просто сделать паузу в 1 секунду. Что сложного? 1. Загрузил в таймер нужное значение 2. подождал пока не сработает прерывание по переполнению 3. PROFIT??? |
| Автор: UniBomb 1.5.2011, 13:58 |
| smalcom, спасибо, капитан! |