реклама на сайте
подробности

 
 
> Микроконтролеры AVR. Джон Мортон. Ошибки в книге?
Merovey
сообщение Oct 27 2009, 12:40
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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 равенства не наступит. Правильно ли я понимаю, или есть какие-то особенности?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Oct 27 2009, 14:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Как переводчик может перепутать: "out TCNT0,temp" и "in temp,TCNT0"??? Да и вообще зачем переводчику править текст проги? Как говорится "если в слове МИР перепутать 3 буквы, то получится нецензурщина". Это явный косяк автора. Причём похоже на всю голову.

Исходя из приведенного вами текста (с учётом замены out на in) мы видим следующее:
1) TCNT не устанавливается в цикле. Таким образом после сравнения он продолжает считать дальше.
2) Mark80 вычитается по 80, что вообще необъяснимо.

Первое сравнение получим при значении таймера 80
Последующие сравнения будут происходить ч/з 176

Таким образом округлённо получим задержку 176*30+80=5380. При делителе 1024 это составит чуть больше 2 сек.

Даже если предположить, что я ошибся в расчётах и задержка высчитана правильно, то это всё равно из ряда вон выходящий пример с дурным стилем.

Стандартным видом задержки является что-то в виде следующего.

Код
wait:
    ldi        w1,high(FCnt)    ; Загрузить счётчик задержки
    ldi        w2,low(FCnt); Загрузить счётчик задержки
wt01:
;    rjmp    pc+1
;    rjmp    pc+1
;    rjmp    pc+1
;    rjmp    pc+1
;    rjmp    pc+1
;    rjmp    pc+1
    subi    w2,1
    sbci    w1,0
    brcc    wt01


Где длительность приблизительно равна (1+1+2)*FCnt -1+2 такта (без учёта прерываний).

Если к примеру мы разрэмим 2 rjmp, то результат будет (2+2+1+1+2)*FCnt -1+2 такта и так далее.

В качестве ядра (там где стоят rjmp) мы можем считать события. В том числе переполнения таймера или элементарные отсчёты таймера. Например при частоте 2.4576 при делителе 1024 один такт таймера составит 0.416666 мс соответственно секунда составит 2400 тактов. Если мы возьмём по 80 (как в примере), то получим 30*80=2400.

Соответственно прога быдет выглядеть так (без инициализации таймера и сохраняя стилистику автора)

Код
wait_1s:
    ldi    w1,30        ; Загрузить счётчик задержки
    ldi    temp,0
    out    TCNT0,w2
    ldi    w2,80
wt01:
    in    temp,TCNT
    cp    temp,w2    
    brne    wt01
    ldi    temp,0
    out    TCNT0,w2
    dec    w1
    brne    wt01


Реально обычно так не делают. Обычно исходят из того, что 2400 / 256 = 9.... Итого получается 9 полных циклов + 96 тактов.
Задержка выглядит так:

Код
wait_1s:
    ldi    temp,-96        ; Загрузить счётчик задержки
    out    TCNT0,temp
    sbi    TIFR,TOV0
    ldi    temp,9
wt01:
    sbis    TIFR,TOV0
    rjmp    wt01
    sbi    TIFR,TOV0
    dec    temp
    brne    wt01
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 27 2009, 14:59
Сообщение #3


Гуру
******

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



Цитата(SasaVitebsk @ Oct 27 2009, 17:34) *
Исходя из приведенного вами текста (с учётом замены out на in) мы видим следующее:
1) TCNT не устанавливается в цикле. Таким образом после сравнения он продолжает считать дальше.
2) Mark80 вычитается по 80, что вообще необъяснимо.
Вы - недоглядели: вычитается минус 80 (т.е. значение увеличивается на 80). Т.е. значение переменной Mark80 каждый раз "сдвигается" на 80 единиц относительно предыдущего и равенство счетного регистра таймера и переменной наступает через 80 * 1024 (1024 - это пределитель) тактов генератора.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - ReAl   Цитата(SasaVitebsk @ Oct 27 2009, 16:34) ...   Oct 27 2009, 15:03
|- - SasaVitebsk   Цитата(ReAl @ Oct 27 2009, 18:03) Вычитае...   Oct 27 2009, 17:26
- - Merovey   Ну вот пример программы из книги, где это использу...   Oct 28 2009, 12:31
|- - Палыч   Цитата(Merovey @ Oct 28 2009, 15:31) Код....   Oct 28 2009, 13:11
|- - Merovey   Цитата(Палыч @ Oct 28 2009, 16:11) P.S. У...   Oct 29 2009, 06:02
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 10:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016