Помогите настроить TMR1 - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » Помогите настроить TMR1
Помогите настроить TMR1
ilyafm98 Дата: Ср, 28.03.2012, 20:44  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 18
Репутация: 0   ±
Замечания:   ±
На сайте с 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    
ЯНДЕКС Дата: 28.03.2012
mikhail09p Дата: Ср, 28.03.2012, 21:28  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Здравствуйте, ilyafm98! И как Вы себе представляете, я проверю, что программа работает, чтобы помочь Вам? Неужели нельзя выложить проэкт Протеуса? Или Вы хотите, чтобы люди догадывались, что у Вас за схема и пытались повторить её, чтобы помочь? Обычно выкладывают весь проэкт архивом.
ilyafm98 Дата: Ср, 28.03.2012, 22:06  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 18
Репутация: 0   ±
Замечания:   ±
На сайте с 08.12.2010

Статус: Offline

Здравствуйте mikhail09p, спасибо за проявленное желание помочь. Проект в протеусе не делал, я сразу на своей отладочной плате испытываю. Думал что из прошивки все понятно будет, она короткая и я все разделял в ней для наглядности. Процессор 16f873, кварц 20 МГц, контрольные импульсы снимаю с portb.0 через разделительный конденсатор на высокоомные наушники.
Установлю протеус и накидаю схему,если это облегчит помощь.
anatol Дата: Ср, 28.03.2012, 22:34  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 535
Репутация: 13   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

ilyafm98, а что это у вас программма на чистом ассемблере?
Потом -сколько разрядов в 1-м таймере? что это значит tmr1h = 32768 tmr1l = 32768
z var word -что за переменная. И где точка останова x = x-1 .
Карандаш в руки. Или это провеерка на вшивость местного контингента?
ilyafm98 Дата: Ср, 28.03.2012, 23:06  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Новенький
Сообщений: 18
Репутация: 0   ±
Замечания:   ±
На сайте с 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 случайно в архив закинул не ту прошивку. Перезалил, теперь нормальная.
Оказалось в протеус тоже не ту прошивку загружал, теперь в протеусе проект у меня работает.
Прикрепления: Timer.rar(15Kb)

Сообщение отредактировал ilyafm98 - Ср, 28.03.2012, 23:15
anatol Дата: Чт, 29.03.2012, 00:26  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 535
Репутация: 13   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 535
Репутация: 13   ±
Замечания:   ±
На сайте с 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
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1097
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Наверное, нужно сказать так: TMR1L и TMR1H образуют всего 2 байта - младший и старший. Один байт может принять значение $FF. Соответственно, весь TMR1 может принимать максимальное значение $FFFF или 65535. Это не значит, что одна половина счетчика может принять максимальное значение 32768 и вторая то же самое.
ilyafm98 Дата: Чт, 29.03.2012, 17:33  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Новенький
Сообщений: 18
Репутация: 0   ±
Замечания:   ±
На сайте с 08.12.2010

Статус: Offline

Спасибо за разьяснения, попробовал использовать значения
Code

         tmr1h = 111
         tmr1l = 111

Ожидаемого результата в виде ускорения срабатывания таймера не наблюдается, может быть в настройках таймера дело? По даташиту сверю, напишу какие настройки я поставил.
Пересмотрел настройки- все выставлено для того чтобы Tmr1 выполнял прерывания при переполнении. Решил попробовать отключить его... Но при этом выполнение программы нисколько не изменилось! Решил отключить Tmr0, и только после этого программа прекратила работу. Попробовал загружать начальное значение Tmr0, на что он соответсвующе отреагировал.
Значит я применил неверные настройки, если прерывания на самом деле происходят от таймера 0 а не от таймера 1?

Сообщение отредактировал ilyafm98 - Чт, 29.03.2012, 18:58
Форум Picbasic.ru » Программирование МК » PicBasicPro » Помогите настроить TMR1
Страница 1 из 11
Поиск: