Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [avr] помогите с таймером на tiny 13, помогите с таймером на tiny 13 
:(
    Опции темы
hawk3500
Дата 24.4.2011, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2009

Репутация: нет
Всего: 2



Здравствуйте.
Делаю таймр под avr tiny 13
Подскажите как сделать функцию(подпрограмму) которая будет просто ожидать указанное время минут и секунд.
Как работать с таймерами?
Читал много мануала, но до конца всё равно не понял как допустим просто сделать паузу в 1 секунду.
Заранее благодарен.

--------------------
воин dzen'a
PM MAIL   Вверх
Курсант
Дата 24.4.2011, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



Я конечно не претендую на правильность, но у меня тупая задержка времени стоит... Я поставил три вложенных счетчика...

точно в асме не помню как, но примерно так:

Код

1: инкрементировать r17
    если r17 = 0 то перейти к 4
2: инкрементировать r18
    если r18 = 0 то перейти к 1
3: инкрементировать r19
    если r19 = 0 то перейти к 2
    перейти к 3
4: выполнить действия после задержки



смысл такой, что пройдет целая куча тактов, прежде чем программа доберется до метки "4".

Но это конечно жуткий быдлокод, а вот чтобы программировать в реальном времени - это наверное сложнее, может какой watchdog применить или считать такты - тут не знаю... Сам пока не дошел...
PM ICQ Skype   Вверх
hawk3500
Дата 24.4.2011, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2009

Репутация: нет
Всего: 2



да такого рода я делал, но высоая погрешность....
копаю в сторону TCCNT...как я поняял это банальный счётчик команд..
но как с ним совладать я не знаю......
Если кто в курсе отзавитесь)
Заранее благодарен.
--------------------
воин dzen'a
PM MAIL   Вверх
Mazzi
Дата 24.4.2011, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Используй библиотечную функцию delay для требуемой задержки.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
hawk3500
Дата 25.4.2011, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2009

Репутация: нет
Всего: 2



А где эту функцию взять?

--------------------
воин dzen'a
PM MAIL   Вверх
UniBomb
Дата 25.4.2011, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



hawk3500, где, где... Вот ты не указал, чем ты пользуешся (avr-gcc, iar, icc, avrstudio), и Mazzi решил промолчать  smile 

Ну а вообще для задержек (если действительно нужно задержка без выполнения других действий) можно использовать "бесполезный" цикл. В простейшем случае он выглядит так:

Код

delay:
    ldi r17, 100 ;сто - это аргумент задержки
del1:
    dec r16
    brne del1


Данный код не делает ничего полезного, но при этом он занимает систему на определённое время. Была даже выведенная формула, по которой можно было определить на сколько тактов он займёт систему, но за давностью лет я её не помню  smile Но давай посчитаем. Команда декремента (dec) выполняется 1 такт, команда перехода по "не равно" 2 такта если переход и 1 такт если "равно". Основное тело цикла выполнится 99 раз, значит 99*3. Последний, сотый раз программа закончит, значит 99*3+2. Ну и в конце концов загрузка константы в регистр общего назначения (ldi) выполняется 1 так. Итого получается данная подпрограмма выполнится за 99*3+2+1 = 300 тактов. Ох, а формула то совсем простая  smile  delay = x * 3(в тактах).

Если максимально-возможная задержка окажется недостаточной (из-за ограничения на аргумент в 255), то можно использовать аналогичные вложенные циклы:

Код

delay:
    ldi  r16,100 ;старший байт аргумента
del1:       
    ldi  r17,100 ;младший байт аргумента
del2:       
    dec  r17
    brne del2
    dec  r16
    brne del1


С учётом вложенности циклов формула расчёта итоговой задержки будет немного отличаться от предыдущей. В качестве домашнего задания предлагаю вывести формулу для этого "двойного" цикла самостоятельно.

