|
Таймер, Непонятно, как можно так писать? |
|
|
|
Jan 31 2007, 14:27
|
Группа: Новичок
Сообщений: 8
Регистрация: 31-01-07
Пользователь №: 24 905

|
Вот фрагмент кода
TimeLoop: out TCNT0, temp ;Сохраняем содержимое регистра таймера счетчика в temp cp temp, 80 ; Сравниваем это содержимое с 80 brne TimeLoop ; Если не равно, то возвращаемся к началу цикла
Вот мне непонятна одна вещь: каждая команда выполняется за один такт (какие-то команды могут выполняться за 2 такта). Один такт и в регистре таймера счетчика оказывается 1 (предполагается, что делитель частоты не используется). Следоваетльно в цикле описанном выше можно проскочить момент, когда в регистре таймера счетчика будет 80. Может, я что-то неправильно здесь понимаю? Конечно, по мне гораздо удобнее воспользоваться прерываниями.
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 14)
|
Jan 31 2007, 14:39
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата Непонятно, как можно так писать? А кто ЭТО так пишет? Цитата out TCNT0, temp ;Сохраняем содержимое регистра таймера счетчика в temp это  загружает temp в TCNT0 если нужен такой цикл то пишут через флаг например так: Код WAIT_T: WDR IN TMP1,TIFR ; SBRS TMP1,OCF1A ;ОЖИДАТЬ ПОЯВЛЕНИЯ ФЛАГА СОВПАДЕНИЯ ТАЙМЕРА(1)(1) RJMP WAIT_T
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Jan 31 2007, 14:40
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(T&D @ Jan 31 2007, 18:27)  out TCNT0, temp ;Сохраняем содержимое регистра таймера счетчика в temp Судя по комментарию, должно выглядеть наоборот: Код in temp, TCNT0; !!! А в Вашем коде Вы наоборот загоняете в TCNT0 то, что находится в temp...
--------------------
|
|
|
|
|
Jan 31 2007, 14:52
|
Группа: Новичок
Сообщений: 8
Регистрация: 31-01-07
Пользователь №: 24 905

|
Цитата(prottoss @ Jan 31 2007, 14:40)  Цитата(T&D @ Jan 31 2007, 18:27)  out TCNT0, temp ;Сохраняем содержимое регистра таймера счетчика в temp Судя по комментарию, должно выглядеть наоборот: Код in temp, TCNT0; !!! А в Вашем коде Вы наоборот загоняете в TCNT0 то, что находится в temp... Скорее всего и наоборот, но вопрос немного в другом был: Есть вероятность, что мы при таком написании пропустим момент, когда в регистре таймера счетчика окажется 80? И следовательно не выйдем из цикла, хотя должны были выйти? Например, когда будет выполняться команда сравнения в регистре таймера будет 80, а в переменную temp сохранилось 79. 79 не равно 80, опять попадаем в цикл. Сохраняем в переменную temp значение таймера счетчика, а в нем уже 81 или 82, таким образом мы проскакиваем значение 80. Или я что-то в этом недопонимаю?
|
|
|
|
|
Jan 31 2007, 15:06
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата Есть вероятность, что мы при таком написании пропустим момент, когда в регистре таймера счетчика окажется 80? И следовательно не выйдем из цикла, хотя должны были выйти? Например, когда будет выполняться команда сравнения в регистре таймера будет 80, а в переменную temp сохранилось 79. 79 не равно 80, опять попадаем в цикл. Сохраняем в переменную temp значение таймера счетчика, а в нем уже 81 или 82, таким образом мы проскакиваем значение 80. Или я что-то в этом недопонимаю? Да, и это можно проверить в AVR_Studio, запустив отладчик и посмотреть как будет меняться переменная temp в этом цикле.
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Jan 31 2007, 15:10
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Да...уф.. Задача собственно несовсем понятна, даже совсем непонятна!? Чем Вам не нравятся прерывания? зачем программно следить за переполнением? Ну абстрагируясь :-), в вашем случае должно быть так: TimeLoop: in temp,TCNT0;Сохраняем содержимое регистра таймера счетчика в temp cpi temp, 80 ; Сравниваем это содержимое с 80 (именно cpi!!!) brlo TimeLoop ; Если меньше, то возвращаемся к началу цикла
Зы: Я заранее извиняюсь, может это и не так, но тема и вопрос очень тянут наизвечную проблему новичков "хочу в свои" и "как мне набрать постов.." Надеюсь что это не так.:-)
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Jan 31 2007, 15:23
|
Группа: Новичок
Сообщений: 8
Регистрация: 31-01-07
Пользователь №: 24 905

