|
Микроконтролеры AVR. Джон Мортон. Ошибки в книге? |
|
|
|
Oct 27 2009, 12:40
|

Участник

Группа: Участник
Сообщений: 43
Регистрация: 24-08-07
Из: Санкт-Петербург
Пользователь №: 30 043

|
Добрый день! Речь идет не о банальных опечатках, а о более глобальных ошибках. Например, вот фрагмент кода, который формирует секундную задержку для микроконтроллера AT90S1200. Кварц на 2.4576 МГц. Код ldi Count30,30 ldi Mark80,80 TimeLoop: out TCNT0,temp cp temp,Mark80 brne TimeLoop subi Mark80,-80 dec Count30 brne TimeLoop Понимаю, что вместо out TCNT0,temp должно быть in temp,TCNT0. Быстрей всего это косяк переводчика. Но насколько работоспособен сам принцип формирования такой задержки? Насколько я понял, таймер считает до 255 и начинает заново, значит после 3-х циклов, когда Mark80 превысит значение 255 равенства не наступит. Правильно ли я понимаю, или есть какие-то особенности?
|
|
|
|
|
 |
Ответов
|
Oct 28 2009, 12:31
|

Участник

Группа: Участник
Сообщений: 43
Регистрация: 24-08-07
Из: Санкт-Петербург
Пользователь №: 30 043

|
Ну вот пример программы из книги, где это используется. Поочередно включаются светодиоды: CODE .device at90s1200 .nolist .include "C:\Program Files\Atmel\AVR Studio\1200def.inc" .list
.def temp=r16 .def Mark240=r17 .def Counter=r18 .def Speed=r19
rjmp Init
Init: ser temp out DDRB,temp ldi temp,0b11111100 out DDRD,temp
ldi temp,0b00000001 out PortB,temp
ldi temp,0b00000011 out PortD,temp
ldi temp,0b00000101 out TTCR0,temp
ldi Mark240,240 ldi Counter,5 ldi Speed,5
Start: ; Проверяется нажатие кнопки уменьшения скорости sbic PinD,0 rjmp UpTest inc Speed cpi Speed,11 brne ReleaseDown dec Speed
ReleaseDown: sbis PinD,0 rjmp ReleaseDown
; Проверяется нажатие кнопки увеличения скорости UpTest: sbic PinD,1 rjmp Timer dec Speed brne ReleaseUp inc Speed
ReleaseUp: sbis PinD,0 rjmp ReleaseUp
; Формируем задержку Timer: in temp,TCNT0 cp temp,Mark240 brne Timer
subi Mark240,-240 dec Counter brne Start
;Меняем СИД mov Counter,Speed
in temp,PortB lsl temp brcc PC+2 ldi temp,0b00000001
out PortB,temp rjmp Start Цитата(Палыч @ Oct 28 2009, 10:57)  Переполним... Но, и счетный регистр таймера работает с переполнением. Поэтому я и употребил - "отодвинем". но переполнение происходит же не одинаково? время разве не уедет? я понимаю так, достигли мы в Mark80 значения 240. Прибавляем 80, получаем переполнение. А Timer считает дальше (до 255), и равенство будет не ранее, чем переполнится Timer и дойдет до нужного значения, так? Это время будет соответствовать тому же периоду, что и увеличение со 160 до 240?
Причина редактирования: Нарушение п.3.4 Правил форума.
|
|
|
|
|
Oct 28 2009, 13:11
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Merovey @ Oct 28 2009, 15:31)  Код .device at90s1200 ldi temp,0b00000101 out TTCR0,temp Вот это - и есть инициализация таймера. Остальные регистры = Initial Value - "значение при включении/сбросе". P.S. Уж не знаю чья ошибка, но регистр называется TCCR0 Цитата(Merovey @ Oct 28 2009, 15:31)  но переполнение происходит же не одинаково? время разве не уедет? Почему же происходит не одинаково? Пусть счетный регистр таймера и Mark80 в текущий момент имеют значение 240. Произошло сравнение (они равны); прибавляем к Mark80 значение 80 (вычитаем минус 80) - получаем Mark80 равным 64 (240+80=320; 320 -не помещается в байт; один разряд с весом 256 вылез за старший разряд байта; 320-256=64). На таймер/счетчик поступают с пределителя импульсы; счетный регистр их считает: 241 242 ... 254 255 0 1 ... 63 64 Значение на счетном регистре достигнет 64 через те же 80 импульсов от пределителя. P.S. Может так понятнее: Увеличить число на 80 - абсолютно то же самое, что прибавить 80 раз по единице.
|
|
|
|
|
Oct 29 2009, 06:02
|

Участник

Группа: Участник
Сообщений: 43
Регистрация: 24-08-07
Из: Санкт-Петербург
Пользователь №: 30 043

|
Цитата(Палыч @ Oct 28 2009, 16:11)  P.S. Уж не знаю чья ошибка, но регистр называется TCCR0 Это моя ошибка, точнее описка. Цитата(Палыч @ Oct 28 2009, 16:11)  Почему же происходит не одинаково? Пусть счетный регистр таймера и Mark80 в текущий момент имеют значение 240. Произошло сравнение (они равны); прибавляем к Mark80 значение 80 (вычитаем минус 80) - получаем Mark80 равным 64 (240+80=320; 320 -не помещается в байт; один разряд с весом 256 вылез за старший разряд байта; 320-256=64). На таймер/счетчик поступают с пределителя импульсы; счетный регистр их считает: 241 242 ... 254 255 0 1 ... 63 64 Значение на счетном регистре достигнет 64 через те же 80 импульсов от пределителя. Теперь понял. Спасибо. Насчет первичной инициализации понятно. Я думал, еще в самом цикле нужно определять ).
|
|
|
|
Сообщений в этой теме
Merovey Микроконтролеры AVR. Джон Мортон. Ошибки в книге? Oct 27 2009, 12:40 V_G А как байт (Mark80) может превысить 255?
А какую ч... Oct 27 2009, 13:33 Merovey ЦитатаА как байт (Mark80) может превысить 255?
Раб... Oct 27 2009, 13:46 Палыч Цитата(Merovey @ Oct 27 2009, 15:40) Но н... Oct 27 2009, 14:02 Merovey Цитата(Палыч @ Oct 27 2009, 17:02)
Ну о... Oct 28 2009, 07:32  Палыч Цитата(Merovey @ Oct 28 2009, 10:32) А на... Oct 28 2009, 07:57 SasaVitebsk Как переводчик может перепутать: "out TCNT0,t... Oct 27 2009, 14:34 Палыч Цитата(SasaVitebsk @ Oct 27 2009, 17:34) ... Oct 27 2009, 14:59 ReAl Цитата(SasaVitebsk @ Oct 27 2009, 16:34) ... Oct 27 2009, 15:03  SasaVitebsk Цитата(ReAl @ Oct 27 2009, 18:03) Вычитае... Oct 27 2009, 17:26 SasaVitebsk Разобраться с самим МК, конечно надо. И немного ас... Oct 30 2009, 09:05 Valek У меня есть вопрос какраз по этой книге. Когда мы ... Nov 1 2012, 08:00 bookd Цитата(Valek @ Nov 1 2012, 11:00) У меня ... Nov 1 2012, 08:12 Valek В моей формуле Т - это время задержки (сек) которо... Nov 1 2012, 12:36 bookd Цитата(Valek @ Nov 1 2012, 15:36) В моей ... Nov 1 2012, 12:58 Valek УРА!!! УРА!!! УРА!... Nov 1 2012, 13:44
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|