{"id":616,"date":"2016-11-09T20:31:27","date_gmt":"2016-11-09T19:31:27","guid":{"rendered":"http:\/\/www.daniel.slask.pl\/?p=616"},"modified":"2021-02-12T20:57:07","modified_gmt":"2021-02-12T19:57:07","slug":"obsluga-przerwania-od-zmiany-na-danym-pinie-przerwanie-pcint","status":"publish","type":"post","link":"https:\/\/daniel.slask.pl\/m\/obsluga-przerwania-od-zmiany-na-danym-pinie-przerwanie-pcint\/","title":{"rendered":"Obs\u0142uga przerwania od zmiany na danym pinie &#8211; przerwanie PCINT"},"content":{"rendered":"\n<p>Tym razem b\u0119dzie o przerwaniu PCINT, kt\u00f3re wyst\u0119puj\u0119 w niekt\u00f3rych mikrokontrolerach rodziny AVR firmy ATMEL. Dzi\u0119ki nim mo\u017cliwe jest wykorzystanie ka\u017cdego wyj\u015bcia jako \u017ar\u00f3d\u0142o przerwania zewn\u0119trznego. R\u00f3\u017cnica mi\u0119dzy przerwaniami PCINT a dobrze znanymi przerwaniami INT jest taka, \u017ce te pierwsze wyst\u0119puj\u0105 zawsze przy zmianie stanu (jest brak mo\u017cliwo\u015bci wyboru typu reakcji na stan wej\u015bcia) a przerwania INT mo\u017cna skonfigurowa\u0107 na 1 z 4 sposob\u00f3w:<\/p>\n\n\n\n<ol><li>Stan niski;<\/li><li>Zmian\u0119 stanu;<\/li><li>Na zbocze opadaj\u0105ce;<\/li><li>Na zbocze narastaj\u0105ce;<\/li><\/ol>\n\n\n\n<p>Brak mo\u017cliwo\u015bci wyboru typu reakcji nie jest a\u017c tak du\u017cym utrudnieniem &#8211; mo\u017cna to rozwi\u0105za\u0107 programowo. Przedstawi\u0119 to w dalszej cz\u0119\u015bci artyku\u0142u, lecz jeszcze troch\u0119 wyja\u015bnienia dot. dzia\u0142ania przerwania PCINT. Ot\u00f3\u017c mo\u017cliwe jest skonfigurowanie ka\u017cdego wyj\u015bcia w ten spos\u00f3b, aby generowa\u0142o przerwania PCINT, lecz nie generuje on przerwania konkretnie dla danego wyj\u015bcia, lecz dla pewnej grupy &#8211; jeden wektor przerwania dla kilku wyj\u015b\u0107. W zale\u017cno\u015bci od ilo\u015bci wyj\u015b\u0107 w mikrokotrolerze wyst\u0119puje odpowiednia ilo\u015b\u0107 grup. Jest to \u015bci\u015ble zwi\u0105zane z ilo\u015bci\u0105 port\u00f3w &#8211; ile port\u00f3w tyle grup przerwa\u0144 PCINT. Przyk\u0142adowo dla atmegi328 wyst\u0119puj\u0105 trzy takie grupy &#8211; na poni\u017cszym rysunku piny nale\u017c\u0105ce do tej samej grupy zosta\u0142y oznaczone tym samym kolorem.<\/p>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/11\/grupy_atmega328.png\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/11\/grupy_atmega328-150x150.png\" alt=\"Grupy przerwa\u0144 dla PCINT\" class=\"wp-image-622\"\/><\/a><figcaption>Grupy przerwa\u0144 dla PCINT<\/figcaption><\/figure>\n\n\n\n<p>Piny portu B s\u0105 w tej samej grupie, wi\u0119c wektor przerwania dla tych pin\u00f3w jest taki sam. Aktywacj\u0119 przerwania dokonuje si\u0119 poprzez aktywowanie danej grupy przerwa\u0144 (rejestr PICCR bity PCIE0, PCIE1, PCIE2), oraz zamaskowane (aktywacj\u0119) pinu dla kt\u00f3rego przerwanie ma wyst\u0105pi\u0107 (odpowiednio rejestry PCMSK0, PCMSK1, PCMSK2). Mo\u017cliwe jest wykonanie przerwania dla kilku pin\u00f3w tej samej grupy.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">\/\/inicjalizacja PCINT8, oraz PCINT9\nPCICR |= (1&lt;&lt;PCIE1);\t\t\t\/\/aktywowanie przerwania od pcint\nPCMSK1 |= (1&lt;&lt;PCINT8) | (1&lt;&lt;PCINT9);\t\/\/dla tego pinu przerwanie b\u0119dzie wykonywane przerwanie<\/code><\/pre>\n\n\n\n<p>Wektory przerwa\u0144 przybieraj\u0105 nast\u0119puj\u0105c\u0105 posta\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:default decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">PCINT0_vect\nPCINT1_vect\nPCINT2_vect<\/code><\/pre>\n\n\n\n<p>W przypadku gdy chcemy, aby przerwanie wykonywane by\u0142o dla kilku pin\u00f3w tej samej grupy, ale reakcje by\u0142y podejmowane w zale\u017cno\u015bci od pinu, kt\u00f3ry wywo\u0142a\u0142 to przerwanie, nale\u017cy obs\u0142u\u017cy\u0107 je programowo (dla przypomnienia &#8211; przerwanie wyst\u0119puje przy ka\u017cdej zmianie stanu jednego z wybranych pin\u00f3w). Np tak:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">ISR(PCINT1_vect){\nif( (PINC &amp; (1 &lt;&lt; PC0)) )\n\tLED1_TOGGLE;\nif( (PINC &amp; (1&lt;&lt;PC1)) )\n\tLED2_TOGGLE;\n}<\/code><\/pre>\n\n\n\n<p>Zmiana stanu odpowiedniej diody b\u0119dzie nast\u0119powa\u0142a po doprowadzeniu sygna\u0142u na odpowiedni pin. Jest to jeden ze sposob\u00f3w &#8211; je\u017celi macie jaki\u015b inny to podzielcie si\u0119 nim w komentarzach.<br>Jak wida\u0107 obs\u0142uga tego przerwania jest bardzo prosta, a mo\u017cliwo\u015bci jakie nam to daje s\u0105 ogromne. Zach\u0119cam do stosowania nie tylko przerwa\u0144 INT, ale r\u00f3wnie\u017c tu przedstawionych PCINT.<br>Dla przyk\u0142adu poka\u017c\u0119 kod wykorzystuj\u0105cy przerwanie PCINT. B\u0119dzie on powodowa\u0142 zmian\u0119 stanu diody LED w zale\u017cno\u015bci od stanu na porcie wykorzystuj\u0105cym przerwanie PCINT. Sygna\u0142 zegarowy b\u0119dzie pochodzi\u0107 z uk\u0142adu RTC i wyst\u0119powa\u0107 b\u0119dzie co 1 Hz (biblioteki dla zegara PCF8563p znajduj\u0105 si\u0119 w tym <a href=\"http:\/\/www.daniel.slask.pl\/?p=280\">artykule<\/a>).<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">#include &lt;avr\/io.h&gt;\n#include &lt;avr\/interrupt.h&gt;\n\n#include \"I2C_TWI\/i2c_twi.h\"\n#include \"DS_PCF8563p\/pcf8563p.h\"\n\n#define LED_TOGGLE \tPORTC ^= (1&lt;&lt;PC3)\n\n\/\/przerwanie od zegara RTC\nISR(PCINT1_vect){\n\tif( (PINC &amp; (1&lt;&lt;PC0)) )\n\t\tLED_TOGGLE;\n}\n\nint main(void){\n\t\n\t\/\/**********\tinicjalizacja wyj\u015bcia - dioda LED\n\tDDRC |= (1&lt;&lt;PC3);\n\t\n\ti2cSetBitrate(200);\n\n\t\/\/**********\tinicjalizacja pcf8563p\n\tregister_twi_start_pcf(TWI_start);\n\tregister_twi_stop_pcf(TWI_stop);\n\tregister_twi_read_pcf(TWI_read);\n\tregister_twi_write_pcf(TWI_write);\n\n\t\t\/\/inicjalizacja wyj\u015bcia clkout na 1Hz\n\tpcf8563p_set_clkout(CLKOUT_1HZ);\n\t\n\t\/\/inicjalizacja PCINT8\n\tPCICR |= (1&lt;&lt;PCIE1);\t\t\t\/\/aktywowanie przerwania od pcint\n\tPCMSK1 |= (1&lt;&lt;PCINT8);\t\t\t\/\/dla tego pinu przerwanie b\u0119dzie wykonywane\n\n\tsei();\n\twhile(1){\n\t\t\/\/jaki\u015b program\n\t}\t\n}<\/code><\/pre>\n\n\n\n<p>I to by\u0142oby na tyle o przerwaniach PCINT. Stara\u0142em si\u0119 to opisa\u0107 kr\u00f3tko, prosto i zrozumiale.&nbsp; W razie pyta\u0144, w\u0105tpliwo\u015bci, ewentualnych b\u0142\u0119d\u00f3w piszcie w komentarzach.Po wi\u0119cej szczeg\u00f3\u0142owych informacji zapraszam do not katalogowych.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tym razem b\u0119dzie o przerwaniu PCINT, kt\u00f3re wyst\u0119puj\u0119 w niekt\u00f3rych mikrokontrolerach rodziny AVR firmy ATMEL. Dzi\u0119ki nim mo\u017cliwe jest wykorzystanie ka\u017cdego wyj\u015bcia jako \u017ar\u00f3d\u0142o przerwania zewn\u0119trznego. R\u00f3\u017cnica mi\u0119dzy przerwaniami PCINT a dobrze znanymi przerwaniami INT jest taka, \u017ce te pierwsze&#8230;<br \/><a class=\"read-more-button\" href=\"https:\/\/daniel.slask.pl\/m\/obsluga-przerwania-od-zmiany-na-danym-pinie-przerwanie-pcint\/\">Wi\u0119cej<\/a><\/p>\n","protected":false},"author":1,"featured_media":626,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[6,7],"tags":[12,32,101,95,100],"views":2116,"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/11\/button-palec.png","jetpack_shortlink":"https:\/\/wp.me\/pcPgV3-9W","_links":{"self":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/616"}],"collection":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/comments?post=616"}],"version-history":[{"count":12,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/616\/revisions"}],"predecessor-version":[{"id":1637,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/616\/revisions\/1637"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media\/626"}],"wp:attachment":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media?parent=616"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/categories?post=616"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/tags?post=616"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}