Прерывание!
|
|
Broka |
Дата: Чт, 22.10.2009, 20:43 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
253
Замечания:
±
На сайте с 30.09.2009
Статус:
Offline
|
Прочитал несколько раз про Прерывания в микроконтроллерах,так ничего и непонял. 16F84A(В наличие). Задача состоит в том, что бы на PORTB.0 всегда выходил сигнал на инфракрасный светодиод, а PORTA.0 принимал в это время другим датчиком и при изменение уровня на PORTA.0 включилась,та или иная функция. Программа идёт циклически,так что одновременно излучать и принимать у меня в программе неполучается. Мне посоветовали сделать это на 16F628,так как у него есть выход аппаратного шима.Но понимаете в чём дело,если я сейчас это не пойму( именно 16F84A), потом будет труднее. Если можете покажите пожалуйста на примере как это делается(в смысле прерывание).
Наладчик КИП и А
|
|
|
|
Dmitry |
Дата: Пт, 23.10.2009, 00:22 | Сообщение # 2 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Quote (Broka) Но понимаете в чём дело,если я сейчас это не пойму( именно 16F84A), потом будет труднее. Потом будет легче. На вашем нынешнем уровне разобраться с аппаратным ШИМ-ом - как раз подходящая задача. А с прерываниями (тоже аппаратными, программное вам тут не подойдет) - рановато.
|
|
|
|
ADMIN |
Дата: Пт, 23.10.2009, 03:26 | Сообщение # 3 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
А прерывания от чего вас интересует? Просто PORTA.0 не имеет функции прерывания, а PORTB.0 имеет. Может, имеет смысл поменять местами выполняемые функции?
|
|
|
|
Broka |
Дата: Пт, 23.10.2009, 09:03 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
253
Замечания:
±
На сайте с 30.09.2009
Статус:
Offline
|
Спасибо,будем разбираться с ШИМ
Наладчик КИП и А
|
|
|
|
terrarus |
Дата: Пт, 23.10.2009, 09:41 | Сообщение # 5 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Broka, советую почитать даташит на русском языке о модуле CCP (ШИМ) в PIC-микроконтроллерах . Он находится на сайте http://terrarus.ucoz.ru/proton_plus_ide/index.html далее в меню и в разделе DATASHEETs/PIC/RUS/Модуль CCP. То есть это аппаратный узел в микроконтроллере который может работать в фоновом режиме, если его задействовать микроконтроллер может отдновременно выполнять и нужную программу и независимо от нее гнать импульсную последовательность с изменяемой скважностью на отделный вывод микроконтроллера. Обычно таких ШИМ модулей в микроконтроллере 2, но есть и с 3 модулями. Для работы с аппаратными ШИМ модулями применяется команда HPWM А команда PWM обеспечивает программную реализацию ШИМ. которая в фоновом режиме невозможна. То есть пока микроконтроллер генерирует ШИМ ничего другого он делать не может.
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
Broka |
Дата: Сб, 24.10.2009, 19:28 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
253
Замечания:
±
На сайте с 30.09.2009
Статус:
Offline
|
terrarus, Спасибо большое за разьяснение,Вы мне конкретно всё рассказали про ШИМ, Я теперь знаю ,что такой аппаратный ШИМ и что такое программный. Ещё раз Спасибо большое
Наладчик КИП и А
|
|
|
|
Dmitry |
Дата: Сб, 24.10.2009, 20:45 | Сообщение # 7 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Quote (terrarus) Для работы с аппаратными ШИМ модулями применяется команда HPWM Чет мне кажется, ему HPWM не подойдет. Ему надо Quote (Broka) На выходе нужна частота 36KHz , а в мануале на пикбейсик сказано: "HPWM Channel,Dutycycle,Frequency ... Frequency is the desired frequency of the PWM signal. ... The highest frequency at any oscillator speed is 32767Hz." В протоне тоже такое странное ограничение?
Сообщение отредактировал
Dmitry - Сб, 24.10.2009, 20:47
|
|
|
|
terrarus |
Дата: Сб, 24.10.2009, 21:01 | Сообщение # 8 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Да в Протоне такое ограничение существует. Если его не устроит максимально возможная частота в 32767 Гц. то придется ему писать вставку на асемблере, что наверное на этом этапе для него будет сложно, если не сказать больше... А может быть его устройство будет нормально работать на частотах около 32 кГц.
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
Dmitry |
Дата: Сб, 24.10.2009, 21:17 | Сообщение # 9 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Зачем на ассемблере? Пусть напрямую пишет в регистры модуля CCP прямо на бейсике. Вот разобраться в назначении отдельных битов этих регистров будет сложновато. Если с техническим английским проблемы, то можно почитать тут: http://www.microchip.ru/files/d-sheets-rus/pic16f62x.pdf на стр. 63-64. Особенно пункт 10.3.3 (стр. 64)
Сообщение отредактировал
Dmitry - Сб, 24.10.2009, 21:44
|
|
|
|
rdx75 |
Дата: Чт, 19.11.2009, 02:11 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 29.08.2009
Статус:
Offline
|
Ребята, кто подскажет в чем ошибка в коде программы. Мк 16f873a. Короче прога меряет (точнее должна мерять) сколько машинных циклов пройдет за время когда на входе portb.4 сменится логическое значение и пускает результат по rs232 на комп. Для замера количества тактов используется таймер TMR1. Вот текст самой проги: Include "modedefs.bas" ' Описание режимов последовательного порта INTCON = 0 OPTION_REG = %10000000 'подтягивающие резисторы выключены t1con = %00000001 'включение модуля tmr1 '----------------Настройки порта B,C ----------------------------- TrisB = %00010000 ' 1 = вход, 0 = выход portb = %00000000 trisc = %10000000 'на портс.7 вход данных на рс232 (портс.6 - выход) portc = %00000000 c1 var byte c2 var byte t1 var bit 'значение предыдущего состояния входа c1=0:c2=0 pir1.0 = 0 'обнулен флаг по переполнению таймера TMR1 Begin: if (portb.4 = 1 and t1 = 0) or (portb.4 = 0 and t1 = 1) then c1 = tmr1h: c2 = tmr1l 'таймер TMR1 16-рязрядный, поэтому у него 2 регистра tmr1h и tmr1l tmr1h = 0: tmr1l = 0 serout portc.6, T2400, [c1,c2] t1 = portb.4 endif goto Begin end Но прога почему-то выдает на комп только нули, но зато только в моменты смены логического уровня на входе portb.4
|
|
|
|
Dmitry |
Дата: Чт, 19.11.2009, 22:33 | Сообщение # 11 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
а комп как принимает, терминалом или спец прогой? мож лучше отсылать serout portc.6, T2400, [dec c1, dec c2] в терминал для проверки?
|
|
|
|
rdx75 |
Дата: Сб, 21.11.2009, 00:50 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
8
Замечания:
±
На сайте с 29.08.2009
Статус:
Offline
|
Весь прикол в том, что этот код работает. Когда я на следующий день запустил комп и включил мк все сразу заработало. Видимо у меня просто завис ком-порт. Для обмена данными я использую прогу COMPump.
|
|
|
|
Dmitry |
Дата: Вс, 22.11.2009, 22:38 | Сообщение # 13 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Ну слава богу! А то я минут 10 втыкал в код, тож не мог понять почему он не работает
|
|
|
|