|
|
  |
Таймер, Непонятно, как можно так писать? |
|
|
|
Jan 31 2007, 18:59
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Wild007 @ Jan 31 2007, 15:57)  потом приходит на такой форум как наш где и понимает, что прочитанное ранее надо забыть и читать только "серьёзные книги" .  Или не понимает  он уже сделал "кучу проектов" с мигающими лампадами, нажимающимися кнопками и даже играющей музыкой. Они работают что еще надо? В одном старинном класическом труде было написано: Цитата Я мог написать непобедимую программу игры в крестики-нолики в трехмерном пространстве на пяти различных языках программирования, а также написать программу, состоящую из 1000 строк, которая бы работала. Затем я попал в реальный мир. Моей первой задачей было прочитать и понять программу емкостью 200000 строк, а затем увеличить скорость ее работы в 2 раза. Иногда попадание в "реальный мир" помогает  , но и заповедных мест (где еще достаточно программ в сотни строк с единственным критерием "работает") в ембеддерстве еще хватает.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 31 2007, 23:49
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(smk @ Jan 31 2007, 21:03)  Все философское хорошо, но выучить ассеблер нужно. Только прога нужна работающая раньше чем ассеблер выучен будет. Вот кто сможет предложить ассемблерную вставку, обеспечивающую на ноге 4000 Гц при тактовой 128000 Гц и длительностью 0,25 с ???? Код ldi R21,$32 LABEL1: ldi R20,$06 nop LABEL2: sbi portB,1 subi R20,$01 brne LABEL2 ldi R20,$05 nop nop LABEL3: cbi portB,1 subi R20,$01 brne LABEL3 nop nop nop subi R21,$01 brne LABEL1 Дергаем на ноге portB.1 С Вас пиво.
|
|
|
|
|
Feb 1 2007, 00:08
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(T&D @ Jan 31 2007, 15:27)  Вот фрагмент кода
TimeLoop: out TCNT0, temp ;Сохраняем содержимое регистра таймера счетчика в temp cp temp, 80 ; Сравниваем это содержимое с 80 brne TimeLoop ; Если не равно, то возвращаемся к началу цикла
Вот мне непонятна одна вещь: каждая команда выполняется за один такт (какие-то команды могут выполняться за 2 такта). Один такт и в регистре таймера счетчика оказывается 1 (предполагается, что делитель частоты не используется). Следоваетльно в цикле описанном выше можно проскочить момент, когда в регистре таймера счетчика будет 80. Может, я что-то неправильно здесь понимаю? Конечно, по мне гораздо удобнее воспользоваться прерываниями. Если рассматривать действительно ошибку автора, (а не то что данный кусок был вырван из контекста описания какого-нибудь прерывания), то можно переписать след. образом clr temp out TCNT0, temp TimeLoop: in temp,TCNT0 ;Сохраняем содержимое регистра таймера счетчика в temp cpi temp, 80 ; Сравниваем это содержимое с 80 brle TimeLoop ; Если меньше или равно, то возвращаемся к началу цикла
|
|
|
|
|
Feb 1 2007, 09:51
|

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

|
Цитата то можно переписать след. образом Уважаемый SasaVitebsk, читайте вчерашний пост №6 :-) Да еще...: Цитата brle TimeLoop ; Если меньше или равно, то возвращаемся к началу цикла Ну нету такой команды в авр-е, нету...:-) Цитата bodja74:Если цикл сравнения проходит быстрее клока таймера то можно и равно поставить ,хотя идеальной точности при таком подходе все равно не получить. При сравнении по равно есть вероятность "проскачить" значение, а это ни есть гут! Лучше делать однозначно: либо больше/равно, либо меньше.
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Feb 1 2007, 12:53
|
Группа: Новичок
Сообщений: 8
Регистрация: 31-01-07
Пользователь №: 24 905

|
Спасибо за ответы. Можно ещё один вопрос задать? Вопрос про радиоуправление. Вот есть два микроконтроллера. На одном кнопки, а на другом светодиоды. Нажимаем кнопку или кнопки - формируется посылка по UART, все эти данные каким-то образом должны преобразоваться в электромагнитное колебание, передаваться на принимающее устройство и преобразовываться обратно, поступая на UART другого контроллера, на нем должны зажечься соответствующие светодиоды. Предположим, что имеются две рации или два модуля (передающий и принимающий), так что с этим проблем нет. Но я до конца не понимаю следующую вещь. Вот от первого контроллера по UART пошли данные (низкая частота), потом происходит модуляция низкой частоты высокой, потом идет передача, прием, происходит обратный процесс - демодуляция, и низкая частота поступает на UART второго контроллера. Я правильно понимаю этот процесс или не совсем? Ведь здесь аналоговый сигнал и боюсь, что на UART второго контроллера его не подашь, его надо на АЦП направлять... Вот этот вопрос мне не ясен. Вопрос про таймер был связан с тем, что нужно будет в этой задаче через определенные промежутки времени (чтобы не было дребезга контактов) определять состояние кнопок (нажата или нет).
|
|
|
|
|
Feb 1 2007, 13:06
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(T&D @ Feb 1 2007, 11:53)  Я правильно понимаю этот процесс или не совсем?
Ведь здесь аналоговый сигнал и боюсь, что на UART второго контроллера его не подашь Вот тут правильно. UART может "зацепиться" за шум в качестве стартового бита и пропустить настоящий стартовый бит. Цитата(T&D @ Feb 1 2007, 11:53)  , его надо на АЦП направлять... А это не обязательно - зависит от того, насколько зашумлен канал, какая достоверность передачи вам нужна, от протокола (есть ли повторы), от количества вычислительных ресурсов, которые вы способны отдать на декодирование. Тут решений море разных. Можно использовать эфирный протокол типа манчестера и декодировать компаратором и таймером, как было сделано при чтении данных с ленты в "Радио86-РК" или "синклере". ну и Цитата(T&D @ Feb 1 2007, 11:53)  формируется посылка по UART соответственно тоже отпадает.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 1 2007, 13:32
|
Группа: Новичок
Сообщений: 8
Регистрация: 31-01-07
Пользователь №: 24 905

