{"id":1785,"date":"2018-01-27T23:49:32","date_gmt":"2018-01-27T22:49:32","guid":{"rendered":"http:\/\/yarogniew.net\/arduino\/?p=1785"},"modified":"2018-08-27T23:50:25","modified_gmt":"2018-08-27T21:50:25","slug":"przerwania-w-arduino","status":"publish","type":"post","link":"https:\/\/arduino.net.pl\/index.php\/przerwania-w-arduino\/","title":{"rendered":"Przerwania w arduino"},"content":{"rendered":"<p>Jedna z nazw u\u017cywanych w elektronice, kt\u00f3re bardzo dobrze okre\u015blaj\u0105 to co istotnie robi\u0105, jest <em>przerwanie<\/em>\u00a0(ang. <em><a href=\"https:\/\/www.arduino.cc\/reference\/en\/language\/functions\/external-interrupts\/attachinterrupt\/\">interrupts<\/a><\/em>).<\/p>\n<p>W wi\u0119kszo\u015bci przypadk\u00f3w chodzi o to, by m\u00f3c kontrolowa\u0107 stan pinu, gdy procesor wykonuje g\u0142\u00f3wn\u0105 p\u0119tl\u0119 programu. Wykonywana zostaje funkcja, kt\u00f3r\u0105 wskazujemy w przerwaniu, po czym procesor kontynuuje dzia\u0142ania funkcji loop().<\/p>\n<p>Obs\u0142uga przerwa\u0144 w arduino i w ATmega328 (Arduino UNO, nano) jest\u00a0prosta. Procesor ten obs\u0142uguje przerwania na wej\u015bciach D2 i D3.<br \/>\nAby si\u0119 nie pomyli\u0107 przydatne jest polecenie\u00a0<em>digitalPinToInterrupt().<\/em><br \/>\nPoni\u017cej program, kt\u00f3ry zwraca numer przerwania na podanym pinie. W przypadku naszego procesora to <em><strong>0<\/strong><\/em> i <em><strong>1<\/strong><\/em>.<\/p>\n<pre class=\"brush: plain; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\r\n\r\n\/*\r\n* Demonstracja funkcji digitalPinToInterrupt(),\r\n* zwracaj\u0105cej w warto\u015bci numer przerwania\r\n* na podanym w argumencie pinie.\r\n* Je\u015bli pin nie obs\u0142uguje przerwa\u0144, zwracana jest warto\u015b\u0107 -1.\r\n* www.yarogniew.net\/arduino\r\n*\/\r\n\r\nvoid setup() {\r\n\r\nSerial.begin(9600);\r\n\r\nSerial.print(&quot;Przerwanie na pinie 2 ma numer &quot;);\r\nSerial.println(digitalPinToInterrupt(2));\r\nSerial.print(&quot;Przerwanie na pinie 3 ma numer &quot;);\r\nSerial.println(digitalPinToInterrupt(3));\r\nSerial.print(&quot;Przerwanie na pinie 4 ma numer &quot;);\r\nSerial.println(digitalPinToInterrupt(4));\r\n}\r\n\r\nvoid loop() {\r\n\r\n}\r\n\r\n<\/pre>\n<p>Dzi\u0119ki przerwaniu mo\u017cemy na przyk\u0142ad w czasie grania melodii za\u015bwieci\u0107 diod\u0119. Gdyby\u015bmy wstawili sprawdzanie stanu pinu w\u0142\u0105cznika do p\u0119tli g\u0142\u00f3wnej, program robi\u0142by to ze zw\u0142ok\u0105 albo w og\u00f3le. U\u017cycie przerwania umo\u017cliwia prawie bezkonfliktowe wykonanie obu funkcji. Zw\u0142aszcza \u017ce sprawdzenie stanu i za\u015bwiecenie diody trwa kr\u00f3tko.<\/p>\n<p>Funkcja wygl\u0105da tak:<br \/>\n<em>attachInterrupt(0,buttonPressed,RISING);<\/em><\/p>\n<h3>PO\u0141\u0104CZENIE:<\/h3>\n<p><a href=\"http:\/\/yarogniew.net\/arduino\/wp-content\/uploads\/2018\/01\/przerwania_tactile_buz_sch.png\"><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1012 size-full\" src=\"http:\/\/yarogniew.net\/arduino\/wp-content\/uploads\/2018\/01\/przerwania_tactile_buz_sch.png\" alt=\"\" width=\"623\" height=\"472\" srcset=\"https:\/\/arduino.net.pl\/wp-content\/uploads\/2018\/01\/przerwania_tactile_buz_sch.png 623w, https:\/\/arduino.net.pl\/wp-content\/uploads\/2018\/01\/przerwania_tactile_buz_sch-300x227.png 300w\" sizes=\"auto, (max-width: 623px) 100vw, 623px\" \/><\/a><\/p>\n<h3>KOD:<\/h3>\n<pre class=\"brush: plain; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\r\n\r\n\/*Program \u015bwietnie pokazuj\u0105cy dzia\u0142anie przerwa\u0144 w Arduino\r\nW czasie odtwarzania melodii mo\u017cemy swobodnie w\u0142\u0105cza\u0107 i wy\u0142\u0105cza\u0107 diod\u0119 led*\/\r\n\r\nvolatile boolean ledOn = false;\r\n#include &quot;pitches.h&quot;\r\n\r\nvoid setup() {\r\npinMode(13,OUTPUT);\r\npinMode(2,INPUT);\r\nattachInterrupt(0,buttonPressed,RISING);\r\n}\r\n\r\nvoid loop() {\r\nplayHoney();\r\n\r\n}\r\nvoid buttonPressed()\r\n{\r\nif(ledOn)\r\n{\r\nledOn = false;\r\ndigitalWrite(13,LOW);\r\n}else\r\n{\r\nledOn = true;\r\ndigitalWrite(13,HIGH);\r\n}\r\n}\r\n\r\nvoid playHoney(){\r\n\r\n\/\/Honeysuckle rose, standard\r\n\r\nint melody&#x5B;] = {\r\nNOTE_C5, NOTE_AS4, NOTE_D4, NOTE_F4, NOTE_A4,\r\nNOTE_C5, NOTE_AS4, NOTE_D4, NOTE_F4, NOTE_A4,\r\nNOTE_C5, NOTE_AS4, NOTE_D4, NOTE_F4, NOTE_A4, NOTE_A4, NOTE_A4,\r\nNOTE_A4, NOTE_G4, NOTE_F4, NOTE_D4, NOTE_F4, NOTE_F4, NOTE_F4,\r\nNOTE_A4, NOTE_G4, NOTE_F4, NOTE_D4, NOTE_F4, 0\r\n};\r\n\r\nint noteDurations&#x5B;] = {\r\n2, 1, 2, 1, 6,\r\n2, 1, 2, 1, 6,\r\n2, 1, 2, 1, 3, 3, 6,\r\n2, 1, 2, 1, 3, 3, 12,\r\n2, 1, 2, 1, 12, 12\r\n};\r\n\r\nfor (int thisNote = 0; thisNote &amp;amp;lt; sizeof(melody)\/sizeof(int); thisNote++) {\r\n\r\nint noteDuration = 100 * noteDurations&#x5B;thisNote];\r\ntone(8, melody&#x5B;thisNote], noteDuration);\r\n\r\n\/\/ to distinguish the notes, set a minimum time between them.\r\n\/\/ the note's duration + 30% seems to work well:\r\nint pauseBetweenNotes = noteDuration * 1.30;\r\ndelay(pauseBetweenNotes);\r\n\r\nnoTone(8);\r\n}\r\n}\r\n<\/pre>\n<p>Program potrzebuje biblioteki <em>pitches.h<\/em>. Jak j\u0105 za\u0142o\u017cy\u0107 pisa\u0142em <a href=\"http:\/\/yarogniew.net\/arduino\/?p=987\">tu<\/a>.<\/p>\n<h3>LINKS:<\/h3>\n<p><a href=\"https:\/\/www.arduino.cc\/reference\/en\/language\/functions\/external-interrupts\/attachinterrupt\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.arduino.cc\/reference\/en\/language\/functions\/external-interrupts\/attachinterrupt\/<\/a><br \/>\n<a href=\"http:\/\/akademia.nettigo.pl\/arduino_przerwania\/\" target=\"_blank\" rel=\"noopener\">http:\/\/akademia.nettigo.pl\/arduino_przerwania\/<\/a><br \/>\n<a href=\"https:\/\/forbot.pl\/blog\/kurs-arduino-ii-przerwania-kontaktron-czujnik-pir-id16792\" target=\"_blank\" rel=\"noopener\">https:\/\/forbot.pl\/blog\/kurs-arduino-ii-przerwania-kontaktron-czujnik-pir-id16792<\/a><br \/>\n<a href=\"http:\/\/educ8s.tv\/arduino-interrupts-tutorial\/\">Arduino Interrupts Tutorial, educ8s.tv<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jedna z nazw u\u017cywanych w elektronice, kt\u00f3re bardzo dobrze okre\u015blaj\u0105 to co istotnie robi\u0105, jest przerwanie\u00a0(ang. interrupts). W wi\u0119kszo\u015bci przypadk\u00f3w chodzi o to, by m\u00f3c kontrolowa\u0107 stan pinu, gdy procesor&#8230;<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[2,66],"tags":[9,70],"class_list":["post-1785","post","type-post","status-publish","format-standard","hentry","category-arduino","category-elektronika","tag-arduino","tag-interrupts"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/1785","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1785"}],"version-history":[{"count":1,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/1785\/revisions"}],"predecessor-version":[{"id":1786,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/1785\/revisions\/1786"}],"wp:attachment":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1785"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1785"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1785"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}