Как использовать эти PCINT? Поиск результатов не дал, справка тоже. Прошу помощи
работа с PCINT на attiny13
Сообщений 1 страница 15 из 15
Поделиться22014-01-16 07:55:29
PCINT в тиньках есть PCINT0 и PCINT1...Х
Использовать как обычное прерывание, прописывать разрешение и обработчик.
От PCINT1...Х прерывание будет генерироваться при любом изменении любой ноги, вне зависимости как она сконфигурирована, на выход или на вход. И никак, кроме как сравнением состояния порта с предыдущим вызовом не определить, какая же это именно нога дрыгнулась.
Лично я поэтому использую PCINT1...Х в основном для вывода камушка из слипа, не прописывая в обработчик ничего. А вот на PCINT0 можно удобно сесть для подсчета количества/длительности/декодирования и т.д.
Поделиться32014-01-16 09:58:38
никак, кроме как сравнением состояния порта с предыдущим вызовом не определить, какая же это именно нога дрыгнулась.
Чуток не так.
Есть в МК регистр GIFR в котором включаются разрешения на прерывания. Например включив бит PCIF0 разрешим прерывания PCINT0..7. Включим PCIF1, разрешим прерывания PCINT8..15 и т.д. (если они конечно есть в МК)
Затем зададим маску в регистрах PCMSKx (где х = 0 .. 1 и т.д.). Эта маска разрешит прерывания только на конкретных ногах. Например включим в регистре PCMSK0 бит PCINT2. При этом прерывание будет только по этому входу. Другие ноги можно использовать на свое усмотрение. Единственным ньюансом является то, что прерывание будет происходить и по фронту и по спаду сигнала, но тут уже нужно внутри программы определять что вам нужно.
Вот как то так.
Поделиться42014-01-16 15:33:12
Написал вот такой код. Не работает. В чем дело?
$regfile = "attiny13.dat" $crystal = 9600000 $hwstack = 10 $swstack = 20 $framesize = 30 Config Portb.4 = Output On Pcint0 Button: Enable Interrupts Enable Pcint0 Do Loop End Button: Portb.4 = 1 Return
Поделиться52014-01-16 16:13:07
Как использовать эти PCINT? Поиск результатов не дал, справка тоже. Прошу помощи
Как это не дал результата, а здесь, что по Вашему?
Лёгкая правка исходников согласно документации на МК.
Отредактировано sasha_1973 (2014-01-16 16:14:20)
Поделиться62014-01-16 16:42:43
Как использовать эти PCINT?
Мне тоже стало интересно как работает PCINT и полез я в даташит на тини13. Что я понял:
1. Включаем прерывания.
Sreg = 128 'или 'вкл.глобальные прерывания Enable Interrupts

2. Определяем какие ноги будут участвовать в прерывании
Pcmsk = 63 'разрешаем ножкам PCINT0-PCINT5
'работать на прерываниеСтавим в единицу биты в кружочках, если ноги будут работать на прерывание. 63 - это 00111111
3. Разрешаем PCINT0. Так как у тини13 всего-то и есть,что одно INT0(PCINT0), трудностей быть не должно.
Gimsk = 32 'или Enable Pcint0 'разрешаем прерывания PCI