Ну и далее по наитию - этот цикл можно наворачивать до тех пор, пока регистры общего назначения не кончатся. Но и при этом следует помнить, что полученная задержка будет измеряться тактами. Что бы сделать задержку по времени нужно время перевести в количество тактов, и это количество тактов передать в качестве аргумента в эти подпрограммы  smile  Расчитать можно очень просто:

f(cpu) - это частота, на которой работает мк. Иными словами за одну секунду мк выполнит f тактов. А нам нужно t секунд. Тогда количество тактов будет равно t(сек)*f(такт/сек). Только не забудь время задержки перевести в секунды  smile 

Это сообщение отредактировал(а) UniBomb - 25.4.2011, 08:27
PM MAIL ICQ Skype   Вверх
xvr
Дата 25.4.2011, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(hawk3500 @  24.4.2011,  20:15 Найти цитируемый пост)
Читал много мануала, но до конца всё равно не понял как допустим просто сделать паузу в 1 секунду.

3 варианта:
  • Ждать в пустом цикле (см предыдущие ответы)
  • Запустить аппаратный таймер считать клоки тактового генератора процессора. В цикле проверять флаг переполнения таймера, сбрасывать его и снова ждать. И так столько раз, сколько надо.
  • Запустить аппаратный таймер считать клоки тактового генератора процессора. Настроить прерывание от его (таймера) переполнения и в обработчике прерывания увеличивать (или уменьшать) счетчик. В основной программе периодически проверять счетчик, пока не дойдет до заданного значения (или до 0)

PM MAIL   Вверх
hawk3500
Дата 26.4.2011, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2009

Репутация: нет
Всего: 2



Код

.equ HREN =$32 ;определение основных рабочих регистров
.equ MYTIMER =$33
.def temp = R16
.def SECONDS = R18 
.def MINETS = R19 
.def temp1 = R17 
.list
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.cseg 
;;;;;;;;;;;;;;;;;;;инициализация стека
ldi temp, RAMEND
out SPL, temp
;;;;;;;;;;;;;;;;;инициализация порта ВВ
ldi temp, 0xFF
out DDRB, temp;установка port B на вывод
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN: 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;малый цикл;;;;;;;;;;;;;;;;;;;
sbi PORTB, 5;устанавливаем PORTB5 в ноль (включаем инд)
push R18;сохраняем в стек текущее значение R18
push R19;сохраняем в стек текущее значение R19
ldi R19,0x1;задаём количество секунд задержки 0-FF(1 c)
ldi R18,0x0;задаём количество минут задержки 0-FF(0 min)
rcall MyTimerZ;вызываем функцию задержки
pop R19;восстанавливаем предыдущее значение R19
pop R18;восстанавливаем предыдущее значение R18
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cbi PORTB, 5;устанавливаем PORTB5 в единицу (выключаем инд)
push R18;сохраняем в стек текущее значение R18
push R19;сохраняем в стек текущее значение R19
ldi R19,0x1;задаём количество секунд задержки 0-FF (1 c)
ldi R18,0x0;задаём количество минут задержки 0-FF (0 min)
rcall MyTimerZ;вызываем функцию задержки
pop R19;восстанавливаем предыдущее значение R19
pop R18;восстанавливаем предыдущее значение R18
ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SECOND:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ldi R16,0x9
POINT01:
cpi R16,0x0
breq POINT01END
push R16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ldi R16,0x0
out HREN,R16;;выставляем 8-и битный таймер в ноль
POINT00256:
in R16,HREN;;считываем текущее значение таймера
cpi R16,0x86;
brlo POINT00256;;если меньше то ждём пока он не будет ему равен
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pop R16
dec R16
rjmp POINT01
POINT01END:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
POINT1END:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SECOND_SART:
cpi R19,0
breq SECOND_END
rcall SECOND
dec R19
rjmp SECOND_SART
SECOND_END:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MINETS_START:
cpi R18,0
breq MINETS_END
ldi R19,0x3C
rcall SECOND_SART
dec R18
rjmp MINETS_START
MINETS_END:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MyTimerZ:
;;R19-seconds
;;R18-minets
push R16
push R19
ldi R19,5
out MYTIMER,R19
pop R19
rcall SECOND_SART
rcall MINETS_START
pop R16
ret




