| Прерывание! | 
|  | 
| 
 
 
 
 | Broka | Дата: Чт, 22.10.2009, 20:43  |                                                                                                                Сообщение # 1 |  
 |   
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 252
 
 
 Замечания: ± На сайте с 30.09.2009
 
 
 Статус: 
 Offline
 
 | Прочитал несколько раз про Прерывания в микроконтроллерах,так ничего и непонял. 16F84A(В наличие). Задача состоит в том, что бы на PORTB.0 всегда выходил сигнал на инфракрасный светодиод,
 а PORTA.0 принимал в это время другим датчиком и при изменение уровня на PORTA.0 включилась,та или иная функция. Программа идёт циклически,так что одновременно излучать и принимать у меня в программе неполучается.
 Мне посоветовали сделать это на 16F628,так как у него есть выход аппаратного шима.Но понимаете в чём дело,если я сейчас это не пойму( именно 16F84A), потом будет труднее.
 Если можете покажите пожалуйста на примере как это делается(в смысле прерывание).
 
 Наладчик КИП и А
 |  
 |  |  |  | 
| 
 
 
 
 | Dmitry | Дата: Пт, 23.10.2009, 00:22  |                                                                                                                Сообщение # 2 |  
 | ![Dmitry]()  
 
 
 
 
  Группа:
  Пользователи
 
  Ранг: 
 
 Могу и подсказать
 
  
 Сообщений: 
 
 
 157
 
 
 Замечания: ± На сайте с 12.05.2009
 
 
 Статус: 
 Offline
 
 | Quote (Broka) Но понимаете в чём дело,если я сейчас это не пойму( именно 16F84A), потом будет труднее.Потом будет легче. На вашем нынешнем уровне разобраться с аппаратным ШИМ-ом - как раз подходящая задача. А с прерываниями (тоже аппаратными, программное вам тут не подойдет) - рановато.
 |  
 |  |  |  | 
| 
 
 
 
 | ADMIN | Дата: Пт, 23.10.2009, 03:26  |                                                                                                                Сообщение # 3 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 20.08.2007
 
 
 Статус: 
 Offline
 
 | А прерывания от чего вас интересует? Просто PORTA.0 не имеет функции прерывания, а PORTB.0 имеет. Может, имеет смысл поменять местами выполняемые функции? |  
 |  |  |  | 
| 
 
 
 
 | Broka | Дата: Пт, 23.10.2009, 09:03  |                                                                                                                Сообщение # 4 |  
 |   
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 252
 
 
 Замечания: ± На сайте с 30.09.2009
 
 
 Статус: 
 Offline
 
 | Спасибо,будем разбираться с ШИМ   
 Наладчик КИП и А
 |  
 |  |  |  | 
| 
 
 
 
 | terrarus | Дата: Пт, 23.10.2009, 09:41  |                                                                                                                Сообщение # 5 |  
 | ![terrarus]()  
 
 
 
 
  Группа:
  Пользователи
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 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 |  
 |   
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 252
 
 
 Замечания: ± На сайте с 30.09.2009
 
 
 Статус: 
 Offline
 
 | terrarus, Спасибо большое за разьяснение,Вы мне конкретно всё рассказали про ШИМ, Я теперь знаю ,что такой аппаратный ШИМ и что такое программный.
 Ещё раз Спасибо большое
   
 Наладчик КИП и А
 |  
 |  |  |  | 
| 
 
 
 
 | Dmitry | Дата: Сб, 24.10.2009, 20:45  |                                                                                                                Сообщение # 7 |  
 | ![Dmitry]()  
 
 
 
 
  Группа:
  Пользователи
 
  Ранг: 
 
 Могу и подсказать
 
  
 Сообщений: 
 
 
 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 |  
 | ![terrarus]()  
 
 
 
 
  Группа:
  Пользователи
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 451
 
 
 Замечания: ± На сайте с 21.08.2008
 
 
 Статус: 
 Offline
 
 | Да в Протоне такое ограничение существует. Если его не устроит максимально возможная частота в 32767 Гц. то придется ему писать вставку на асемблере, что наверное на этом этапе для него будет сложно, если не сказать больше... А может быть его устройство будет нормально работать на частотах около 32 кГц.
 
 Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
 |  
 |  |  |  | 
| 
 
 
 
 | Dmitry | Дата: Сб, 24.10.2009, 21:17  |                                                                                                                Сообщение # 9 |  
 | ![Dmitry]()  
 
 
 
 
  Группа:
  Пользователи
 
  Ранг: 
 
 Могу и подсказать
 
  
 Сообщений: 
 
 
 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 |  
 | ![rdx75]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 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 |  
 | ![Dmitry]()  
 
 
 
 
  Группа:
  Пользователи
 
  Ранг: 
 
 Могу и подсказать
 
  
 Сообщений: 
 
 
 157
 
 
 Замечания: ± На сайте с 12.05.2009
 
 
 Статус: 
 Offline
 
 | а комп как принимает, терминалом или спец прогой? мож лучше отсылать serout portc.6, T2400, [dec c1, dec c2] в терминал для проверки? |  
 |  |  |  | 
| 
 
 
 
 | rdx75 | Дата: Сб, 21.11.2009, 00:50  |                                                                                                                Сообщение # 12 |  
 | ![rdx75]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 8
 
 
 Замечания: ± На сайте с 29.08.2009
 
 
 Статус: 
 Offline
 
 | Весь прикол в том, что этот код работает. Когда я на следующий день запустил комп и включил мк все сразу заработало. Видимо у меня просто завис ком-порт. Для обмена данными я использую прогу COMPump. |  
 |  |  |  | 
| 
 
 
 
 | Dmitry | Дата: Вс, 22.11.2009, 22:38  |                                                                                                                Сообщение # 13 |  
 | ![Dmitry]()  
 
 
 
 
  Группа:
  Пользователи
 
  Ранг: 
 
 Могу и подсказать
 
  
 Сообщений: 
 
 
 157
 
 
 Замечания: ± На сайте с 12.05.2009
 
 
 Статус: 
 Offline
 
 | Ну слава богу! А то я минут 10 втыкал в код, тож не мог понять почему он не работает   |  
 |  |  |  |