Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.81/86: Рейтинг темы: голосов - 86, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 07.12.2010
Сообщений: 574
1

Таймер для MCS-51

10.12.2010, 23:14. Просмотров 16791. Ответов 16
Метки нет (Все метки)

И снова дравствуйте!
На данный момент я уже с другим вопросом, а точнее просьбой...
Не могу догнать, как работает, организуется таймер внутренний и внешний (если я верно понял из Фруне).
Так вот просьба состоит в том чтобы посоветовали в какой литературе можно еще прочесть про таймер, а лучше (если кто может) показали на наглядном примере задержки на некоторое время (допустим на 5 сек).
А то цикл в цикле, в цикле, в цикле..... устал создавать и высчитывать :)
P.S. программирую только в ассемблер, ну и желательно в Keil
Снова зарание спассибки большое :)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2010, 23:14
Ответы с готовыми решениями:

Встроенный таймер в MCS-51
Здравствуйте. Приложенное изображение - это циклограмма обработки детали. По сути время операции -...

Программатор для MCS-51 к COM port
Подскажите пожалуйста, завалялось несколько МК AT89C2051, я так понял что прошивать их не AVR/PIC...

Программа для расчета арифметической функции (MCS 51)
для MCS 51 Необходимо разработать программу для расчета функции : A*B A, B двухбайтовые...

Таймер должен через время положить файл на БД. [Таймер]
Мне нужен таймер, а я не знаю как его делать именно, чтоб в конкретное время он сохранял информацию...

