Помогите настроить TMR1
|
|
ilyafm98 |
Дата: Ср, 28.03.2012, 20:44 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 08.12.2010
Статус:
Offline
|
Здравствуйте! Решил научиться пользоваться таймерами. Пользуясь даташитом на процессор и примерами с форума написал программу. Программа генерирует импульсы на выводе процессора, и при каждом переполнении таймера должно происходить увеличение частоты импульсов. Нчальное значение около 600 Гц, при достижении частоты 2 кГц прерывания останавливаются и процессор продолжает генерировать сигнал 2 кГц. Программа работает, но у меня почему то не получается перед окончанием программы, выполняемой после прерывания, задать начальное значение таймера, перед возвращением к основной программе. То есть при одой и той же конфигурации настроек таймера нарастание звука от 600 Гц до 2 кГц происходит примерно за 1 секунду (определяю по звуку). При попытке установить начальное значение таймера ожидаемого ускорения нарастания частоты не наблюдается, впечатление такое, что процессор вобще не реагирует на эти значения. Пробовал задавать от нулевых до максимальных, эффекта нет. Подскажите, в чем может скрываться ошибка? Code @ device pic16F873A, HS_osc, wdt_off define OSC 20
OPTION_REG = %10100 INTCON = %11100100 PIE1 = %00000001 PIR1 = %00000001 T1CON = %001111
x var word z var word
clear On Interrupt Goto TickInterrupt x = 800
Main: high portb.0 pauseus x low portb.0 pauseus x gosub main
disable TickInterrupt:
x = x-1 if x = 200 then gosub mains INTCON.2 = 0 PIR1.0 = 0 tmr1h = 32768 tmr1l = 32768 Resume enable
disable mains: high portb.0 pauseus x low portb.0 pauseus x goto mains
|
|
|
|
mikhail09p |
Дата: Ср, 28.03.2012, 21:28 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Здравствуйте, ilyafm98! И как Вы себе представляете, я проверю, что программа работает, чтобы помочь Вам? Неужели нельзя выложить проэкт Протеуса? Или Вы хотите, чтобы люди догадывались, что у Вас за схема и пытались повторить её, чтобы помочь? Обычно выкладывают весь проэкт архивом.
|
|
|
|
ilyafm98 |
Дата: Ср, 28.03.2012, 22:06 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 08.12.2010
Статус:
Offline
|
Здравствуйте mikhail09p, спасибо за проявленное желание помочь. Проект в протеусе не делал, я сразу на своей отладочной плате испытываю. Думал что из прошивки все понятно будет, она короткая и я все разделял в ней для наглядности. Процессор 16f873, кварц 20 МГц, контрольные импульсы снимаю с portb.0 через разделительный конденсатор на высокоомные наушники. Установлю протеус и накидаю схему,если это облегчит помощь.
|
|
|
|
anatol |
Дата: Ср, 28.03.2012, 22:34 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
ilyafm98, а что это у вас программма на чистом ассемблере? Потом -сколько разрядов в 1-м таймере? что это значит tmr1h = 32768 tmr1l = 32768 z var word -что за переменная. И где точка останова x = x-1 . Карандаш в руки. Или это провеерка на вшивость местного контингента?
|
|
|
|
ilyafm98 |
Дата: Ср, 28.03.2012, 23:06 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 08.12.2010
Статус:
Offline
|
anatol, программа написана на PicBasic, в Microcode Studio, компилятор версии 2.47. В первом таймере 16 разрядов, соответственно в hex, при указанных мной значениях, это будет выглядеть как: Code tmr1h = $8000 tmr1l = $8000 У меня в программе эти значения указаны в десятичном виде, что не противоречит руководству пользователя компилятором: Code tmr1h = 32768 tmr1l = 32768 "z var word" - прошу прощения, ввел вас в заблуждение. Эту переменную создавал когда испытывал разные версии программы. В данной программе она не используется. "И где точка останова x = x-1" вот она: Code if x = 200 then gosub mains При достижении переменной "х" значения "200" программа переходит к метке "mains", при этом прерывания отключаются и на выводе portb.0 генерируются импульсы с постоянной частотой. Создал проект в протеусе. Раньше с ним не работал, у меня в нем не получилось запустить свою программу. Указал путь к hex файлу прошивки, тактовую частоту и конфигурационное слово (0x2F4A). Архив прикрепляю.
PS случайно в архив закинул не ту прошивку. Перезалил, теперь нормальная. Оказалось в протеус тоже не ту прошивку загружал, теперь в протеусе проект у меня работает.
Сообщение отредактировал
ilyafm98 - Ср, 28.03.2012, 23:15
|
|
|
|
anatol |
Дата: Чт, 29.03.2012, 00:26 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
ilyafm98, у самого заклинило что 16 разрядов = 32767. С другой стороны - tmr1h = $80 tmr1l = $00 или tmr1 = $8000
Quote (ilyafm98) при этом прерывания отключаются Здесь "стопарю", не вижу явно отключения, переход на метку mains:, а откл прерывания перед ней disable mains: high portb.0 pauseus x low portb.0 pauseus x goto mains
может так
mains: disable high portb.0 pauseus x low portb.0 pauseus x goto mains
Сообщение отредактировал
anatol - Чт, 29.03.2012, 00:27
|
|
|
|
ilyafm98 |
Дата: Чт, 29.03.2012, 07:19 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 08.12.2010
Статус:
Offline
|
anatol, перевод между СС осуществляю в стандартном калькуляторе, встроенном в Windows XP, в нем в режиме "Инженерный" можно переключаться между СС. FFFF hex = 65535 DEC, соотвественно половина от этого будет равна 32768 в десятичной СС, или же 8000 в шестнадцатеричной. Что касаемо положения команды"disable" - то располагаться она может прямо перед меткой программы, в которой нужно отключить прерывания. Отладочная плата и проект в протеусе функционируют, подтверждая возможность такого располождения команды "disable". С этим я давно разобрался, вопрос заключается в том что процессор не реагирует ускорением совершения прерываний загрузкой начальных значений в таймер 1: Code tmr1h = 32768 tmr1l = 32768 Программа компилируется, но реакции на загрузку начальных значений нет, как будто я их и не загружаю.
Сообщение отредактировал
ilyafm98 - Чт, 29.03.2012, 07:20
|
|
|
|
anatol |
Дата: Чт, 29.03.2012, 08:05 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Илья!. Я пытаюсь вам сказать, что tmr1h = "слово" = 2-м байтам = старшей "половине" регистра счетчика. Тоже и для tmr1l = младшей "половине" регистра счетчика . "Загружая" в них по 4 байта получите , наверно, загруженное значение "=0000" __________________________________________________________________________________________________ Правка: Я пытаюсь вам сказать, что tmr1h = "Байту" = старшей "половине" регистра счетчика. Тоже и для tmr1l = младшей "половине" регистра счетчика . "Загружая" в них по 2 байта получите , наверно, загруженное значение "=0000"
Сообщение отредактировал
anatol - Чт, 29.03.2012, 10:45
|
|
|
|
ADMIN |
Дата: Чт, 29.03.2012, 10:01 | Сообщение # 9 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Наверное, нужно сказать так: TMR1L и TMR1H образуют всего 2 байта - младший и старший. Один байт может принять значение $FF. Соответственно, весь TMR1 может принимать максимальное значение $FFFF или 65535. Это не значит, что одна половина счетчика может принять максимальное значение 32768 и вторая то же самое.
|
|
|
|
ilyafm98 |
Дата: Чт, 29.03.2012, 17:33 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 08.12.2010
Статус:
Offline
|
Спасибо за разьяснения, попробовал использовать значения Code tmr1h = 111 tmr1l = 111 Ожидаемого результата в виде ускорения срабатывания таймера не наблюдается, может быть в настройках таймера дело? По даташиту сверю, напишу какие настройки я поставил. Пересмотрел настройки- все выставлено для того чтобы Tmr1 выполнял прерывания при переполнении. Решил попробовать отключить его... Но при этом выполнение программы нисколько не изменилось! Решил отключить Tmr0, и только после этого программа прекратила работу. Попробовал загружать начальное значение Tmr0, на что он соответсвующе отреагировал. Значит я применил неверные настройки, если прерывания на самом деле происходят от таймера 0 а не от таймера 1?
Сообщение отредактировал
ilyafm98 - Чт, 29.03.2012, 18:58
|
|
|
|