|
Цитата(add @ Jan 31 2007, 15:10)  Да...уф.. Задача собственно несовсем понятна, даже совсем непонятна!? Чем Вам не нравятся прерывания? зачем программно следить за переполнением? Ну абстрагируясь :-), в вашем случае должно быть так: TimeLoop: in temp,TCNT0;Сохраняем содержимое регистра таймера счетчика в temp cpi temp, 80 ; Сравниваем это содержимое с 80 (именно cpi!!!) brlo TimeLoop ; Если меньше, то возвращаемся к началу цикла
Зы: Я заранее извиняюсь, может это и не так, но тема и вопрос очень тянут наизвечную проблему новичков "хочу в свои" и "как мне набрать постов.." Надеюсь что это не так.:-) Этот пример не мной придуман, он взят из книги Мортона "Микроконтроллеры AVR. Вводный курс". Мне лично прерывания нравятся, и я бы их использовал. Но этот автор привел такой пример и утверждает, что он работает, хотя по мне, так мы можем очень долго не выйти из этого цикла, если идет проверка именно на равенство какому-либо числу.
|
|
|
|
|
Jan 31 2007, 15:27
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата Этот пример не мной придуман, он взят из книги Мортона "Микроконтроллеры AVR. Вводный курс". :-) найду, посмеятся на досуге...:-) тот код, который Вы привели, наполовину корректен с точки зрения компилятора..(1я 4я строка норм. 3 и 4-я явные ошибки )
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Jan 31 2007, 15:36
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Может автор Цитата Мортона "Микроконтроллеры AVR. Вводный курс". и написл так, чтобы Вы шевелили серым веществом, а не переписывали бездумно приведенные примеры.
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Jan 31 2007, 15:36
|
Группа: Новичок
Сообщений: 8
Регистрация: 31-01-07
Пользователь №: 24 905

|
Цитата(add @ Jan 31 2007, 15:27)  Цитата Этот пример не мной придуман, он взят из книги Мортона "Микроконтроллеры AVR. Вводный курс". :-) найду, посмеятся на досуге...:-) тот код, который Вы привели, наполовину корректен с точки зрения компилятора..(1я 4я строка норм. 3 и 4-я явные ошибки ) В строчке я сам немного напортачил cp temp, 80 (здесь, конечно, нужно было написать cpi temp, 80) в оригинале у автора написано: cp temp, Mark80 , где Mark80 - регистр общего назначения (автор дал ему такое имя) Все остальные строчки полностью переписаны из книги.
|
|
|
|
|
Jan 31 2007, 15:49
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата Все остальные строчки полностью переписаны из книги. Да, есть такое :-) (стр.63). Дорогой друг! Такое(опечатки, неточности, грубые ошибки) в технической литературе встречаеться оч. часто :-) как это неприскорбно... Сам натыкался не раз...К примеру в серии про Мегу, классик, и т.д. Тут можно согласится с Wild007 про серые клеточки..:-)
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Jan 31 2007, 16:45
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(add @ Jan 31 2007, 14:49)  Цитата Все остальные строчки полностью переписаны из книги. Да, есть такое :-) (стр.63). Дорогой друг! Такое(опечатки, неточности, грубые ошибки) в технической литературе встречаеться оч. часто :-) как это неприскорбно... Сам натыкался не раз...К примеру в серии про Мегу, классик, и т.д. Тут можно согласится с Wild007 про серые клеточки..:-) Есть ещё одно прискорбное наблюдение - чем ниже интеллект или преподавательские способности аффтара, тем больше его тянет писАть подобные "курсы". См. об одном из таких здесь. PS остерегайтесь вводных курсов, читайте серьёзные книги сразу.
|
|
|
|
|
Jan 31 2007, 16:57
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата PS остерегайтесь вводных курсов, читайте серьёзные книги сразу. К сожалению, новичёк всегда начинает с "вводных курсов", потом приходит на такой форум как наш где и понимает, что прочитанное ранее надо забыть и читать только "серьёзные книги" .
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|