|
Цитата(Сергей Борщ @ Feb 1 2007, 13:06)  А это не обязательно - зависит от того, насколько зашумлен канал, какая достоверность передачи вам нужна, от протокола (есть ли повторы), от количества вычислительных ресурсов, которые вы способны отдать на декодирование. Тут решений море разных. Можно использовать эфирный протокол типа манчестера и декодировать компаратором и таймером, как было сделано при чтении данных с ленты в "Радио86-РК" или "синклере". Мигание светодиодов некритично, поэтому достоверность передачине слишком высокая нужна, но, конечно, хотелось бы, чтобы мигали правильно в большинстве случаев. Можно, конечно же делать и подтверждения насколько правильно был принят сигнал. Предположим, что частота на которой происходит передача и прием сигнала не зашумлена и имеются две фирменные рации. По Вашему мнению в этой ситуации можно обойтись одним только модулятором/демодулятором, то есть на одной стороне модулировать цифровой сигнал, а на другой стороне производить демодуляцию в надежде получить исходный цифровой сигнал? Или же так никто не делает и всегда производится предварительное декодирование такого сигнала?
|
|
|
|
|
Feb 1 2007, 13:54
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(add @ Feb 1 2007, 10:51)  Цитата то можно переписать след. образом Уважаемый SasaVitebsk, читайте вчерашний пост №6 :-) Ну извиняйте. Цитата Да еще...: Цитата brle TimeLoop ; Если меньше или равно, то возвращаемся к началу цикла Ну нету такой команды в авр-е, нету...:-) Цитата bodja74:Если цикл сравнения проходит быстрее клока таймера то можно и равно поставить ,хотя идеальной точности при таком подходе все равно не получить. При сравнении по равно есть вероятность "проскачить" значение, а это ни есть гут! Лучше делать однозначно: либо больше/равно, либо меньше. Да лоханулся...  Ну тогда лучше так clr temp out TCNT0, temp TimeLoop: in temp,TCNT0 ;Сохраняем содержимое регистра таймера счетчика в temp cpi temp, 81 ; Сравниваем это содержимое с 81 brlo TimeLoop ; Если меньше, то возвращаемся к началу цикла
|
|
|
|
|
Feb 1 2007, 15:50
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(add @ Feb 1 2007, 09:51)  Цитата bodja74:Если цикл сравнения проходит быстрее клока таймера то можно и равно поставить ,хотя идеальной точности при таком подходе все равно не получить. При сравнении по равно есть вероятность "проскачить" значение, а это ни есть гут! Лучше делать однозначно: либо больше/равно, либо меньше. Обьясняю популярно, TCNT считает клоки таймера ,а клок таймера может быть и 64 и 1024 и т.д. тактов проца ,при том условии ,что я писал в предыдущем посте ,вероятность проскочить равна 0.
|
|
|
|
|
Feb 1 2007, 16:00
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(T&D @ Feb 1 2007, 12:32)  Мигание светодиодов некритично, поэтому достоверность передачине слишком высокая нужна, но, конечно, хотелось бы, чтобы мигали правильно в большинстве случаев. Хм. С таким критерием пока не сталкивался Цитата(T&D @ Feb 1 2007, 12:32)  Можно, конечно же делать и подтверждения насколько правильно был принят сигнал. Предположим, что частота на которой происходит передача и прием сигнала не зашумлена и имеются две фирменные рации. 1)В эфире всегда есть шумы. 2)Радиостанция не может всегда находиться на передаче. Будут паузы, в паузах будут шумы. Цитата(T&D @ Feb 1 2007, 12:32)  По Вашему мнению в этой ситуации можно обойтись одним только модулятором/демодулятором, то есть на одной стороне модулировать цифровой сигнал, а на другой стороне производить демодуляцию в надежде получить исходный цифровой сигнал? Или же так никто не делает и всегда производится предварительное декодирование такого сигнала? Не совсем понял вопроса. Односторонняя передача используется довольно широко. Теоретически подавать в радиостанцию и снимать цифровой сигнал можно, но сигнал должен обладать определенными свойствами - например не должен содержать длительных периодов из одних нулей или единиц, позволять выделить начало каждого бита. В качестве занимательного чтива могу предложить Б. Скляр "Цифровая связь". И продолжить тему наверное лучше в другом форуме - она к AVR практически не имеет отношения.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 1 2007, 16:12
|
Группа: Новичок
Сообщений: 8
Регистрация: 31-01-07
Пользователь №: 24 905

|
Цитата(bodja74 @ Feb 1 2007, 15:50)  Обьясняю популярно, TCNT считает клоки таймера ,а клок таймера может быть и 64 и 1024 и т.д. тактов проца ,при том условии ,что я писал в предыдущем посте ,вероятность проскочить равна 0.  А если делитель частоты не используется? То клок таймера=такту проца, следовательно здесь есть вероятность проскочить значение.
|
|
|
|
|
Feb 1 2007, 16:39
|

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

|
Цитата(bodja74 @ Feb 1 2007, 14:50)  Обьясняю популярно, TCNT считает клоки таймера ,а клок таймера может быть и 64 и 1024 и т.д. тактов проца ,при том условии ,что я писал в предыдущем посте ,вероятность проскочить равна 0.  Кто-то говорил, что при исполнении этого цикла прерывания запрещены? Если нет, то вероятность проскочить далеко не нулевая.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|