{"id":422,"date":"2015-07-11T15:02:30","date_gmt":"2015-07-11T12:02:30","guid":{"rendered":"http:\/\/ozenozkaya.com\/blog\/?p=422"},"modified":"2015-07-11T15:02:30","modified_gmt":"2015-07-11T12:02:30","slug":"pic-programlama-5-giris-cikis-io-inputoutput-islemleri-2","status":"publish","type":"post","link":"http:\/\/ozenozkaya.com\/blog\/?p=422","title":{"rendered":"PIC Programlama \u2013 5 \u2013 Giri\u015f \u00c7\u0131k\u0131\u015f (I\/O, Input\/Output) \u0130\u015flemleri -2"},"content":{"rendered":"<p>\u00d6nceki yaz\u0131m\u0131z\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 giri\u015f \u00e7\u0131k\u0131\u015f i\u015flemleri olarak koymu\u015ftuk ama a\u00e7\u0131k\u00e7a g\u00f6r\u00fclebildi\u011fi \u00fczere, yaln\u0131zca \u00e7\u0131k\u0131\u015f i\u015flemleri \u00fczerinde durduk \ud83d\ude42 Bu yaz\u0131da, vadedileni tamamlayarak PIC mikrokontrol\u00f6rlerinde giri\u015f i\u015flemlerini nas\u0131l yapar\u0131z ona de\u011finece\u011fiz.<\/p>\n<p>PIC programlama yaz\u0131 dizisinin as\u0131l ama\u00e7 seti, g\u00f6m\u00fcl\u00fc sistemlerin programlanmas\u0131 hususunda temel olu\u015fturup, s\u00fcrecin i\u00e7 dinamiklerini de anlatmak oldu\u011fundan yine bir k\u00fct\u00fcphane kullanmadan devam edece\u011fiz. Giri\u015f i\u015flemleri \u00fczerinden gidebilmemiz i\u00e7in, mikrokontrol\u00f6r\u00fcn pinlerine ba\u011flayaca\u011f\u0131m\u0131z elemanlar\u0131n, pinde olu\u015fturaca\u011f\u0131 gerilimsel seviyeyi okumam\u0131z gerekir. Buna g\u00f6re buton ve switch uygulamalar\u0131, mevzuyu anlatmakta kullan\u0131labilecek iki g\u00fczel ve basit eleman oluyor.\u00a0Butona daha sonra da de\u011finece\u011fiz. \u015eimdi mevzuyu anlatmak i\u00e7in switch \u00fczerinden gidelim. Butonun basit kullan\u0131m\u0131 switch&#8217;den \u00e7ok farkl\u0131 de\u011fil ama bouncing gibi problemlere de \u00f6nlem alaca\u011f\u0131m\u0131z i\u00e7in butonu timer&#8217;dan sonra anlataca\u011f\u0131z. Neyse \ud83d\ude42<\/p>\n<p>\u00d6ncelikle daha kolay olandan ba\u015flayal\u0131m. Switch yani anahtar eleman\u0131n\u0131n kullan\u0131m\u0131na de\u011finelim. Anahtar&#8217;\u0131n ad\u0131 \u00fczerinde, elektriksel ak\u0131m\u0131 a\u00e7\u0131p kapatabilen devre eleman\u0131. Buna g\u00f6re, iki durumlu bir anahtar i\u00e7in; anahtar bir konumdayken a\u00e7\u0131k devre, di\u011fer konumdayken k\u0131sa devre davran\u0131\u015f\u0131 g\u00f6sterecektir.<\/p>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Switch\" target=\"_blank\">Wikipedia <\/a>sayfas\u0131nda daha fazla bilgi bulabilir, \u00e7e\u015fitli switch&#8217;lerin foto\u011fraflar\u0131n\u0131 da g\u00f6rebilirsiniz.<\/p>\n<p>\u015eimdi gelelim bu anahtar\u0131n PIC16 ile kullan\u0131lmas\u0131na. \u00c7ok basit bir uygulama olacak olsa da, anahtar ile PIC&#8217;i arac\u0131 yaparak LED s\u00fcrelim. LED&#8217;i normal \u015fartlar alt\u0131nda PIC&#8217;siz de s\u00fcrebiliriz ama mevzunun basit yoldan anla\u015f\u0131lmas\u0131 i\u00e7in b\u00f6yle anlams\u0131z bir uygulama \u00fczerinden gitmek mant\u0131kl\u0131 olacak diye d\u00fc\u015f\u00fcn\u00fcyorum. Bir sar\u0131 ve bir k\u0131rm\u0131z\u0131 olmak \u00fczere iki LED, bir anahtar ve bir de PIC olan bir devre d\u00fc\u015f\u00fcnelim (Direnc, kondansat\u00f6r gibi elemanlar\u0131 saym\u0131yorum). Birazc\u0131k da olsa farkl\u0131l\u0131k yaratmak i\u00e7in anahtar bir konumda iken sar\u0131 LED&#8217;i yak\u0131p k\u0131rm\u0131z\u0131 LED&#8217;i\u00a0s\u00f6nd\u00fcrece\u011fiz. Di\u011fer durumda ise k\u0131rm\u0131z\u0131 ledi yak\u0131p sar\u0131 ledi s\u00f6nd\u00fcrece\u011fiz. Tabi bu basit i\u015fi yaparken bile, kodu ibretlik \u015fekilde yazaca\u011f\u0131z.\u00a0Haydi i\u015fe koyulal\u0131m \ud83d\ude42<\/p>\n<pre class=\"lang:c decode:true\" title=\"SwitchInterfacing.c\">\/* \n * File:   main.c\n * Author: ozenozkaya\n *\n * Created on 02 Haziran 2015 Sali, 12:47\n *\/\n\n#define F_OSC (1000000UL)\n\n#define REG_TRISB_ADDR (0x86)\n#define REG_TRISB (*( volatile unsigned char*)REG_TRISB_ADDR)\n#define TRIS_PIN_OUTPUT (0)\n#define TRIS_PIN_INPUT  (1)\n#define TRIS_PORT_OUTPUT (0)\n#define TRIS_PORT_INPUT  (0xFF)\n\n#define REG_PORTB_ADDR (0x06)\n#define REG_PORTB (*( volatile unsigned char*)REG_PORTB_ADDR)\n#define PORT_PIN_LOW  (0)\n#define PORT_PIN_HIGH (1)\n#define PORT_ALL_LOW  (0)\n#define PORT_ALL_HIGH (0xFF)\n\ntypedef struct \n{\n    \/\/one bit is stored in one BYTE\n    unsigned char pin0:1;\n    unsigned char pin1:1;\n    unsigned char pin2:1;\n    unsigned char pin3:1;\n    unsigned char pin4:1;\n    unsigned char pin5:1;\n    unsigned char pin6:1;\n    unsigned char pin7:1;\n}tris_port_pin_t;\n\ntypedef union\n{\n    tris_port_pin_t pins;\n    volatile unsigned char port;\n}tris_port_t,*tris_port_ptr_t;\n\n\n\nvoid main() {\n    tris_port_t *portb_ptr=(tris_port_ptr_t)REG_PORTB_ADDR;\n    tris_port_t *trisb_ptr=(tris_port_ptr_t)REG_TRISB_ADDR;\n    \n    trisb_ptr-&gt;port = TRIS_PORT_INPUT;\n    trisb_ptr-&gt;pins.pin1 = TRIS_PIN_OUTPUT;\n    trisb_ptr-&gt;pins.pin2 = TRIS_PIN_OUTPUT;\n    \n    portb_ptr-&gt;port = PORT_ALL_LOW;\n    \n    \n    while(1)\n    {\n        switch(portb_ptr-&gt;pins.pin0)\n        {\n            case PORT_PIN_LOW:\n                portb_ptr-&gt;pins.pin1 = PORT_PIN_HIGH;\n                portb_ptr-&gt;pins.pin2 = PORT_PIN_LOW;\n                break;\n            case PORT_PIN_HIGH:\n                portb_ptr-&gt;pins.pin1 = PORT_PIN_LOW;\n                portb_ptr-&gt;pins.pin2 = PORT_PIN_HIGH;    \n                break;\n            default:\n                break;        \n        }\n    \n    }   \n    \n}\n<\/pre>\n<p>Kodu a\u00e7\u0131klamadan \u00f6nce, bir define hinli\u011fi ile, daha \u015feker hale getirelim diyorum. Misal a\u015fa\u011f\u0131daki gibi yapsak, kodun yapt\u0131\u011f\u0131 i\u015f daha iyi anla\u015f\u0131lacak sanki.<\/p>\n<pre class=\"lang:c decode:true \" title=\"SwitchInterfacing2.c\">\/* \n * File:   main.c\n * Author: ozenozkaya\n *\n * Created on 02 Haziran 2015 Sali, 12:47\n *\/\n\n#define F_OSC (1000000UL)\n\n#define REG_TRISB_ADDR (0x86)\n#define REG_TRISB (*( volatile unsigned char*)REG_TRISB_ADDR)\n#define TRIS_PIN_OUTPUT (0)\n#define TRIS_PIN_INPUT  (1)\n#define TRIS_PORT_OUTPUT (0)\n#define TRIS_PORT_INPUT  (0xFF)\n\n#define REG_PORTB_ADDR (0x06)\n#define REG_PORTB (*( volatile unsigned char*)REG_PORTB_ADDR)\n#define PORT_PIN_LOW  (0)\n#define PORT_PIN_HIGH (1)\n#define PORT_ALL_LOW  (0)\n#define PORT_ALL_HIGH (0xFF)\n\n#define SWITCH_PIN pins.pin0\n#define RED_LED_PIN pins.pin1\n#define YELLOW_LED_PIN pins.pin2\n\n#define LED_ON (PORT_PIN_HIGH)\n#define LED_OFF (PORT_PIN_LOW)\n\n\ntypedef struct \n{\n    \/\/one bit is stored in one BYTE\n    unsigned char pin0:1;\n    unsigned char pin1:1;\n    unsigned char pin2:1;\n    unsigned char pin3:1;\n    unsigned char pin4:1;\n    unsigned char pin5:1;\n    unsigned char pin6:1;\n    unsigned char pin7:1;\n}tris_port_pin_t;\n\n\ntypedef union\n{\n    tris_port_pin_t pins;\n    volatile unsigned char port;\n}tris_port_t,*tris_port_ptr_t;\n\n\n\nvoid main() {\n    tris_port_t *portb_ptr=(tris_port_ptr_t)REG_PORTB_ADDR;\n    tris_port_t *trisb_ptr=(tris_port_ptr_t)REG_TRISB_ADDR;\n    \n    trisb_ptr-&gt;port = TRIS_PORT_INPUT;\n    trisb_ptr-&gt;SWITCH_PIN = TRIS_PIN_INPUT;\n    trisb_ptr-&gt;RED_LED_PIN = TRIS_PIN_OUTPUT;\n    trisb_ptr-&gt;YELLOW_LED_PIN = TRIS_PIN_OUTPUT;\n    \n    portb_ptr-&gt;port = PORT_ALL_LOW;\n    \n    \n    while(1)\n    {\n        switch(portb_ptr-&gt;SWITCH_PIN)\n        {\n            case PORT_PIN_LOW:\n                portb_ptr-&gt;RED_LED_PIN = LED_ON;\n                portb_ptr-&gt;YELLOW_LED_PIN = LED_OFF;\n                break;\n            case PORT_PIN_HIGH:\n                portb_ptr-&gt;RED_LED_PIN = LED_OFF;\n                portb_ptr-&gt;YELLOW_LED_PIN = LED_ON;    \n                break;\n            default:\n                break;        \n        }\n    \n    }   \n    \n}\n<\/pre>\n<p>Tabi kodu yazd\u0131k \u00f6yle ama k\u0131sa bir a\u00e7\u0131klama da yapaca\u011f\u0131z. Ayr\u0131ca birinci kod ile ikincisi aras\u0131ndaki farklar\u0131 da ele almakta fayda var. Ancak bundan \u00f6nce kodun Proteus ISIS ortam\u0131ndaki \u00e7\u0131kt\u0131lar\u0131n\u0131 bir payla\u015fal\u0131m.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/switch1.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-423\" src=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/switch1.png?resize=601%2C598\" alt=\"switch1\" width=\"601\" height=\"598\" \/><\/a> <a href=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/switch2.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-424\" src=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/switch2.png?resize=600%2C600\" alt=\"switch2\" width=\"600\" height=\"600\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi kodumuz \u00e7i\u00e7ek gibi \u00e7al\u0131\u015f\u0131yor. \u015eimdi gelelim kod\u00a0hakk\u0131nda konu\u015fma fasl\u0131na. Malumunuz bu kod \u00e7ok farkl\u0131 \u015fekillerde yaz\u0131labilirdi ama yine \u00f6zg\u00fcn bir i\u015f yapal\u0131m istedik. Bu sebeple gittik her bir pini struct bitfield olarak tan\u0131mlad\u0131k. Bu sayede port \u00fczerindeki her pine tek tek, bir de\u011fi\u015fken \u00fczerinden eri\u015fmek m\u00fcmk\u00fcn oldu. Tan\u0131mlad\u0131\u011f\u0131m\u0131z union ile, registerlara hem pin bazl\u0131 (tek tek) hem de port bazl\u0131 (topluca) eri\u015fim imkan\u0131 sa\u011flad\u0131k. Bu i\u015fin ekme\u011fini de kodu yazarken yedik; kodumuz hem \u00e7ok anla\u015f\u0131l\u0131r hem de \u00e7ok geni\u015fletilebilir oldu.<\/p>\n<p>\u0130kinci kodda yapt\u0131\u011f\u0131m\u0131z trick ise, kodun okunurlu\u011funu \u00e7ok art\u0131rd\u0131. Switch ve ledlerin hangi pinlere ba\u011fl\u0131 oldu\u011funu define ile tan\u0131mlayarak, kodun okunurlu\u011funu epeyce art\u0131rm\u0131\u015f olduk. Bu sayede ikinci kodu okuyan birisi art\u0131k kodun fiziksel olarak ne i\u015f yapt\u0131\u011f\u0131n\u0131 kolayca anlayabilir durumu geldi. Her kod bir hikaye anlat\u0131r malum. Birinci kod hikayeyi mikrokontrol\u00f6r\u00fcn perspektifinden anlat\u0131rken, ikinci kod hikayeyi insan g\u00f6z\u00fc perspektifinden anlatm\u0131\u015f oldu.<\/p>\n<p>Bu yaz\u0131 bu kadar olsun \ud83d\ude42 Bir ba\u015fka yaz\u0131da yine devam edece\u011fiz. Yaz\u0131lar\u0131 be\u011fendiyseniz, faydalanabilecek tan\u0131d\u0131klar\u0131n\u0131zla payla\u015fmay\u0131 unutmay\u0131n\u0131z.<\/p>\n<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=414\" class=\"su-button su-button-style-3d\" style=\"color:#FFFFFF;background-color:#2D89EF;border-color:#246ec0;border-radius:5px\" target=\"_self\"><span style=\"color:#FFFFFF;padding:6px 16px;font-size:13px;line-height:20px;border-color:#6cadf4;border-radius:5px;text-shadow:none\"><i class=\"sui sui-arrow-circle-o-left\" style=\"font-size:13px;color:#FFFFFF\"><\/i> \u00d6nceki Sayfa<\/span><\/a> \u00a0<a href=\"http:\/\/ozenozkaya.com\/blog?p=432\" class=\"su-button su-button-style-3d\" style=\"color:#FFFFFF;background-color:#2D89EF;border-color:#246ec0;border-radius:5px\" target=\"_self\"><span style=\"color:#FFFFFF;padding:6px 16px;font-size:13px;line-height:20px;border-color:#6cadf4;border-radius:5px;text-shadow:none\"><i class=\"sui sui-arrow-circle-right\" style=\"font-size:13px;color:#FFFFFF\"><\/i> Sonraki Sayfa<\/span><\/a>\n","protected":false},"excerpt":{"rendered":"<p>\u00d6nceki yaz\u0131m\u0131z\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 giri\u015f \u00e7\u0131k\u0131\u015f i\u015flemleri olarak koymu\u015ftuk ama a\u00e7\u0131k\u00e7a g\u00f6r\u00fclebildi\u011fi \u00fczere, yaln\u0131zca \u00e7\u0131k\u0131\u015f i\u015flemleri \u00fczerinde durduk \ud83d\ude42 Bu yaz\u0131da, vadedileni tamamlayarak PIC mikrokontrol\u00f6rlerinde giri\u015f i\u015flemlerini nas\u0131l yapar\u0131z ona de\u011finece\u011fiz. PIC programlama yaz\u0131 dizisinin as\u0131l ama\u00e7 seti, g\u00f6m\u00fcl\u00fc sistemlerin programlanmas\u0131 hususunda temel olu\u015fturup, s\u00fcrecin i\u00e7 dinamiklerini de anlatmak oldu\u011fundan yine bir k\u00fct\u00fcphane kullanmadan devam edece\u011fiz. <a class=\"read-more\" href=\"http:\/\/ozenozkaya.com\/blog\/?p=422\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_tr_post_content":"\u00d6nceki yaz\u0131m\u0131z\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 giri\u015f \u00e7\u0131k\u0131\u015f i\u015flemleri olarak koymu\u015ftuk ama a\u00e7\u0131k\u00e7a g\u00f6r\u00fclebildi\u011fi \u00fczere, yaln\u0131zca \u00e7\u0131k\u0131\u015f i\u015flemleri \u00fczerinde durduk :) Bu yaz\u0131da, vadedileni tamamlayarak PIC mikrokontrol\u00f6rlerinde giri\u015f i\u015flemlerini nas\u0131l yapar\u0131z ona de\u011finece\u011fiz.\n\nPIC programlama yaz\u0131 dizisinin as\u0131l ama\u00e7 seti, g\u00f6m\u00fcl\u00fc sistemlerin programlanmas\u0131 hususunda temel olu\u015fturup, s\u00fcrecin i\u00e7 dinamiklerini de anlatmak oldu\u011fundan yine bir k\u00fct\u00fcphane kullanmadan devam edece\u011fiz. Giri\u015f i\u015flemleri \u00fczerinden gidebilmemiz i\u00e7in, mikrokontrol\u00f6r\u00fcn pinlerine ba\u011flayaca\u011f\u0131m\u0131z elemanlar\u0131n, pinde olu\u015fturaca\u011f\u0131 gerilimsel seviyeyi okumam\u0131z gerekir. Buna g\u00f6re buton ve switch uygulamalar\u0131, mevzuyu anlatmakta kullan\u0131labilecek iki g\u00fczel ve basit eleman oluyor.\u00a0Butona daha sonra da de\u011finece\u011fiz. \u015eimdi mevzuyu anlatmak i\u00e7in switch \u00fczerinden gidelim. Butonun basit kullan\u0131m\u0131 switch'den \u00e7ok farkl\u0131 de\u011fil ama bouncing gibi problemlere de \u00f6nlem alaca\u011f\u0131m\u0131z i\u00e7in butonu timer'dan sonra anlataca\u011f\u0131z. Neyse :)\n\n\u00d6ncelikle daha kolay olandan ba\u015flayal\u0131m. Switch yani anahtar eleman\u0131n\u0131n kullan\u0131m\u0131na de\u011finelim. Anahtar'\u0131n ad\u0131 \u00fczerinde, elektriksel ak\u0131m\u0131 a\u00e7\u0131p kapatabilen devre eleman\u0131. Buna g\u00f6re, iki durumlu bir anahtar i\u00e7in; anahtar bir konumdayken a\u00e7\u0131k devre, di\u011fer konumdayken k\u0131sa devre davran\u0131\u015f\u0131 g\u00f6sterecektir.\n\n<a href=\"https:\/\/en.wikipedia.org\/wiki\/Switch\" target=\"_blank\">Wikipedia <\/a>sayfas\u0131nda daha fazla bilgi bulabilir, \u00e7e\u015fitli switch'lerin foto\u011fraflar\u0131n\u0131 da g\u00f6rebilirsiniz.\n\n\u015eimdi gelelim bu anahtar\u0131n PIC16 ile kullan\u0131lmas\u0131na. \u00c7ok basit bir uygulama olacak olsa da, anahtar ile PIC'i arac\u0131 yaparak LED s\u00fcrelim. LED'i normal \u015fartlar alt\u0131nda PIC'siz de s\u00fcrebiliriz ama mevzunun basit yoldan anla\u015f\u0131lmas\u0131 i\u00e7in b\u00f6yle anlams\u0131z bir uygulama \u00fczerinden gitmek mant\u0131kl\u0131 olacak diye d\u00fc\u015f\u00fcn\u00fcyorum. Bir sar\u0131 ve bir k\u0131rm\u0131z\u0131 olmak \u00fczere iki LED, bir anahtar ve bir de PIC olan bir devre d\u00fc\u015f\u00fcnelim (Direnc, kondansat\u00f6r gibi elemanlar\u0131 saym\u0131yorum). Birazc\u0131k da olsa farkl\u0131l\u0131k yaratmak i\u00e7in anahtar bir konumda iken sar\u0131 LED'i yak\u0131p k\u0131rm\u0131z\u0131 LED'i\u00a0s\u00f6nd\u00fcrece\u011fiz. Di\u011fer durumda ise k\u0131rm\u0131z\u0131 ledi yak\u0131p sar\u0131 ledi s\u00f6nd\u00fcrece\u011fiz. Tabi bu basit i\u015fi yaparken bile, kodu ibretlik \u015fekilde yazaca\u011f\u0131z.\u00a0Haydi i\u015fe koyulal\u0131m :)\n\n<pre class=\"lang:c decode:true\" title=\"SwitchInterfacing.c\">\/* \n * File:   main.c\n * Author: ozenozkaya\n *\n * Created on 02 Haziran 2015 Sali, 12:47\n *\/\n\n#define F_OSC (1000000UL)\n\n#define REG_TRISB_ADDR (0x86)\n#define REG_TRISB (*( volatile unsigned char*)REG_TRISB_ADDR)\n#define TRIS_PIN_OUTPUT (0)\n#define TRIS_PIN_INPUT  (1)\n#define TRIS_PORT_OUTPUT (0)\n#define TRIS_PORT_INPUT  (0xFF)\n\n#define REG_PORTB_ADDR (0x06)\n#define REG_PORTB (*( volatile unsigned char*)REG_PORTB_ADDR)\n#define PORT_PIN_LOW  (0)\n#define PORT_PIN_HIGH (1)\n#define PORT_ALL_LOW  (0)\n#define PORT_ALL_HIGH (0xFF)\n\ntypedef struct \n{\n    \/\/one bit is stored in one BYTE\n    unsigned char pin0:1;\n    unsigned char pin1:1;\n    unsigned char pin2:1;\n    unsigned char pin3:1;\n    unsigned char pin4:1;\n    unsigned char pin5:1;\n    unsigned char pin6:1;\n    unsigned char pin7:1;\n}tris_port_pin_t;\n\ntypedef union\n{\n    tris_port_pin_t pins;\n    volatile unsigned char port;\n}tris_port_t,*tris_port_ptr_t;\n\n\n\nvoid main() {\n    tris_port_t *portb_ptr=(tris_port_ptr_t)REG_PORTB_ADDR;\n    tris_port_t *trisb_ptr=(tris_port_ptr_t)REG_TRISB_ADDR;\n    \n    trisb_ptr-&gt;port = TRIS_PORT_INPUT;\n    trisb_ptr-&gt;pins.pin1 = TRIS_PIN_OUTPUT;\n    trisb_ptr-&gt;pins.pin2 = TRIS_PIN_OUTPUT;\n    \n    portb_ptr-&gt;port = PORT_ALL_LOW;\n    \n    \n    while(1)\n    {\n        switch(portb_ptr-&gt;pins.pin0)\n        {\n            case PORT_PIN_LOW:\n                portb_ptr-&gt;pins.pin1 = PORT_PIN_HIGH;\n                portb_ptr-&gt;pins.pin2 = PORT_PIN_LOW;\n                break;\n            case PORT_PIN_HIGH:\n                portb_ptr-&gt;pins.pin1 = PORT_PIN_LOW;\n                portb_ptr-&gt;pins.pin2 = PORT_PIN_HIGH;    \n                break;\n            default:\n                break;        \n        }\n    \n    }   \n    \n}\n<\/pre>\n\nKodu a\u00e7\u0131klamadan \u00f6nce, bir define hinli\u011fi ile, daha \u015feker hale getirelim diyorum. Misal a\u015fa\u011f\u0131daki gibi yapsak, kodun yapt\u0131\u011f\u0131 i\u015f daha iyi anla\u015f\u0131lacak sanki.\n\n<pre class=\"lang:c decode:true \" title=\"SwitchInterfacing2.c\">\/* \n * File:   main.c\n * Author: ozenozkaya\n *\n * Created on 02 Haziran 2015 Sali, 12:47\n *\/\n\n#define F_OSC (1000000UL)\n\n#define REG_TRISB_ADDR (0x86)\n#define REG_TRISB (*( volatile unsigned char*)REG_TRISB_ADDR)\n#define TRIS_PIN_OUTPUT (0)\n#define TRIS_PIN_INPUT  (1)\n#define TRIS_PORT_OUTPUT (0)\n#define TRIS_PORT_INPUT  (0xFF)\n\n#define REG_PORTB_ADDR (0x06)\n#define REG_PORTB (*( volatile unsigned char*)REG_PORTB_ADDR)\n#define PORT_PIN_LOW  (0)\n#define PORT_PIN_HIGH (1)\n#define PORT_ALL_LOW  (0)\n#define PORT_ALL_HIGH (0xFF)\n\n#define SWITCH_PIN pins.pin0\n#define RED_LED_PIN pins.pin1\n#define YELLOW_LED_PIN pins.pin2\n\n#define LED_ON (PORT_PIN_HIGH)\n#define LED_OFF (PORT_PIN_LOW)\n\n\ntypedef struct \n{\n    \/\/one bit is stored in one BYTE\n    unsigned char pin0:1;\n    unsigned char pin1:1;\n    unsigned char pin2:1;\n    unsigned char pin3:1;\n    unsigned char pin4:1;\n    unsigned char pin5:1;\n    unsigned char pin6:1;\n    unsigned char pin7:1;\n}tris_port_pin_t;\n\n\ntypedef union\n{\n    tris_port_pin_t pins;\n    volatile unsigned char port;\n}tris_port_t,*tris_port_ptr_t;\n\n\n\nvoid main() {\n    tris_port_t *portb_ptr=(tris_port_ptr_t)REG_PORTB_ADDR;\n    tris_port_t *trisb_ptr=(tris_port_ptr_t)REG_TRISB_ADDR;\n    \n    trisb_ptr-&gt;port = TRIS_PORT_INPUT;\n    trisb_ptr-&gt;SWITCH_PIN = TRIS_PIN_INPUT;\n    trisb_ptr-&gt;RED_LED_PIN = TRIS_PIN_OUTPUT;\n    trisb_ptr-&gt;YELLOW_LED_PIN = TRIS_PIN_OUTPUT;\n    \n    portb_ptr-&gt;port = PORT_ALL_LOW;\n    \n    \n    while(1)\n    {\n        switch(portb_ptr-&gt;SWITCH_PIN)\n        {\n            case PORT_PIN_LOW:\n                portb_ptr-&gt;RED_LED_PIN = LED_ON;\n                portb_ptr-&gt;YELLOW_LED_PIN = LED_OFF;\n                break;\n            case PORT_PIN_HIGH:\n                portb_ptr-&gt;RED_LED_PIN = LED_OFF;\n                portb_ptr-&gt;YELLOW_LED_PIN = LED_ON;    \n                break;\n            default:\n                break;        \n        }\n    \n    }   \n    \n}\n<\/pre>\n\nTabi kodu yazd\u0131k \u00f6yle ama k\u0131sa bir a\u00e7\u0131klama da yapaca\u011f\u0131z. Ayr\u0131ca birinci kod ile ikincisi aras\u0131ndaki farklar\u0131 da ele almakta fayda var. Ancak bundan \u00f6nce kodun Proteus ISIS ortam\u0131ndaki \u00e7\u0131kt\u0131lar\u0131n\u0131 bir payla\u015fal\u0131m.\n\n<a href=\"http:\/\/ozenozkaya.com\/blog\/wp-content\/uploads\/switch1.png\"><img class=\"alignnone size-full wp-image-423\" src=\"http:\/\/ozenozkaya.com\/blog\/wp-content\/uploads\/switch1.png\" alt=\"switch1\" width=\"601\" height=\"598\" \/><\/a> <a href=\"http:\/\/ozenozkaya.com\/blog\/wp-content\/uploads\/switch2.png\"><img class=\"alignnone size-full wp-image-424\" src=\"http:\/\/ozenozkaya.com\/blog\/wp-content\/uploads\/switch2.png\" alt=\"switch2\" width=\"600\" height=\"600\" \/><\/a>\n\n&nbsp;\n\nG\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi kodumuz \u00e7i\u00e7ek gibi \u00e7al\u0131\u015f\u0131yor. \u015eimdi gelelim kod\u00a0hakk\u0131nda konu\u015fma fasl\u0131na. Malumunuz bu kod \u00e7ok farkl\u0131 \u015fekillerde yaz\u0131labilirdi ama yine \u00f6zg\u00fcn bir i\u015f yapal\u0131m istedik. Bu sebeple gittik her bir pini struct bitfield olarak tan\u0131mlad\u0131k. Bu sayede port \u00fczerindeki her pine tek tek, bir de\u011fi\u015fken \u00fczerinden eri\u015fmek m\u00fcmk\u00fcn oldu. Tan\u0131mlad\u0131\u011f\u0131m\u0131z union ile, registerlara hem pin bazl\u0131 (tek tek) hem de port bazl\u0131 (topluca) eri\u015fim imkan\u0131 sa\u011flad\u0131k. Bu i\u015fin ekme\u011fini de kodu yazarken yedik; kodumuz hem \u00e7ok anla\u015f\u0131l\u0131r hem de \u00e7ok geni\u015fletilebilir oldu.\n\n\u0130kinci kodda yapt\u0131\u011f\u0131m\u0131z trick ise, kodun okunurlu\u011funu \u00e7ok art\u0131rd\u0131. Switch ve ledlerin hangi pinlere ba\u011fl\u0131 oldu\u011funu define ile tan\u0131mlayarak, kodun okunurlu\u011funu epeyce art\u0131rm\u0131\u015f olduk. Bu sayede ikinci kodu okuyan birisi art\u0131k kodun fiziksel olarak ne i\u015f yapt\u0131\u011f\u0131n\u0131 kolayca anlayabilir durumu geldi. Her kod bir hikaye anlat\u0131r malum. Birinci kod hikayeyi mikrokontrol\u00f6r\u00fcn perspektifinden anlat\u0131rken, ikinci kod hikayeyi insan g\u00f6z\u00fc perspektifinden anlatm\u0131\u015f oldu.\n\nBu yaz\u0131 bu kadar olsun :) Bir ba\u015fka yaz\u0131da yine devam edece\u011fiz. Yaz\u0131lar\u0131 be\u011fendiyseniz, faydalanabilecek tan\u0131d\u0131klar\u0131n\u0131zla payla\u015fmay\u0131 unutmay\u0131n\u0131z.\n\n[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=414\" style=\"3d\"\u00a0icon=\"icon: arrow-circle-o-left\"]\u00d6nceki Sayfa[\/su_button] \u00a0[su_button url=\"http:\/\/ozenozkaya.com\/blog?p=432\" style=\"3d\" icon=\"icon: arrow-circle-right\"]Sonraki Sayfa[\/su_button]","_tr_post_name":"pic-programlama-5-giris-cikis-io-inputoutput-islemleri-2","_tr_post_excerpt":"","_tr_post_title":"PIC Programlama \u2013 5 \u2013 Giri\u015f \u00c7\u0131k\u0131\u015f (I\/O, Input\/Output) \u0130\u015flemleri -2","_en_post_content":"","_en_post_name":"","_en_post_excerpt":"","_en_post_title":"","edit_language":"tr","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":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[1],"tags":[],"class_list":["post-422","post","type-post","status-publish","format-standard","hentry","category-genel"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5gWM6-6O","jetpack-related-posts":[],"_links":{"self":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/422","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=422"}],"version-history":[{"count":0,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/422\/revisions"}],"wp:attachment":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=422"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=422"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=422"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}