16
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 570
11.12.2010, 08:49 2
В обработчике прерывания таймера организуется счётчик - инкрементируется или декрементируется (дело вкуса) переменная. Как она достигнет заданного значения (или нуля), выставляется флаг, который обрабатывается уже в главном цикле.
0
0 / 0 / 0
Регистрация: 07.12.2010
Сообщений: 574
11.12.2010, 08:55 3
Цитата Сообщение от Kotz
В обработчике прерывания таймера организуется счётчик - инкрементируется или декрементируется (дело вкуса) переменная. Как она достигнет заданного значения (или нуля), выставляется флаг, который обрабатывается уже в главном цикле.
хм... а Пример таймера можно, с пояснялкой? :-[
0
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
11.12.2010, 10:28 4
Вот один из примеров реализации:
Код
$NOMOD51
$INCLUDE(REG52.INC)

NAME   MAIN

BSEG   AT   0
timer_4000ms:      dbit   1

DSEG   AT   08h
time_4000ms:      ds   1

ISEG   AT   80h
stack_stort:      ds   64

CSEG   AT 0
jmp      main_init
org      03h         ;INT0
reti
org      0Bh         ;T0
jmp      t0_int
org      013h      ;INT1
reti
org      01Bh      ;T1
reti
org      023h      ;SP
reti
org      02Bh      ;INT2,T2
reti

;************************************************
; TIMER1 INTERUPT
;************************************************
t0_int:
push   PSW
clr      TR1
jb      timer_4000ms,t0_ext
djnz   time_4000ms,t0_ext
setb   timer_4000ms
mov      time_4000ms,#200
t0_ext:
setb   TR1
pop      PSW
reti

;************************************************
; MAIN PROGROMM
;************************************************
main_init:
; Hordware Timers
mov      TCON,#0            ;Ostanovtivaem oba tajmera
mov      TMOD,#00010001b    ;Zadaem rezhimy dlja tajmerov T0 i T1 (16-razrjadnye tajmery)
mov      TL0,#0FFh
mov      TH0,#0FFh
setb    TR0
clr      timer_4000ms

main_loop:
jnb      timer_4000ms, main_loop
/* Делаем то, что нам нужно каждые 4 сек. */
clr      timer_4000ms
jmp      main_loop

END
0
0 / 0 / 0
Регистрация: 07.12.2010
Сообщений: 574
11.12.2010, 10:32 5
оооо! спасибо, буду сидеть, разбираться))
0
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
11.12.2010, 10:44 6
Не за что. Не забудь только проинициализировать переменную time_4000ms в разделе инициализации:
Код
mov    time_4000ms,#200
А вообще #200 - это я от фуфла вписал, на самом деле оно будет на порядок меньше. Точнее можно подогнать в симуляторе UVision.
0
0 / 0 / 0
Регистрация: 07.12.2010
Сообщений: 574
11.12.2010, 21:09 7
ХМ... видимо для меня действительно чуток сложновато дела с таймером :(
0
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
11.12.2010, 21:14 8
А кому было просто? На то и симулятор придумали, чтоб всё, как на рентгене, было видно, во время выполнения программы.
0
0 / 0 / 0
Регистрация: 07.12.2010
Сообщений: 574
11.12.2010, 21:21 9
и то верно )
а если кину сюда небольшой пример, можете помочь проанализировать?
точнее так сказать, проверить верно ли я понимаю )
0
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
11.12.2010, 21:23 10
Кидай, кто нибудь да глянет.
0
0 / 0 / 0
Регистрация: 07.12.2010
Сообщений: 574
11.12.2010, 21:34 11
Код
[color=#808040]$NOMOD51

ACC     DATA    0E0H
B       DATA    0F0H
SP      DATA    81H
DPL     DATA    82H
DPH     DATA    83H
P0      DATA   80H
P1      DATA   90H
P2      DATA   0A0H
P3      DATA   0B0H

ORG 0
;
LJMP START
;
ORG 100H
;
stort:
MOV TH0, #0h ; регистр таймера 0 (т.е. при его переполнении произайдет прерывайние?)
MOV TL0, #0h; аналогично
MOV TMOD, #1h ; установили 16-и битный режим
MOV R0, #211
SITB TCON.4 ; сделали чтобы работал таймер, а не счетчик
again:
JNB TCON.5, $ ; проверяет TCON5
CLR TCON.5
DJNZ R0, again

END[/color]
Сразу говорю переделывал с примера. Т.е. первым делом хотел бы унать как можно будет сделать не столь длиную адержку (редактированием TH0 и TL0 в большую сторону? и изменяя R0?) И как можно именно выскчитать какое время будет выполнятся операция, а то в заданиях жёсткие рамки по времени :) Спасибо зарание за ответы на мои сообщения
0
0 / 0 / 0
Регистрация: 02.02.2010
Сообщений: 1,142
11.12.2010, 21:56 12
Сегодня как раз разбирался с таймерами, задавал вопросы в соседней теме.
Вроде немного разобрался как работает:)
Для работы с таймерами нужны следующие регистры:
- TCON - тут таймеры включаются/выключаются и настраиваются внешние прерывания(ножки INTx), а также тут находятся флаги переполнения.
- TMOD - выбор режима таймера(всего их четыре), выбор режима работы счетчик/таймер
- TLx/THx - младший и старший байты, содержащие значения таймера
- IE - регистр управления прерываниями, тут можно разрешить прерывание от таймера

Таймера два, они работают одинаково.

Каждый таймер имеет четыре режима:
Режим 0: 8битный счетчик в регистре THx с делителем в регистре TLx
Режим 1: 16 битный счетчик, в TLx младший байт, в THx старший байт счетчика
Режим 2: 8 битный счетчик в TLx, при переполнении в TLx загружается содержимое из THx
И третий режим с которым я еще не разобрался:)

Для задержек самый интересный - это первый режим. Таймер тикает с частотой равной частоте кварца/12.
Тоесть задержку можно организовать следующим образом:
- высчитываем сколько нужно тиков в зависимости от тактовой частоты
- инициализируем таймер в первом режиме
- запускаем таймер и в цикле ждем, пока пара THx:TLx не станет равна высчитаной задержке

С ассемблером я не разбирался, использую SDCC, так что напишу словами:)

Задержка на таймере 0 в первом режиме:
- записать байт b00000001 в TMOD(таймер 0 в качестве таймера в режиме 1)
- сбросить в ноль TH0 и TL0
- установить бит TR0 в регистре TCON для запуска таймера
- в цикле ждать пока число в паре TH1:TL1 не станет равно рассчитанной задержке