4.Указываем обработчик прерывания
On Pcint0 Test 'обработчик прерывания
5. И управляем портом PORTB.3
Test: If Pinb.2 = 0 Then 'если кнопка на ноге 7 нажата Waitms 200 'немного подождем... Toggle Portb.3 'переключим состояние порта End If If Pinb.0 = 0 Then 'тоже,но на ноге 5 Waitms 200 Toggle Portb.3 End If Gifr = 32 'сбрасываем флаг Return
Про флаги прерывания( GIFR) можно почитать отдельно.
Все вместе:
$regfile = "attiny13.dat"
$crystal = 4000000
$hwstack = 8
$swstack = 8
$framesize = 12
Config Portb.3 = Output
Sreg = 128
'или 'вкл.глобальные прерывания
Enable Interrupts
Pcmsk = 63 'разрешаем ножкам PCINT0-PCINT5
'работать на прерывание
Gimsk = 32
'или
Enable Pcint0 'разрешаем прерывания PCI
On Pcint0 Test 'обработчик прерывания
Do
'здесь,как обычно что-то происходит
Loop
'------------------------------
'обработчик прерывания
Test:
If Pinb.2 = 0 Then 'если кнопка на ноге 7 нажата
Waitms 200 'немного подождем...
Toggle Portb.3 'переключим состояние порта
End If
If Pinb.0 = 0 Then 'тоже,но на ноге 5
Waitms 200
Toggle Portb.3
End If
Gifr = 32 'сбрасываем флаг
ReturnЕсли я что-то не так понял,прошу меня поправить, так как я и сам ещё начинающий, но код вполне устойчиво работает.. 
Отредактировано Sergik07 (2014-01-16 16:51:52)
Поделиться72014-01-17 00:04:23
Ну так и отлично!
Лучше, конечно, писать Pcmsk = 63 в бинарном виде. Так наглядней. А то через м есяц гулянок, придётся за калькулятор опять браться 
Да,и у attiny13, вроде нет частоты 4 Мгц.
Поделиться82014-01-22 08:06:43
Чуток не так.
Есть в МК регистр GIFR в котором включаются разрешения на прерывания. Например включив бит PCIF0 разрешим прерывания PCINT0..7. Включим PCIF1, разрешим прерывания PCINT8..15 и т.д. (если они конечно есть в МК)...
Да, сорри, Tiny 13 это новый кристалл, у него есть PCMSK, можно отключить ноги с выводом, но прерывание от всех разрешенных все равно одно и нужно определять состояние сравнением с предыдущим состоянием как для выделения конкретной ноги, так и для определение фронт это или спад.
Отредактировано IgorL (2014-01-22 08:10:03)
Поделиться92016-09-28 11:17:11
А как поставить прерывание по смене импульса в PCINT 18-19 (или другие по маске) и как выбрать обработчик прерываний (Int0 или Int1)?
------------------------------------------
Pcmsk2 = &B0000_1100 - выбираю PCINT18 и PCINT19 (PD2 PD3) (стр.94 в >документе< )
Config Int0 = Rising - конфигурирую прерывание, но вот тут не ясно, INT0 или INT1 будет обрабатывать?
On Pcint2 Encod1 - включаю Pcint2, так как PCINT19 и PCI18 находятся в Bit 2 – PCIE2 (стр.92 в >документе<)
Enable Pcint2
Enable Interrupts
Encod1:
return
------------------------------------------
Странно, но прерывания срабатывают, всё-же был момент бубна, не могу понять, правильно сделал?
Отредактировано Ev3658 (2016-09-28 11:18:19)
Поделиться102016-09-28 11:33:00
Если я правильно помню,то Pcint срабатывает по изменению уровня само по себе,а Int0 и Int1 можно конфигурировать:фронт,спад и т.д.
Если конфигурируешь Int0 ,то и обрабатывать будет то,что пришло на эту ногу. int и pcint они же разные.
Поделиться112016-09-28 12:23:24
Спасибо!!! Век живи, век учись!!!!
Получается, в контроллере есть несколько обработчиков прерывания PcInt, в Atmega328p примерно так:
On Pcint0 метка - с 23 по 16
On Pcint1 метка - с 14 по 8
On Pcint2 метка - с 7 по 0
15й не используется из-за ножки Reset.
Информация с стр.93 Datasheet Atmega328p
Чтоб срабатывало по нужному входу, нужно записать бит в маску, точней будет срабатывание по маске.
Выводы 23 по 16 записываются в Pcmsk2 = &B0000_0000, выводы 14-8 в Pcmsk1 = &B0000_0000 и выводы 7 по 0 в Pcmsk1 = &B0000_0000
Получается всё просто!!! Легче, чем с INT0 или INT1 !!!! Спасибо!
Поделиться122016-09-28 12:57:59
Получается, в контроллере есть несколько обработчиков прерывания PcInt, в Atmega328p примерно так:
Поделиться132016-09-28 16:27:33
Ev3658
Может пригодится. Вот тут на одно int можно повесить несколько кнопок.
Поделиться142016-09-28 16:58:16
Я вообще делал на одну ногу несколько кнопок, идея в том, что кнопка=резюк и АЦП определял нажатие. Кстати говоря, если INT0 совпадает с АЦП, то получается очень простое устройство с возможностью глубокой спячки и обработки нажатия. 
Отредактировано RDW (2016-09-28 17:01:19)
Поделиться152016-09-28 18:11:51
Ev3658
Может пригодится. Вот тут на одно int можно повесить несколько кнопок.
классика
так на первых PIC делали, так как там было только 1 аппаратное внешнее прерывание...
да и АЦП для опроса нескольких кнопок - где-то из тех же времён 