{"id":523,"date":"2016-01-10T00:03:07","date_gmt":"2016-01-09T22:03:07","guid":{"rendered":"http:\/\/ozenozkaya.com\/blog\/?p=523"},"modified":"2016-05-29T22:24:53","modified_gmt":"2016-05-29T19:24:53","slug":"pic-programlama-9-zamanlayicilar-timers-2","status":"publish","type":"post","link":"http:\/\/ozenozkaya.com\/blog\/?p=523","title":{"rendered":"PIC Programlama \u2013 9 \u2013 Zamanlay\u0131c\u0131lar (Timers) 2"},"content":{"rendered":"<p>Merhabalar, g\u00f6rece uzunca bir aradan sonra yaz\u0131lar\u0131m\u0131za kald\u0131\u011f\u0131m\u0131z yerden devam ediyoruz. \u00d6nceki yaz\u0131da tam da bir tak\u0131m soru i\u015faretleri b\u0131rakarak ayr\u0131lm\u0131\u015ft\u0131k. G\u00fcn, bunlar\u0131n olabildi\u011fince yan\u0131tlanaca\u011f\u0131 g\u00fcnd\u00fcr.<\/p>\n<p>\u00d6ncelikle \u015fu 1.06ms meselesinin \u00e7\u00f6z\u00fcm\u00fcn\u00fc ve cevab\u0131n\u0131 verelim. Evet efendim, kodumuzda yapt\u0131\u011f\u0131m\u0131z tek sat\u0131rl\u0131k bir modifikasyon ile \u00f6zlenen tabloyu \u00f6ncelikle kamu huzuruna sunal\u0131m.<\/p>\n<div id=\"attachment_524\" style=\"width: 752px\" class=\"wp-caption alignnone\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-524\" data-attachment-id=\"524\" data-permalink=\"http:\/\/ozenozkaya.com\/blog\/?attachment_id=524\" data-orig-file=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_timer0_1.png?fit=742%2C510\" data-orig-size=\"742,510\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"pic_timer0_1\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_timer0_1.png?fit=300%2C206\" data-large-file=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_timer0_1.png?fit=640%2C440\" class=\"size-full wp-image-524\" src=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_timer0_1.png?resize=640%2C440\" alt=\"\" width=\"640\" height=\"440\" srcset=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_timer0_1.png?w=742 742w, https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_timer0_1.png?resize=300%2C206 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><p id=\"caption-attachment-524\" class=\"wp-caption-text\">1.00 ms zamanlay\u0131c\u0131 \u00e7\u0131kt\u0131s\u0131<\/p><\/div>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere tam 1.00 ms&#8217;lik \u00e7\u0131kt\u0131y\u0131 yakalad\u0131k. Tabi burada tam&#8217;dan kas\u0131t, mikrosaniye mertebesindeki \u00f6l\u00e7\u00fcme ithafen bir taml\u0131k. Neyse, \u015fimdi hemen ilk a\u015famada bu uygulaman\u0131n kodlar\u0131n\u0131 payla\u015fal\u0131m.<\/p>\n<pre class=\"lang:c decode:true\" title=\"1ms Timer\">\/* \r\n * File:   main.c\r\n * Author: ozenozkaya\r\n *\r\n * Created on 24 September 2015 \r\n *\/\r\n\r\n#include \"pic16f84a_lib.h\"\r\n\r\n\/*FOSC is 4Mhz. Prescaler input it 1Mhz.\r\n Because prescaler is 8, prescaler output f=125kHz.\r\n So,the prescaler output period is 8uS.\r\n Hence, we need 125 timer pulses to reach 1mS.\r\n 8uS*125 = 1mS*\/\r\n#define TIMER0_VAL_FOR_1MS  (118)\r\n\r\nstatic void milisecond_event_callback()\r\n{\r\n    REG_TIMER0_UNION.count = TIMER0_ASSIGN_CNT(TIMER0_VAL_FOR_1MS);\r\n    REG_PORTB_UNION.port^=0xFF;    \r\n}\r\n\r\nvoid main() {\r\n    REG_TRISB_UNION.port = TRIS_PORT_OUTPUT;\r\n    REG_PORTB_UNION.port = PORT_ALL_LOW;\r\n    \r\n    \/*! 125*8uS = 1000uS = 1mS*\/\r\n    REG_TIMER0_UNION.count = TIMER0_ASSIGN_CNT(TIMER0_VAL_FOR_1MS); \r\n    REG_INTCON_UNION.value = INT_DISABLE_ALL;\r\n    REG_INTCON_UNION.bits.GIE = INT_ENABLE;\r\n    REG_INTCON_UNION.bits.T0IE = INT_ENABLE;\r\n    \r\n    REG_OPTION_UNION.bits.T0CS = T0CS_SOURCE_INTERNAL_CLOCK;\r\n    REG_OPTION_UNION.bits.PSA = PSA_ASSIGN_TO_TIMER0;\r\n    REG_OPTION_UNION.bits.PS = PS_TMR0_RATE_DIVIDE_8; \/\/8uS\r\n    \r\n    register_timer0_int_callback(milisecond_event_callback);\r\n    WAIT_LOOP_FOREVER();\r\n}\r\n<\/pre>\n<p>K\u00fct\u00fcphanemiz yine ayn\u0131, orada bir de\u011fi\u015fikli\u011fe ihtiya\u00e7 yok. \u015eimdi burada neyin de\u011fi\u015fti\u011fini ve neden de\u011fi\u015fti\u011fini a\u00e7\u0131klayal\u0131m. Bir \u00f6nceki yaz\u0131daki koddan farkl\u0131 olan tek sat\u0131r \u015fu:<\/p>\n<pre class=\"lang:c decode:true \">#define TIMER0_VAL_FOR_1MS  (118)<\/pre>\n<p>Bu de\u011ferin normal \u015fartlar alt\u0131nda 125 olmas\u0131 gerekti\u011fini a\u00e7\u0131klam\u0131\u015ft\u0131k. Ancak gelgelelim kesme fonksiyonu i\u00e7inde yazd\u0131\u011f\u0131m\u0131z kodlar, ister istemez bir miktar gecikmeye neden oluyor. Bu sebeple bu gecikmeyi tolere edemiyorsak, timer0&#8217;a y\u00fcklenecek de\u011feri kalibre etmemiz elzem oluyor. Denemeler ile g\u00f6r\u00fcyoruz ki kesme fonksiyondaki kodlar\u0131m\u0131z 7 timer0 cycle kadar bir gecikmeyi do\u011furuyor. Bunu kompanze etmek i\u00e7in 125 cycle yerine 118 cycle sayd\u0131\u011f\u0131m\u0131zda tam 1.o0 ms&#8217;lik bir zamanlama elde ediyoruz. Tabi ki bu s\u00fcre\u00e7 yaln\u0131zca PIC gibi \u00e7ok k\u0131s\u0131tl\u0131 kaynakl\u0131 ve g\u00f6rece yava\u015f ortamlarda ya\u015fan\u0131yor. \u00d6rne\u011fin ARM Cortex M3-M4 gibi platformlarda bu s\u00fcreler ihmal edilecek kadar k\u0131sal\u0131r ve b\u00f6yle bir istisnai kodlama yapman\u0131z gerekmez. Yine uygulaman\u0131z zaman kritik de\u011filse, b\u00f6yle bir istisnai kodlamaya ihtiya\u00e7 duymazs\u0131n\u0131z. Ama yine de bu \u00f6nemli konuyu ak\u0131lda tutmakta fayda var \ud83d\ude42<\/p>\n<p>\u015eimdi, \u00f6nceki yaz\u0131daki defteri kapatt\u0131\u011f\u0131m\u0131za g\u00f6re bu yaz\u0131n\u0131n esas konusuna gelebiliriz. Bu yaz\u0131m\u0131zda zamanlay\u0131c\u0131lar\u0131n bir ba\u015fka \u00f6nemli kullan\u0131m alan\u0131na de\u011finece\u011fiz: PWM (Pulse Width Modulation). Nedir efendim PWM? \u00c7evirisini yapacak olursak dalga geni\u015fli\u011fi mod\u00fclasyonudur. PWM&#8217;in ne oldu\u011fu detayl\u0131ca <a href=\"http:\/\/www.raspi.gen.tr\/2015\/06\/06\/pwm-mantigi-ve-de-ledlerde-pwm-kullanimi\/\">\u015eURADA\u00a0<\/a>anlat\u0131ld\u0131\u011f\u0131ndan daha fazla a\u00e7\u0131klama yapmaya gerek duymuyorum.<\/p>\n<p>\u00c7o\u011fu mikrokontrol\u00f6rde, zamanlay\u0131c\u0131lar \u00fczerinde \u00e7al\u0131\u015fan PWM mod\u00fclleri donan\u0131msal olarak bulunur. PIC&#8217;in baz\u0131 modellerinde de bu imkan sa\u011flanm\u0131\u015f. Onlar\u0131n kullan\u0131m\u0131na da elbet de\u011finece\u011fiz ama daha \u00f6nemlisi donan\u0131msal PWM mod\u00fcl\u00fc olmasa da bu mod\u00fclasyonu nas\u0131l ger\u00e7ekleyebilece\u011fimiz. Bu yaz\u0131da zamanlay\u0131c\u0131 kullanarak PWM ger\u00e7ekleyece\u011fiz.<\/p>\n<p><strong>Zamanlay\u0131c\u0131lar ve GPIO ile PWM<\/strong><\/p>\n<p>PWM dedi\u011fimiz nane say\u0131s\u0131z i\u015fe yar\u0131yor. \u00d6rne\u011fin bir motorun d\u00f6n\u00fc\u015f h\u0131z\u0131n\u0131, bir LED&#8217;in \u0131\u015f\u0131k \u015fiddetini ve daha bir \u00e7ok benzer \u015feyi PWM ile yapabiliyoruz. PWM, i\u015faretin etkin de\u011ferini de\u011fi\u015ftirmeye y\u00f6nelik bir mod\u00fclasyon oldu\u011fundan, fiziksel \u00e7\u0131kt\u0131 farketmeksizin &#8220;\u015fiddet ayarlama&#8221; i\u015fini yapar. Ne demek istiyorum?<\/p>\n<ul>\n<li>Bir motoru sabit 5V ile besledi\u011finizde o motor 5 birim h\u0131zla d\u00f6n\u00fcyorsa, o motoru sabit 2.5V ile besledi\u011finizde motor 2.5 birim h\u0131zla d\u00f6ner.<\/li>\n<li>Bir LED&#8217;i\u00a0sabit 5V ile besledi\u011finizde o LED\u00a05 birim \u0131\u015f\u0131k\u00a0\u015fiddeti ile yan\u0131yorsa, o LED&#8217;i\u00a0sabit 2.5V ile besledi\u011finizde LED\u00a02.5 birim \u0131\u015f\u0131k\u00a0\u015fiddeti ile yanar.<\/li>\n<li>Bir buzzer&#8217;\u0131\u00a0sabit 5V ile besledi\u011finizde o buzzer\u00a05 birim \u015fiddetle ses \u00e7\u0131kar\u0131yorsa, o buzzer&#8217;\u0131\u00a0sabit 2.5V ile besledi\u011finizde buzzer\u00a02.5 birim \u015fiddetle\u00a0ses \u00e7\u0131kar\u0131r.<\/li>\n<\/ul>\n<p>Yani \u00e7\u0131kt\u0131n\u0131n fiziksel \u015fekli farketmeksizin, genelde bu i\u015f b\u00f6yle y\u00fcr\u00fcr. Gelgelelim biz dijital d\u00fcnyada \u00f6yle kolay kolay 2.5V veremiyoruz. Bunun yerine i\u015fareti zamanda mod\u00fcle ederek i\u015fimizi g\u00f6rmek istiyoruz. Nas\u0131l yani?<\/p>\n<p>Yani elinizde olan yaln\u0131zca 5V ise, bundan 2.5V etkin gerilim de\u011feri elde etmenin ba\u015fka bir yolu var. 1ms s\u00fcreyle 5V, 1ms s\u00fcreyle 0V verip bunu s\u00fcrekli tekrarlarsan\u0131z bu i\u015faretin etkin gerilim de\u011feri (5V*1ms +0V*1ms)\/2ms = 2.5V olur. 5V lojik 1, 0V lojik 0 oldu\u011fundan ve i\u015faret zaman\u0131n %50sinde lojik 1 de\u011ferini ald\u0131\u011f\u0131ndan bu i\u015farete %50 PWM denir.<\/p>\n<p>Benzer \u015fekilde\u00a0\u00a08ms s\u00fcreyle 5V, 2ms s\u00fcreyle 0V verip bunu s\u00fcrekli tekrarlarsan\u0131z bu i\u015faretin etkin gerilim de\u011feri \u00a0(5V*8ms + 0V*2ms) \/10ms= 4V olur. Hesap a\u00e7\u0131k efendim. Zaman\u0131n %80&#8217;inde i\u015faret lojik 1 de\u011ferini ald\u0131\u011f\u0131ndan bu i\u015farete %80 PWM denir. PWM&#8217;de i\u015faretin 1 oldu\u011fu zamana <strong>duty cycle<\/strong> denir. Tekrar eden toplam zaman, periyottur ve burada i\u015faretin <strong>periyodu<\/strong> 10ms&#8217;dir. Frekans = (1 \/ Periyot[sn]) oldu\u011fundan burada frekans 1\/10[ms] = 1\/0.01[sn]\u00a0= 100 Hz olur. \u00a0 <strong>Periyot<\/strong> ve <strong>duty cycle<\/strong> kontrol edilerek dalga geni\u015fli\u011fi mod\u00fclasyonu (PWM) yap\u0131labilir.<\/p>\n<p>PWM&#8217;i anlatmaya gerek yok dedim ama anlatmadan da duramad\u0131m. \u015eimdi laf\u0131 b\u0131rak\u0131p icraate ge\u00e7elim. Peki ne yapaca\u011f\u0131z, PWM&#8217;in %1&#8217;lik \u00e7\u00f6z\u00fcn\u00fcrl\u00fckle kontrol edilebildi\u011fi bir uygulama yazal\u0131m.<\/p>\n<p>K\u00fct\u00fcphanemizde bir de\u011fi\u015fiklik yapmaks\u0131z\u0131n main.c dosyam\u0131z\u0131 a\u015fa\u011f\u0131daki gibi yazarsak olay tamam oluyor.<\/p>\n<pre class=\"lang:c decode:true\" title=\"pwm\">\/* \r\n * File:   main.c\r\n * Author: ozenozkaya\r\n *\r\n * Created on 09 January 2016 \r\n *\/\r\n\r\n#include \"pic16f84a_lib.h\"\r\n\r\n\/*FOSC is 4Mhz. Prescaler input it 1Mhz.\r\n Because prescaler is 8, prescaler output f=125kHz.\r\n So,the prescaler output period is 8uS.\r\n Hence, we need 125 timer pulses to reach 1mS.\r\n 8uS*125 = 1mS*\/\r\n#define TIMER0_VAL_FOR_1MS  (118)\r\n#define PWM_DUTY_CYCLE_DEFAULT (50)\r\n#define PWM_OUTPUT_SET()    do{REG_PORTB_UNION.port=0xFF;}while(0)\r\n#define PWM_OUTPUT_CLR()    do{REG_PORTB_UNION.port=0;}while(0)\r\n\r\nstatic uint8_t pwm_duty_cycle=PWM_DUTY_CYCLE_DEFAULT;\r\n\r\nstatic void pwm_event_callback()\r\n{\r\n    static uint8_t pwm_tick=0;\r\n    REG_TIMER0_UNION.count = TIMER0_ASSIGN_CNT(TIMER0_VAL_FOR_1MS);\r\n    \r\n    if(pwm_tick&lt;pwm_duty_cycle)\r\n    {\r\n        PWM_OUTPUT_SET();\r\n    }\r\n    else\r\n    {\r\n        PWM_OUTPUT_CLR();\r\n    }\r\n    \r\n    if(pwm_tick&gt;=100)\r\n    {\r\n        pwm_tick=0;\r\n    }\r\n    else\r\n    {\r\n        pwm_tick++;\r\n    }\r\n    \r\n}\r\n\r\nvoid pwm_set_duty_cycle(uint8_t new_pwm_duty_cycle)\r\n{\r\n    if(new_pwm_duty_cycle &lt;= 100)\r\n    {\r\n        pwm_duty_cycle = new_pwm_duty_cycle;\r\n    }\r\n}\r\n\r\n\r\nvoid main() {\r\n    REG_TRISB_UNION.port = TRIS_PORT_OUTPUT;\r\n    REG_PORTB_UNION.port = PORT_ALL_LOW;\r\n    \r\n    \/*! 125*8uS = 1000uS = 1mS*\/\r\n    REG_TIMER0_UNION.count = TIMER0_ASSIGN_CNT(TIMER0_VAL_FOR_1MS); \r\n    REG_INTCON_UNION.value = INT_DISABLE_ALL;\r\n    REG_INTCON_UNION.bits.GIE = INT_ENABLE;\r\n    REG_INTCON_UNION.bits.T0IE = INT_ENABLE;\r\n    \r\n    REG_OPTION_UNION.bits.T0CS = T0CS_SOURCE_INTERNAL_CLOCK;\r\n    REG_OPTION_UNION.bits.PSA = PSA_ASSIGN_TO_TIMER0;\r\n    REG_OPTION_UNION.bits.PS = PS_TMR0_RATE_DIVIDE_8; \/\/8uS\r\n    \r\n    pwm_set_duty_cycle(50);\r\n    register_timer0_int_callback(pwm_event_callback);\r\n    WAIT_LOOP_FOREVER();\r\n}\r\n<\/pre>\n<p>Ve bu \u015firin mi \u015firin ama bir o kadar da ac\u0131mas\u0131z kodun \u00e7\u0131kt\u0131s\u0131 a\u015fa\u011f\u0131daki gibi oluyor.<\/p>\n<div id=\"attachment_525\" style=\"width: 696px\" class=\"wp-caption alignnone\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-525\" data-attachment-id=\"525\" data-permalink=\"http:\/\/ozenozkaya.com\/blog\/?attachment_id=525\" data-orig-file=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_0.png?fit=686%2C395\" data-orig-size=\"686,395\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"pic_pwm_0\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_0.png?fit=300%2C173\" data-large-file=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_0.png?fit=640%2C369\" class=\"wp-image-525 size-full\" src=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_0.png?resize=640%2C369\" alt=\"\" width=\"640\" height=\"369\" srcset=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_0.png?w=686 686w, https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_0.png?resize=300%2C173 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><p id=\"caption-attachment-525\" class=\"wp-caption-text\">%50 PWM<\/p><\/div>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere periyodu ~100ms olan %50&#8217;lik bir PWM i\u015fareti elde etmi\u015f olduk. Gelin \u015fimdi %25&#8217;lik PWM elde etmek i\u00e7in ne yapmam\u0131z gerekti\u011fini g\u00f6relim.<\/p>\n<p>Yaln\u0131zca \u015fu sat\u0131r\u0131 de\u011fi\u015ftirmek yeterli:<\/p>\n<pre class=\"lang:c decode:true \">pwm_set_duty_cycle(25);<\/pre>\n<p>Bu durumda sim\u00fclasyon \u00e7\u0131kt\u0131s\u0131 da a\u015fa\u011f\u0131daki gibi oluyor.<\/p>\n<div id=\"attachment_526\" style=\"width: 696px\" class=\"wp-caption alignnone\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-526\" data-attachment-id=\"526\" data-permalink=\"http:\/\/ozenozkaya.com\/blog\/?attachment_id=526\" data-orig-file=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_25.png?fit=686%2C238\" data-orig-size=\"686,238\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"pic_pwm_25\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;%25 PWM&lt;\/p&gt;\n\" data-medium-file=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_25.png?fit=300%2C104\" data-large-file=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_25.png?fit=640%2C222\" class=\"size-full wp-image-526\" src=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_25.png?resize=640%2C222\" alt=\"\" width=\"640\" height=\"222\" srcset=\"https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_25.png?w=686 686w, https:\/\/i0.wp.com\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_25.png?resize=300%2C104 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><p id=\"caption-attachment-526\" class=\"wp-caption-text\">%25 PWM<\/p><\/div>\n<p>Her iki \u00e7\u0131kt\u0131da da periyodun 100ms oldu\u011funa yani frekans\u0131n 10Hz oldu\u011funa dikkat ediniz. PWM frekans\u0131n\u0131 \u00f6rne\u011fin 20HZ yapmak i\u00e7in a\u015fa\u011f\u0131daki de\u011fi\u015fikli\u011fi yapman\u0131z yeterli.<\/p>\n<pre class=\"lang:c decode:true \">#define TIMER0_VAL_FOR_1MS  (59)<\/pre>\n<p>Bu de\u011fi\u015fiklik ile zamanlay\u0131c\u0131n\u0131n birim zaman\u0131n\u0131 1ms&#8217;den 0.5ms&#8217;ye d\u00fc\u015f\u00fcrd\u00fck. Bu da frekans\u0131 iki kat\u0131na \u00e7\u0131kard\u0131.<\/p>\n<p>Bu uygulama ile art\u0131k bir motorun h\u0131z\u0131n\u0131 kontrol etmek m\u00fcmk\u00fcn. Robot\u00e7u arkada\u015flar varsa bu k\u0131s\u0131m faydal\u0131 olacakt\u0131r diye d\u00fc\u015f\u00fcn\u00fcyorum.<\/p>\n<p>Projenin kaynak kodlar\u0131n\u0131 <a href=\"http:\/\/ozenozkaya.com\/files\/codes\/Timer0_SimplePWM.rar\">BURADAN <\/a>indirebilirsiniz.<\/p>\n<p>Bu g\u00fcnl\u00fck de bu kadar. \u0130leride yeni ibretlerle ve yeni yaz\u0131larla devam edece\u011fiz.<\/p>\n<p>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=470\" 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=538\" 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>Merhabalar, g\u00f6rece uzunca bir aradan sonra yaz\u0131lar\u0131m\u0131za kald\u0131\u011f\u0131m\u0131z yerden devam ediyoruz. \u00d6nceki yaz\u0131da tam da bir tak\u0131m soru i\u015faretleri b\u0131rakarak ayr\u0131lm\u0131\u015ft\u0131k. G\u00fcn, bunlar\u0131n olabildi\u011fince yan\u0131tlanaca\u011f\u0131 g\u00fcnd\u00fcr. \u00d6ncelikle \u015fu 1.06ms meselesinin \u00e7\u00f6z\u00fcm\u00fcn\u00fc ve cevab\u0131n\u0131 verelim. Evet efendim, kodumuzda yapt\u0131\u011f\u0131m\u0131z tek sat\u0131rl\u0131k bir modifikasyon ile \u00f6zlenen tabloyu \u00f6ncelikle kamu huzuruna sunal\u0131m. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere tam 1.00 ms&#8217;lik \u00e7\u0131kt\u0131y\u0131 <a class=\"read-more\" href=\"http:\/\/ozenozkaya.com\/blog\/?p=523\">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":"Merhabalar, g\u00f6rece uzunca bir aradan sonra yaz\u0131lar\u0131m\u0131za kald\u0131\u011f\u0131m\u0131z yerden devam ediyoruz. \u00d6nceki yaz\u0131da tam da bir tak\u0131m soru i\u015faretleri b\u0131rakarak ayr\u0131lm\u0131\u015ft\u0131k. G\u00fcn, bunlar\u0131n olabildi\u011fince yan\u0131tlanaca\u011f\u0131 g\u00fcnd\u00fcr.\r\n\r\n\u00d6ncelikle \u015fu 1.06ms meselesinin \u00e7\u00f6z\u00fcm\u00fcn\u00fc ve cevab\u0131n\u0131 verelim. Evet efendim, kodumuzda yapt\u0131\u011f\u0131m\u0131z tek sat\u0131rl\u0131k bir modifikasyon ile \u00f6zlenen tabloyu \u00f6ncelikle kamu huzuruna sunal\u0131m.\r\n\r\n[caption id=\"attachment_524\" align=\"alignnone\" width=\"742\"]<img class=\"size-full wp-image-524\" src=\"http:\/\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_timer0_1.png\" alt=\"\" width=\"742\" height=\"510\" \/> 1.00 ms zamanlay\u0131c\u0131 \u00e7\u0131kt\u0131s\u0131[\/caption]\r\n\r\nG\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere tam 1.00 ms'lik \u00e7\u0131kt\u0131y\u0131 yakalad\u0131k. Tabi burada tam'dan kas\u0131t, mikrosaniye mertebesindeki \u00f6l\u00e7\u00fcme ithafen bir taml\u0131k. Neyse, \u015fimdi hemen ilk a\u015famada bu uygulaman\u0131n kodlar\u0131n\u0131 payla\u015fal\u0131m.\r\n<pre class=\"lang:c decode:true\" title=\"1ms Timer\">\/* \r\n * File:   main.c\r\n * Author: ozenozkaya\r\n *\r\n * Created on 24 September 2015 \r\n *\/\r\n\r\n#include \"pic16f84a_lib.h\"\r\n\r\n\/*FOSC is 4Mhz. Prescaler input it 1Mhz.\r\n Because prescaler is 8, prescaler output f=125kHz.\r\n So,the prescaler output period is 8uS.\r\n Hence, we need 125 timer pulses to reach 1mS.\r\n 8uS*125 = 1mS*\/\r\n#define TIMER0_VAL_FOR_1MS  (118)\r\n\r\nstatic void milisecond_event_callback()\r\n{\r\n    REG_TIMER0_UNION.count = TIMER0_ASSIGN_CNT(TIMER0_VAL_FOR_1MS);\r\n    REG_PORTB_UNION.port^=0xFF;    \r\n}\r\n\r\nvoid main() {\r\n    REG_TRISB_UNION.port = TRIS_PORT_OUTPUT;\r\n    REG_PORTB_UNION.port = PORT_ALL_LOW;\r\n    \r\n    \/*! 125*8uS = 1000uS = 1mS*\/\r\n    REG_TIMER0_UNION.count = TIMER0_ASSIGN_CNT(TIMER0_VAL_FOR_1MS); \r\n    REG_INTCON_UNION.value = INT_DISABLE_ALL;\r\n    REG_INTCON_UNION.bits.GIE = INT_ENABLE;\r\n    REG_INTCON_UNION.bits.T0IE = INT_ENABLE;\r\n    \r\n    REG_OPTION_UNION.bits.T0CS = T0CS_SOURCE_INTERNAL_CLOCK;\r\n    REG_OPTION_UNION.bits.PSA = PSA_ASSIGN_TO_TIMER0;\r\n    REG_OPTION_UNION.bits.PS = PS_TMR0_RATE_DIVIDE_8; \/\/8uS\r\n    \r\n    register_timer0_int_callback(milisecond_event_callback);\r\n    WAIT_LOOP_FOREVER();\r\n}\r\n<\/pre>\r\nK\u00fct\u00fcphanemiz yine ayn\u0131, orada bir de\u011fi\u015fikli\u011fe ihtiya\u00e7 yok. \u015eimdi burada neyin de\u011fi\u015fti\u011fini ve neden de\u011fi\u015fti\u011fini a\u00e7\u0131klayal\u0131m. Bir \u00f6nceki yaz\u0131daki koddan farkl\u0131 olan tek sat\u0131r \u015fu:\r\n<pre class=\"lang:c decode:true \">#define TIMER0_VAL_FOR_1MS  (118)<\/pre>\r\nBu de\u011ferin normal \u015fartlar alt\u0131nda 125 olmas\u0131 gerekti\u011fini a\u00e7\u0131klam\u0131\u015ft\u0131k. Ancak gelgelelim kesme fonksiyonu i\u00e7inde yazd\u0131\u011f\u0131m\u0131z kodlar, ister istemez bir miktar gecikmeye neden oluyor. Bu sebeple bu gecikmeyi tolere edemiyorsak, timer0'a y\u00fcklenecek de\u011feri kalibre etmemiz elzem oluyor. Denemeler ile g\u00f6r\u00fcyoruz ki kesme fonksiyondaki kodlar\u0131m\u0131z 7 timer0 cycle kadar bir gecikmeyi do\u011furuyor. Bunu kompanze etmek i\u00e7in 125 cycle yerine 118 cycle sayd\u0131\u011f\u0131m\u0131zda tam 1.o0 ms'lik bir zamanlama elde ediyoruz. Tabi ki bu s\u00fcre\u00e7 yaln\u0131zca PIC gibi \u00e7ok k\u0131s\u0131tl\u0131 kaynakl\u0131 ve g\u00f6rece yava\u015f ortamlarda ya\u015fan\u0131yor. \u00d6rne\u011fin ARM Cortex M3-M4 gibi platformlarda bu s\u00fcreler ihmal edilecek kadar k\u0131sal\u0131r ve b\u00f6yle bir istisnai kodlama yapman\u0131z gerekmez. Yine uygulaman\u0131z zaman kritik de\u011filse, b\u00f6yle bir istisnai kodlamaya ihtiya\u00e7 duymazs\u0131n\u0131z. Ama yine de bu \u00f6nemli konuyu ak\u0131lda tutmakta fayda var :)\r\n\r\n\u015eimdi, \u00f6nceki yaz\u0131daki defteri kapatt\u0131\u011f\u0131m\u0131za g\u00f6re bu yaz\u0131n\u0131n esas konusuna gelebiliriz. Bu yaz\u0131m\u0131zda zamanlay\u0131c\u0131lar\u0131n bir ba\u015fka \u00f6nemli kullan\u0131m alan\u0131na de\u011finece\u011fiz: PWM (Pulse Width Modulation). Nedir efendim PWM? \u00c7evirisini yapacak olursak dalga geni\u015fli\u011fi mod\u00fclasyonudur. PWM'in ne oldu\u011fu detayl\u0131ca <a href=\"http:\/\/www.raspi.gen.tr\/2015\/06\/06\/pwm-mantigi-ve-de-ledlerde-pwm-kullanimi\/\">\u015eURADA\u00a0<\/a>anlat\u0131ld\u0131\u011f\u0131ndan daha fazla a\u00e7\u0131klama yapmaya gerek duymuyorum.\r\n\r\n\u00c7o\u011fu mikrokontrol\u00f6rde, zamanlay\u0131c\u0131lar \u00fczerinde \u00e7al\u0131\u015fan PWM mod\u00fclleri donan\u0131msal olarak bulunur. PIC'in baz\u0131 modellerinde de bu imkan sa\u011flanm\u0131\u015f. Onlar\u0131n kullan\u0131m\u0131na da elbet de\u011finece\u011fiz ama daha \u00f6nemlisi donan\u0131msal PWM mod\u00fcl\u00fc olmasa da bu mod\u00fclasyonu nas\u0131l ger\u00e7ekleyebilece\u011fimiz. Bu yaz\u0131da zamanlay\u0131c\u0131 kullanarak PWM ger\u00e7ekleyece\u011fiz.\r\n\r\n<strong>Zamanlay\u0131c\u0131lar ve GPIO ile PWM<\/strong>\r\n\r\nPWM dedi\u011fimiz nane say\u0131s\u0131z i\u015fe yar\u0131yor. \u00d6rne\u011fin bir motorun d\u00f6n\u00fc\u015f h\u0131z\u0131n\u0131, bir LED'in \u0131\u015f\u0131k \u015fiddetini ve daha bir \u00e7ok benzer \u015feyi PWM ile yapabiliyoruz. PWM, i\u015faretin etkin de\u011ferini de\u011fi\u015ftirmeye y\u00f6nelik bir mod\u00fclasyon oldu\u011fundan, fiziksel \u00e7\u0131kt\u0131 farketmeksizin \"\u015fiddet ayarlama\" i\u015fini yapar. Ne demek istiyorum?\r\n<ul>\r\n \t<li>Bir motoru sabit 5V ile besledi\u011finizde o motor 5 birim h\u0131zla d\u00f6n\u00fcyorsa, o motoru sabit 2.5V ile besledi\u011finizde motor 2.5 birim h\u0131zla d\u00f6ner.<\/li>\r\n \t<li>Bir LED'i\u00a0sabit 5V ile besledi\u011finizde o LED\u00a05 birim \u0131\u015f\u0131k\u00a0\u015fiddeti ile yan\u0131yorsa, o LED'i\u00a0sabit 2.5V ile besledi\u011finizde LED\u00a02.5 birim \u0131\u015f\u0131k\u00a0\u015fiddeti ile yanar.<\/li>\r\n \t<li>Bir buzzer'\u0131\u00a0sabit 5V ile besledi\u011finizde o buzzer\u00a05 birim \u015fiddetle ses \u00e7\u0131kar\u0131yorsa, o buzzer'\u0131\u00a0sabit 2.5V ile besledi\u011finizde buzzer\u00a02.5 birim \u015fiddetle\u00a0ses \u00e7\u0131kar\u0131r.<\/li>\r\n<\/ul>\r\nYani \u00e7\u0131kt\u0131n\u0131n fiziksel \u015fekli farketmeksizin, genelde bu i\u015f b\u00f6yle y\u00fcr\u00fcr. Gelgelelim biz dijital d\u00fcnyada \u00f6yle kolay kolay 2.5V veremiyoruz. Bunun yerine i\u015fareti zamanda mod\u00fcle ederek i\u015fimizi g\u00f6rmek istiyoruz. Nas\u0131l yani?\r\n\r\nYani elinizde olan yaln\u0131zca 5V ise, bundan 2.5V etkin gerilim de\u011feri elde etmenin ba\u015fka bir yolu var. 1ms s\u00fcreyle 5V, 1ms s\u00fcreyle 0V verip bunu s\u00fcrekli tekrarlarsan\u0131z bu i\u015faretin etkin gerilim de\u011feri (5V*1ms +0V*1ms)\/2ms = 2.5V olur. 5V lojik 1, 0V lojik 0 oldu\u011fundan ve i\u015faret zaman\u0131n %50sinde lojik 1 de\u011ferini ald\u0131\u011f\u0131ndan bu i\u015farete %50 PWM denir.\r\n\r\nBenzer \u015fekilde\u00a0\u00a08ms s\u00fcreyle 5V, 2ms s\u00fcreyle 0V verip bunu s\u00fcrekli tekrarlarsan\u0131z bu i\u015faretin etkin gerilim de\u011feri \u00a0(5V*8ms + 0V*2ms) \/10ms= 4V olur. Hesap a\u00e7\u0131k efendim. Zaman\u0131n %80'inde i\u015faret lojik 1 de\u011ferini ald\u0131\u011f\u0131ndan bu i\u015farete %80 PWM denir. PWM'de i\u015faretin 1 oldu\u011fu zamana <strong>duty cycle<\/strong> denir. Tekrar eden toplam zaman, periyottur ve burada i\u015faretin <strong>periyodu<\/strong> 10ms'dir. Frekans = (1 \/ Periyot[sn]) oldu\u011fundan burada frekans 1\/10[ms] = 1\/0.01[sn]\u00a0= 100 Hz olur. \u00a0 <strong>Periyot<\/strong> ve <strong>duty cycle<\/strong> kontrol edilerek dalga geni\u015fli\u011fi mod\u00fclasyonu (PWM) yap\u0131labilir.\r\n\r\nPWM'i anlatmaya gerek yok dedim ama anlatmadan da duramad\u0131m. \u015eimdi laf\u0131 b\u0131rak\u0131p icraate ge\u00e7elim. Peki ne yapaca\u011f\u0131z, PWM'in %1'lik \u00e7\u00f6z\u00fcn\u00fcrl\u00fckle kontrol edilebildi\u011fi bir uygulama yazal\u0131m.\r\n\r\nK\u00fct\u00fcphanemizde bir de\u011fi\u015fiklik yapmaks\u0131z\u0131n main.c dosyam\u0131z\u0131 a\u015fa\u011f\u0131daki gibi yazarsak olay tamam oluyor.\r\n<pre class=\"lang:c decode:true\" title=\"pwm\">\/* \r\n * File:   main.c\r\n * Author: ozenozkaya\r\n *\r\n * Created on 09 January 2016 \r\n *\/\r\n\r\n#include \"pic16f84a_lib.h\"\r\n\r\n\/*FOSC is 4Mhz. Prescaler input it 1Mhz.\r\n Because prescaler is 8, prescaler output f=125kHz.\r\n So,the prescaler output period is 8uS.\r\n Hence, we need 125 timer pulses to reach 1mS.\r\n 8uS*125 = 1mS*\/\r\n#define TIMER0_VAL_FOR_1MS  (118)\r\n#define PWM_DUTY_CYCLE_DEFAULT (50)\r\n#define PWM_OUTPUT_SET()    do{REG_PORTB_UNION.port=0xFF;}while(0)\r\n#define PWM_OUTPUT_CLR()    do{REG_PORTB_UNION.port=0;}while(0)\r\n\r\nstatic uint8_t pwm_duty_cycle=PWM_DUTY_CYCLE_DEFAULT;\r\n\r\nstatic void pwm_event_callback()\r\n{\r\n    static uint8_t pwm_tick=0;\r\n    REG_TIMER0_UNION.count = TIMER0_ASSIGN_CNT(TIMER0_VAL_FOR_1MS);\r\n    \r\n    if(pwm_tick&lt;pwm_duty_cycle)\r\n    {\r\n        PWM_OUTPUT_SET();\r\n    }\r\n    else\r\n    {\r\n        PWM_OUTPUT_CLR();\r\n    }\r\n    \r\n    if(pwm_tick&gt;=100)\r\n    {\r\n        pwm_tick=0;\r\n    }\r\n    else\r\n    {\r\n        pwm_tick++;\r\n    }\r\n    \r\n}\r\n\r\nvoid pwm_set_duty_cycle(uint8_t new_pwm_duty_cycle)\r\n{\r\n    if(new_pwm_duty_cycle &lt;= 100)\r\n    {\r\n        pwm_duty_cycle = new_pwm_duty_cycle;\r\n    }\r\n}\r\n\r\n\r\nvoid main() {\r\n    REG_TRISB_UNION.port = TRIS_PORT_OUTPUT;\r\n    REG_PORTB_UNION.port = PORT_ALL_LOW;\r\n    \r\n    \/*! 125*8uS = 1000uS = 1mS*\/\r\n    REG_TIMER0_UNION.count = TIMER0_ASSIGN_CNT(TIMER0_VAL_FOR_1MS); \r\n    REG_INTCON_UNION.value = INT_DISABLE_ALL;\r\n    REG_INTCON_UNION.bits.GIE = INT_ENABLE;\r\n    REG_INTCON_UNION.bits.T0IE = INT_ENABLE;\r\n    \r\n    REG_OPTION_UNION.bits.T0CS = T0CS_SOURCE_INTERNAL_CLOCK;\r\n    REG_OPTION_UNION.bits.PSA = PSA_ASSIGN_TO_TIMER0;\r\n    REG_OPTION_UNION.bits.PS = PS_TMR0_RATE_DIVIDE_8; \/\/8uS\r\n    \r\n    pwm_set_duty_cycle(50);\r\n    register_timer0_int_callback(pwm_event_callback);\r\n    WAIT_LOOP_FOREVER();\r\n}\r\n<\/pre>\r\nVe bu \u015firin mi \u015firin ama bir o kadar da ac\u0131mas\u0131z kodun \u00e7\u0131kt\u0131s\u0131 a\u015fa\u011f\u0131daki gibi oluyor.\r\n\r\n[caption id=\"attachment_525\" align=\"alignnone\" width=\"686\"]<img class=\"wp-image-525 size-full\" src=\"http:\/\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_0.png\" alt=\"\" width=\"686\" height=\"395\" \/> %50 PWM[\/caption]\r\n\r\nG\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere periyodu ~100ms olan %50'lik bir PWM i\u015fareti elde etmi\u015f olduk. Gelin \u015fimdi %25'lik PWM elde etmek i\u00e7in ne yapmam\u0131z gerekti\u011fini g\u00f6relim.\r\n\r\nYaln\u0131zca \u015fu sat\u0131r\u0131 de\u011fi\u015ftirmek yeterli:\r\n<pre class=\"lang:c decode:true \">pwm_set_duty_cycle(25);<\/pre>\r\nBu durumda sim\u00fclasyon \u00e7\u0131kt\u0131s\u0131 da a\u015fa\u011f\u0131daki gibi oluyor.\r\n\r\n[caption id=\"attachment_526\" align=\"alignnone\" width=\"686\"]<img class=\"size-full wp-image-526\" src=\"http:\/\/ozenozkaya.com\/blog\/wp-content\/uploads\/pic_pwm_25.png\" alt=\"\" width=\"686\" height=\"238\" \/> %25 PWM[\/caption]\r\n\r\nHer iki \u00e7\u0131kt\u0131da da periyodun 100ms oldu\u011funa yani frekans\u0131n 10Hz oldu\u011funa dikkat ediniz. PWM frekans\u0131n\u0131 \u00f6rne\u011fin 20HZ yapmak i\u00e7in a\u015fa\u011f\u0131daki de\u011fi\u015fikli\u011fi yapman\u0131z yeterli.\r\n<pre class=\"lang:c decode:true \">#define TIMER0_VAL_FOR_1MS  (59)<\/pre>\r\nBu de\u011fi\u015fiklik ile zamanlay\u0131c\u0131n\u0131n birim zaman\u0131n\u0131 1ms'den 0.5ms'ye d\u00fc\u015f\u00fcrd\u00fck. Bu da frekans\u0131 iki kat\u0131na \u00e7\u0131kard\u0131.\r\n\r\nBu uygulama ile art\u0131k bir motorun h\u0131z\u0131n\u0131 kontrol etmek m\u00fcmk\u00fcn. Robot\u00e7u arkada\u015flar varsa bu k\u0131s\u0131m faydal\u0131 olacakt\u0131r diye d\u00fc\u015f\u00fcn\u00fcyorum.\r\n\r\nProjenin kaynak kodlar\u0131n\u0131 <a href=\"http:\/\/ozenozkaya.com\/files\/codes\/Timer0_SimplePWM.rar\">BURADAN <\/a>indirebilirsiniz.\r\n\r\nBu g\u00fcnl\u00fck de bu kadar. \u0130leride yeni ibretlerle ve yeni yaz\u0131larla devam edece\u011fiz.\r\n\r\nYaz\u0131lar\u0131 be\u011fendiyseniz, faydalanabilecek tan\u0131d\u0131klar\u0131n\u0131zla payla\u015fmay\u0131 unutmay\u0131n\u0131z.\r\n\r\n[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=470\" style=\"3d\"\u00a0icon=\"icon: arrow-circle-o-left\"]\u00d6nceki Sayfa[\/su_button] \u00a0[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=538\" style=\"3d\" icon=\"icon: arrow-circle-right\"]Sonraki Sayfa[\/su_button]","_tr_post_name":"pic-programlama-9-zamanlayicilar-timers-2","_tr_post_excerpt":"","_tr_post_title":"PIC Programlama \u2013 9 \u2013 Zamanlay\u0131c\u0131lar (Timers) 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":[2,3],"tags":[],"class_list":["post-523","post","type-post","status-publish","format-standard","hentry","category-elektronik","category-gomulu-sistemler"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5gWM6-8r","jetpack-related-posts":[],"_links":{"self":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/523","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=523"}],"version-history":[{"count":2,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/523\/revisions"}],"predecessor-version":[{"id":546,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/523\/revisions\/546"}],"wp:attachment":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=523"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}