Для задержки в асинхронном режиме(по прерыванию), нужно в векторе прерываний добавить переход на обработчик прерывания, и разрешить прерывания от таймера, установив биты EA и ETx(ET1 для таймера 1 и ET0 для 0) в регистре IE.
Важно! Прерывание сробатывает только по переполнению!
Т.е. на следующий тик, после того, когда регистровая пара THx:TLx стала 0xFFFF.
Так что для задержки по прерыванию в THx:TLx нужно записать значение 0xFFFF - задержка.

Любые замечания и дополнения приветствуются, т.к. я с таймерами на 8051 первый раз столкнулся только сегодня, и мог понаписать чего-нибудь неправильного:)
0
0 / 0 / 0
Регистрация: 07.12.2010
Сообщений: 574
11.12.2010, 22:01 13
Ну если правельно, то в голове начинает прояснятся чуть-чуть :)
0
0 / 0 / 0
Регистрация: 02.02.2010
Сообщений: 1,142
11.12.2010, 22:14 14
Сейчас посмотрел на пример, да, логичнее будет сначала записать в THx:TLx значение 0xFFFF - задержка, а в цикле уже проверять только значение флага переполнения TFx в TCON.
Код
SITB TCON.4 ; сделали чтобы работал таймер, а не счетчик
Неправильный комментарий:) Четвертый бит в TCON - это TR0. Если TR0 единичка - таймер начинает считать.
А выбор режима таймер/счетчик - это биты C/Tx в TMOD. Если 0, то таймер, если 1 - то счетчик.

Теперь насчет самого примера. Тут таймер считает от 0 до 131071 столько раз, сколько записано в R0(целых 211!:)).
Т.е. задержка будет 211 * 131071 * (1/(f*12)) секунд(если частота f в герцах).
Так что чтобы уменьшить задержку, нужно уменьшать значение R0.
0
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
11.12.2010, 22:42 15
Для настройки таймера использую следующий код;
Тактовая кварца = 7372800
Код
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
Global  vTH0    ; Типа макро. Объявление глобальной переменной.
Global  vTL0    ;

mInitTimer0 MACRO   Freq
mov     vTL0,    #LOW ((0ffffh-(61440/Freq)*10)+1)
mov     vTH0,    #HIGH((0ffffh-(61440/Freq)*10)+1)

mov     TL0,    #LOW ((0ffffh-(61440/Freq)*10)+1)
mov     TH0,    #HIGH((0ffffh-(61440/Freq)*10)+1)
anl     TMOD,       #0f0h
orl     TMOD,       #001h
setb    TR0
setb    ET0
ENDM
;----------------------------------------------------------------------------
msSetTimer0 MACRO   Freq
mov     vTL0,    #LOW ((0ffffh-(61440/Freq)*10)+1)
mov     vTH0,    #HIGH((0ffffh-(61440/Freq)*10)+1)
ENDM
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
INT_TIMER0:
clr     EA
push    PSW
push    ACC

mov     a,      vTL0
mov     TL0,    a
mov     a,      vTH0
mov     TH0,    a

call    OVFT0

pop     ACC
pop     PSW
setb    EA
reti
В результате подпрограмма OVFT0 будет вызываться с частотой указанной при вызове макро настройки таймера (Freq).
Пример: mInitTimer0 100
!!! Границы не отслеживаются !!!
0
0 / 0 / 0
Регистрация: 07.12.2010
Сообщений: 574
12.12.2010, 15:20 16
внутренний таймер проще освоить?
0
0 / 0 / 0
Регистрация: 07.12.2010
Сообщений: 574
18.12.2010, 16:18 17
разобрался с внутренним вроде :)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2010, 16:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Книжки по MCS-51
Прошу не осуждать, что мол ленивый... гугл на что? и т.д. но проблема такова, что не могу найти...

mcs - компилятор
где можно скачать С# компилятор для linux? на сколько я понимаю, для того чтобы запустить С#...

Задержка таймера в MCS-51
Подскажите, как сделать задержку таймера на 100мс? Вот таким образом у меня получается задержка...

MCS-51. Работа с прерываниями
Нужно разработать функции, обеспечивающие формирование периодического прерывания микроконтроллера...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.