я делаю вот так.
Пишу в  avr studio.

Хотелось бы сделать так как вы гоорите:
" Настроить прерывание от его (таймера) переполнения и в обработчике прерывания увеличивать (или уменьшать) счетчик."
Но как это сделать я не знаю.
Подскажите пожалуйста.




Это сообщение отредактировал(а) hawk3500 - 26.4.2011, 14:59
--------------------
воин dzen'a
PM MAIL   Вверх
xvr
Дата 26.4.2011, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(hawk3500 @  26.4.2011,  14:58 Найти цитируемый пост)
Но как это сделать я не знаю.
Подскажите пожалуйста.
Писать на С.  smile Лично я с ассемблером давным давно завязал, о чем ничуть не жалею.


PM MAIL   Вверх
UniBomb
Дата 27.4.2011, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



И всё равно мне не понятен сакральный смысл применения в этом случае таймера. Ведь программа (как я понял) всё равно ничего не будет делать, пока таймер не отсигнализирует о прошествии необходимого времени. Ведь лезвие достопочтенного Уильяма Оккамы не зря гласит "не следует плодить сущности без крайней на то необходимости". Таймер он ведь может понадобится в другом месте. Ну да ладно.


hawk3500, во-первых на какой частоте работает твой мк? Именно от этой частоты нужно плясать при настройке таймера. Настрой его на период срабатывания в 1 миллисекунду. Без знания частоты и без даташита (не использую я тиньки  smile ) я тут тебе не помошник. Далее в твоей программе не вижу таблицу векторов прерываний:

Код

.CSEG
.org 0
    rjmp MAIN
    reti
    ;...
    reti
    rjmp our_super_timer   ;переход на обработчик прерывания от таймера, только поставить его нужно в определённое место
    reti
    ;...
    reti           
 
MAIN:


Далее - заводишь ещё одну переменную под миллисекунды (.def msec=r17) и в обработчике прерывания от таймера пишешь нечто подобное:

Код

our_super_timer:
    inc msec
    cpi msec, 99 ;в секунде ведь 100 миллисекунд
    brne timer_ok
    clr msec
    inc sec
    cpi sec, 59 ;а в минуте 60 секунд
    brne timer_ok
    clr sec
    inc min
    cpi min, 59 ;тут даже и объяснять нечего
    brne timer_ok:
    clr min
timer_ok:
    reti 


Хотя обработчик наверное можно и более красиво написать, но у меня давно не было практики в ассемблере  smile 

Это сообщение отредактировал(а) UniBomb - 27.4.2011, 08:56
PM MAIL ICQ Skype   Вверх
UniBomb
Дата 27.4.2011, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



А, пока писал забыл о чём вопрос  smile Нужно ведь ещё проверять регистры sec и min на достижение нужного значения. Тут можно пойти двумями путями: проверять на достижение нужных значений непосредственно в том куске программы где это нужно; проверять это дело непосредственно в нашем обработчике таймера и выставлять флаг достижения (.def is_time=r16), а в том куске программы где нужно проверять этот флаг. Первый вариант предпочтительней в виду большей универсальности, но при этом необходимо перед ожиданием сбрасывать регистры "времени".
PM MAIL ICQ Skype   Вверх
smalcom
Дата 1.5.2011, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: 4
Всего: 7



>>но до конца всё равно не понял как допустим просто сделать паузу в 1 секунду.

Что сложного?
1. Загрузил в таймер нужное значение
2. подождал пока не сработает прерывание по переполнению
3. PROFIT???


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
UniBomb
Дата 1.5.2011, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



smalcom, спасибо, капитан!  smile 
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0550 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.