<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2265599632708789206</id><updated>2012-01-31T06:17:18.613-08:00</updated><category term='SHT11'/><category term='Variable DC power supply'/><category term='PIC16F628A Development Board'/><category term='Homemade power supply'/><category term='PIC16F628A Projects'/><category term='PIC12F683 and UART'/><category term='Tachometer'/><category term='RS232'/><category term='DC Motor Control'/><category term='PIC16F628A Counter'/><category term='keypad'/><category term='pic16f1827'/><category term='PIC Projects'/><category term='PIC12F683'/><category term='pic microchip and hyperterminal'/><category term='PIC16F628A clock'/><category term='DC power supply'/><category term='PIC16F628A frequency counter'/><category term='Seven Segment Display'/><category term='Temperature data logger'/><category term='DVM'/><category term='LED Chaser'/><category term='1-Wire Protocol'/><category term='LCD Interface'/><category term='555'/><category term='8-pin PIC microcontrollers'/><category term='voltmeter'/><category term='opamp'/><category term='DS1820'/><category term='PIC16F688'/><category term='4-Bit Counter'/><category term='heart rate measurement'/><category term='Why PIC?'/><category term='breadboard'/><category term='PIC Timer'/><category term='PIC16F628A tutorials'/><category term='PIC12F683 Dev Board'/><category term='pic16f1847'/><category term='Transistor tester'/><category term='mikroC'/><category term='UART'/><category term='DIY Power Supply'/><category term='Hyperterminal and PIC16F628A'/><category term='LM350T'/><category term='PIC12F629 Digital Thermometer'/><category term='PWM'/><category term='PIC Temperature Display'/><category term='PIC Tutorials'/><category term='LM350 Variable voltage regulator'/><category term='PIC16F628A Experiments'/><category term='Digital Power Meter'/><category term='Multiplexed Seven Segment'/><category term='Nokia LCD and PIC'/><category term='H-bridge'/><category term='PICMicro'/><category term='PIC Timer1'/><category term='SHT75'/><category term='pic16f628a module'/><category term='christmas light'/><category term='Interrupt'/><category term='PIC Frequency Counter'/><category term='Timer'/><category term='Interrupt service routine'/><category term='PIC16F628A'/><category term='Temperature Meter'/><category term='PIC12F629'/><category term='PIC12F683 ADC'/><category term='PIC Kit'/><category term='Serial LCD'/><category term='ISR'/><category term='humidity sensor'/><category term='enhanced mid-range pic'/><category term='PIC18f2550'/><category term='EEPROM'/><category term='Gear Clock'/><category term='pic project'/><category term='Nokia 3310 and Microcontroller'/><title type='text'>Experiments with PIC16F628A</title><subtitle type='html'>PIC Programming in C</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>50</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-4102968667325731975</id><published>2011-06-24T12:51:00.000-07:00</published><updated>2011-10-14T10:28:02.035-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pic16f1847'/><category scheme='http://www.blogger.com/atom/ns#' term='pic16f1827'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Development Board'/><category scheme='http://www.blogger.com/atom/ns#' term='enhanced mid-range pic'/><title type='text'>Development board for PIC16F628A, PIC16F88, PIC16F1827, and PIC16F1847 microcontrollers</title><content type='html'>I recently made a second version of my old 18-pin PIC development board with much more peripheral chips.This board is best suitable for doing experiments with enhanced mid-range PIC microcontrollers, such as PIC16F1827 and PIC16F1847. The board has I/O port expander, external EEPROM, temperature sensor, Quad OpAmp, digital potentiometer chips, and many more features.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0ej9qz1ULSs/TgTqKN8wpjI/AAAAAAAAAes/gItcU4U_niw/s1600/PIC16F1827FinishedBoard-550x353.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://1.bp.blogspot.com/-0ej9qz1ULSs/TgTqKN8wpjI/AAAAAAAAAes/gItcU4U_niw/s400/PIC16F1827FinishedBoard-550x353.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;Check out the details of the development board &lt;a href="http://embedded-lab.com/blog/?p=2889" target="blank"&gt;HERE&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-4102968667325731975?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/4102968667325731975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2011/06/development-board-for-pic16f628a.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/4102968667325731975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/4102968667325731975'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2011/06/development-board-for-pic16f628a.html' title='Development board for PIC16F628A, PIC16F88, PIC16F1827, and PIC16F1847 microcontrollers'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-0ej9qz1ULSs/TgTqKN8wpjI/AAAAAAAAAes/gItcU4U_niw/s72-c/PIC16F1827FinishedBoard-550x353.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-7437912427009122382</id><published>2011-05-29T07:16:00.000-07:00</published><updated>2011-05-30T17:01:16.592-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SHT75'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC18f2550'/><category scheme='http://www.blogger.com/atom/ns#' term='SHT11'/><category scheme='http://www.blogger.com/atom/ns#' term='humidity sensor'/><title type='text'>Sensirion's SHT1x and SHT7x series of humidity sensors interfaced to PIC Microcontroller</title><content type='html'>Sensirion's SHT series of humidity sensors integrate sensor elements with all the required signal processing circuits on chip, and provide fully calibrated digital outputs for relative humidity and temperature measurements. This tutorial explains how you can interface a SHT1x/7x sensor to a PIC microcontroller to measure ambient temperature and relative humidity. The tutorial described in full detail about the sensors, their specifications and interface, and the implementation of communication protocol using mikroC compiler.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://www.blogger.com/goog_2110850806"&gt;&lt;img border="0" height="272" src="http://2.bp.blogspot.com/-utIRsp1JCjQ/TeJTyhjFJiI/AAAAAAAAAeU/xHd-o7lhroU/s400/Drift1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Two sensors are simultaneously interfaced to PIC and the consistency between the two sets of results are also explored.&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_2110850806"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://embedded-lab.com/blog/?p=2711" target="blank"&gt;Read the project in detail&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-7437912427009122382?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/7437912427009122382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2011/05/sensirions-sht1x-and-sht7x-series-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/7437912427009122382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/7437912427009122382'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2011/05/sensirions-sht1x-and-sht7x-series-of.html' title='Sensirion&apos;s SHT1x and SHT7x series of humidity sensors interfaced to PIC Microcontroller'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-utIRsp1JCjQ/TeJTyhjFJiI/AAAAAAAAAeU/xHd-o7lhroU/s72-c/Drift1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-5328814964940396299</id><published>2011-05-11T11:08:00.000-07:00</published><updated>2011-05-13T13:42:36.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC18F2550'/><category scheme='http://www.blogger.com/atom/ns#' term='LED dot matrix'/><title type='text'>Fundamentals of LED dot matrix display</title><content type='html'>LED dot matrices are very popular means of displaying information as it allows both static and animated text and images. This tutorial describes the basic architecture of a LED dot matrix display and its interfacing with a microcontroller (PIC18F2550) to display static characters and special symbols.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9iWwQBhQdoE/TcrRM7If5sI/AAAAAAAAAeM/xXtABQhOJRs/s1600/LED_MatrixTitle.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-9iWwQBhQdoE/TcrRM7If5sI/AAAAAAAAAeM/xXtABQhOJRs/s400/LED_MatrixTitle.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://embedded-lab.com/blog/?p=2478" target="blank"&gt;Read rest of the article&lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-5328814964940396299?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/5328814964940396299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2011/05/fundamentals-of-led-dot-matrix-display.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5328814964940396299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5328814964940396299'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2011/05/fundamentals-of-led-dot-matrix-display.html' title='Fundamentals of LED dot matrix display'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-9iWwQBhQdoE/TcrRM7If5sI/AAAAAAAAAeM/xXtABQhOJRs/s72-c/LED_MatrixTitle.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-3610552366577816292</id><published>2011-03-27T07:35:00.000-07:00</published><updated>2011-06-24T12:43:38.986-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC Frequency Counter'/><category scheme='http://www.blogger.com/atom/ns#' term='DC power supply'/><category scheme='http://www.blogger.com/atom/ns#' term='Digital Power Meter'/><category scheme='http://www.blogger.com/atom/ns#' term='voltmeter'/><title type='text'>Multi-functional power supply with built-in voltage, current, and frequency meters</title><content type='html'>While prototyping your new project, you might want to know how much power your designed circuit will draw from the source voltage. One way to find it is to connect an ammeter in series with the circuit and determine the current drawn from the source. Then, knowing the source voltage you can easily determine the power. But doing this may not be always convenient. This project describes a special power supply unit that has built-in features for measuring the source voltage and current. Therefore, you can monitor both the parameters continuously while experimenting your circuit.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DDjzhpXsRKs/TY9J9ZuariI/AAAAAAAAAeI/YBOAkV-LLYU/s1600/FrequencyTesting-550x412.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://1.bp.blogspot.com/-DDjzhpXsRKs/TY9J9ZuariI/AAAAAAAAAeI/YBOAkV-LLYU/s400/FrequencyTesting-550x412.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Check the details of the project &lt;b&gt;&lt;a href="http://embedded-lab.com/blog/?p=1953" target="blank"&gt;HERE&lt;/a&gt;&lt;/b&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-3610552366577816292?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/3610552366577816292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2011/03/multi-functional-power-supply-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3610552366577816292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3610552366577816292'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2011/03/multi-functional-power-supply-with.html' title='Multi-functional power supply with built-in voltage, current, and frequency meters'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-DDjzhpXsRKs/TY9J9ZuariI/AAAAAAAAAeI/YBOAkV-LLYU/s72-c/FrequencyTesting-550x412.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-5053563149216069787</id><published>2011-02-20T11:39:00.000-08:00</published><updated>2011-05-11T11:06:39.425-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='keypad'/><category scheme='http://www.blogger.com/atom/ns#' term='555'/><title type='text'>555 timer could reduce number of pins in keypad interfacing</title><content type='html'>A 4x3 matrix keypad requires 7 I/O pins of microcontroller for interfacing. But you could reduce the required number of connections to two by using a 555 timer IC. If you want to know how, visit Embedded Lab's new post "&lt;a href="http://embedded-lab.com/blog/?p=1812"&gt;2-Wire Keypad Interfacing using 555 Timer&lt;/a&gt;".&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-5MB8SoIuSho/TWFt9sNS_zI/AAAAAAAAAd4/6E2PtQZhhPE/s1600/Board.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://4.bp.blogspot.com/-5MB8SoIuSho/TWFt9sNS_zI/AAAAAAAAAd4/6E2PtQZhhPE/s400/Board.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-5053563149216069787?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/5053563149216069787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2011/02/555-timer-could-reduce-number-of-pins.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5053563149216069787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5053563149216069787'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2011/02/555-timer-could-reduce-number-of-pins.html' title='555 timer could reduce number of pins in keypad interfacing'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-5MB8SoIuSho/TWFt9sNS_zI/AAAAAAAAAd4/6E2PtQZhhPE/s72-c/Board.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-3660130695990212518</id><published>2011-02-05T12:26:00.000-08:00</published><updated>2011-06-24T12:42:48.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opamp'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A'/><category scheme='http://www.blogger.com/atom/ns#' term='heart rate measurement'/><title type='text'>Heart rate measurement through optical sensors</title><content type='html'>Resting heart rate is an very important health parameter that is directly related to the soundness of human&amp;nbsp;cardiovascular&amp;nbsp;system. This project describes a digital method of measuring heart rate through fingertip. The blood volume inside the finger artery fluctuates with heartbeats. This fluctuation can be measured by transmitting an IR light through the finger. A portion of this light is reflected back. The amount of light reflected back depends upon the blood volume. This small change in the reflected light is amplified through proper signal conditioning circuit and converted into a pulse. Later, a PIC16F628A microcontroller is used to count the pulses at the output of the signal conditioner and display the heart rate on seven segment LEDs.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TU2xebpGUPI/AAAAAAAAAdw/0qIIwJnZ0d4/s1600/HeartRateOuput1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TU2xebpGUPI/AAAAAAAAAdw/0qIIwJnZ0d4/s400/HeartRateOuput1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The signal conditioning circuit uses two operational amplifiers to build a two-stage active low-pass filter with a gain of about 10000, and a cut-off frequency close to 2.5 Hz.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;a href="http://embedded-lab.com/blog/?p=1671" target="blank"&gt;Read More&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-3660130695990212518?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/3660130695990212518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2011/02/heart-rate-measurement-through-optical.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3660130695990212518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3660130695990212518'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2011/02/heart-rate-measurement-through-optical.html' title='Heart rate measurement through optical sensors'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_92HIn_KJDYY/TU2xebpGUPI/AAAAAAAAAdw/0qIIwJnZ0d4/s72-c/HeartRateOuput1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-3338913006302148468</id><published>2011-01-11T06:59:00.000-08:00</published><updated>2011-06-24T12:42:18.856-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PICMicro'/><category scheme='http://www.blogger.com/atom/ns#' term='H-bridge'/><category scheme='http://www.blogger.com/atom/ns#' term='DC Motor Control'/><title type='text'>PIC Micro, H-bridge and DC motor</title><content type='html'>H-Bridge is a very popular application circuit for dc motor control. It uses BJTs or MOSFETs to switch on the dc motor in clockwise or counterclockwise direction. This tutorial describes the classical H-bridge circuit and how to interface it with a PIC microcontroller to operate a DC motor.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://embedded-lab.com/blog/wp-content/uploads/2011/01/Img_DC_MotorHBSetup.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="310" src="http://embedded-lab.com/blog/wp-content/uploads/2011/01/Img_DC_MotorHBSetup.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;a href="http://embedded-lab.com/blog/?p=1159" target="blank"&gt;Read&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-3338913006302148468?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/3338913006302148468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2011/01/pic-micro-h-bridge-and-dc-motor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3338913006302148468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3338913006302148468'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2011/01/pic-micro-h-bridge-and-dc-motor.html' title='PIC Micro, H-bridge and DC motor'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-6564026772133701025</id><published>2011-01-05T11:47:00.000-08:00</published><updated>2011-06-24T12:41:37.883-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC Timer'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A'/><title type='text'>Programmable digital timer with a relay switch</title><content type='html'>This project shows how to make a simple programmable digital timer switch with a PIC16F628A microcontroller. The timing schedule for the relay switch can be programmed through 4 push buttons. The program menu, the status of the relay switch and time information is shown on a character LCD.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://embedded-lab.com/blog/wp-content/uploads/2010/12/Img_DigitalTimerFinished2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="290" src="http://embedded-lab.com/blog/wp-content/uploads/2010/12/Img_DigitalTimerFinished2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;The circuit details and firmware are available to download at &lt;a href="http://www.embedded-lab.com/"&gt;www.embedded-lab.com&lt;/a&gt; in the Projects section.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-6564026772133701025?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/6564026772133701025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2011/01/programmable-digital-timer-with-relay.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/6564026772133701025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/6564026772133701025'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2011/01/programmable-digital-timer-with-relay.html' title='Programmable digital timer with a relay switch'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-8058557637072863837</id><published>2010-12-08T17:53:00.000-08:00</published><updated>2011-06-24T12:30:50.360-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='christmas light'/><category scheme='http://www.blogger.com/atom/ns#' term='pic project'/><title type='text'>Running message display board for Christmas decoration</title><content type='html'>This is a Christmas decoration project using LEDs and PIC microcontroller. The red color LEDs are used to construct a Christmas greeting and the letters in the message are individually controlled through the microcontroller's I/O pins.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="375" width="460"&gt;&lt;param name="movie" value="http://www.youtube.com/v/NxojyOrQw7I?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/NxojyOrQw7I?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="460" height="375"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;For the circuit diagram and test program, visit &lt;a href="http://embedded-lab.com/blog/?p=1034" target="blank"&gt;PIC16F628A Breadboard Module.&lt;/a&gt;&lt;br /&gt;Check the details of the project &lt;b&gt;&lt;a href="http://embedded-lab.com/blog/?p=1260" target="blank"&gt;HERE&lt;/a&gt;&lt;/b&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-8058557637072863837?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/8058557637072863837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/12/running-message-display-board-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/8058557637072863837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/8058557637072863837'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/12/running-message-display-board-for.html' title='Running message display board for Christmas decoration'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-564379529101543151</id><published>2010-12-03T08:50:00.000-08:00</published><updated>2011-06-24T12:28:58.228-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pic16f628a module'/><category scheme='http://www.blogger.com/atom/ns#' term='breadboard'/><title type='text'>PIC16F628A breadboard module for quick prototyping</title><content type='html'>This breadboard module is for PIC16F628A microcontroller and it provides access to the I/O ports and the power supply pins through male headers that can be easily inserted into a breadboard. This board will make protyping easier as the external oscillator, reset, and ICSP circuits are already implemented in the module. The layout of the module is shown below.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://embedded-lab.com/blog/wp-content/uploads/2010/11/PIC16F628A_Layout.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://embedded-lab.com/blog/wp-content/uploads/2010/11/PIC16F628A_Layout.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You can construct this board on a general purpose prototyping circuit board.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://embedded-lab.com/blog/wp-content/uploads/2010/12/Img_BreadBoardModulePIC16F628A.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://embedded-lab.com/blog/wp-content/uploads/2010/12/Img_BreadBoardModulePIC16F628A.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;For the circuit diagram and test program, visit &lt;a href="http://embedded-lab.com/blog/?p=1034" target="blank"&gt;PIC16F628A Breadboard Module.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-564379529101543151?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/564379529101543151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/12/pic16f628a-breadboard-module-for-quick.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/564379529101543151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/564379529101543151'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/12/pic16f628a-breadboard-module-for-quick.html' title='PIC16F628A breadboard module for quick prototyping'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-5723551337032356308</id><published>2010-11-09T09:26:00.000-08:00</published><updated>2011-06-24T12:27:59.855-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Transistor tester'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Projects'/><title type='text'>PIC based Diode and BJT tester</title><content type='html'>If your digital multimeter does not have features for testing diodes and transistors, hold on, here's a project that describes how you can construct one by yourself. This project is based on a PIC16F688 microcontroller and uses the simple concept of unidirectional conduction of PN juction to find if the diode or transistor is good or bad. The test results are displayed on a character LCD. It also shows the type of the transistor (NPN or PNP) as well as which of the PN junctions are open or short in a faulty transistor.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://embedded-lab.com/blog/wp-content/uploads/2010/11/Img_PIC16F688_BJTTesterNPNDetails.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="301" src="http://embedded-lab.com/blog/wp-content/uploads/2010/11/Img_PIC16F688_BJTTesterNPNDetails.jpg" width="400" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;Source:&lt;/b&gt; http://embedded-lab.com/blog/&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The firmware is developed using MikroC Pro for PIC compiler. For the details of the circuit diagram and firmware, &lt;a href="http://embedded-lab.com/blog/?p=815" target="blank"&gt;&lt;b&gt;visit here&lt;/b&gt;&lt;/a&gt;.&amp;nbsp; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-5723551337032356308?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/5723551337032356308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/11/pic-based-diode-and-bjt-tester.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5723551337032356308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5723551337032356308'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/11/pic-based-diode-and-bjt-tester.html' title='PIC based Diode and BJT tester'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-2751473172085062802</id><published>2010-10-28T17:43:00.000-07:00</published><updated>2011-06-24T12:26:57.280-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tachometer'/><category scheme='http://www.blogger.com/atom/ns#' term='Hyperterminal and PIC16F628A'/><title type='text'>Contact less tachometer using PIC16F628A</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;Tachometer is a device that gives you the information about the rotational speed of any shaft or disc. It usually measures the speed in revolutions per minute (RPM). Today we are going to make a simple tachometer that could measure the rotation speed of a disk without making any physical contact (that's why it is contact less) with the rotating object. The range of this tachometer is 0 - 9999 RPM and displays the RPM on a multiplexed 4-digit seven-segment display. Of course, we are going to do this project on our usual PIC16F628A development board.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Infrared sensor&lt;/b&gt;&lt;br /&gt;Contact-less measurement of RPM will be achieved through an IR sensor. An IR diode will send a beam of infrared towards the rotating disc, and any reflected pulse will be received by a photo diode. The resistance of a photo diode drops drastically when exposed to infrared. An infrared is reflected by a white surface and absorbed by the dark ones. The test disc for this project is shown below. You can see the disc is black and will absorb any infrared falling upon it. A small piece of white paper sticked to the disc as shown is just enough to reflect the infrared back. This will give one reflected IR pulse per rotation which is sensed by the photo diode.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TMoSlWYuFqI/AAAAAAAAAcg/wzL9muQ7y3w/s1600/RotDisc.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="293" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TMoSlWYuFqI/AAAAAAAAAcg/wzL9muQ7y3w/s400/RotDisc.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;The IR transmitter and receiver circuit is very simple. The IR sensor module built for this purpose is shown below followed by the circuit diagram.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TMoT9chykwI/AAAAAAAAAcs/dcT3Bx_ZnIc/s1600/IR+Assembly.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="317" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TMoT9chykwI/AAAAAAAAAcs/dcT3Bx_ZnIc/s400/IR+Assembly.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TMoS4I5gbDI/AAAAAAAAAck/Vu5VxoxvRZs/s1600/IR_Circuit.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="195" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TMoS4I5gbDI/AAAAAAAAAck/Vu5VxoxvRZs/s400/IR_Circuit.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;IR Tx is the control signal to turn On and Off the IR transmission. The PIC16F628A microcontroller will turn the IR diode on for 1 sec, and will count the reflected pulse during this interval through IR Rx Pulse output. During normal condition,&amp;nbsp;the photo diode (IR Rx diode) offers high impedance (tens of K) and so&amp;nbsp;the voltage across it will make the BC557 transistor in the receiver part (right) cut off. The IR Rx Pulse will be at logic low. When there is a reflected pulse, the resistance of the photo diode (IR Rx diode) will drop down and allow BC557 transistor to saturate. This gives a logic high at IR Rx Pulse output. The PIC 16F628A will count the pulses within the 1 sec interval to determine the RPM of the disc. Actually, it takes 3 samples of RPM and gives the average. So, the measuring time is 3 sec. The pulses will be counted by Timer0 counter.&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;b&gt;Microcontroller Circuit&lt;/b&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;I suggest to see the circuit diagram of the development board (&lt;b&gt;&lt;a href="http://pic16f628a.blogspot.com/2009/09/pic16f628a-development-board-part-1.html"&gt;PIC16F628A Dev Board&lt;/a&gt;&lt;/b&gt;) first and then follow the instructions below.&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Seven segment displays used are common cathode type. The seven segments (a-g) are driven through RB0-RB6 respectively. The 4 common cathodes are controlled by RA0 (units digit) through RA3 (thousands digit).&lt;/li&gt;&lt;li&gt;IR Tx is connected to RB7&lt;/li&gt;&lt;li&gt;IR Rx Pulse is connected to RA4/T0CKI&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Software&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Compile this code with mikroC. I am using 4.0MHz external crystal for clock and MCLR is enabled.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;/*&lt;/div&gt;&lt;div&gt;* Project name: Contact less digital tachometer&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Copyright:&lt;/div&gt;&lt;div&gt;(c) Rajendra Bhatt, October, 2010.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Test configuration:&lt;/div&gt;&lt;div&gt;MCU: PIC16F628A runs @ 4.0 MHz external crystal oscillator&lt;/div&gt;&lt;div&gt;The common cathodes of the four seven segment dispalys are&lt;/div&gt;&lt;div&gt;controlled by RA0, RA1, RA2 and RA3&lt;/div&gt;&lt;div&gt;*/&lt;/div&gt;&lt;div&gt;//-------------- Function to Return mask for common cathode 7-seg. display&lt;/div&gt;&lt;div&gt;unsigned short mask(unsigned short num) {&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;switch (num) {&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 0 : return 0x3F;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 1 : return 0x06;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 2 : return 0x5B;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 3 : return 0x4F;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 4 : return 0x66;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 5 : return 0x6D;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 6 : return 0x7D;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 7 : return 0x07;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 8 : return 0x7F;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 9 : return 0x6F;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;} //case end&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;sbit IR_Tx at RB7_bit;&lt;/div&gt;&lt;div&gt;sbit DD0_Set at RA0_bit;&lt;/div&gt;&lt;div&gt;sbit DD1_Set at RA1_bit;&lt;/div&gt;&lt;div&gt;sbit DD2_Set at RA2_bit;&lt;/div&gt;&lt;div&gt;sbit DD3_Set at RA3_bit;&lt;/div&gt;&lt;div&gt;unsigned short i, DD0, DD1, DD2, DD3;&lt;/div&gt;&lt;div&gt;unsigned int Sample1, Sample2, Sample3, RPM;&lt;/div&gt;&lt;div&gt;void main() {&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;TRISB = 0b00000000; // Set PORTB direction to be output&lt;/div&gt;&lt;div&gt;TRISA = 0b00110000; // Set PORTA direction to be output&lt;/div&gt;&lt;div&gt;PORTB = 0x00; // Turn OFF LEDs on PORTB&lt;/div&gt;&lt;div&gt;CMCON = 7 ; // Disable comparators&lt;/div&gt;&lt;div&gt;RPM = 0; // Initial Value of Counter&lt;/div&gt;&lt;div&gt;OPTION_REG = 0b00111000; // TOCS=1 for Counter mode, PSA=1 for 1:1&lt;/div&gt;&lt;div&gt;IR_Tx = 0; // Turn OFF IR&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;do {&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;DD0 = RPM%10;&lt;/div&gt;&lt;div&gt;&amp;nbsp;DD0 = mask(DD0);&lt;/div&gt;&lt;div&gt;&amp;nbsp;DD1 = (RPM/10)%10;&lt;/div&gt;&lt;div&gt;&amp;nbsp;DD1 = mask(DD1);&lt;/div&gt;&lt;div&gt;&amp;nbsp;DD2 = (RPM/100)%10;&lt;/div&gt;&lt;div&gt;&amp;nbsp;DD2 = mask(DD2);&lt;/div&gt;&lt;div&gt;&amp;nbsp;DD3 = (RPM/1000);&lt;/div&gt;&lt;div&gt;&amp;nbsp;DD3 = mask(DD3);&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;for (i = 0; i&amp;lt;=100; i++) {&lt;/div&gt;&lt;div&gt;PORTB = DD0;&lt;/div&gt;&lt;div&gt;DD0_Set = 1;&lt;/div&gt;&lt;div&gt;DD1_Set = 0;&lt;/div&gt;&lt;div&gt;DD2_Set = 0;&lt;/div&gt;&lt;div&gt;DD3_Set = 0;&lt;/div&gt;&lt;div&gt;delay_ms(5);&lt;/div&gt;&lt;div&gt;PORTB = DD1;&lt;/div&gt;&lt;div&gt;DD0_Set = 0;&lt;/div&gt;&lt;div&gt;DD1_Set = 1;&lt;/div&gt;&lt;div&gt;DD2_Set = 0;&lt;/div&gt;&lt;div&gt;DD3_Set = 0;&lt;/div&gt;&lt;div&gt;delay_ms(5);&lt;/div&gt;&lt;div&gt;PORTB = DD2;&lt;/div&gt;&lt;div&gt;DD0_Set = 0;&lt;/div&gt;&lt;div&gt;DD1_Set = 0;&lt;/div&gt;&lt;div&gt;DD2_Set = 1;&lt;/div&gt;&lt;div&gt;DD3_Set = 0;&lt;/div&gt;&lt;div&gt;delay_ms(5);&lt;/div&gt;&lt;div&gt;PORTB = DD3;&lt;/div&gt;&lt;div&gt;DD0_Set = 0;&lt;/div&gt;&lt;div&gt;DD1_Set = 0;&lt;/div&gt;&lt;div&gt;DD2_Set = 0;&lt;/div&gt;&lt;div&gt;DD3_Set = 1;&lt;/div&gt;&lt;div&gt;delay_ms(5);&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;DD3_Set = 0;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;// First Sample&lt;/div&gt;&lt;div&gt;TMR0=0;&lt;/div&gt;&lt;div&gt;IR_Tx = 1;&lt;/div&gt;&lt;div&gt;Delay_ms(1000); // Delay 1 Sec&lt;/div&gt;&lt;div&gt;IR_Tx = 0;&lt;/div&gt;&lt;div&gt;Sample1 = TMR0*60;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;// Second Sample&lt;/div&gt;&lt;div&gt;TMR0=0;&lt;/div&gt;&lt;div&gt;IR_Tx = 1;&lt;/div&gt;&lt;div&gt;Delay_ms(1000); // Delay 1 Sec&lt;/div&gt;&lt;div&gt;IR_Tx = 0;&lt;/div&gt;&lt;div&gt;Sample2 = TMR0*60;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;// Third Sample&lt;/div&gt;&lt;div&gt;TMR0=0;&lt;/div&gt;&lt;div&gt;IR_Tx = 1;&lt;/div&gt;&lt;div&gt;Delay_ms(1000); // Delay 1 Sec&lt;/div&gt;&lt;div&gt;IR_Tx = 0;&lt;/div&gt;&lt;div&gt;Sample3 = TMR0*60;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;RPM = Sample1 + Sample2 + Sample3;&lt;/div&gt;&lt;div&gt;RPM = RPM/3;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;} while(1); // endless loop&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Output&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The tachometer is tested for various speeds of the rotating disc. The speed is varied by varying the voltage across the motor driving the disc. I got this motor-disc assembly from my old broken printer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Setup&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TMoXuRtRR1I/AAAAAAAAAcw/Y7zZ2EZ7_ac/s1600/CompleteSetup.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TMoXuRtRR1I/AAAAAAAAAcw/Y7zZ2EZ7_ac/s400/CompleteSetup.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Slow speed&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TMoXyxNGE2I/AAAAAAAAAc0/a76tHNVaozY/s1600/Output1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TMoXyxNGE2I/AAAAAAAAAc0/a76tHNVaozY/s400/Output1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Fast speed&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TMoX2nh9drI/AAAAAAAAAc4/FatD42nI7rs/s1600/Output2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TMoX2nh9drI/AAAAAAAAAc4/FatD42nI7rs/s400/Output2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-2751473172085062802?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/2751473172085062802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/10/contact-less-tachometer.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/2751473172085062802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/2751473172085062802'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/10/contact-less-tachometer.html' title='Contact less tachometer using PIC16F628A'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_92HIn_KJDYY/TMoSlWYuFqI/AAAAAAAAAcg/wzL9muQ7y3w/s72-c/RotDisc.jpg' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-6888987248161573757</id><published>2010-10-22T10:37:00.000-07:00</published><updated>2011-06-24T12:25:14.261-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DVM'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F688'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='mikroC'/><title type='text'>PIC16F688 based Digital Voltmeter</title><content type='html'>Actually this is the another version of my older DVM project that was based on PIC12F683. The older version displays the measured voltage on a LCD that is driven serially by PIC12F683 using 3 I/O pins. The new one uses PIC16F688 microcontroller that doesn't require the serial driver as it has got enough pins to drive a LCD directly in 4-bit mode. The theory and math is just the same. You can read my PIC12F683 version of this project &lt;a href="http://picboard.blogspot.com/2010/10/0-20v-digital-voltmeter-dvm-using.html"&gt;&lt;b&gt;here&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Circuit Diagram&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TMHIVZXGy6I/AAAAAAAAAb4/jWPEEDpboAE/s1600/Picture+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="302" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TMHIVZXGy6I/AAAAAAAAAb4/jWPEEDpboAE/s400/Picture+3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TMHJMXeTNWI/AAAAAAAAAb8/UhE5ap--s3E/s1600/Circut.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="303" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TMHJMXeTNWI/AAAAAAAAAb8/UhE5ap--s3E/s400/Circut.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Circuit on breadboard&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Important:&lt;/b&gt; You need a regulated +5V supply for accuracy of the output. The ADC uses Vdd as the reference for conversion, and all computations are done with Vdd = 5V. You can get a regulated +5V using a LM7805 linear regulator IC. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TMHK5g4bfHI/AAAAAAAAAcA/47I0Ck8CaCY/s1600/lm7805.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="305" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TMHK5g4bfHI/AAAAAAAAAcA/47I0Ck8CaCY/s400/lm7805.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&amp;nbsp;My source for a regulated +5V using LM7805 &lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TMHLL8iyt0I/AAAAAAAAAcE/RCQMgEHiqRY/s1600/powersrc.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TMHLL8iyt0I/AAAAAAAAAcE/RCQMgEHiqRY/s400/powersrc.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;My variable power supply source for testing the DVM &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Read the detail theory and math involved in this project &lt;a href="http://picboard.blogspot.com/2010/10/0-20v-digital-voltmeter-dvm-using.html"&gt;&lt;b&gt;here&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Software&lt;/b&gt;&lt;br /&gt;Use mikroC compiler to compile this code. Use options Internal Clock @ 4 MHz, MCLR Enabled, and Power-Up Timer Enabled.&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp; Digital Voltmeter based on PIC16F688&lt;br /&gt;&amp;nbsp; Rajendra Bhatt, Oct 12, 2010&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;// LCD module connections&lt;br /&gt;sbit LCD_RS at RC4_bit;&lt;br /&gt;sbit LCD_EN at RC5_bit;&lt;br /&gt;sbit LCD_D4 at RC0_bit;&lt;br /&gt;sbit LCD_D5 at RC1_bit;&lt;br /&gt;sbit LCD_D6 at RC2_bit;&lt;br /&gt;sbit LCD_D7 at RC3_bit;&lt;br /&gt;sbit LCD_RS_Direction at TRISC4_bit;&lt;br /&gt;sbit LCD_EN_Direction at TRISC5_bit;&lt;br /&gt;sbit LCD_D4_Direction at TRISC0_bit;&lt;br /&gt;sbit LCD_D5_Direction at TRISC1_bit;&lt;br /&gt;sbit LCD_D6_Direction at TRISC2_bit;&lt;br /&gt;sbit LCD_D7_Direction at TRISC3_bit;&lt;br /&gt;// End LCD module connections&lt;br /&gt;&lt;br /&gt;char Message1[] = "DVM Project";&lt;br /&gt;unsigned int ADC_Value, DisplayVolt;&lt;br /&gt;char *volt = "00.0";&lt;br /&gt;&lt;br /&gt;void main() {&lt;br /&gt;&amp;nbsp; ANSEL = 0b00000100; // RA2/AN2 is analog input&lt;br /&gt;&amp;nbsp; ADCON0 = 0b00001000; // Analog channel select @ AN2&lt;br /&gt;&amp;nbsp; ADCON1 = 0x00;&lt;br /&gt;&amp;nbsp; CMCON0 = 0x07 ; // Disbale comparators&lt;br /&gt;&amp;nbsp; TRISC = 0b00000000; // PORTC All Outputs&lt;br /&gt;&amp;nbsp; TRISA = 0b00001100; // PORTA All Outputs, Except RA3 and RA2&lt;br /&gt;&amp;nbsp; Lcd_Init();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Initialize LCD&lt;br /&gt;&amp;nbsp; Lcd_Cmd(_LCD_CLEAR);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // CLEAR display&lt;br /&gt;&amp;nbsp; Lcd_Cmd(_LCD_CURSOR_OFF);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Cursor off&lt;br /&gt;&amp;nbsp; Lcd_Out(1,1,Message1);&lt;br /&gt;&amp;nbsp; Lcd_Chr(2,10,'V');&lt;br /&gt;&lt;br /&gt;do {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ADC_Value = ADC_Read(2);&lt;br /&gt;&amp;nbsp;&amp;nbsp; DisplayVolt = ADC_Value * 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp; volt[0] = DisplayVolt/1000 + 48;&lt;br /&gt;&amp;nbsp;&amp;nbsp; volt[1] = (DisplayVolt/100)%10 + 48;&lt;br /&gt;&amp;nbsp;&amp;nbsp; volt[3] = (DisplayVolt/10)%10 + 48;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Lcd_Out(2,5,volt);&lt;br /&gt;&amp;nbsp;&amp;nbsp; delay_ms(100);&lt;br /&gt;&amp;nbsp; } while(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Output&lt;/b&gt;&lt;br /&gt;The DVM has been tested with various input voltages ranging from 0-20 V and found to be very accurate. Here are some of the pictures of testing.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TMHLa-_Rj8I/AAAAAAAAAcI/V10fRAODcJc/s1600/test1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TMHLa-_Rj8I/AAAAAAAAAcI/V10fRAODcJc/s400/test1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TMHLghFHxMI/AAAAAAAAAcM/cgCgjuVNm-U/s1600/test2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TMHLghFHxMI/AAAAAAAAAcM/cgCgjuVNm-U/s400/test2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TMHLmSUzqII/AAAAAAAAAcQ/RmEKKYgtA7k/s1600/test3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TMHLmSUzqII/AAAAAAAAAcQ/RmEKKYgtA7k/s400/test3.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TMHLqznEbBI/AAAAAAAAAcU/Q6JFCoLJSjE/s1600/test4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TMHLqznEbBI/AAAAAAAAAcU/Q6JFCoLJSjE/s400/test4.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-6888987248161573757?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/6888987248161573757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/10/pic16f688-based-digital-voltmeter.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/6888987248161573757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/6888987248161573757'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/10/pic16f688-based-digital-voltmeter.html' title='PIC16F688 based Digital Voltmeter'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_92HIn_KJDYY/TMHIVZXGy6I/AAAAAAAAAb4/jWPEEDpboAE/s72-c/Picture+3.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-7557793330821122079</id><published>2010-10-05T17:23:00.000-07:00</published><updated>2011-06-24T12:24:12.505-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Digital Power Meter'/><title type='text'>EnerJar: A Digital Energy Meter</title><content type='html'>This project won the grand prize of 2008 Green Gadgets Design competition. It measures the power consumption of an electrical gadget with high accuracy. The project uses PIC16F877A microcontroller to compute the power and shows the output on a 4-digit multiplexed seven segment display.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://enerjar.net/files/images/closeup1-web_0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://enerjar.net/files/images/closeup1-web_0.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;The power consumed by an electrical appliance is simply the product of voltage across the appliance and the current drawn by it. Voltage measurement is pretty straight forward. Using a resistor divider network, 120 V can be converted down to below 5 V, and can be read through ADC port. However, PIC cannot measure the current directly, it must be converted to voltage first. This is done by a low shunt resistance. This voltage drop across the shunt resistance is too small and requires a precision instrumentation amplifier to boost it to appropriate level.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The firmware for PIC is available to download.&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="border-collapse: collapse; width: 100%;"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td align="center"&gt;&lt;a href="http://enerjar.net/" target="_blank"&gt;&lt;b&gt;Read Rest of the Project&lt;/b&gt;&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-7557793330821122079?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/7557793330821122079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/10/enerjar-digital-energy-meter.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/7557793330821122079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/7557793330821122079'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/10/enerjar-digital-energy-meter.html' title='EnerJar: A Digital Energy Meter'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-147739301443107929</id><published>2010-10-03T15:15:00.000-07:00</published><updated>2011-06-24T12:23:14.700-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='mikroC'/><title type='text'>Digital Voltmeter using PIC12F683</title><content type='html'>This is a digital voltmeter project based on PIC12F683 microcontroller. It measures and displays input voltage from 0 to 20V with high accuracy. You cannot feed 20V directly to PIC port, so a simple resistor divider network is used for this purpose. A 5.1V zener diode is used to prevent any damage to PIC port in case the input voltage goes way above 20V.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TKj3UMy8WvI/AAAAAAAAAbk/wT7ZmFElVtY/s400/DSC00183.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TKj3UMy8WvI/AAAAAAAAAbk/wT7ZmFElVtY/s400/DSC00183.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Since PIC12F683 does not have sufficient pins to drive a LCD, 3-wire serial discussed before is used to display the measured voltage.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="border-collapse: collapse; width: 100%;"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td align="center"&gt;&lt;a href="http://picboard.blogspot.com/2010/10/0-20v-digital-voltmeter-dvm-using.html" target="_blank"&gt;&lt;b&gt;Read Rest of the Project&lt;/b&gt;&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-147739301443107929?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/147739301443107929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/10/digital-voltmeter-using-pic12f683.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/147739301443107929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/147739301443107929'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/10/digital-voltmeter-using-pic12f683.html' title='Digital Voltmeter using PIC12F683'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_92HIn_KJDYY/TKj3UMy8WvI/AAAAAAAAAbk/wT7ZmFElVtY/s72-c/DSC00183.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-7119239675815360951</id><published>2010-10-02T16:46:00.000-07:00</published><updated>2011-10-14T10:26:18.703-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC Projects'/><title type='text'>My PIC Projects</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TMoXyxNGE2I/AAAAAAAAAc0/a76tHNVaozY/s1600/Output1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TMoXyxNGE2I/AAAAAAAAAc0/a76tHNVaozY/s400/Output1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here's the list of all of my PIC Projects posted so far:&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/10/contact-less-tachometer.html"&gt;Contactless Tachometer &lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/10/pic16f688-based-digital-voltmeter.html"&gt;Digital Voltmeter using PIC16F688&lt;/a&gt;&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/10/digital-voltmeter-using-pic12f683.html"&gt;0-20V Digital Voltmeter using PIC12F683&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://pic16f628a.blogspot.com/2009/09/experiment-no-4-reading-temperature.html"&gt;Digital Temperature Meter using PIC16F628A&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/09/experiment-no-12-timer0-counter.html"&gt;Mains Line Frequency Counter&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/09/00-99-minutes-timer.html"&gt;00-99 min Timer&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/09/pic16f628a-ds1820-4-digit-seven-segment.html"&gt;Digital Thermometer (Seven Segment)&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/09/centigrade-and-fahrenheit-scale-digital.html"&gt;&lt;b&gt;Digital Thermometer (LCD)&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/09/make-your-own-serial-lcd-for-pic.html"&gt;Serial LCD&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://pic16f628a.blogspot.com/2009/09/pic16f628a-development-board-part-1.html"&gt;PIC16F628A Development Board&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/02/pic12f683-development-board.html"&gt;PIC12F683 Learning Board&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/08/tiny-temperature-data-logger-using.html"&gt;Temperature Data Logger using PIC12F683&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-7119239675815360951?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/7119239675815360951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/10/my-pic-projects.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/7119239675815360951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/7119239675815360951'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/10/my-pic-projects.html' title='My PIC Projects'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_92HIn_KJDYY/TMoXyxNGE2I/AAAAAAAAAc0/a76tHNVaozY/s72-c/Output1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-9216823557812808411</id><published>2010-09-28T18:15:00.000-07:00</published><updated>2011-11-01T11:44:03.314-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC Temperature Display'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F688'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Temperature Meter'/><title type='text'>Centigrade and Fahrenheit Scale Digital Thermometer with LCD Display</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TKKQa25jTeI/AAAAAAAAAa8/EHN4ywdd97o/s1600/Header.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TKKQa25jTeI/AAAAAAAAAa8/EHN4ywdd97o/s400/Header.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Digital thermometers are cool devices as they show temperatures in human readable formats. This digital thermometer project is based on a PIC16F688 microcontroller and a DS1820 temperature sensor, and it displays temperature on a character LCD screen in both Celsius and Fahrenheit scales.  I selected PIC16F688 for this project because it is cheap (I bought one for $1.50). DS1820 is a 3-pin digital temperature sensor from Dallas semiconductors (now Maxim) which is designed to measure temperatures ranging from -55 to +125 °C in 0.5 °C increments. The firmware I have written is able to read and display the entire temperature range of DS1820. In order to test for temperature measurements below 0°C, I put the sensor inside my freezer. While trying this, don’t put the whole unit inside the freezer as LCD display unit may stop working at the freezer temperature. Similarly, bringing a soldering iron tip close to the sensor can do testing for the higher range temperature values.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;About DS1820&lt;/b&gt;&lt;br /&gt;I suggest reading my previous articles on DS1820 for getting details about this 1-wire temperature sensor. The firmware that I wrote works only for DS1820 (it may work for DS18S20 making some change in the temperature conversion time, read http://www.maxim-ic.com/datasheet/index.mvp/id/3021). It will definitely not work for DS18B20.&lt;br /&gt;&lt;br /&gt;DS1820 converts temperature in to a 9-bit digital word, which is read by PIC16F688 as two bytes (TempH and TempL). The value of the least significant bit is 0.5°C. For positive temperature, the next eight bits after the LSB gives the integer part of the temperature. For example, 000110011 represents 25.5°C. Further, the floating-point math can be avoided during C to F conversion by using a scale factor of 10. Therefore, 25.5°C (scaled 255) is converted to F as,&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;TempinF&lt;/b&gt; = 9*&lt;b&gt;TempinC&lt;/b&gt;/5 + 320  = 9*255/5 +320 = 779 (which is 76.9 F)&lt;/div&gt;&lt;br /&gt;However, the negative temperatures are stored in 2's complement form. So the most significant bit of the 2-byte temperature reading from DS1820 is 1 if the temperature is below 0°C. The firmware takes care of all negative temperature readings (in both C and F scales). The computed temperature is displayed on LCD as a 5-digit string array, xxx.x (e.g., 24.5, 101.0, -12.5, etc).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Circuit Diagram&lt;/b&gt;&lt;br /&gt;The circuit diagram of this project is shown below. DS1820 sensor output is read by PIC16F688 through RA5 port. The computed temperature is converted to a string and sent to the LCD to display. The LCD is operating in 4-bit mode, and ports RC0-RC3 serves D4-D7 data pins of the LCD. The Register Select (RS) and Enable (E) signals for LCD are provided through ports RC4 and RC5. The Read/Write pin of the LCD is permanently grounded, as there is no data read from the LCD in this project. The contrast adjustment of LCD is done with the 10K potentiometer shown in the circuit diagram.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TKKQmdz7aAI/AAAAAAAAAbM/xo0Zp_3W508/s1600/CircuitDiagram.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TKKQmdz7aAI/AAAAAAAAAbM/xo0Zp_3W508/s400/CircuitDiagram.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TKKQkUSZVpI/AAAAAAAAAbI/Hdwh6pVKB4Q/s1600/BreadboardCircuit.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="291" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TKKQkUSZVpI/AAAAAAAAAbI/Hdwh6pVKB4Q/s400/BreadboardCircuit.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Besides, there are two tact switches in the design. The first one serves as the system reset that is to reset the whole system and reinitialize the LCD. The another tact switch is connected to the external interrupt pin of PIC16F688. This is the toggle switch for the LCD back light. This is helpful in reading the temperature display in low illumination conditions. An interrupt service routine is written for back light toggling. When the system is first turned ON, the LCD back light turns ON by default.&lt;br /&gt;&lt;br /&gt;The following circuit can be used to get +5V regulated power supply required for the circuit.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TKKR2EzneqI/AAAAAAAAAbU/fz3c_lkOu2g/s1600/power_supply_schematic.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TKKR2EzneqI/AAAAAAAAAbU/fz3c_lkOu2g/s400/power_supply_schematic.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Firmware&lt;/b&gt;&lt;br /&gt;The firmware was developed with mikroC compiler from mikroelektronika. The in-built library routines for DS1820 make the firmware development easier. The code is provided with adequate comments so that the reader won't have much difficulty in understanding programming logic.&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #ffe599;"&gt;/*&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Digital Room Thermometer using PIC16F688&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Copyright@Rajendra Bhatt&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;July 13, 2010&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;*/&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// LCD module connections&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit LCD_RS at RC4_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit LCD_EN at RC5_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit LCD_D4 at RC0_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit LCD_D5 at RC1_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit LCD_D6 at RC2_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit LCD_D7 at RC3_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit LCD_RS_Direction at TRISC4_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit LCD_EN_Direction at TRISC5_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit LCD_D4_Direction at TRISC0_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit LCD_D5_Direction at TRISC1_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit LCD_D6_Direction at TRISC2_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit LCD_D7_Direction at TRISC3_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// End LCD module connections&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// Back Light Switch connected to RA1&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;sbit BackLight at RA1_bit;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// Define Messages&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;char message0[] = "LCD Initialized";&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;char message1[] = "Room Temperature";&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// String array to store temperature value to display&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;char *tempC = "000.0";&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;char *tempF = "000.0";&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// Variables to store temperature register values&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;unsigned int temp_whole, temp_fraction, temp_value;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;signed int tempinF, tempinC;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;unsigned short C_Neg=0, F_Neg=0, TempH, TempL;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;void Display_Temperature() {&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// convert Temp to characters&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;if (!C_Neg) {&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;if (tempinC/1000)&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// 48 is the decimal character code value for displaying 0 on LCD&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempC[0] = tempinC/1000  + 48;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;else tempC[0] = ' ';&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;}&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempC[1] = (tempinC/100)%10 + 48;             // Extract tens digit&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempC[2] =  (tempinC/10)%10 + 48;             // Extract ones digit&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// convert temp_fraction to characters&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempC[4] =  tempinC%10  + 48;         // Extract tens digit&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// print temperature on LCD&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Lcd_Out(2, 1, tempC);&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;if (!F_Neg) {&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;if (tempinF/1000)&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempF[0] = tempinF/1000  + 48;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;else tempF[0] = ' ';&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;}&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempF[1] = (tempinF/100)%10 + 48;             // Extract tens digit&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempF[2] =  (tempinF/10)%10 + 48;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempF[4] =  tempinF%10  + 48;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// print temperature on LCD&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Lcd_Out(2, 10, tempF);&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;}&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// ISR for LCD Backlight&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;void interrupt(void){&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;if (INTCON.INTF == 1)          // Check if INTF flag is set&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;{&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;BackLight =~BackLight;  // Toggle Backlight&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Delay_ms(300) ;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;INTCON.INTF = 0;       // Clear interrupt flag before exiting ISR&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;}&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;}&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;void main() {&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;TRISC = 0x00 ;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;TRISA = 0b00001100; //  RA2, RA3 Inputs, Rest O/P's&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;ANSEL =   0b00000000;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;PORTA =   0b00000000;            //  Start with Everything Low&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;PORTC =   0b00000000;            //  Start with Everything Low&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;CMCON0 =  0b00000111;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Lcd_Init();                        // Initialize LCD&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Lcd_Cmd(_LCD_CLEAR);               // CLEAR display&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;BackLight = 1;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Lcd_Out(1,1,message0);&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Delay_ms(1000);&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Lcd_Out(1,1,message1);             // Write message1 in 1st row&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// Print degree character&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Lcd_Chr(2,6,223);&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Lcd_Chr(2,15,223);&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// different LCD displays have different char code for degree&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// if you see greek alpha letter try typing 178 instead of 223&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Lcd_Chr(2,7,'C');&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Lcd_Chr(2,16,'F');&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// Interrupt Setup&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;OPTION_REG = 0x00;   // Clear INTEDG, External Interrupt on falling edge&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;INTCON.INTF = 0;     // Clear interrupt flag prior to enable&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;INTCON.INTE = 1;     // enable INT interrupt&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;INTCON.GIE  = 1;     // enable Global interrupts&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;do {&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;//--- perform temperature reading&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Ow_Reset(&amp;amp;PORTA, 5);      // Onewire reset signal&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Ow_Write(&amp;amp;PORTA, 5, 0xCC);   // Issue command SKIP_ROM&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Ow_Write(&amp;amp;PORTA, 5, 0x44);   // Issue command CONVERT_T&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;INTCON.GIE  = 1;     // 1-wire library disables interrpts&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Delay_ms(600);&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Ow_Reset(&amp;amp;PORTA, 5);&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Ow_Write(&amp;amp;PORTA, 5, 0xCC);    // Issue command SKIP_ROM&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Ow_Write(&amp;amp;PORTA, 5, 0xBE);    // Issue command READ_SCRATCHPAD&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// Read Byte 0 from Scratchpad&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;TempL =  Ow_Read(&amp;amp;PORTA, 5);&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// Then read Byte 1 from Scratchpad&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;TempH = Ow_Read(&amp;amp;PORTA, 5);&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;temp_value = (TempH &amp;lt;&amp;lt; 8)+ TempL ;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// check if temperature is negative&amp;nbsp;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;if (temp_value &amp;amp; 0x8000) {&amp;nbsp;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;C_Neg = 1;&amp;nbsp;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempC[0] = '-';&amp;nbsp;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// Negative temp values are stored in 2's complement form&amp;nbsp;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;temp_value = ~temp_value + 1;&amp;nbsp;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;}&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;else C_Neg = 0;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;// Get temp_whole by dividing by 2&amp;nbsp;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;temp_whole = temp_value &amp;gt;&amp;gt; 1 ;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;if (temp_value &amp;amp; 0x0001){  // LSB is 0.5C&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;temp_fraction = 5;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;}&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;else temp_fraction = 0;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempinC = temp_whole*10+temp_fraction;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;if(C_Neg)  {&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempinF = 320-9*tempinC/5;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;if (tempinF &amp;lt; 0) {&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;F_Neg = 1;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempF[0] = '-';&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;tempinF = abs(tempinF);&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;}&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;else F_Neg = 0;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;}&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;else tempinF = 9*tempinC/5 + 320;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;//--- Format and display result on Lcd&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;Display_Temperature();&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;} while(1);&lt;/div&gt;&lt;div style="color: #ffe599;"&gt;}&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Snapshots of temperature measurements&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TKKQiDC6JWI/AAAAAAAAAbE/midOKzWElu8/s1600/BacklighON.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TKKQiDC6JWI/AAAAAAAAAbE/midOKzWElu8/s400/BacklighON.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Back Light ON&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TKKQgOPtiyI/AAAAAAAAAbA/CPPBVCgg3Vo/s1600/BacklighOFF.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TKKQgOPtiyI/AAAAAAAAAbA/CPPBVCgg3Vo/s400/BacklighOFF.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Back Light OFF&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TKKR1vzcLcI/AAAAAAAAAbQ/nyTkq5YrZWU/s1600/FreezerTemp.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TKKR1vzcLcI/AAAAAAAAAbQ/nyTkq5YrZWU/s400/FreezerTemp.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Freezer Temperature&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TKKR3sw6krI/AAAAAAAAAbY/XZLIaeBxMWo/s1600/SolderingTemp.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TKKR3sw6krI/AAAAAAAAAbY/XZLIaeBxMWo/s400/SolderingTemp.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Soldering Iron Temperature&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-9216823557812808411?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/9216823557812808411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/centigrade-and-fahrenheit-scale-digital.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/9216823557812808411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/9216823557812808411'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/centigrade-and-fahrenheit-scale-digital.html' title='Centigrade and Fahrenheit Scale Digital Thermometer with LCD Display'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_92HIn_KJDYY/TKKQa25jTeI/AAAAAAAAAa8/EHN4ywdd97o/s72-c/Header.JPG' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-5258254935114171477</id><published>2010-09-27T17:22:00.000-07:00</published><updated>2011-06-24T12:20:02.709-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='8-pin PIC microcontrollers'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683'/><category scheme='http://www.blogger.com/atom/ns#' term='Serial LCD'/><title type='text'>Make your own Serial LCD for PIC Microcontrollers</title><content type='html'>HD44780 based character LCD displays are very popular among hobbyists. They are easy to interface with microcontrollers and most of the present day high-level compilers have in-built routines for them. However, the bad part is at least 6 I/O pins of microcontroller are required to use them in your project. Therefore, they are not applicable for 8-pin devices like PIC12F series microchips. The aim of this project is to allow LCD interfacing to such devices using 3-wires. I am going to demonstrate this with PIC12F683 microcontroller. The character data or command from the microcontroller will be transferred serially to an 8-bit serial-in parallel-out shift register (74HC595), and the parallel output will be fed to the LCD driver pins.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TKEfXiMjQuI/AAAAAAAAAak/7yInh3tTbso/s400/Output2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TKEfXiMjQuI/AAAAAAAAAak/7yInh3tTbso/s400/Output2.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://picboard.blogspot.com/2010/09/serial-lcd-for-low-pin-count-pic.html" target="blank"&gt;&lt;b&gt;Read rest of the project.&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-5258254935114171477?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/5258254935114171477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/make-your-own-serial-lcd-for-pic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5258254935114171477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5258254935114171477'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/make-your-own-serial-lcd-for-pic.html' title='Make your own Serial LCD for PIC Microcontrollers'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_92HIn_KJDYY/TKEfXiMjQuI/AAAAAAAAAak/7yInh3tTbso/s72-c/Output2.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-6146207660532824014</id><published>2010-09-25T19:39:00.000-07:00</published><updated>2011-06-24T12:18:08.612-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683 and UART'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Timer1'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Frequency Counter'/><title type='text'>Using PIC Timer1 Module for Counting Frequency of an External Clock Source</title><content type='html'>The Timer1 module inside PIC12F683 is a 16-bit timer/counter. If used as an asynchronous counter, this module can be used for counting the frequency of an external clock source applied to its GP5/T1CKI port. The following example is a 0-65535 Hz frequency counter using Timer1 module of PIC12F683. The Timer1 module is reset first and then turned ON for 1 sec to count the clock pulses arrived at its T1CKI port during that period. The number of pulses arrived in&amp;nbsp; second is frequency itself. The measured frequency value is sent to PC through serial port and displayed on a hyperterminal receiver window. If the external clock frequency is over 65535 Hz, Timer1 overflows and an interrupt is generated. In case of the overflow, "Frequency out of range " message is displayed on the window. A 555 Timer IC running as an astable multivibrator is used as the external clock source.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TJ5njkDruaI/AAAAAAAAAaE/9IOKeOdSPBc/s400/SetUp.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TJ5njkDruaI/AAAAAAAAAaE/9IOKeOdSPBc/s400/SetUp.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://picboard.blogspot.com/2010/09/experiment-no-6-pic12f683-timer1-used.html" target="blank"&gt;&lt;b&gt;&amp;nbsp;Read rest of the project here.&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-6146207660532824014?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/6146207660532824014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/using-pic-timer1-module-for-counting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/6146207660532824014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/6146207660532824014'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/using-pic-timer1-module-for-counting.html' title='Using PIC Timer1 Module for Counting Frequency of an External Clock Source'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_92HIn_KJDYY/TJ5njkDruaI/AAAAAAAAAaE/9IOKeOdSPBc/s72-c/SetUp.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-7392092863699758491</id><published>2010-09-20T16:44:00.000-07:00</published><updated>2011-06-24T12:16:42.542-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC Timer'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A'/><title type='text'>00-99 Minutes Timer</title><content type='html'>&lt;b&gt;Introduction &lt;/b&gt;&lt;br /&gt;This project describes how to program PIC16F628A to function as a 00-99 min programmable timer. User can set any time between 00-99 minutes and can turn ON a device for that period. The device will be automatically turned OFF after the time expires. For demonstration, the ON/OFF condition of device is simulated by switching LED ON and OFF. With the use of three input switches (unit, ten, start/stop) the user can set ON time of the timer and can also control Start/Stop operation. The two time set switches are for selecting unit and tens digit of minute time interval (00-99). Once you set the value of minute interval, pressing the Start/Stop will turn the timer ON (LED will glow), and pressing the same button again at any point of time during timer operation will interrupt the process (LED will turn OFF) and the timer will be reset. LCD display will provide timer status and user interface for setting time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setup&lt;/b&gt;&lt;br /&gt;Connect SW1, SW2, and SW3 to RB0, RB1, and RB2 respectively. SW1 will serve Start/Stop, SW2 as unit minute, and SW3 as tens minute. Connect a LED to RA3 port.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TJfww41BjdI/AAAAAAAAAYI/EFVcs1AcRRQ/s1600/SetUp.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TJfww41BjdI/AAAAAAAAAYI/EFVcs1AcRRQ/s400/SetUp.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TJfxIKfXThI/AAAAAAAAAYQ/U8DgL7ta9po/s1600/Circuit.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TJfxIKfXThI/AAAAAAAAAYQ/U8DgL7ta9po/s400/Circuit.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Software&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp;&amp;nbsp;############################################&lt;br /&gt;&amp;nbsp;&amp;nbsp;Project: 00-99 Minutes Timer&lt;br /&gt;&amp;nbsp;&amp;nbsp;Designed By: Rajendra Bhatt&lt;br /&gt;&amp;nbsp;&amp;nbsp;Date: Sep 03, 2010&lt;br /&gt;&amp;nbsp;&amp;nbsp;############################################&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;LCD Data D4-D7 connected to RB4-RB7&lt;br /&gt;&amp;nbsp;&amp;nbsp;LCD RS -&amp;gt; RA0&lt;br /&gt;&amp;nbsp;&amp;nbsp;LCD E -&amp;gt; RA1&lt;br /&gt;&amp;nbsp;&amp;nbsp;Start/Stop Time Select -&amp;gt; RB3&lt;br /&gt;&amp;nbsp;&amp;nbsp;Unit Min Switch -&amp;gt; RB0&lt;br /&gt;&amp;nbsp;&amp;nbsp;Tens Min Switch -&amp;gt; RB1&lt;br /&gt;&amp;nbsp;&amp;nbsp;Cancel Switch -&amp;gt; RB2&lt;br /&gt;&amp;nbsp;&amp;nbsp;Relay -&amp;gt; RA3&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;// LCD module connections&lt;br /&gt;sbit LCD_RS at RA0_bit;&lt;br /&gt;sbit LCD_EN at RA1_bit;&lt;br /&gt;sbit LCD_D4 at RB4_bit;&lt;br /&gt;sbit LCD_D5 at RB5_bit;&lt;br /&gt;sbit LCD_D6 at RB6_bit;&lt;br /&gt;sbit LCD_D7 at RB7_bit;&lt;br /&gt;sbit LCD_RS_Direction at TRISA0_bit;&lt;br /&gt;sbit LCD_EN_Direction at TRISA1_bit;&lt;br /&gt;sbit LCD_D4_Direction at TRISB4_bit;&lt;br /&gt;sbit LCD_D5_Direction at TRISB5_bit;&lt;br /&gt;sbit LCD_D6_Direction at TRISB6_bit;&lt;br /&gt;sbit LCD_D7_Direction at TRISB7_bit;&lt;br /&gt;// End LCD module connections&lt;br /&gt;&lt;br /&gt;// Tact switches and Relay ports&lt;br /&gt;sbit Relay at RA3_bit;&lt;br /&gt;sbit SS_Select at RB0_bit; &amp;nbsp;// Start Stop Time Select&lt;br /&gt;sbit Unit_Button at RB1_bit;&lt;br /&gt;sbit Ten_Button at RB2_bit;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Messages&lt;br /&gt;char Message1[]="00-99 min Timer";&lt;br /&gt;char Message2[]="Device ON";&lt;br /&gt;char Message3[]="Device OFF";&lt;br /&gt;char Message4[]="Set Time: &amp;nbsp; &amp;nbsp;min";&lt;br /&gt;char Message5[]="Time Left: &amp;nbsp; min";&lt;br /&gt;unsigned short i, j, unit=0, ten=0, ON_OFF=0, index=0, clear, time;&lt;br /&gt;char *digit = "00";&lt;br /&gt;// 300ms Delay&lt;br /&gt;void Delay_300(){&lt;br /&gt;&amp;nbsp;Delay_ms(300);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void Display_Digits(){&lt;br /&gt;&amp;nbsp;digit[1]=unit+48;&lt;br /&gt;&amp;nbsp;digit[0]=ten+48;&lt;br /&gt;&amp;nbsp;Lcd_Out(2,11,digit);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void start_timer(unsigned short tmin){&lt;br /&gt;&amp;nbsp;unsigned short temp1, temp2;&lt;br /&gt;&amp;nbsp;Relay = 1;&lt;br /&gt;&amp;nbsp;ON_OFF = 1;&lt;br /&gt;&amp;nbsp;Lcd_Cmd(_LCD_CLEAR);&lt;br /&gt;&amp;nbsp;Lcd_Out(1,1,Message2);&lt;br /&gt;&amp;nbsp;Lcd_Out(2,1,Message5);&lt;br /&gt;&amp;nbsp;OPTION_REG = 0x80 ;&lt;br /&gt;&amp;nbsp;INTCON = 0x90;&lt;br /&gt;&amp;nbsp;for (i=0; i&amp;lt; tmin; i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;temp1 = (tmin-i)%10 ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;temp2 = (tmin-i)/10 ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Lcd_Chr(2, 12, temp2+48);&lt;br /&gt;&amp;nbsp;&amp;nbsp;Lcd_Chr(2, 13, temp1+48);&lt;br /&gt;&amp;nbsp;&amp;nbsp;j=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;do {&lt;br /&gt;&amp;nbsp;&amp;nbsp;Delay_ms(1000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;j++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;} while(((j&amp;lt;=60) &amp;amp;&amp;amp; (Clear ==0)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (Clear) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; Relay = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Delay_ms(500);&lt;br /&gt;&amp;nbsp;&amp;nbsp; Lcd_Out(1,1,Message3);&lt;br /&gt;&amp;nbsp;&amp;nbsp; INTCON = 0x00;&lt;br /&gt;&amp;nbsp;&amp;nbsp; goto stop;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;stop: Relay = 0;&lt;br /&gt;ON_OFF = 0;&lt;br /&gt;unit = 0;&lt;br /&gt;ten = 0;&lt;br /&gt;clear = 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void interrupt(void){&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (INTCON.INTF == 1) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Check if INTF flag is set&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; Clear = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; INTCON.INTF = 0; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Clear interrupt flag before exiting ISR&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;void main() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;CMCON &amp;nbsp;|= 7; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Disable Comparators&lt;br /&gt;&amp;nbsp;&amp;nbsp;TRISB = 0b00001111;&lt;br /&gt;&amp;nbsp;&amp;nbsp;TRISA = 0b11110000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Relay = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Lcd_Init(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Initialize LCD&lt;br /&gt;start:&lt;br /&gt;&amp;nbsp;&amp;nbsp;clear = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Lcd_Cmd(_LCD_CLEAR); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Clear display&lt;br /&gt;&amp;nbsp;&amp;nbsp;Lcd_Cmd(_LCD_CURSOR_OFF); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Cursor off&lt;br /&gt;&amp;nbsp;&amp;nbsp;Lcd_Out(1,1,Message1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;Lcd_Out(2,1,Message4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;Display_Digits() &amp;nbsp;;&lt;br /&gt;&amp;nbsp;do {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; if(!Unit_Button){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; Delay_300();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; unit ++;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; if(unit==10) unit=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; Display_Digits();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;} // If !Unit_Button&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!Ten_Button){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; Delay_300();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; ten ++;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; if(ten==10) ten=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; Display_Digits();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;} // If !Ten_Button&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!SS_Select){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; Delay_300();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; time = ten*10+unit ;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; if(time &amp;gt; 0) start_timer(time);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;} // If !SS_Select&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(clear){&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;goto start;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;} while(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Output&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;When the power is first turned on, you will see this on LCD screen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TJfxTx4eAHI/AAAAAAAAAYY/5Zak15fzA8Y/s1600/OutPut1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TJfxTx4eAHI/AAAAAAAAAYY/5Zak15fzA8Y/s400/OutPut1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Use SW2 and SW3 to chose time between 00-99 min.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TJfxbiBaoTI/AAAAAAAAAYg/bvtqVFEI7Ks/s1600/OutPut2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TJfxbiBaoTI/AAAAAAAAAYg/bvtqVFEI7Ks/s400/OutPut2.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When you press SW1 (Start/Stop), the LED connected at RA3 will be turned ON and you will see the time left message on the screen too.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TJfxfjjlK_I/AAAAAAAAAYo/qC5UPwKUgCw/s1600/OutPut3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TJfxfjjlK_I/AAAAAAAAAYo/qC5UPwKUgCw/s400/OutPut3.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When the time is UP, or you press SW1 again, the timer will be interrupted, LED will turn OFF, and the timer is reset to original condition.&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-7392092863699758491?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/7392092863699758491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/00-99-minutes-timer.html#comment-form' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/7392092863699758491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/7392092863699758491'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/00-99-minutes-timer.html' title='00-99 Minutes Timer'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_92HIn_KJDYY/TJfww41BjdI/AAAAAAAAAYI/EFVcs1AcRRQ/s72-c/SetUp.JPG' height='72' width='72'/><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-4903426024314414294</id><published>2010-09-14T16:56:00.000-07:00</published><updated>2011-06-24T12:15:00.177-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PWM'/><category scheme='http://www.blogger.com/atom/ns#' term='LED Chaser'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Projects'/><title type='text'>Neat LED Chaser for Hobbyists</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://picprojects.org.uk/projects/ledchaserpwm/ebay/fig10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://picprojects.org.uk/projects/ledchaserpwm/ebay/fig10.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Besides just turning ON and OFF, there are lot of other stuff that you can do with LEDs. In one of my experiments, I showed how to control the intensity of an LED using PWM. Here's a project that uses the similar concept to generate 8-channel PWM signals through PIC16F628A ports and drive 8 LEDs with 4 levels of intensity. A number of visual effects and chase sequences are programmed into the firmware. Enjoy watching this video!&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/SKe67xZG8Sg&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/SKe67xZG8Sg&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="400" height="320"&gt;&lt;/embed&gt;&lt;/object&gt;&amp;nbsp;&lt;/div&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://picprojects.org.uk/projects/ledchaserpwm/index.htm" target="blank"&gt;&lt;b&gt;Read rest of the project. &lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-4903426024314414294?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/4903426024314414294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/neat-led-chaser-for-hobbyists.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/4903426024314414294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/4903426024314414294'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/neat-led-chaser-for-hobbyists.html' title='Neat LED Chaser for Hobbyists'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-3632105786479968906</id><published>2010-09-12T15:53:00.000-07:00</published><updated>2011-06-24T12:13:58.478-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A frequency counter'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A'/><title type='text'>Experiment No. 12: Timer0 Counting AC Line Frequency</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;The Timer0 module in PIC16F628A is both 8-bit Timer and Counter. When used as Counter, the Timer0 module will increment on every rising or falling edge of the T0CKI (RA4, pin 3) pin. The incrementing edge is determined by the T0SE bit of the OPTION register.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TI1c2HpA1JI/AAAAAAAAAW8/N55JxPAoHEw/s1600/Display.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TI1c2HpA1JI/AAAAAAAAAW8/N55JxPAoHEw/s400/Display.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/Su-L9AeutlI/AAAAAAAAAKY/pyEpQeI4RkE/s1600/OPTION.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="315" src="http://4.bp.blogspot.com/_92HIn_KJDYY/Su-L9AeutlI/AAAAAAAAAKY/pyEpQeI4RkE/s400/OPTION.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Counter mode is selected by setting the T0CS bit to 1 in the OPTION register. You can see from the above table that the minimum prescaler is 1:2 for TMR0. In order to get 1:1 prescaler for Timer0, the prescaler must be assigned to the WDT module. So for our purpose, the value of OPTION register could be 0b00101000 (28h). Now, the Timer0 will work as an 8-bit counter, counting the pulses arrived at RA4/T0CKI pin at low-to-high transition.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setup&lt;/b&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;In this experiment we are going to measure the mains AC frequency by using Timer0 as counter. The mains AC frequency is 120V, so we cannot directly feed it to PIC port. We need to first step down the 120V AC first to appropriate level. I am going to use a 12V transformer for this purpose. The 12V AC sine wave output from the transformer will be further converted to 5V square waves (approximately) using a BJT switch.&amp;nbsp;I built this additional circuit on a breadboard. The 5V square waves will be fed to T0CKI port of PIC16F628A.&amp;nbsp;The number of pulses arrived at port T0CKI within 1 second will be the frequency of the input signal.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TI1Uvie95aI/AAAAAAAAAWk/tVFq_U0GXOg/s1600/lunapic_128431865496062_15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="162" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TI1Uvie95aI/AAAAAAAAAWk/tVFq_U0GXOg/s400/lunapic_128431865496062_15.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TI1VDc9KVTI/AAAAAAAAAWs/QC6FddvUwW8/s1600/DSC00006.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TI1VDc9KVTI/AAAAAAAAAWs/QC6FddvUwW8/s400/DSC00006.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;Note:&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #cc0000;"&gt; Don't forget to connect the emitter ground to the ground of PIC16F628A development board.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Now connect the collector of BC547 transistor to T0CKI port (pin 3). Put the 16x2 character LCD module on its socket on the board.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Software&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp;&amp;nbsp;Project Name: Use of Timer 0 as counter&lt;br /&gt;&amp;nbsp;&amp;nbsp;* Copyright:&amp;nbsp;&amp;nbsp; &amp;nbsp;(c) Rajendra Bhatt, 2010.&lt;br /&gt;&amp;nbsp;* Description:&amp;nbsp;&amp;nbsp;Timer0 counter reads mains frequency and&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; display on LCD&lt;br /&gt;&lt;br /&gt;&amp;nbsp;* Test configuration:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; MCU: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PIC16F628A&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; Oscillator: &amp;nbsp; &amp;nbsp; &amp;nbsp;XT, 4.0 MHz&lt;br /&gt;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;// LCD module connections&lt;br /&gt;sbit LCD_RS at RA0_bit;&lt;br /&gt;sbit LCD_EN at RA1_bit;&lt;br /&gt;sbit LCD_D4 at RB4_bit;&lt;br /&gt;sbit LCD_D5 at RB5_bit;&lt;br /&gt;sbit LCD_D6 at RB6_bit;&lt;br /&gt;sbit LCD_D7 at RB7_bit;&lt;br /&gt;sbit LCD_RS_Direction at TRISA0_bit;&lt;br /&gt;sbit LCD_EN_Direction at TRISA1_bit;&lt;br /&gt;sbit LCD_D4_Direction at TRISB4_bit;&lt;br /&gt;sbit LCD_D5_Direction at TRISB5_bit;&lt;br /&gt;sbit LCD_D6_Direction at TRISB6_bit;&lt;br /&gt;sbit LCD_D7_Direction at TRISB7_bit;&lt;br /&gt;// End LCD module connections&lt;br /&gt;&lt;br /&gt;// Define Messages&lt;br /&gt;&amp;nbsp;char message1[] = "Frequency= &amp;nbsp; &amp;nbsp;Hz";&lt;br /&gt;&amp;nbsp;char *freq = "000";&lt;br /&gt;&amp;nbsp;void Display_Freq(unsigned int freq2write) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;freq[0] = (freq2write/100) + 48; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Extract hundreds digit&lt;br /&gt;&amp;nbsp;&amp;nbsp;freq[1] = (freq2write/10)%10 + 48; &amp;nbsp; &amp;nbsp;// Extract tens digit&lt;br /&gt;&amp;nbsp;&amp;nbsp;freq[2] = &amp;nbsp;freq2write%10 &amp;nbsp; &amp;nbsp; + 48; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Extract ones digit&lt;br /&gt;&amp;nbsp;&amp;nbsp;// print temperature on LCD&lt;br /&gt;&amp;nbsp;&amp;nbsp;Lcd_Out(1, 11, freq);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;void main() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;CMCON |= 7; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Disable Comparators&lt;br /&gt;&amp;nbsp;&amp;nbsp;TRISB = 0b00000000; &amp;nbsp; &amp;nbsp; &amp;nbsp;// set direction to be output&lt;br /&gt;&amp;nbsp;&amp;nbsp;Lcd_Init();&lt;br /&gt;&amp;nbsp;&amp;nbsp;Lcd_Cmd(_LCD_CLEAR); &amp;nbsp; &amp;nbsp; // Clear display&lt;br /&gt;&amp;nbsp;&amp;nbsp;Lcd_Cmd(_LCD_CURSOR_OFF); &amp;nbsp; &amp;nbsp;// Cursor off&lt;br /&gt;&amp;nbsp;&amp;nbsp;Lcd_Out(1,1,message1); &amp;nbsp; &amp;nbsp; // Write message1 in 1st row&lt;br /&gt;&amp;nbsp;&amp;nbsp;OPTION_REG = 0b00101000; // TOCS=1 for Counter mode, PSA=1 for 1:1 prescaler&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;do {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;TMR0=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Delay_ms(1000); &amp;nbsp;// Delay 1 Sec&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Display_Freq(TMR0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;} while(1); &amp;nbsp;// Till PORTB &amp;lt; 15&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Output&lt;/b&gt;&lt;br /&gt;You will see the mains AC frequency displayed on the LCD.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TI1Z20bb2qI/AAAAAAAAAW0/xij5WG8W-SU/s1600/Output.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TI1Z20bb2qI/AAAAAAAAAW0/xij5WG8W-SU/s400/Output.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-3632105786479968906?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/3632105786479968906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/experiment-no-12-timer0-counter.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3632105786479968906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3632105786479968906'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/experiment-no-12-timer0-counter.html' title='Experiment No. 12: Timer0 Counting AC Line Frequency'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_92HIn_KJDYY/TI1c2HpA1JI/AAAAAAAAAW8/N55JxPAoHEw/s72-c/Display.JPG' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-2873217629265361685</id><published>2010-09-11T05:51:00.000-07:00</published><updated>2011-06-24T12:13:04.782-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Experiments'/><title type='text'>PIC16F628A Experiments</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/StEPfF_WfoI/AAAAAAAAAJw/3KNMESLQ1B8/s1600/EXP5_b.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/_92HIn_KJDYY/StEPfF_WfoI/AAAAAAAAAJw/3KNMESLQ1B8/s400/EXP5_b.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here's the list of all the experiments I have posted on this blog. I have performed these experiments on my PIC16F628A development board.&lt;br /&gt;(First read about my &lt;a href="http://pic16f628a.blogspot.com/2009/09/pic16f628a-development-board-part-1.html"&gt;&lt;b&gt;PIC16F628A Development Board&lt;/b&gt;&lt;/a&gt;)&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";google_ad_host = "pub-1556223355139109";/* 336x280, BlueTemp, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://pic16f628a.blogspot.com/2009/09/experiment-no-1-4-bit-binary-counter_09.html"&gt;&lt;b&gt;Experiment No. 1:&lt;/b&gt; Four-bit Binary Counter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pic16f628a.blogspot.com/2009/09/experiment-no-2-push-button-and-seven.html"&gt;&lt;b&gt;Experiment No. 2:&lt;/b&gt; Tact Switch and Seven-Segment Display Interface&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pic16f628a.blogspot.com/2009/09/experiment-no-3-lcd-interface-in-4-bit.html"&gt;&lt;b&gt;Experiment No. 3:&lt;/b&gt; HD44780 LCD Interface in 4-bit Mode&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pic16f628a.blogspot.com/2009/09/experiment-no-4-reading-temperature.html"&gt;&lt;b&gt;Experiment No. 4: &lt;/b&gt;1-Wire Interface with DS1820 Temperature Sensor&lt;/a&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pic16f628a.blogspot.com/2009/10/experiment-no-5-multiplexed-seven.html"&gt;&lt;b&gt;Experiment No. 5: &lt;/b&gt;Multiplexed Seven-Segment Display&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/goog_11491665"&gt;&lt;b&gt;Experiment No. 6: &lt;/b&gt;&lt;/a&gt;&lt;a href="http://pic16f628a.blogspot.com/2009/10/experiment-no-6-readwrite-internal.html"&gt;Read/Write Internal EEPROM&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/goog_11491668"&gt;&lt;b&gt;Experiment No. 7: &lt;/b&gt;&lt;/a&gt;&lt;a href="http://pic16f628a.blogspot.com/2009/11/experiment-no-7-timers-and-interrupts.html"&gt;Timers and Interrupts&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pic16f628a.blogspot.com/2009/11/experiment-no-8-use-of-pwm-to-control.html"&gt;&lt;b&gt;Experiment No. 8: &lt;/b&gt;Hardware PWM to control LED Brightness&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/01/dc-motor-speed-control-using-pwm.html"&gt;&lt;b&gt;Experiment No. 9: &lt;/b&gt;Digital Speed Control of DC Motor&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/01/experiment-no-10-use-of-uart-library-to.html"&gt;&lt;b&gt;Experiment No. 10: &lt;/b&gt;UART Data Transfer to PC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/02/experiment-no-11-temperature-data.html"&gt;&lt;b&gt;Experiment No. 11: &lt;/b&gt;Temperature Data Logger&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://www.blogger.com/goog_203374427"&gt;Experiment No. 12:&lt;/a&gt;&lt;/b&gt;&lt;b&gt;&lt;a href="http://www.blogger.com/goog_203374427"&gt;&amp;nbsp;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;a href="http://pic16f628a.blogspot.com/2010/09/experiment-no-12-timer0-counter.html"&gt;Timer0 as Mains AC Frequency Counter&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/a&gt; &amp;nbsp;&lt;/span&gt;&lt;/b&gt; &amp;nbsp;&lt;b&gt; &lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;More experiments will be added to this section in future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-2873217629265361685?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/2873217629265361685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/pic16f628a-experiments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/2873217629265361685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/2873217629265361685'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/pic16f628a-experiments.html' title='PIC16F628A Experiments'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_92HIn_KJDYY/StEPfF_WfoI/AAAAAAAAAJw/3KNMESLQ1B8/s72-c/EXP5_b.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-8915949990243043571</id><published>2010-09-07T19:01:00.000-07:00</published><updated>2011-06-24T12:11:57.718-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC Temperature Display'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='mikroC'/><title type='text'>PIC16F628A + DS1820 + 4-Digit Seven Segment C/F Thermometer</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;This project describes how to read temperature from a DS1820 sensor with a PIC16F628A microcontroller and display the temperature value in a multiplexed 4-digit seven segment display. The temperature will be displayed in both Centigrade and&amp;nbsp;Fahrenheit units&amp;nbsp;switching back and forth. The temperature resolution is 1 degree in both the units. Out of 4-digits, the most significant three digits will display numeric temperature values from 00 to 125. The most significant digit will show '-' for negative temperatures, and the least significant digit will display C or F.&lt;br /&gt;&lt;br /&gt;On my PIC16F628A board, connect D1 to RA2, D2 to RA1, D3 to RA0, and D4 to RA3. DS1820 data will be read at RA4 port. The seven segments a-g will be driven by RB0-RB6.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Software&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;/* Project name:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; Seven-segment display digital thermometer&lt;br /&gt;&amp;nbsp;* Copyright:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; (c) Rajendra Bhatt, 2010.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;MCU: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PIC16F628A&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; Oscillator: &amp;nbsp; &amp;nbsp; &amp;nbsp;XT, 4.0 MHz&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;// Temperature digits&lt;br /&gt;unsigned short i, DD0=0x3f, DD1=0x3f,DD2=0x3f, CF_Flag=0xff, CF=0x3f, N_Flag;&lt;br /&gt;// CF_Flag = 0: F, 1: C&lt;br /&gt;// Variable to store temperature register value&lt;br /&gt;unsigned temp_value=0, temp_whole;&lt;br /&gt;unsigned int temp_fraction=0;&lt;br /&gt;float temp_F;&lt;br /&gt;&lt;br /&gt;//-------------- Function to Return mask for common cathode 7-seg. display&lt;br /&gt;unsigned short mask(unsigned short num) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;switch (num) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 0 : return 0x3F;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 1 : return 0x06;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 2 : return 0x5B;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 3 : return 0x4F;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 4 : return 0x66;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 5 : return 0x6D;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 6 : return 0x7D;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 7 : return 0x07;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 8 : return 0x7F;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 9 : return 0x6F;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 10 : return 0x40; &amp;nbsp;// Symbol '-'&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 11 : return 0x39; &amp;nbsp; // Symbol C&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 12 : return 0x71; &amp;nbsp; // Symbol F&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;case 13 : return 0x00; &amp;nbsp;// Blank&lt;br /&gt;&amp;nbsp;&amp;nbsp;} //case end&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void display_temp(short DD0, short DD1, short DD2, short CF) &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i = 0; i&amp;lt;=200; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;PORTB = DD0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA0_bit = 1; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Select Ones Digit&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA1_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA2_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA3_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;delay_ms(5);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;PORTB = DD1;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA0_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA1_bit = 1; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Select Tens Digit&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA2_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA3_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;delay_ms(5);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;PORTB = DD2;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA0_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA1_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA2_bit = 1; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Select +/- Digit&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA3_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;delay_ms(5);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;PORTB = CF;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA0_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA1_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA2_bit = 0 ;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;RA3_bit = 1; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Select CF Digit&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;delay_ms(5);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void main() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;CMCON &amp;nbsp;|= 7; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Disable Comparators&lt;br /&gt;&amp;nbsp;&amp;nbsp;TRISB = 0x00; &amp;nbsp; &amp;nbsp;// Set PORTB direction to be output&lt;br /&gt;&amp;nbsp;&amp;nbsp;PORTB = 0x00; &amp;nbsp; &amp;nbsp;// Turn OFF LEDs on PORTB&lt;br /&gt;&amp;nbsp;&amp;nbsp;TRISA0_bit = 0; &amp;nbsp;// RA.0 to RA3 Output&lt;br /&gt;&amp;nbsp;&amp;nbsp;TRISA1_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;TRISA2_bit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;TRISA3_bit = 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//--- main loop&lt;br /&gt;&amp;nbsp;&amp;nbsp;do {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;N_Flag = 0; &amp;nbsp;// Reset Temp Flag&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//--- perform temperature reading&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ow_Reset(&amp;amp;PORTA, 4); &amp;nbsp; &amp;nbsp; &amp;nbsp;// Onewire reset signal&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ow_Write(&amp;amp;PORTA, 4, 0xCC); &amp;nbsp; // Issue command SKIP_ROM&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ow_Write(&amp;amp;PORTA, 4, 0x44); &amp;nbsp; // Issue command CONVERT_T&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;display_temp(DD0, DD1, DD2,CF) &amp;nbsp; ;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ow_Reset(&amp;amp;PORTA, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ow_Write(&amp;amp;PORTA, 4, 0xCC); &amp;nbsp; &amp;nbsp;// Issue command SKIP_ROM&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ow_Write(&amp;amp;PORTA, 4, 0xBE); &amp;nbsp; &amp;nbsp;// Issue command READ_SCRATCHPAD&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Next Read Temperature&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Read Byte 0 from Scratchpad&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;temp_value = &amp;nbsp;Ow_Read(&amp;amp;PORTA, 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Then read Byte 1 from Scratchpad and shift 8 bit left and add the Byte 0&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;temp_value = (Ow_Read(&amp;amp;PORTA, 4) &amp;lt;&amp;lt; 8) + temp_value;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (temp_value &amp;amp; 0x8000) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; temp_value = ~temp_value + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; N_Flag = 1; &amp;nbsp; // Temp is -ive&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (temp_value &amp;amp; 0x0001) temp_value += 1; &amp;nbsp; // 0.5 round to 1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;temp_value = temp_value &amp;gt;&amp;gt; 1 ;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (CF_Flag == 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; if (N_Flag ==1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;temp_F = (32.0-9.0*temp_value/5.0)*10 + 6;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;if (temp_F &amp;lt; 0){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; N_Flag=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; temp_value = abs(temp_value);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else N_Flag = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else temp_F = (9.0*temp_value/5.0+32.0)*10 + 6; //If decimal is greater or equal&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // to 0.5, add 0.5&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;temp_value = temp_F/10;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;CF = 12;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (CF_Flag == 0xff) CF = 11;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DD0 = temp_value%10; &amp;nbsp;// Extract Ones Digit&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DD0 = mask(DD0);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DD1 = (temp_value/10)%10; // Extract Tens Digit&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DD1 = mask(DD1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DD2 = &amp;nbsp;temp_value/100; // Extract Hundred digit&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;CF = mask(CF);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (N_Flag == 1) DD2=10;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else if (DD2 == 0) DD2 = 13 ;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DD2 = mask(DD2) ;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;PORTB=0x00;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;CF_Flag =~CF_Flag;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;} while (1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Output Pictures&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TIbtw07QrVI/AAAAAAAAAUE/aXvxi7g7F4I/s1600/DSC09995.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TIbtw07QrVI/AAAAAAAAAUE/aXvxi7g7F4I/s400/DSC09995.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TIbt0waXhGI/AAAAAAAAAUM/yak15eQQAE8/s1600/DSC09996.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TIbt0waXhGI/AAAAAAAAAUM/yak15eQQAE8/s400/DSC09996.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Over 99F temperature reading (touched the sensor with a hot soldering iron )&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TIbt29UcxzI/AAAAAAAAAUU/UBkStQC7peg/s1600/DSC09992.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TIbt29UcxzI/AAAAAAAAAUU/UBkStQC7peg/s400/DSC09992.JPG" width="400" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-8915949990243043571?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/8915949990243043571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/pic16f628a-ds1820-4-digit-seven-segment.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/8915949990243043571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/8915949990243043571'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/pic16f628a-ds1820-4-digit-seven-segment.html' title='PIC16F628A + DS1820 + 4-Digit Seven Segment C/F Thermometer'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_92HIn_KJDYY/TIbtw07QrVI/AAAAAAAAAUE/aXvxi7g7F4I/s72-c/DSC09995.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-8183978548799948730</id><published>2010-09-03T19:06:00.000-07:00</published><updated>2011-06-24T12:10:05.655-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gear Clock'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A clock'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Projects'/><title type='text'>Gear Clock Controlled by PIC16F628A</title><content type='html'>I was browsing internet for PIC16F628A related projects and I saw this. This guy came up with an amazing idea. He made some wooden gears, tied them up, and drove with a stepper motor from a floppy drive, and turn it into a Gear Clock. The stepper motor is controlled by a PIC16F628A Microchip that also keeps track of time. You can set time with the help of two switches that control clockwise and anti-clockwise motion of the minute gear. If both the switches are pressed, the stepper motor is de-energized and the minute gear is free to rotate by hand.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;b&gt;Source:&lt;/b&gt;&amp;nbsp;http://alan-parekh.com/projects/gear-clock/&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://alan-parekh.com/wp-content/uploads/2009/10/gear_clock_510-600x450.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://alan-parekh.com/wp-content/uploads/2009/10/gear_clock_510-600x450.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;object height="320" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zkLIKfdYW3I&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/zkLIKfdYW3I&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="480" height="320"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://alan-parekh.com/projects/gear-clock/"&gt;&lt;b&gt;Read rest of the project.&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-8183978548799948730?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/8183978548799948730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/gear-clock-controlled-by-pic16f628a.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/8183978548799948730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/8183978548799948730'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/gear-clock-controlled-by-pic16f628a.html' title='Gear Clock Controlled by PIC16F628A'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-3045276968264143690</id><published>2010-09-01T07:25:00.000-07:00</published><updated>2011-10-14T10:07:20.800-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nokia LCD and PIC'/><category scheme='http://www.blogger.com/atom/ns#' term='8-pin PIC microcontrollers'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F629 Digital Thermometer'/><category scheme='http://www.blogger.com/atom/ns#' term='Nokia 3310 and Microcontroller'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F629'/><title type='text'>Digital Thermometer on a Nokia LCD Screen</title><content type='html'>If you have an old Nokia 3310 cell phone, don't throw it away. You can use its LCD screen for this cool project. This project describes the use of such a LCD to display temperature. &amp;nbsp;It uses PIC12F629 microchip as a brain that reads temperature measurement from a DS18B20 sensor, and displays it on a Nokia 3310 LCD screen.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.electronics-lab.com/blog/wp-content/uploads/2007/09/nokialcdopis.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="271" src="http://www.electronics-lab.com/blog/wp-content/uploads/2007/09/nokialcdopis.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;i&gt;&lt;b&gt;Source:&lt;/b&gt;&amp;nbsp;http://www.ivica-novakovic.from.hr/Nokia%20Lcd%20Termometar-eng.htm&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;The Nokia LCD has 84x84 resolution and runs on 2.7-3.3 V supply, and PIC12F629 can also be operated within this voltage range. The best thing is to operate this with 2 AA batteries. For circuit diagram and firmware, &lt;b&gt;&lt;a href="http://www.ivica-novakovic.from.hr/Nokia%20Lcd%20Termometar-eng.htm" target="blank"&gt;Visit Here.&lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-3045276968264143690?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/3045276968264143690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/digital-thermometer-on-nokia-lcd-screen.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3045276968264143690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3045276968264143690'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/09/digital-thermometer-on-nokia-lcd-screen.html' title='Digital Thermometer on a Nokia LCD Screen'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-4799720124345074719</id><published>2010-08-27T09:03:00.000-07:00</published><updated>2011-06-24T12:07:52.332-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683 and UART'/><category scheme='http://www.blogger.com/atom/ns#' term='8-pin PIC microcontrollers'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683'/><category scheme='http://www.blogger.com/atom/ns#' term='Temperature data logger'/><title type='text'>A tiny Temperature Data Logger using PIC12F683 and DS1820</title><content type='html'>For past few days, I have been working on a PIC12F683 based temperature data logger. I just finished this project and the product is available on my PIC12F683 blog page.This is how the finished product looks like.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/THb2EkMPpwI/AAAAAAAAATY/Dak-kaJCtSQ/s1600/LEDBlinks.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="232" src="http://2.bp.blogspot.com/_92HIn_KJDYY/THb2EkMPpwI/AAAAAAAAATY/Dak-kaJCtSQ/s400/LEDBlinks.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It reads temperature values from a DS1820 sensor and stores in its internal EEPROM. It has 3 selectable sampling intervals (1 sec, 1 min, and 10 min). Three tact switches provides 7 functions, and this runs with 3 &amp;nbsp;AAA batteries. It can be interfaced to a PC through serial port, and also has an ISCP header for firmware upgrade.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://picboard.blogspot.com/2010/08/versatile-temperature-data-logger-using.html" target="blank"&gt;Read rest of the project.&amp;nbsp;&lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-4799720124345074719?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/4799720124345074719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/08/tiny-temperature-data-logger-using.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/4799720124345074719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/4799720124345074719'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/08/tiny-temperature-data-logger-using.html' title='A tiny Temperature Data Logger using PIC12F683 and DS1820'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_92HIn_KJDYY/THb2EkMPpwI/AAAAAAAAATY/Dak-kaJCtSQ/s72-c/LEDBlinks.JPG' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-5672346096255060301</id><published>2010-07-30T15:25:00.000-07:00</published><updated>2011-06-24T12:05:12.147-07:00</updated><title type='text'>MSP430 LaunchPad: Super Cheap Embedded Design Tool for just $4.30</title><content type='html'>Texas Instrument is going to make a big move into the hobbyist microcontroller market by introducing MSP430 Launchpad, a development platform for 16-bit MSP430 microcontrollers. Can you guess its price? Yes, $4.30 with free FedEx shipping. It is unbelievable!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://dangerousprototypes.com/wp-content/media/2010/06/launchpad-board1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://dangerousprototypes.com/wp-content/media/2010/06/launchpad-board1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;"What is LaunchPad?&lt;/b&gt;&lt;br /&gt;LaunchPad is an easy-to-use development tool intended for beginners and experienced users alike for creating microcontroller-based applications. At $4.30, the LaunchPad offers everything you need to get started with your projects. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;The LaunchPad development kit is a part of the MSP430 Value Line series. LaunchPad has an integrated DIP target socket that supports up to 20 pins, allowing MSP430 Value Line devices to be dropped into the LaunchPad board. Also, an on-board flash emulation tool allows direct interface to a PC for easy programming, debugging, and evaluation. Included are free and downloadable software development environments for writing and debugging software. LaunchPad can be used to create interactive solutions thanks to its on-board push buttons, LEDs, and extra input/output pins for easy integration of external devices.&lt;/i&gt;"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is included in the package?&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;LaunchPad Development board (MSP-EXP430G2)&lt;/li&gt;&lt;li&gt;Mini USB cable&lt;/li&gt;&lt;li&gt;2x MSP430 flash devices&lt;br /&gt;MSP430G2211IN14 flash device&lt;br /&gt;MSP430G2231IN14 flash device (preloaded with sample program)&lt;/li&gt;&lt;li&gt;10-pin PCB Connectors (2 male &amp;amp; 2 female)&lt;/li&gt;&lt;li&gt;32kHz crystal (MS3V-T1R 32.768kHz CL: 12.5pF +/-20ppm, www.microcrystal.com)&lt;/li&gt;&lt;li&gt;Quick Start Guide&lt;/li&gt;&lt;li&gt;2x LaunchPad stickers&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Source:&lt;/b&gt; http://processors.wiki.ti.com/index.php/MSP430_LaunchPad_(MSP-EXP430G2)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;object style="height: 344px; width: 425px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/RVHGjgkFPlU"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/RVHGjgkFPlU" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Watch Demo Application&lt;/b&gt;&lt;/div&gt;&lt;object style="height: 344px; width: 425px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/U0mGoRtYbyg"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/U0mGoRtYbyg" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Hurry up, I have already ordered two of them.&amp;nbsp; &lt;a href="http://www.ti-estore.com/Merchant2/merchant.mvc?Screen=PROD&amp;amp;Product_Code=MSP-EXP430G2" target="blank"&gt;&lt;b&gt;Order Here.&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;For more details, &lt;a href="http://processors.wiki.ti.com/index.php/MSP430_LaunchPad_%28MSP-EXP430G2%29"&gt;CLICK HERE! &lt;/a&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-5672346096255060301?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/5672346096255060301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/07/msp430-launchpad-embedded-design-tool.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5672346096255060301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5672346096255060301'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/07/msp430-launchpad-embedded-design-tool.html' title='MSP430 LaunchPad: Super Cheap Embedded Design Tool for just $4.30'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-6492022151610038329</id><published>2010-07-11T07:52:00.000-07:00</published><updated>2011-06-24T12:03:41.008-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Variable DC power supply'/><category scheme='http://www.blogger.com/atom/ns#' term='LM350T'/><category scheme='http://www.blogger.com/atom/ns#' term='Homemade power supply'/><category scheme='http://www.blogger.com/atom/ns#' term='DIY Power Supply'/><category scheme='http://www.blogger.com/atom/ns#' term='DC power supply'/><category scheme='http://www.blogger.com/atom/ns#' term='LM350 Variable voltage regulator'/><title type='text'>Variable DC Power Supply (1.25 - 18V) using LM350 IC</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;A variable DC power supply is one of the most important tools for an electronics&amp;nbsp;hobbyist. In order to carry out an experiment you need a reliable DC power source that can be varied according to the need of the experiment. Last week I felt I must have one on my workbench, and thought to make one for myself. This design is very simple but is great for powering almost all kinds electronic projects. It uses LM350 (a 3-pin IC) to generate a variable DC power supply. I would recommend to read the &lt;a href="http://www.national.com/ds/LM/LM150.pdf"&gt;&lt;b&gt;datasheet&lt;/b&gt;&lt;/a&gt; before doing this project.&lt;br /&gt;&lt;br /&gt;The LM350 is an adjustable 3-terminal positive voltage&amp;nbsp;regulator that is capable of supplying in excess of 3A over a&amp;nbsp;1.2V to 33V output range. They are exceptionally easy to&amp;nbsp;use and require only 2 external resistors to set the output&amp;nbsp;voltage.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-qkzmJbjoOoE/TDk27YRT6WI/AAAAAAAAARo/TocZ57VL4iE/s1600/5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-qkzmJbjoOoE/TDk27YRT6WI/AAAAAAAAARo/TocZ57VL4iE/s400/5.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Main Features&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Adjustable output down to 1.2V&lt;/li&gt;&lt;li&gt;Guaranteed 3A output current&lt;/li&gt;&lt;li&gt;Guaranteed thermal regulation&lt;/li&gt;&lt;li&gt;Output is short circuit protected &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Requirements&lt;/b&gt;&lt;br /&gt;You need following things to make this variable power supplies.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A 120/24V transformer&lt;/li&gt;&lt;li&gt;A bridge rectifier IC or four general purpose diodes.&lt;/li&gt;&lt;li&gt;Capacitors: 1000 uF, 50 V electrolyte (1), 0.1 uF&amp;nbsp;ceramic&amp;nbsp;(1), 1 uF, 50 V electrolyte (1)&lt;/li&gt;&lt;li&gt;Resistors: 360 Ohm (1), 5 K potentiometer (1), 4.7K (1)&lt;/li&gt;&lt;li&gt;A Rocker Switch for AC ON/OFF&lt;/li&gt;&lt;li&gt;A voltmeter display (I used an analog one)&lt;/li&gt;&lt;li&gt;An LED for power on indication.&amp;nbsp;&lt;/li&gt;&lt;li&gt;A heat sink for LM350&lt;/li&gt;&lt;li&gt;Wires, prototyping board, soldering iron, box, etc as per required.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;Circuit Diagram&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First of all you need to generate an unregulated 24V DC using the step-down transformer and the rectifier circuit. Use the 1000uF capacitor at the output to reduce the ripples. The circuit is shown below.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TDnXSoIUFYI/AAAAAAAAASY/270bxc_efqk/s1600/Bridge+rectifier2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="147" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TDnXSoIUFYI/AAAAAAAAASY/270bxc_efqk/s400/Bridge+rectifier2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Fig. Bridge Rectifier Circuit using 4 Diodes&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Next comes LM350 IC that takes in this unregulated 24V DC and with the use of two resistors (R1 = 360 Ohm, R2 = 5K Potentiometer) you can derive variable DC voltage. The circuit diagram along with the equation for output voltage is shown below. I took this circuit from LM350 datasheet and it shows R1 = 240 Ohm, but I am gonna use 360 Ohm as I am generating 18V DC at maximum. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TDk8Hwp212I/AAAAAAAAASI/FhTcscoDASI/s1600/circuit.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="291" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TDk8Hwp212I/AAAAAAAAASI/FhTcscoDASI/s400/circuit.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;The value of IAdj is about 100uA, so the error term is almost negligible. &lt;br /&gt;Other things that are not included in the circuits above are a power on LED and the analog voltmeter display. I connected the LED to the output unregulated 24V DC through 4.7K resistor. This indicates the power switch is ON. Also connect the voltmeter to final output voltage terminals to display what voltage is being generated. &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;Remember the heat sink for LM350.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Assembly&lt;/b&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;Here are some of the pictures that I took while making this power supply.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TDk2p_xQfzI/AAAAAAAAARI/eQIYxi3-4cU/s1600/1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TDk2p_xQfzI/AAAAAAAAARI/eQIYxi3-4cU/s400/1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TDk2vBwXt4I/AAAAAAAAARQ/llWnZU3bPD8/s1600/2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TDk2vBwXt4I/AAAAAAAAARQ/llWnZU3bPD8/s400/2.JPG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TDk2zlrHQxI/AAAAAAAAARY/8MC6uDHMlW4/s1600/3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TDk2zlrHQxI/AAAAAAAAARY/8MC6uDHMlW4/s400/3.JPG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TDk23-rDqLI/AAAAAAAAARg/ww6kRx7HhXU/s1600/4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="325" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TDk23-rDqLI/AAAAAAAAARg/ww6kRx7HhXU/s400/4.JPG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TDk27YRT6WI/AAAAAAAAARo/eo4RJYegE1g/s1600/5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TDk27YRT6WI/AAAAAAAAARo/eo4RJYegE1g/s400/5.JPG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TDk2__yfdFI/AAAAAAAAARw/TNacKT9b_-U/s1600/6.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TDk2__yfdFI/AAAAAAAAARw/TNacKT9b_-U/s400/6.JPG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TDk3DiGTiQI/AAAAAAAAAR4/DZJj7039DPE/s1600/7.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TDk3DiGTiQI/AAAAAAAAAR4/DZJj7039DPE/s400/7.JPG" style="cursor: move;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TDk3HsCwSzI/AAAAAAAAASA/0PXU6XUuNR8/s1600/8.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TDk3HsCwSzI/AAAAAAAAASA/0PXU6XUuNR8/s400/8.JPG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Finalized product.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;I hope this project will be helpful to you and you have enjoyed reading this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-6492022151610038329?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/6492022151610038329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/07/variable-dc-power-supply-125-18v-using.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/6492022151610038329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/6492022151610038329'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/07/variable-dc-power-supply-125-18v-using.html' title='Variable DC Power Supply (1.25 - 18V) using LM350 IC'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-qkzmJbjoOoE/TDk27YRT6WI/AAAAAAAAARo/TocZ57VL4iE/s72-c/5.JPG' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-5455649120182365411</id><published>2010-07-08T13:48:00.000-07:00</published><updated>2011-06-24T12:01:26.982-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683 and UART'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683'/><category scheme='http://www.blogger.com/atom/ns#' term='Interrupt service routine'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683 Dev Board'/><category scheme='http://www.blogger.com/atom/ns#' term='ISR'/><category scheme='http://www.blogger.com/atom/ns#' term='pic microchip and hyperterminal'/><category scheme='http://www.blogger.com/atom/ns#' term='Interrupt'/><title type='text'>External Interrupt Demonstration with PIC12F683</title><content type='html'>PIC12F683 has got one external interrupt input which is edge triggered. If you want to learn how to write an Interrupt Service&amp;nbsp; Routine (ISR) using mikroC compiler, check this out. When an interrpt arrives, the PIC12F683 displays the interrupt arrival information as a part of ISR on a windows PC hyper-terminal through software UART. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TCaKiGI45RI/AAAAAAAAAQA/aM6RHJfsuk0/s1600/intrdemo.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="277" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TCaKiGI45RI/AAAAAAAAAQA/aM6RHJfsuk0/s400/intrdemo.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picboard.blogspot.com/2010/06/experiment-no-4-external-interrupt.html" target="blank"&gt;&lt;span style="font-size: large;"&gt;Click here for more details.&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-5455649120182365411?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/5455649120182365411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/07/external-interrupt-demonstration-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5455649120182365411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5455649120182365411'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/07/external-interrupt-demonstration-with.html' title='External Interrupt Demonstration with PIC12F683'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_92HIn_KJDYY/TCaKiGI45RI/AAAAAAAAAQA/aM6RHJfsuk0/s72-c/intrdemo.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-3560903971955315</id><published>2010-06-26T13:15:00.000-07:00</published><updated>2011-06-24T11:57:56.733-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683 and UART'/><category scheme='http://www.blogger.com/atom/ns#' term='8-pin PIC microcontrollers'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683 Dev Board'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683 ADC'/><category scheme='http://www.blogger.com/atom/ns#' term='mikroC'/><title type='text'>Using ADC in mikroC</title><content type='html'>&lt;div style="text-align: left;"&gt;With mikroC built-in library, use of ADC on PIC microcontrollers has become more simple. PIC16F628A doesn't have in-built ADC in it, so I am going to demonstrate this with my PIC12F683 development board. The analog input will be given through a potentiometer, and the 10-bit digital output will be displayed on a hyperterminal window on PC.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/TCZfcb_GJDI/AAAAAAAAAPw/hvAFZF99EZ0/s1600/ADCHyperTerminal.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_92HIn_KJDYY/TCZfcb_GJDI/AAAAAAAAAPw/hvAFZF99EZ0/s400/ADCHyperTerminal.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TCZflAdG6mI/AAAAAAAAAP4/MVd0-e747Hg/s1600/145246.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TCZflAdG6mI/AAAAAAAAAP4/MVd0-e747Hg/s400/145246.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;See details of this &lt;/span&gt;&lt;a href="http://picboard.blogspot.com/2010/06/experiment-no-3-analog-to-digital.html"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;HERE&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-3560903971955315?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/3560903971955315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/06/using-adc-in-mikroc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3560903971955315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3560903971955315'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/06/using-adc-in-mikroc.html' title='Using ADC in mikroC'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_92HIn_KJDYY/TCZfcb_GJDI/AAAAAAAAAPw/hvAFZF99EZ0/s72-c/ADCHyperTerminal.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-170416397164519471</id><published>2010-02-17T14:46:00.000-08:00</published><updated>2011-06-24T11:31:51.998-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='8-pin PIC microcontrollers'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683 Dev Board'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC12F683 ADC'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Projects'/><title type='text'>PIC12F683 Development Board</title><content type='html'>I have recently made a new PIC development board for PIC12F683. It is an 8-pin microcontroller with a lot of good features including 10-bit ADC and PWM. The development board has following features:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-JAM3egQcnYs/TIzPHm-hb5I/AAAAAAAAAV8/USWW0DzdRT8/s1600/lunapic_128413505138086_19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-JAM3egQcnYs/TIzPHm-hb5I/AAAAAAAAAV8/USWW0DzdRT8/s1600/lunapic_128413505138086_19.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;1. A Regulated +5V power supply.&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;2. 3 Red LED outputs which can be connected to any GPIO pins using jumper wires.&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;3. An ON/OFF power supply switch.&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;4. A Green LED as a power ON indicator.&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;5. An 8-pin IC socket for PIC12F683 microcontroller.&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;6. Two potentiometers: one for providing Vref, and other for simulating analog input to ADC.&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;7. An ICSP header connector.&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;8. Two tactile switches for input operation.&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;9. A TTL to RS232 level shifter using a transistor circuit.&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;10. A piezo buzzer.&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;11. A DC motor with driving circuit.&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;12. Access to individual pins of PIC12F683 through female header pins.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a class="cssButton" href="javascript:void(0)" id="publishButton" onclick="if (this.className.indexOf(&amp;quot;ubtn-disabled&amp;quot;) == -1) {var e = document['postingForm'].publish;(e.length) ? e[0].click() : e.click(); if (window.event) window.event.cancelBubble = true; return false;}" target=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="cssButtonOuter"&gt;&lt;div class="cssButtonMiddle"&gt;&lt;div class="cssButtonInner"&gt;&lt;a class="cssButton" href="javascript:void(0)" id="publishButton" onclick="if (this.className.indexOf(&amp;quot;ubtn-disabled&amp;quot;) == -1) {var e = document['postingForm'].publish;(e.length) ? e[0].click() : e.click(); if (window.event) window.event.cancelBubble = true; return false;}" target=""&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/S3xw5n8mAyI/AAAAAAAAAOM/O4yuvaZV_hA/s1600-h/Picture+9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="297" src="http://3.bp.blogspot.com/_92HIn_KJDYY/S3xw5n8mAyI/AAAAAAAAAOM/O4yuvaZV_hA/s400/Picture+9.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;For further details, visit&amp;nbsp; Read &amp;nbsp;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a href="http://picboard.blogspot.com/2010/02/make-your-own-pic12f683-development.html"&gt;My Blog&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-170416397164519471?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/170416397164519471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/02/pic12f683-development-board.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/170416397164519471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/170416397164519471'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/02/pic12f683-development-board.html' title='PIC12F683 Development Board'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-JAM3egQcnYs/TIzPHm-hb5I/AAAAAAAAAV8/USWW0DzdRT8/s72-c/lunapic_128413505138086_19.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-714913178831626940</id><published>2010-02-13T15:01:00.000-08:00</published><updated>2011-10-14T10:08:40.183-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DS1820'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='1-Wire Protocol'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Temperature data logger'/><category scheme='http://www.blogger.com/atom/ns#' term='UART'/><title type='text'>Experiment No. 11: Temperature Data Logger Using PIC16F628A Microcontroller</title><content type='html'>This project is the combination of the two experiments that we already did in past: Experiment No. 4 and 10. In experiment 4, we demonstrated how to use the mikroC 1-wire library to read temperature data from a digital sensor DS1820, and display the value on a LCD screen. Now we are going to use the hardware UART to transfer the temperature data from the PIC to a PC (Exp. No. 10). The Hyper-Terminal program running on a PC will receive the temperature values and display on screen. The temperature data from the microcontroller will be sent in every 15 sec.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Experimental Setup: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The setup for this experiment is same as the &lt;a href="http://pic16f628a.blogspot.com/2010/01/experiment-no-10-use-of-uart-library-to.html"&gt;Experiment no. 10&lt;/a&gt; with a DS1820 inserted in its 3-pin female header receiver on the board. The data output of DS1820 is connected to RB.0 (see articles&amp;nbsp;&lt;a href="http://pic16f628a.blogspot.com/2009/09/experiment-no-4-reading-temperature.html"&gt; Exp. No. 4&lt;/a&gt; and &lt;a href="http://pic16f628a.blogspot.com/2009/09/1-wire-communication-protocol.html"&gt;1-Wire Protocol&lt;/a&gt; for detail). You need to rebuild the same TTL to RS232 level shifter circuit on a breadboard and set up a hyper-terminal to receive data at 9600 baud rate. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/S3cur2ZmoAI/AAAAAAAAANg/W4590znS9I0/s1600-h/TempLogger2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="393" src="http://3.bp.blogspot.com/_92HIn_KJDYY/S3cur2ZmoAI/AAAAAAAAANg/W4590znS9I0/s400/TempLogger2.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Software:&lt;/b&gt;&lt;br /&gt;&lt;div style="color: #073763;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #073763;"&gt;&amp;nbsp;/*&lt;br /&gt;&amp;nbsp;* Project name:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Temperature Data Logger&lt;/div&gt;&lt;div style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC16F628A reads digital temperature data from a DS1820 chip, and&lt;/div&gt;&lt;div style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; send it to a PC through RS232 port to display on hyperterminal window.&lt;br /&gt;&amp;nbsp;* Copyright:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (c) Rajendra Bhatt, 2009.&lt;br /&gt;*/ &lt;/div&gt;&lt;div style="color: #073763;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #073763;"&gt;// String array to store temperature value to display&lt;br /&gt;char *temp = "000.00";&lt;br /&gt;&lt;br /&gt;// Temperature Resolution : No. of bits in temp value = 9&lt;br /&gt;const unsigned short TEMP_RES = 9;&lt;br /&gt;&lt;br /&gt;// Variable to store temperature register value&lt;br /&gt;unsigned temp_value;&lt;br /&gt;&lt;br /&gt;void Display_Temperature(unsigned int temp2write) {&lt;br /&gt;&amp;nbsp; const unsigned short RES_SHIFT = TEMP_RES - 8;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; // Variable to store Integer value of temperature&lt;br /&gt;&amp;nbsp; char temp_whole;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; // Variable to store Fraction value of temperature&lt;br /&gt;&amp;nbsp; unsigned int temp_fraction;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; // check if temperature is negative&lt;br /&gt;&amp;nbsp; if (temp2write &amp;amp; 0x8000) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp[0] = '-';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Negative temp values are stored in 2's complement form&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp2write = ~temp2write + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; // Get temp_whole by dividing by 2 (DS1820 9-bit resolution with&lt;br /&gt;&amp;nbsp; // 0.5 Centigrade step )&lt;br /&gt;&amp;nbsp; temp_whole = temp2write &amp;gt;&amp;gt; RES_SHIFT ;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; // convert temp_whole to characters&lt;br /&gt;&amp;nbsp; if (temp_whole/100)&lt;br /&gt;&amp;nbsp; // 48 is the decimal character code value for displaying 0 on LCD&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp[0] = temp_whole/100&amp;nbsp; + 48;&lt;br /&gt;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp[0] = '0';&lt;br /&gt;&lt;br /&gt;&amp;nbsp; temp[1] = (temp_whole/10)%10 + 48;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Extract tens digit&lt;br /&gt;&amp;nbsp; temp[2] =&amp;nbsp; temp_whole%10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + 48;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Extract ones digit&lt;br /&gt;&lt;br /&gt;&amp;nbsp; // extract temp_fraction and convert it to unsigned int&lt;br /&gt;&amp;nbsp; temp_fraction&amp;nbsp; = temp2write &amp;lt;&amp;lt; (4-RES_SHIFT);&lt;br /&gt;&amp;nbsp; temp_fraction &amp;amp;= 0x000F;&lt;br /&gt;&amp;nbsp; temp_fraction *= 625;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; // convert temp_fraction to characters&lt;br /&gt;&amp;nbsp; temp[4] =&amp;nbsp; temp_fraction/1000&amp;nbsp;&amp;nbsp;&amp;nbsp; + 48;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Extract tens digit&lt;br /&gt;&amp;nbsp; temp[5] = (temp_fraction/100)%10 + 48;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Extract ones digit&lt;br /&gt;&lt;br /&gt;&amp;nbsp; // Send temperature to RS232&lt;br /&gt;&amp;nbsp; UART1_Write(10); // Line Feed&lt;br /&gt;&amp;nbsp; UART1_Write(13); // Carriage Return&lt;br /&gt;&amp;nbsp; UART1_Write_Text("Temperature= ");&lt;br /&gt;&amp;nbsp; UART1_Write_Text(temp);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;//unsigned char _data = 0x1E;&lt;br /&gt;void main() {&lt;br /&gt;CMCON = 7;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable Comparators&lt;br /&gt;UART1_Init(9600);&lt;br /&gt;Delay_ms(100);&lt;br /&gt;&amp;nbsp;//--- main loop&lt;br /&gt;&amp;nbsp; do {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //--- perform temperature reading&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ow_Reset(&amp;amp;PORTB, 0);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Onewire reset signal&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ow_Write(&amp;amp;PORTB, 0, 0xCC);&amp;nbsp;&amp;nbsp; // Issue command SKIP_ROM&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ow_Write(&amp;amp;PORTB, 0, 0x44);&amp;nbsp;&amp;nbsp; // Issue command CONVERT_T&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_ms(600);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If this delay is less than 500ms, you will see the first reading on LCD&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //85C which is (if you remember from my article on DS1820)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //a power-on-reset value.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ow_Reset(&amp;amp;PORTB, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ow_Write(&amp;amp;PORTB, 0, 0xCC);&amp;nbsp;&amp;nbsp;&amp;nbsp; // Issue command SKIP_ROM&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ow_Write(&amp;amp;PORTB, 0, 0xBE);&amp;nbsp;&amp;nbsp;&amp;nbsp; // Issue command READ_SCRATCHPAD&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Read Byte 0 from Scratchpad&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp_value =&amp;nbsp; Ow_Read(&amp;amp;PORTB, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Then read Byte 1 from Scratchpad and shift 8 bit left and add the Byte 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp_value = (Ow_Read(&amp;amp;PORTB, 0) &amp;lt;&amp;lt; 8) + temp_value;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //--- Format and display result on Lcd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Display_Temperature(temp_value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_ms(30000);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } while (1);&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Output:&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/S3cu3Xt2bpI/AAAAAAAAANo/qGnAdy7PrOg/s1600-h/TempLogger1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_92HIn_KJDYY/S3cu3Xt2bpI/AAAAAAAAANo/qGnAdy7PrOg/s400/TempLogger1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-714913178831626940?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/714913178831626940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/02/experiment-no-11-temperature-data.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/714913178831626940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/714913178831626940'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/02/experiment-no-11-temperature-data.html' title='Experiment No. 11: Temperature Data Logger Using PIC16F628A Microcontroller'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_92HIn_KJDYY/S3cur2ZmoAI/AAAAAAAAANg/W4590znS9I0/s72-c/TempLogger2.JPG' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-2894919807480102467</id><published>2010-01-23T09:22:00.000-08:00</published><updated>2011-06-24T11:28:34.010-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hyperterminal and PIC16F628A'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Development Board'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A'/><category scheme='http://www.blogger.com/atom/ns#' term='RS232'/><category scheme='http://www.blogger.com/atom/ns#' term='UART'/><title type='text'>Experiment No. 10: Use of UART Library to Communicate with PC</title><content type='html'>MikroC has two sets of built-in library functions for UART communications: &lt;b&gt;Software UART&lt;/b&gt; and &lt;b&gt;Hardware UART&lt;/b&gt;. Since PIC16F628A has a built-in hardware USART module, we are going to use the Hardware UART library. Some PICs don't have hardware USART, such as PIC16F84A. In such cases, any digital I/O pins of PIC can be used for Asynchronous Serial Data Transfer using mikroC Software UART libraries.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Experimental Setup&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The UART Rx and Tx pins in PIC16F628A are multiplexed with RB1 and RB2 pins. In this experiment, we are just sending some character data from PIC to a PC as demonstration of the technique. On PC, the HyperTerminal program should be running to receive data from the PIC16F628A. Since our PIC board does not have a TTL to RS232 voltage level shifter, we are going to construct it on a breadboard. Here is my Level Shifter Circuit:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/S1svs49atNI/AAAAAAAAAMQ/hOdz7b2TjSw/s1600-h/Level+Shifter+Ciruit.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="http://3.bp.blogspot.com/_92HIn_KJDYY/S1svs49atNI/AAAAAAAAAMQ/hOdz7b2TjSw/s400/Level+Shifter+Ciruit.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Connect Tx on PIC side to RB2 pin and leave Rx open, as we are not receiving any data from PC. And,&amp;nbsp; the same circuit on breadboard is shown below. I am using BC557 transistor. The diode in the circuit is any general purpose diode.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;table align="" style="border-collapse: collapse; border: 1px solid black; width: 100%;" width=""&gt;&lt;tbody&gt;&lt;tr style="background-color: orange; color: mediumblue; font-weight: bold;"&gt;       &lt;td style="border: 1px solid black;"&gt;BC557 Transistor Pins&lt;/td&gt; &lt;td&gt;Relevant Links&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/S1sz_d495II/AAAAAAAAAMY/L3Jk7rFjkFA/s1600-h/to92-cbe-pnp.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_92HIn_KJDYY/S1sz_d495II/AAAAAAAAAMY/L3Jk7rFjkFA/s200/to92-cbe-pnp.gif" width="173" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="border: 1px solid black;"&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_200x200, created 9/16/09 */google_ad_slot = "7315657033";google_ad_width = 200;google_ad_height = 200;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/S1sjI9K4O9I/AAAAAAAAALg/67UpBUFiWb0/s1600-h/Level+Shifter+on+board.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="285" src="http://1.bp.blogspot.com/_92HIn_KJDYY/S1sjI9K4O9I/AAAAAAAAALg/67UpBUFiWb0/s400/Level+Shifter+on+board.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I have one COM Port on my PC to which I have connected a RS232 DB9 female connector. We need to make a common ground between RS232 and our experiment board. So connect pin 5 (which is ground) of&amp;nbsp; DB9 connector to our circuit ground.&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/S1sl-Qd6RQI/AAAAAAAAALw/0_ROvh4QChQ/s1600-h/db9_pinouts.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="380" src="http://1.bp.blogspot.com/_92HIn_KJDYY/S1sl-Qd6RQI/AAAAAAAAALw/0_ROvh4QChQ/s400/db9_pinouts.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: #073763; text-align: center;"&gt;&lt;b&gt;Male DB9 Connector Pin descriptions. (Source:http://tk5ep.free.fr/tech/ts850/if232/img/db9_pinouts.gif )&lt;/b&gt;&lt;/div&gt;&lt;div style="color: #073763; text-align: center;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/S1smAl_gMwI/AAAAAAAAAL4/WYzocIrGi-k/s1600-h/RS232+Pins.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="261" src="http://4.bp.blogspot.com/_92HIn_KJDYY/S1smAl_gMwI/AAAAAAAAAL4/WYzocIrGi-k/s400/RS232+Pins.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b style="color: #073763;"&gt;The same signal pins for a female DB9 connector. See, how the pins are flipped around horizontal.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/S1snM-ZS3RI/AAAAAAAAAMA/C-3F-WW30l4/s1600-h/Board.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_92HIn_KJDYY/S1snM-ZS3RI/AAAAAAAAAMA/C-3F-WW30l4/s400/Board.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span style="color: #073763;"&gt;Complete Setup for this Experiment&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;We are going to set 9600 baud rate for data transfer, so next step is to setup the Hyperterminal on PC. I am running this on Windows XP.&lt;/div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Go to Start-&amp;gt; All Programs -&amp;gt; Accessories -&amp;gt; Communications -&amp;gt; Hyper Terminal&lt;/li&gt;&lt;li&gt;Setup a New Connection to a proper COM port number with&lt;br /&gt;&lt;/li&gt;&lt;ol&gt;&lt;ul&gt;&lt;li&gt;bps : 9600&lt;/li&gt;&lt;li&gt;Databits: 8&lt;/li&gt;&lt;li&gt;Parity : None&lt;/li&gt;&lt;li&gt;Stop Bits : 1&lt;/li&gt;&lt;li&gt;Flow Control : Hardware&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;/div&gt;Click OK and now the HyperTerminal is ready to receive data from PIC.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Software&lt;/b&gt;&lt;br /&gt;As mentioned earlier, mikroC has in-built library functions for hardware UART. Check out the manual &lt;b&gt;&lt;a href="http://www.mikroe.com/pdf/mikroc_pic_pro/mikroc_pic_pro_manual_v100.pdf"&gt;here.&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #073763;"&gt;/*&lt;br /&gt;&amp;nbsp;* Project name:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Asynchronous Serial Data Transfer from PIC16F628A to a PC HyperTerminal&lt;br /&gt;&amp;nbsp;* Copyright:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (c) Rajendra Bhatt, 2009.&lt;br /&gt;&lt;br /&gt;*/ &lt;/div&gt;&lt;div style="color: #073763;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #073763;"&gt;void main() {&lt;br /&gt;CMCON = 7;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable Comparators&lt;br /&gt;UART1_Init(9600);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Baud Rate 9600&lt;br /&gt;Delay_ms(100);&lt;br /&gt;while(1) {&lt;br /&gt;//UART1_Write(_data);&lt;br /&gt;UART1_Write_Text(" UART Test Successful! ");&amp;nbsp;&amp;nbsp; // Character Message to be Sent &lt;br /&gt;UART1_Write(10); // Line Feed&lt;br /&gt;UART1_Write(13); // Carriage Return&lt;br /&gt;delay_ms(2000);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send the message every 2 seconds&lt;br /&gt;}&lt;br /&gt;}&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;b&gt;Experimental Output&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/S1stbD5eyiI/AAAAAAAAAMI/kKGK5FHQ4kA/s1600-h/Hyperterminal_phixr.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_92HIn_KJDYY/S1stbD5eyiI/AAAAAAAAAMI/kKGK5FHQ4kA/s400/Hyperterminal_phixr.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-2894919807480102467?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/2894919807480102467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/01/experiment-no-10-use-of-uart-library-to.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/2894919807480102467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/2894919807480102467'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/01/experiment-no-10-use-of-uart-library-to.html' title='Experiment No. 10: Use of UART Library to Communicate with PC'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_92HIn_KJDYY/S1svs49atNI/AAAAAAAAAMQ/hOdz7b2TjSw/s72-c/Level+Shifter+Ciruit.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-2323950216519245800</id><published>2010-01-06T18:28:00.000-08:00</published><updated>2011-06-24T11:27:09.168-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PWM'/><category scheme='http://www.blogger.com/atom/ns#' term='DC Motor Control'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Development Board'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A'/><title type='text'>Experiment No. 9: DC Motor Speed Control using PWM</title><content type='html'>&lt;div style="text-align: left;"&gt;This is an extension of Experiment No. 8 (&lt;a href="http://pic16f628a.blogspot.com/2009/11/experiment-no-8-use-of-pwm-to-control.html"&gt;Click Here&lt;/a&gt;). The PWM output is here connected to power a DC motor through a NPN driving transistor. The motor driving circuit is built in a breadboard, as shown below. The circuit is pretty straight forward, the PWM output from PIC pin drives the BC547 transistor ON and OFF, and the current to drive the motor is provided by the collector current in the transistor. The diode is for back EMF protection. I am using a small 6V DC motor from an old cassette player. For motors that require more current to drive, a darlington transistor pair or high power transistor is recommended.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/S0VDsqkS5OI/AAAAAAAAALA/v6OjcinOqKk/s1600-h/1262731771-198-119-145-240.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_92HIn_KJDYY/S0VDsqkS5OI/AAAAAAAAALA/v6OjcinOqKk/s400/1262731771-198-119-145-240.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/S0VENG3-4II/AAAAAAAAALI/Cv31ukWQyUk/s1600-h/DSC00469.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_92HIn_KJDYY/S0VENG3-4II/AAAAAAAAALI/Cv31ukWQyUk/s400/DSC00469.JPG" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zd1G_jnv4MQ&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/zd1G_jnv4MQ&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-2323950216519245800?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/2323950216519245800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2010/01/dc-motor-speed-control-using-pwm.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/2323950216519245800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/2323950216519245800'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2010/01/dc-motor-speed-control-using-pwm.html' title='Experiment No. 9: DC Motor Speed Control using PWM'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_92HIn_KJDYY/S0VDsqkS5OI/AAAAAAAAALA/v6OjcinOqKk/s72-c/1262731771-198-119-145-240.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-5285176591409927237</id><published>2009-11-18T17:50:00.000-08:00</published><updated>2011-10-14T10:10:12.477-07:00</updated><title type='text'>Experiment No. 8: Use of PWM to control the brightness of a LED.</title><content type='html'>&lt;b&gt;Introduction:&lt;/b&gt;&lt;br /&gt;A PIC16F628A has an in-built Capture/Compare/PWM (CCP) module for which the I/O pin is served by RB.3 (Pin No. 9). In this experiment we are going to use the CCP as a PWM to control the power to a LED. PWM stands for the Pulse Width Modulation where the width of a digital waveform is varied to control the power delivered to a load. The underlying principle in the whole process is that the average power delivered is directly proportional to the modulation &lt;b&gt;duty cycle&lt;/b&gt;. The term &lt;b&gt;duty cycle&lt;/b&gt; describes the proportion of &lt;b&gt;on&lt;/b&gt; time to the regular interval or &lt;b&gt;period&lt;/b&gt; of time; a low duty cycle corresponds to low power, because the power is off for most of the time. Duty cycle is expressed in percent, 100% being fully on.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/SwShxoWJPZI/AAAAAAAAAKw/h_8U8oPZw0o/s1600/PWMod.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_92HIn_KJDYY/SwShxoWJPZI/AAAAAAAAAKw/h_8U8oPZw0o/s400/PWMod.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;i&gt;&lt;b&gt;I&lt;/b&gt;&lt;b&gt;mage Source:&lt;/b&gt; http://www.micromouseinfo.com/introduction/images/intro_hardware/PWMod.gif&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;The mikroC has an in-built library functions for PWM hardware module. Click &lt;a href="http://www.mikroe.com/pdf/mikroc_pic_pro/mikroc_pic_pro_manual_v100.pdf"&gt;here&lt;/a&gt; for details.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt; &lt;br /&gt;&lt;b&gt;Experimental Setup: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In this experiment, we are going to have 11 different intensities (including complete turn OFF) of a LED by varying the duty cycle. We will connect a LED to RB.3, and two Push Buttons to RB.0 and RB.1. The two buttons are for Increment/Decrement the intensity of the LED.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/SwSh7NZcrrI/AAAAAAAAAK4/o0V9e5_qZJ4/s1600/pwm.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_92HIn_KJDYY/SwSh7NZcrrI/AAAAAAAAAK4/o0V9e5_qZJ4/s400/pwm.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Software:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #0c343d;"&gt;/*&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;Project Name: Use of Timer 0 and Interrupt&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;* Copyright:&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;(c) Rajendra Bhatt, 2009.&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;* Description:&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;Use of CCP module as a Pulse Width Modulation&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;* Test configuration:&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;MCU:             PIC16F628A&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;Oscillator:      XT, 4.0 MHz&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;*/&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;unsigned short new_DC, current_DC;&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;void main() {&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;PORTB = 0;         // Initial state of port B&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;TRISB = 3;         // RB0, RB1 input, RB3 (PWM1) output&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;PWM1_Init(5000);   // PWM module initialization (5KHz)&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;new_DC = 0;        // Initial value of variable Duty Cycle&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;current_DC = 0;&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;PWM1_Start();      // Start PWM1 module with Zero DC&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;PWM1_Set_Duty(current_DC);&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;while (1) {&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;if (Button(&amp;amp;PORTB, 0,1,0)) {    // If the button connected to RB0 is pressed&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;if (new_DC &amp;lt; 250)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  // Don't go above 250&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;new_DC = new_DC + 25 ; // increment Duty Cycle by 25&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;}&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;if (Button(&amp;amp;PORTB, 1,1,0)) {    // If the button connected to RB1 is pressed&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;if (new_DC !=0)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  // Don't go below 0&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;new_DC= new_DC - 25 ;      // decrement Duty Cycle by 25&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;}&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;if (current_DC != new_DC) {&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div style="color: #0c343d;"&gt;current_DC = new_DC ;&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;PWM1_Set_Duty(current_DC); // Change the current DC to new value&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;}&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;Delay_ms(150);&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;}&lt;/div&gt;&lt;div style="color: #0c343d;"&gt;}&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Experimental Output Video:&lt;/b&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/MXTYLZAzHZA&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/MXTYLZAzHZA&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-5285176591409927237?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/5285176591409927237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/11/experiment-no-8-use-of-pwm-to-control.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5285176591409927237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5285176591409927237'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/11/experiment-no-8-use-of-pwm-to-control.html' title='Experiment No. 8: Use of PWM to control the brightness of a LED.'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_92HIn_KJDYY/SwShxoWJPZI/AAAAAAAAAKw/h_8U8oPZw0o/s72-c/PWMod.gif' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-7848721425520098975</id><published>2009-11-02T17:52:00.000-08:00</published><updated>2011-06-24T11:22:25.754-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Experiments'/><category scheme='http://www.blogger.com/atom/ns#' term='Timer'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Development Board'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A'/><category scheme='http://www.blogger.com/atom/ns#' term='Interrupt'/><title type='text'>Experiment No. 7: Timers and Interrupts</title><content type='html'>&lt;b&gt;Background &lt;/b&gt;&lt;br /&gt;Many microcontroller applications like generating periodic signals, measuring time interval, keeping date and time, use time as their variable. Therefore, microcontrollers need to have some internal resources to accurately measure time. The PIC16F628A has 3 timer modules which are known as &lt;i&gt;&lt;b&gt;Timer0&lt;/b&gt;&lt;/i&gt;,&lt;i&gt;&lt;b&gt; Timer1&lt;/b&gt;&lt;/i&gt;,&lt;i&gt;&lt;b&gt; and Timer2&lt;/b&gt;&lt;/i&gt;. The basic unit of a timer is a free-run 8-bit or 16-bit incrementing synchronous counter which can be programmed to count internal or external pulses. The count number stored by each counter can be read or modified by accessing the special function register associated with that timer. Some of the bits in these registers are also the indicators of timer overflow, which, therefore, can generate interrupt request to the microcontroller. The use of timer modules to keep record of time elapsed allows the microcontroller to carry on with its other operations like controlling outputs, reading inputs, etc.&lt;br /&gt;&lt;br /&gt;Timers can also have another asynchronour counter, known as &lt;b&gt;&lt;i&gt;prescaler&lt;/i&gt;&lt;/b&gt;, which can be configured to divide the&amp;nbsp; number of pulses received by the timer register to be divided by a factor of 2, 4, 8, 16, 32, 64, 128 or 256.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Timer0 Module&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The Timer0 module is an&amp;nbsp; 8-bit timer/counter which can be configured to count machine cycles or external pulses. When counting machine cycles, it is known to operate as a timer, and when counting the external pulses, it is called to operate as a counter. The external pulses are given to RA4/T0CKI pin. The Timer0 also consists of an 8-bit prescaler which is a programmable division factor.&lt;br /&gt;&lt;br /&gt;The operation of the timer is set up by moving a suitable control code into the OPTION register. Timer mode is selected by clearing the T0CS bit (OPTION&amp;lt;5&amp;gt;). In Timer mode, the TMR0 register value will increment every instruction cycle (without prescaler). Counter mode is selected by setting the T0CS bit. In this mode, the TMR0 register value will increment either on every rising or falling edge of pin RA4/T0CKI pin. The incrementing edge is determined by the source edge (T0SE) control bit (OPTION&amp;lt;4&amp;gt;). Clearing the&lt;br /&gt;T0SE bit selects the rising edge.&lt;br /&gt;&lt;br /&gt;Timer0 interrupt is generated when the TMR0 register timer/counter overflows from FFh to 00h. This overflow sets the T0IF bit of INTCON register. The interrupt can be masked by clearing the T0IE bit (INTCON&amp;lt;5&amp;gt;). The T0IF bit (INTCON&amp;lt;2&amp;gt;) must be cleared in software by the Timer0 module interrupt service routine before reenabling this interrupt. &lt;br /&gt;&lt;br /&gt;The prescalar value can be set using the PSA and PS&amp;lt;2:0&amp;gt; bits of OPTION register.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/Su-L9AeutlI/AAAAAAAAAKY/pyEpQeI4RkE/s1600-h/OPTION.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_92HIn_KJDYY/Su-L9AeutlI/AAAAAAAAAKY/pyEpQeI4RkE/s400/OPTION.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/Su-L-xShPCI/AAAAAAAAAKg/HIiph_CDP7o/s1600-h/INTCON.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_92HIn_KJDYY/Su-L-xShPCI/AAAAAAAAAKg/HIiph_CDP7o/s400/INTCON.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;b&gt;2. Timer1 and Timer2&lt;/b&gt;&lt;br /&gt;Refer to&lt;a href="http://ww1.microchip.com/downloads/en/DeviceDoc/40044F.pdf"&gt; datasheet&lt;/a&gt;.&lt;br /&gt;So in this experiment, we are going to use Timer0 to generate delay for a 4-bit up counter. Connect RB0-RB3 to the 4 LEDs on the board using jumpers.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Software:&lt;/b&gt;&lt;br /&gt;&lt;div style="background-color: white; color: #0c343d;"&gt;/*&lt;br /&gt;&amp;nbsp; Project Name: Use of Timer 0 and Interrupt&lt;br /&gt;&amp;nbsp; * Copyright:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (c) Rajendra Bhatt, 2009.&lt;br /&gt;&amp;nbsp;* Description:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This code is an example of using Timer 0 and Interrupt for delay.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;* Test configuration:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MCU:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC16F628A&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Oscillator:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XT, 4.0 MHz&lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&lt;br /&gt;&amp;nbsp; unsigned cnt, num;&lt;br /&gt;&amp;nbsp; void interrupt() {&amp;nbsp;&amp;nbsp; // Interrupt routine&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; num ++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Interrupt causes Num to be incremented by 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(num == 20) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cnt ++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 20 Interrupts causes cnt to be incremented by 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; num = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TMR0 = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Timer (or counter) TMR0 returns its initial value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTCON = 0x20;&amp;nbsp;&amp;nbsp; // Bit T0IE is set, bit T0IF is cleared&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; void main() {&lt;br /&gt;&amp;nbsp; cnt=0;&lt;br /&gt;&amp;nbsp; num=0;&lt;br /&gt;&amp;nbsp; OPTION_REG = 0x07; // Prescaler (1:256) is assigned to the timer TMR0&lt;br /&gt;&amp;nbsp; TMR0 = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Timer T0 counts from 0 to 255&lt;br /&gt;&amp;nbsp; INTCON = 0xA0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Enable interrupt TMR0&lt;br /&gt;&amp;nbsp; TRISB = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set direction to be output&lt;br /&gt;&amp;nbsp; PORTB = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Turn OFF LEDs on PORTB&lt;br /&gt;&amp;nbsp; do {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB =cnt ;&lt;br /&gt;&amp;nbsp; } while(PORTB &amp;lt; 0x0f);&amp;nbsp; // Till PORTB &amp;lt; 15&lt;br /&gt;&amp;nbsp;}&lt;/div&gt;&lt;div style="background-color: white; color: #0c343d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/SvJBJzZqMpI/AAAAAAAAAKo/AAodrTfBTEU/s1600-h/Timer0.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_92HIn_KJDYY/SvJBJzZqMpI/AAAAAAAAAKo/AAodrTfBTEU/s400/Timer0.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-7848721425520098975?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/7848721425520098975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/11/experiment-no-7-timers-and-interrupts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/7848721425520098975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/7848721425520098975'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/11/experiment-no-7-timers-and-interrupts.html' title='Experiment No. 7: Timers and Interrupts'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_92HIn_KJDYY/Su-L9AeutlI/AAAAAAAAAKY/pyEpQeI4RkE/s72-c/OPTION.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-8316232653662598864</id><published>2009-10-20T18:58:00.000-07:00</published><updated>2011-06-24T11:20:00.559-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Experiments'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Development Board'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A'/><category scheme='http://www.blogger.com/atom/ns#' term='EEPROM'/><title type='text'>Experiment No. 6: Read/Write Internal EEPROM Memory</title><content type='html'>An EEPROM (Electrically-Erasable Programmable ROM) data memory is one of the important features of flash-based PIC microcontrollers. It is called non-volatile to indicate that it  retains the data even when the power is down. Practically speaking, if you want to design a digital lock system, then the password to unlock the system can be saved into the EEPROM, so that when the power is down, the password will still be saved. And other good thing is that the data can be easily modified or overwritten with software control. In this experiment, I am going to show you how to read and write in to the internal EEPROM memory of PIC16F628A using mikroC EEPROM library functions. Here is what we are going to do:&lt;br /&gt;&lt;br /&gt;We will write 0s to 10 EEPROM locations. We will read them first, then write 0-9 to these locations, and turn the power off. We will turn the power on, and read the data in those locations and see. I have created a simple menu on LCD with Read, Write and Delete functions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Experimental Setup:&lt;/b&gt;&lt;br /&gt;Connect the three push buttons on the board to RB.0, RB.1, and RB.2, and plug-in the LCD module.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-40kgOY3UpHs/TgTVHcDFR0I/AAAAAAAAAeo/iEMwc50EKzs/s1600/Screen+shot+2011-06-24+at+2.18.32+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://4.bp.blogspot.com/-40kgOY3UpHs/TgTVHcDFR0I/AAAAAAAAAeo/iEMwc50EKzs/s400/Screen+shot+2011-06-24+at+2.18.32+PM.png" width="400" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;b&gt;Software:&lt;/b&gt;&lt;br /&gt;&lt;div style="color: #073763;"&gt;/*&lt;br /&gt;&amp;nbsp; Project Name: Read/Write Internal EEPROM&lt;br /&gt;&amp;nbsp; * Copyright:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (c) Rajendra Bhatt, 2009.&lt;br /&gt;&amp;nbsp;* Description:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This code is an example of accessing internal EEPROM.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;* Test configuration:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MCU:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC16F628A&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Oscillator:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XT, 4.0 MHz&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;// LCD module connections&lt;br /&gt;sbit LCD_RS at RA0_bit;&lt;br /&gt;sbit LCD_EN at RA1_bit;&lt;br /&gt;sbit LCD_D4 at RB4_bit;&lt;br /&gt;sbit LCD_D5 at RB5_bit;&lt;br /&gt;sbit LCD_D6 at RB6_bit;&lt;br /&gt;sbit LCD_D7 at RB7_bit;&lt;br /&gt;sbit LCD_RS_Direction at TRISA0_bit;&lt;br /&gt;sbit LCD_EN_Direction at TRISA1_bit;&lt;br /&gt;sbit LCD_D4_Direction at TRISB4_bit;&lt;br /&gt;sbit LCD_D5_Direction at TRISB5_bit;&lt;br /&gt;sbit LCD_D6_Direction at TRISB6_bit;&lt;br /&gt;sbit LCD_D7_Direction at TRISB7_bit;&lt;br /&gt;// End LCD module connections&lt;br /&gt;// Define Messages&lt;br /&gt;char message1[] = "1.READ";&lt;br /&gt;char message2[] = "2.WRITE";&lt;br /&gt;char message3[] = "3.Delete";&lt;br /&gt;char message4[] = "WRITE COMPLETED";&lt;br /&gt;char message5[] = "Read Data";&lt;br /&gt;char message6[] = "Data Deleted";&lt;br /&gt;&lt;br /&gt;char digits[] = "0000000000";&lt;br /&gt;unsigned short&amp;nbsp; i, NUM ;&lt;br /&gt;unsigned int ADD = 0x00, temp; // Start EEPROM Location&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void main() {&lt;br /&gt;CMCON&amp;nbsp; |= 7;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable Comparators&lt;br /&gt;TRISB = 0x0F;&lt;br /&gt;PORTB = 0x00;&lt;br /&gt;Lcd_Init();&lt;br /&gt;start:&lt;br /&gt;Lcd_Cmd(_LCD_CLEAR);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clear display&lt;br /&gt;Lcd_Cmd(_LCD_CURSOR_OFF);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Cursor off&lt;br /&gt;Lcd_Out(1,1,message1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write message1 in 1st row&lt;br /&gt;Lcd_Out(1,8,message2);&lt;br /&gt;Lcd_Out(2,1,message3);&lt;br /&gt;do {&lt;br /&gt;// Read Operation&lt;br /&gt;if (Button(&amp;amp;PORTB, 0, 1, 0)) {&amp;nbsp; // Detect logical one to zero&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_ms(300);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lcd_Cmd(_LCD_CLEAR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lcd_Out(1,1,message5);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;=9; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = ADD+i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NUM = EEPROM_Read(temp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; digits[i] = NUM+48;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lcd_Out(2,1,digits);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay_ms(3000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto start;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;// Write Operation&lt;br /&gt;if (Button(&amp;amp;PORTB, 1, 1, 0)) {&amp;nbsp; // Detect logical one to zero&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_ms(300);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = ADD + i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_Write(temp,i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lcd_Cmd(_LCD_CLEAR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lcd_Out(1,1,message4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay_ms(2000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto start;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;// Delete Operation&lt;br /&gt;if (Button(&amp;amp;PORTB, 2, 1, 0)) {&amp;nbsp; // Detect logical one to zero&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_ms(300);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lcd_Cmd(_LCD_CLEAR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lcd_Out(1,1,message6);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;=9; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = ADD+i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_Write(temp, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay_ms(2000) ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto start;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;} while(1);&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Experimental Output Video:&lt;/b&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/XnV-u8ExBFE&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/XnV-u8ExBFE&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-8316232653662598864?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/8316232653662598864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/10/experiment-no-6-readwrite-internal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/8316232653662598864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/8316232653662598864'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/10/experiment-no-6-readwrite-internal.html' title='Experiment No. 6: Read/Write Internal EEPROM Memory'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-40kgOY3UpHs/TgTVHcDFR0I/AAAAAAAAAeo/iEMwc50EKzs/s72-c/Screen+shot+2011-06-24+at+2.18.32+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-8859229482439285643</id><published>2009-10-10T16:09:00.000-07:00</published><updated>2011-06-24T11:17:36.852-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Multiplexed Seven Segment'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Experiments'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A'/><category scheme='http://www.blogger.com/atom/ns#' term='Seven Segment Display'/><title type='text'>Experiment No. 5: Multiplexed Seven Segment Displays</title><content type='html'>In this experiment, we are going to learn how to interface more than one 7-segment LED display to a PIC Port using multiplexing technique. We are going to interface a 4-digit common cathode seven segment display to our PIC board. The multiplexing circuit is already built up in the board using 4 transistors and few resistors (Read &lt;a href="http://pic16f628a.blogspot.com/2009/09/pic16f628a-development-board-part-1.html"&gt;Make Your Own PIC Development Board&lt;/a&gt;). The basic idea of multiplexing is that all seven segment displays are connected to the microcontroller in parallel and the microcontroller alternately prints ones, tens, hundreds, and thousands digits, selecting one at a time. The switching among the digits is so fast that it gives an impression of simultaneous light emission.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Experimental Setup:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Connect RA0 through RA3 to 7-Segment Digit Select headers DG1, DG2, DG3, and DG4 using jumper wires.&lt;br /&gt;2. Insert &lt;span style="color: black; font-family: Arial; font-size: x-small;"&gt;&lt;a href="http://www.futurlec.com/LEDDisp.shtml"&gt;7FR5641AS&lt;/a&gt;&lt;/span&gt; 4-Digit Seven Segment module in to its place on the board.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/StEPeNJAXfI/AAAAAAAAAJo/e10pSfyTFnA/s1600-h/EXP5_a.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_92HIn_KJDYY/StEPeNJAXfI/AAAAAAAAAJo/e10pSfyTFnA/s400/EXP5_a.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/StEPfF_WfoI/AAAAAAAAAJw/3KNMESLQ1B8/s1600-h/EXP5_b.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_92HIn_KJDYY/StEPfF_WfoI/AAAAAAAAAJw/3KNMESLQ1B8/s400/EXP5_b.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Software:&lt;/b&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;* Project name:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4-Digit UP Counter with Four 7-Segment Display Multiplexing&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;* Copyright:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (c) Rajendra Bhatt, 2009.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;* Description:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This code is an example of multiplexing 4 Seven Segment Displays.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;* Test configuration:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MCU:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC16F628A&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The common cathode of four seven segment dispalys are&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; connected to RA0, RA1, RA2 and RA3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;//-------------- Function to Return mask for common cathode 7-seg. display&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;unsigned short mask(unsigned short num) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; switch (num) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0 : return 0x3F;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 1 : return 0x06;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 2 : return 0x5B;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 3 : return 0x4F;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 4 : return 0x66;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 5 : return 0x6D;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 6 : return 0x7D;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 7 : return 0x07;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 8 : return 0x7F;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 9 : return 0x6F;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; } //case end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;unsigned short i, DD0, DD1, DD2, DD3, NUM&amp;nbsp; ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;void main() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; CMCON&amp;nbsp; |= 7;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable Comparators&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; TRISB = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Set PORTB direction to be output&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; PORTB = 0xff;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Turn OFF LEDs on PORTB&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; TRISA0_bit = 0;&amp;nbsp; // RA.0 to RA3 Output&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; TRISA1_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; TRISA2_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; TRISA3_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; TRISA4_bit = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // RA.4 is Input only&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; NUM&amp;nbsp;&amp;nbsp; =&amp;nbsp;&amp;nbsp;&amp;nbsp; 0;&amp;nbsp; // Initial Value of Counter&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; do {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; DD0 = NUM%10;&lt;/span&gt;&amp;nbsp; // &lt;span style="color: #073763;"&gt;Extract Ones Digit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; DD0 = mask(DD0);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; DD1 = (NUM/10)%10;&lt;/span&gt;  // &lt;span style="color: #073763;"&gt;Extract Tens Digit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; DD1 = mask(DD1);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; DD2 = (NUM/100)%10;&lt;/span&gt;  &lt;span style="color: #073763;"&gt;// Extract Hundreds Digit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; DD2 = mask(DD2);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; DD3 = (NUM/1000);&amp;nbsp; &lt;/span&gt; &lt;span style="color: #073763;"&gt;// Extract Thousands Digit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; DD3 = mask(DD3);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; for (i = 0; i&amp;lt;=50; i++) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB = DD0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA0_bit = 1;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Select Ones Digit&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA1_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA2_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA3_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay_ms(5);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB = DD1;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA0_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA1_bit = 1;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;span style="color: #073763;"&gt;Select Tens Digit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA2_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA3_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay_ms(5);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB = DD2;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA0_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA1_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA2_bit = 1;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;span style="color: #073763;"&gt;Select Hundreds Digit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA3_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay_ms(5);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB&amp;nbsp;&amp;nbsp; = DD3;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA0_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA1_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA2_bit = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RA3_bit = 1;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;span style="color: #073763;"&gt;Select Thousands Digit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay_ms(5);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NUM = NUM + 1 ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; } while(1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // endless loop&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;div style="color: #073763;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Experimental Output Video:&lt;/b&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/HTqpzHSDQ_o&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/HTqpzHSDQ_o&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";google_ad_host = "pub-1556223355139109";/* 336x280, BlueTemp, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-8859229482439285643?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/8859229482439285643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/10/experiment-no-5-multiplexed-seven.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/8859229482439285643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/8859229482439285643'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/10/experiment-no-5-multiplexed-seven.html' title='Experiment No. 5: Multiplexed Seven Segment Displays'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_92HIn_KJDYY/StEPeNJAXfI/AAAAAAAAAJo/e10pSfyTFnA/s72-c/EXP5_a.JPG' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-8763909008754576227</id><published>2009-09-30T19:09:00.000-07:00</published><updated>2011-06-24T11:16:32.403-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DS1820'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Experiments'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Development Board'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A'/><category scheme='http://www.blogger.com/atom/ns#' term='Temperature Meter'/><title type='text'>Experiment No. 4 : Reading Temperature Values from DS1820 using 1-Wire Protocol</title><content type='html'>In this experiment, we are going to build a digital temperature meter using DS1820 connected to our PIC16F628A development board. The temperature value will be displayed on the LCD display. I have modified the sample program that comes with the compiler according to our PIC board requirements. Also I have elaborated comments in the program so that every step will be more clear to the readers.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Experimental Setup:&lt;/b&gt;&lt;br /&gt;The experimental setup is very straight-forward. Place DS1820 device on the three-pin female header that we recently added to our board. And also connect the data pin of DS1820 to RB.0 pin of PIC16F628A using a jumper wire.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/SsQO-HkZpZI/AAAAAAAAAJA/uznV5xtAWpI/s1600-h/setup.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_92HIn_KJDYY/SsQO-HkZpZI/AAAAAAAAAJA/uznV5xtAWpI/s400/setup.jpg" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TJjeKcXHDaI/AAAAAAAAAZA/LrhTn2Da0kM/s1600/Picture+5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="313" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TJjeKcXHDaI/AAAAAAAAAZA/LrhTn2Da0kM/s400/Picture+5.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;i&gt;Circuit Diagram&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;b&gt;Software:&lt;/b&gt;&lt;br /&gt;Here is the program written in microC that reads temperature values from DS1820 device using OneWire Library.&lt;br /&gt;&lt;span style="color: #073763;"&gt;/* Project name:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; One Wire Communication Test between PIC16F628A and DS1820&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;* Copyright:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (c) Rajendra Bhatt, 2009.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;* Description:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This code demonstrates how to use One Wire Communication Protocol&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; between PIC16F628A and a 1-wire peripheral device. The peripheral&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; device used here is DS1820, digital temperature sensor.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MCU:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC16F628A&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Oscillator:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XT, 4.0 MHz&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;// LCD connections definitions&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;sbit LCD_RS at RA0_bit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;sbit LCD_EN at RA1_bit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;sbit LCD_D4 at RB4_bit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;sbit LCD_D5 at RB5_bit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;sbit LCD_D6 at RB6_bit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;sbit LCD_D7 at RB7_bit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;sbit LCD_RS_Direction at TRISA0_bit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;sbit LCD_EN_Direction at TRISA1_bit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;sbit LCD_D4_Direction at TRISB4_bit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;sbit LCD_D5_Direction at TRISB5_bit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;sbit LCD_D6_Direction at TRISB6_bit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;sbit LCD_D7_Direction at TRISB7_bit;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;// End LCD connections definitions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;// String array to store temperature value to display&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;char *temp = "000.00";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;// Temperature Resolution : No. of bits in temp value = 9&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;const unsigned short TEMP_RES = 9;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;// Variable to store temperature register value&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;unsigned temp_value;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;void Display_Temperature(unsigned int temp2write) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; const unsigned short RES_SHIFT = TEMP_RES - 8;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; // Variable to store Integer value of temperature&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; char temp_whole;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; // Variable to store Fraction value of temperature&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; unsigned int temp_fraction;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; unsigned short isNegative = 0x00;&lt;/span&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;span style="color: #073763;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; // check if temperature is negative&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; if (temp2write &amp;amp; 0x8000) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp[0] = '-';&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Negative temp values are stored in 2's complement form&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp2write = ~temp2write + 1;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; isNegative = 1; &amp;nbsp; // Temp is -ive &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; // Get temp_whole by dividing by 2 (DS1820 9-bit resolution with&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; // 0.5 Centigrade step )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; temp_whole = temp2write &amp;gt;&amp;gt; RES_SHIFT ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; // convert temp_whole to characters&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;if (!isNegative) { &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; if (temp_whole/100)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp; // 48 is the decimal character code value for displaying 0 on LCD&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp[0] = temp_whole/100&amp;nbsp; + 48;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp[0] = '0';&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; } &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; temp[1] = (temp_whole/10)%10 + 48;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Extract tens digit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; temp[2] =&amp;nbsp; temp_whole%10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + 48;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Extract ones digit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; // extract temp_fraction and convert it to unsigned int&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; temp_fraction&amp;nbsp; = temp2write &amp;lt;&amp;lt; (4-RES_SHIFT);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; temp_fraction &amp;amp;= 0x000F;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; temp_fraction *= 625;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; // convert temp_fraction to characters&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; temp[4] =&amp;nbsp; temp_fraction/1000&amp;nbsp;&amp;nbsp;&amp;nbsp; + 48;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Extract tens digit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; temp[5] = (temp_fraction/100)%10 + 48;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Extract ones digit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; // print temperature on LCD&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; Lcd_Out(2, 5, temp);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;void main() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; CMCON&amp;nbsp; |= 7;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable Comparators&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; Lcd_Init();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Initialize LCD&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; Lcd_Cmd(_LCD_CLEAR);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clear LCD&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; Lcd_Cmd(_LCD_CURSOR_OFF);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Turn cursor off&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; Lcd_Out(1, 3, "Temperature:&amp;nbsp;&amp;nbsp; ");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; // Print degree character, 'C' for Centigrades&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; Lcd_Chr(2,11,223);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;// different LCD displays have different char code for degree&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;// if you see greek alpha letter try typing 178 instead of 223&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; Lcd_Chr(2,12,'C');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; //--- main loop&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp; do {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //--- perform temperature reading&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ow_Reset(&amp;amp;PORTB, 0);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Onewire reset signal&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ow_Write(&amp;amp;PORTB, 0, 0xCC);&amp;nbsp;&amp;nbsp; // Issue command SKIP_ROM&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ow_Write(&amp;amp;PORTB, 0, 0x44);&amp;nbsp;&amp;nbsp; // Issue command CONVERT_T&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_ms(600);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #073763;"&gt;// If this delay is less than 500ms, you will see the first reading on LCD&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //85C which is (if you remember from my article on DS1820)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //a power-on-reset value.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ow_Reset(&amp;amp;PORTB, 0);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ow_Write(&amp;amp;PORTB, 0, 0xCC);&amp;nbsp;&amp;nbsp;&amp;nbsp; // Issue command SKIP_ROM&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ow_Write(&amp;amp;PORTB, 0, 0xBE);&amp;nbsp;&amp;nbsp;&amp;nbsp; // Issue command READ_SCRATCHPAD&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Read Byte 0 from Scratchpad&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp_value =&amp;nbsp; Ow_Read(&amp;amp;PORTB, 0);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Then read Byte 1 from Scratchpad and shift 8 bit left and add the Byte 0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp_value = (Ow_Read(&amp;amp;PORTB, 0) &amp;lt;&amp;lt; 8) + temp_value;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //--- Format and display result on Lcd&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Display_Temperature(temp_value);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } while (1);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #073763;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Experimental Output:&lt;/b&gt;&lt;br /&gt;The temperature reading will be displayed on the LCD screen and will be updated every 600ms. Look at some snapshots below showing output.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/SsQPE5pSzjI/AAAAAAAAAJI/DY0MdeVl1-o/s1600-h/temp1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_92HIn_KJDYY/SsQPE5pSzjI/AAAAAAAAAJI/DY0MdeVl1-o/s400/temp1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/SsQPGUPbjzI/AAAAAAAAAJQ/mTAsKP1kSOc/s1600-h/temp2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_92HIn_KJDYY/SsQPGUPbjzI/AAAAAAAAAJQ/mTAsKP1kSOc/s400/temp2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/SsQPHlcs4gI/AAAAAAAAAJY/Vf6ySOAVP6k/s1600-h/temp3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/SsQPHlcs4gI/AAAAAAAAAJY/Vf6ySOAVP6k/s400/temp3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-8763909008754576227?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/8763909008754576227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/experiment-no-4-reading-temperature.html#comment-form' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/8763909008754576227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/8763909008754576227'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/experiment-no-4-reading-temperature.html' title='Experiment No. 4 : Reading Temperature Values from DS1820 using 1-Wire Protocol'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_92HIn_KJDYY/SsQO-HkZpZI/AAAAAAAAAJA/uznV5xtAWpI/s72-c/setup.jpg' height='72' width='72'/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-1811386675361902743</id><published>2009-09-29T12:25:00.000-07:00</published><updated>2011-10-14T10:10:57.745-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='1-Wire Protocol'/><title type='text'>DS18S20 : 1-Wire Digital Thermometer and mikroC OneWire Library</title><content type='html'>&lt;b&gt;Introduction &lt;/b&gt;&lt;br /&gt;The DS18S20 is a 1-Wire digital thermometer device from MAXIM that provides 9-bit Celsius temperature measurements and communicates over a 1-Wire bus with a central microprocessor. It also has in-built alarm function with nonvolatile user-programmable upper and lower trigger points. The operating temperature range of the device is  –55°C to +125°C with an accuracy of ±0.5°C over the range of –10°C to +85°C. Each DS18S20 has a unique 64-bit serial code, which allows multiple DS18S20s to function on the same 1-Wire bus. Thus, it is simple to use one microprocessor to control many DS18S20s distributed over a large area.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/SsJe70xFX3I/AAAAAAAAAI4/zdEU26yu1mE/s1600-h/Picture+5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/SsJe70xFX3I/AAAAAAAAAI4/zdEU26yu1mE/s400/Picture+5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Device Overview&lt;/b&gt;&lt;br /&gt;The figure below shows a block diagram of the DS18S20. The 64-bit ROM stores the device’s unique serial code. The scratchpad memory contains the 2-byte temperature register that stores the digital output from the temperature sensor. In addition, the scratchpad provides access to the 1-byte upper and lower alarm trigger registers (TH and TL). The TH and TL registers are nonvolatile (EEPROM), so they will retain data when the device is powered down. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/SsJdOiQ2qnI/AAAAAAAAAIg/V8GYAWG-i4g/s1600-h/Picture+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/SsJdOiQ2qnI/AAAAAAAAAIg/V8GYAWG-i4g/s400/Picture+3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Operation&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_468x60, created 9/9/09 */google_ad_slot = "8960243995";google_ad_width = 468;google_ad_height = 60;//--&gt;&lt;/script&gt;&lt;/div&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The core functionality of the DS18S20 is its direct-to-digital temperature sensor. The temperature sensor output has 9-bit resolution, which corresponds to 0.5°C steps. The output data is calibrated in degrees centigrade and is stored as a 16-bit sign-extended two’s complement number in the temperature register. The power-on-reset value of the temperature register is +85°C. The sign bits (S) indicate if the temperature is positive or negative: for positive numbers S = 0 and for negative numbers S = 1. A table below shows some examples of digital output data and corresponding temperature reading.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/SsJdapnMkSI/AAAAAAAAAIo/-zBoNZq_Bgs/s1600-h/Picture+4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_92HIn_KJDYY/SsJdapnMkSI/AAAAAAAAAIo/-zBoNZq_Bgs/s400/Picture+4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;Step-by-Step Operation Sequence&lt;/i&gt;&lt;br /&gt;Now we will discuss one of the simplest ways for accessing the DS18S20. We assume that there is only one such device on bus, and say the bus is connected to RB.0 pin of a PIC16F628A. We will also discuss the built-in OneWire library functions available in mikroC for PIC 2009. &lt;br /&gt;&lt;br /&gt;1) All transactions on the wire bus should begin with an initialization sequence. The bus master (microcontroller) should transmit a reset pulse first, and in its response, the DS18S20 will send the presence pulse indicating that it is on the bus and ready to operate. During the initialization sequence the bus master transmits (TX) the reset pulse by pulling the 1-Wire bus low for a minimum of 480μs. The bus master then releases the bus and goes into receive mode (RX). When the bus is released, the 4.7kΩ pullup resistor pulls the 1-Wire bus high. When the DS18S20 detects this rising edge, it waits 15μs to 60μs and then transmits a presence pulse by pulling the 1-Wire bus low for 60μs to 240μs. &lt;br /&gt;The mikroC function to reset the DS18S20 is &lt;b&gt;Ow_Reser(&amp;amp;PORTB, 0)&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;2) Since there is only one device on the bus, no need to search, read and match the 64-bit ROM address. Rather, the master device can skip the whole ROM sequence by sending SKIP ROM [CCh] command. If there were more than one device on the bus, the master can use SEARCH ROM [F0h], READ ROM [33h], and MATCH ROM [55h] commands to address one specific device on the same bus. The mikroC function to issue SKIP ROM command is &lt;b&gt;Ow_Write(&amp;amp;PORTB, 0, 0xCC)&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;3) Next use CONVERT T [44h] command to initiate a single temperature conversion. Following the conversion, the resulting thermal data is stored in the 2-byte temperature register in the scratchpad memory. The mikroC function to issue CONVERT T command is &lt;b&gt;Ow_Write(&amp;amp;PORTB, 0, 0x44)&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;4) Use READ SCRATCHPAD [BEh] command to read the contents of the scratchpad. The data transfer starts with the least significant bit of byte 0 and continues through the scratchpad until the 9th byte (byte 8 – CRC) is read. The master may issue a reset to terminate reading at any time if only part of the scratchpad data is needed. The mikroC function to issue READ SCRATCHPAD command is Ow_Write(&amp;amp;PORTB, 0, 0xBE). After that you can use &lt;b&gt;Ow_Read(&amp;amp;PORTB, 0)&lt;/b&gt; to read one byte of data via the one wire bus. In order to read both the bytes of temperature register, use Ow_Read command twice.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&amp;nbsp;&lt;b&gt;OneWire Library in mikroC for PIC&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/SsJeq0MRE7I/AAAAAAAAAIw/6ZA9uEJxnTI/s1600-h/Picture+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/SsJeq0MRE7I/AAAAAAAAAIw/6ZA9uEJxnTI/s400/Picture+2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;To explore more about DS18S20 device, read the &lt;a href="http://datasheets.maxim-ic.com/en/ds/DS18S20.pdf"&gt;datasheet&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-1811386675361902743?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/1811386675361902743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/ds18s20-1-wire-digital-thermometer-and.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/1811386675361902743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/1811386675361902743'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/ds18s20-1-wire-digital-thermometer-and.html' title='DS18S20 : 1-Wire Digital Thermometer and mikroC OneWire Library'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_92HIn_KJDYY/SsJe70xFX3I/AAAAAAAAAI4/zdEU26yu1mE/s72-c/Picture+5.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-3031474589421419147</id><published>2009-09-22T08:56:00.000-07:00</published><updated>2011-06-24T11:15:09.093-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DS1820'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='1-Wire Protocol'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Experiments'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Development Board'/><title type='text'>The 1-Wire Communication Protocol</title><content type='html'>The 1-Wire is a registered trademark of Dallas Semiconductor Corp (now Maxim) for a serial communication protocol using a single data line and a ground reference. A 1-Wire Master (a microcontroller) initiates and controls the communication with one or more 1-Wire Slave devices (usually sensors). Each 1-Wire slave device has a unique, factory-programmed , 64-bit identifier, which serves as device address on the 1-Wire bus. This globally unique address is composed of eight bytes divided into three main sections. Starting with the LSB, the first byte stores the 8-bit family codes that identify the device type. The next six bytes store a customizable 48-bit individual address. The last byte, the most significant byte (MSB), contains a cyclic redundancy check (CRC) with a value based on the data contained in the first seven bytes. This allows the master to determine if an address was read without error. With a 248 serial number pool, conflicting or duplicate node addresses on the net are never a problem.&lt;br /&gt;&lt;br /&gt;The 1-Wire protocol uses conventional CMOS/TTL logic levels (maximum 0.8V for logic “zero” and a minimum 2.2V for logic “one”) with operation specified over a supply voltage range of 2.8V to 6V. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;A Typical 1-Wire Communication Flow&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The first part of any communication involves the bus master issuing a reset, which synchronizes the entire bus. A slave device is then selected for subsequent communications. This can be done by selecting all slaves, selecting a specific slave (using the registration number of the device), or by discovering the next slave on the bus using a binary search algorithm. These commands are referred to collectively as network function or read-only-memory (ROM) commands. Once a specific device has been selected, all other devices drop out and ignore subsequent communications until the next reset is issued.&lt;br /&gt;Once a device is isolated for bus communication, the master can issue device-specific commands to it, send data to it, or read data from it. Because each device type performs different functions and serves a different purpose, each type has a unique protocol once it has been selected. Even though each device type may have different protocols and features, they all have the same selection process and follow the command flow seen in the figure below. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/SrjzS1-phtI/AAAAAAAAAHo/umeNT75evGI/s1600-h/155Fig01.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_92HIn_KJDYY/SrjzS1-phtI/AAAAAAAAAHo/umeNT75evGI/s400/155Fig01.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Browse these links for more information on the 1-Wire Protocol.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;i&gt;&lt;a href="http://www.maxim-ic.com/appnotes.cfm/an_pk/1796"&gt;Overview of 1-Wire Technology and its use (Maxim)&lt;/a&gt; &lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/1-Wire"&gt;1-Wire (Wikipedia)&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ww1.microchip.com/downloads/en/AppNotes/01199a.pdf"&gt;&lt;i&gt;1-Wire Communication with PIC Microcontroller&lt;/i&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;Example: DS1820 Digital Temperature Sensor&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I am going to show you how to connect a DS1820, a 1-Wire digital temperature sensor, to a PIC microcontroller.&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/SrmLBIdZ2sI/AAAAAAAAAIA/DwL0nv-ZsAI/s1600-h/ds1820.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/SrmLBIdZ2sI/AAAAAAAAAIA/DwL0nv-ZsAI/s400/ds1820.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/SrmLDtB3XUI/AAAAAAAAAII/7pyWd7lGqsM/s1600-h/DS1820+connections.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/SrmLDtB3XUI/AAAAAAAAAII/7pyWd7lGqsM/s400/DS1820+connections.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;We are now going to implement this circuit in our PIC16F628A development board. We will place a 3-pin female header to hold DS1820 and an additional single pin header for a jumper to connect the data pin to a PIC port. Here is the modified board after soldering the female header connections and a 4.7K resistor on the board.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/SrmMBEb_0_I/AAAAAAAAAIQ/F6tvj3gAMRA/s1600-h/one+wire+1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_92HIn_KJDYY/SrmMBEb_0_I/AAAAAAAAAIQ/F6tvj3gAMRA/s400/one+wire+1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;A more closer look:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/SrmMETTIfXI/AAAAAAAAAIY/FLbFDPS7b7U/s1600-h/one+wire+2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/SrmMETTIfXI/AAAAAAAAAIY/FLbFDPS7b7U/s400/one+wire+2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;We will discuss about the 1-Wire built in library of mikroC for PIC 2009 compiler in the next article. Our next experiment is going to be about reading the temperature values from a DS1820 sensor using the 1-Wire communication protocol. Till then, good bye.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-3031474589421419147?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/3031474589421419147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/1-wire-communication-protocol.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3031474589421419147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3031474589421419147'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/1-wire-communication-protocol.html' title='The 1-Wire Communication Protocol'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_92HIn_KJDYY/SrjzS1-phtI/AAAAAAAAAHo/umeNT75evGI/s72-c/155Fig01.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-6151156778874972365</id><published>2009-09-17T19:52:00.000-07:00</published><updated>2011-06-24T11:13:57.051-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LCD Interface'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Experiments'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A'/><title type='text'>Experiment No. 3: LCD Interface in 4-bit Mode</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;The objective of this experiment is to interface a 16x2 LCD to PIC16F628A in 4-bit mode. This means the data transfer will use only four pins of the microcontroller. There is no additional hardware setup needed for this experiment, as we have a ready-made LCD interface female header. We only need to define the data transfer and control pins in the software. Remember, the LCD interface in our development board uses the following pins of PIC16F628A:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b style="color: #b45f06;"&gt;Data Transfer : D4 -&amp;gt; RB4, D5 -&amp;gt; RB5, D6 -&amp;gt; RB6, D7 -&amp;gt; RB7&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b style="color: #b45f06;"&gt;RS -&amp;gt; RA0, and EN -&amp;gt; RA1&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/SrL11WV9kQI/AAAAAAAAAG0/ZpGRSkgE7_c/s1600/PIC16F628A+Exp3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="270" src="http://3.bp.blogspot.com/_92HIn_KJDYY/SrL11WV9kQI/AAAAAAAAAG0/ZpGRSkgE7_c/s320/PIC16F628A+Exp3.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Circuit Diagram:&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;For those who want to do this on a protoborad, here is the circuit:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt; &lt;/b&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TJjdyKPEeyI/AAAAAAAAAYw/3k-48od_icw/s1600/Picture+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TJjdyKPEeyI/AAAAAAAAAYw/3k-48od_icw/s400/Picture+3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Software:&lt;/b&gt;&lt;/div&gt;&amp;nbsp;&lt;span style="color: red;"&gt;&lt;b&gt;Note:&lt;/b&gt; Never forget to disable the comparator functions on &lt;/span&gt;&lt;i style="color: red;"&gt;PORTA.0, 1, 2, 3 &lt;/i&gt;&lt;span style="color: red;"&gt;pins if you are going to use those pins as digital I/O.&lt;/span&gt;&lt;br /&gt;&lt;div style="color: #0b5394;"&gt;/*&lt;br /&gt;&amp;nbsp;* Project name:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Test LCD in 4-bit mode&lt;br /&gt;&amp;nbsp;* Copyright:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (c) Rajendra Bhatt, 2009.&lt;br /&gt;&amp;nbsp;* Description:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This code demonstrates how to display test message on a LCD which&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; is connected to PIC16F628A through PORTB. D4-D7 pins of LCD are&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; connected to RB4-RB7, whereas RS and EN pins connected to RA0 and RA1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; respectively.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MCU:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC16F628A&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Oscillator:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XT, 4.0 MHz&lt;br /&gt;*/&lt;br /&gt;// LCD module connections&lt;br /&gt;sbit LCD_RS at RA0_bit;&lt;br /&gt;sbit LCD_EN at RA1_bit;&lt;br /&gt;sbit LCD_D4 at RB4_bit;&lt;br /&gt;sbit LCD_D5 at RB5_bit;&lt;br /&gt;sbit LCD_D6 at RB6_bit;&lt;br /&gt;sbit LCD_D7 at RB7_bit;&lt;br /&gt;sbit LCD_RS_Direction at TRISA0_bit;&lt;br /&gt;sbit LCD_EN_Direction at TRISA1_bit;&lt;br /&gt;sbit LCD_D4_Direction at TRISB4_bit;&lt;br /&gt;sbit LCD_D5_Direction at TRISB5_bit;&lt;br /&gt;sbit LCD_D6_Direction at TRISB6_bit;&lt;br /&gt;sbit LCD_D7_Direction at TRISB7_bit;&lt;br /&gt;// End LCD module connections&lt;br /&gt;// Define Messages&lt;br /&gt;&amp;nbsp;char message1[] = "Testing LCD";&lt;br /&gt;&amp;nbsp;char message2[] = "using PIC16F628A";&lt;br /&gt;&amp;nbsp;char message3[] = "Test Successful!";&lt;br /&gt;&amp;nbsp;char message4[] = "2009/09/18";&lt;br /&gt;void main() {&lt;br /&gt;&amp;nbsp; CMCON&amp;nbsp; |= 7;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable Comparators&lt;br /&gt;&amp;nbsp; Lcd_Init();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Initialize LCD&lt;br /&gt;&amp;nbsp; do {&lt;br /&gt;&amp;nbsp; Lcd_Cmd(_LCD_CLEAR);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clear display&lt;br /&gt;&amp;nbsp; Lcd_Cmd(_LCD_CURSOR_OFF);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Cursor off&lt;br /&gt;&amp;nbsp; Lcd_Out(1,1,message1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write message1 in 1st row&lt;br /&gt;&amp;nbsp; Lcd_Out(2,1,message2);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write message1 in 2nd row&lt;br /&gt;&amp;nbsp; Delay_ms(2000);&lt;br /&gt;&amp;nbsp; Lcd_Cmd(_LCD_CLEAR);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clear display&lt;br /&gt;&amp;nbsp; Lcd_Out(1,1,message3);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write message3 in 1st row&lt;br /&gt;&amp;nbsp; Lcd_Out(2,1,message4);&lt;br /&gt;&amp;nbsp; Delay_ms(2000);&lt;br /&gt;&amp;nbsp; } while(1);&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Experiment Output Video:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="330" width="415"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Y_EHh0iIIb4&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Y_EHh0iIIb4&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;If you don't see any message on the display, try adjusting the contrast level using Contrast Adjustment Potentiometer.&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-6151156778874972365?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/6151156778874972365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/experiment-no-3-lcd-interface-in-4-bit.html#comment-form' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/6151156778874972365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/6151156778874972365'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/experiment-no-3-lcd-interface-in-4-bit.html' title='Experiment No. 3: LCD Interface in 4-bit Mode'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_92HIn_KJDYY/SrL11WV9kQI/AAAAAAAAAG0/ZpGRSkgE7_c/s72-c/PIC16F628A+Exp3.jpg' height='72' width='72'/><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-7264907434929725271</id><published>2009-09-17T12:33:00.000-07:00</published><updated>2011-10-14T10:12:32.366-07:00</updated><title type='text'>About PIC16F628A</title><content type='html'>PIC16F628A is a powerful (200 nanosecond instruction execution) yet easy-to-program (only 35 single word instructions) CMOS FLASH-based 8-bit microcontroller from Microchip. It comes into an 18-pin package and is upwards compatible with the PIC16F628, PIC16C62XA, PIC16C5X and PIC12CXXX devices.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/SrKHfMgFeQI/AAAAAAAAAGc/DXB4Ip2CaRk/s1600-h/Picture+1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_92HIn_KJDYY/SrKHfMgFeQI/AAAAAAAAAGc/DXB4Ip2CaRk/s320/Picture+1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Features:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="color: #0b5394;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Operating speeds from DC - 20 MHz&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Interrupt capability&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;35 single word instructions&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Internal and external oscillator options&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Programmable weak pull-ups on PORTb&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;16 I/O pins with individual direction control&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Analog comparator module with:&lt;br /&gt;- Two analog comparators&lt;br /&gt;- Programmable on-chip voltage reference&lt;br /&gt;(VREF) module&lt;br /&gt;- Selectable internal or external reference&lt;br /&gt;- Comparator outputs are externally accessible&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Capture, Compare, PWM module&lt;br /&gt;- 16-bit Capture/Compare&lt;br /&gt;- 10-bit PWM&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;128 bytes of EEPROM data memory&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;2K flash program memory &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Addressable Universal Synchronous/Asynchronous&lt;br /&gt;Receiver/Transmitter USART/SCI&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;I/O Ports:&lt;/b&gt;&lt;br /&gt;The PIC16F627A/628A/648A have two ports, PORTA and PORTB. Some pins for these I/O ports are multiplexed with alternate functions for the peripheral features on the device.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;i&gt;PORTA Functions&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/SrKO3zfmenI/AAAAAAAAAGk/1trPnvet7M8/s1600-h/Picture+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_92HIn_KJDYY/SrKO3zfmenI/AAAAAAAAAGk/1trPnvet7M8/s320/Picture+2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;i&gt;PORTB Functions&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/SrKO9CqzX9I/AAAAAAAAAGs/m6keHnYhmSw/s1600-h/Picture+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_92HIn_KJDYY/SrKO9CqzX9I/AAAAAAAAAGs/m6keHnYhmSw/s320/Picture+3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&lt;i&gt;&lt;b&gt;Note: &lt;/b&gt;While using PORTA pins as Digital Input/Output, always remember to disable the comparator functions on PORTA.0, 1, 2, 3 pins. You can do that by programming the CMCON register = 0x07. &lt;/i&gt;&lt;/div&gt;&lt;br /&gt;For more detail about PIC16F628A, please read the &lt;a href="http://ww1.microchip.com/downloads/en/devicedoc/40044b.pdf"&gt;&lt;b&gt;datasheet&lt;/b&gt;&lt;/a&gt; from Microchip.&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-7264907434929725271?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/7264907434929725271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/about-pic16f628a.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/7264907434929725271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/7264907434929725271'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/about-pic16f628a.html' title='About PIC16F628A'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_92HIn_KJDYY/SrKHfMgFeQI/AAAAAAAAAGc/DXB4Ip2CaRk/s72-c/Picture+1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-2875887422488068401</id><published>2009-09-13T08:21:00.000-07:00</published><updated>2011-10-14T10:13:33.306-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Experiments'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Counter'/><category scheme='http://www.blogger.com/atom/ns#' term='Seven Segment Display'/><title type='text'>Experiment No. 2 : Push Button and Seven Segment Display Interface</title><content type='html'>In this experiment, we will program the PIC16F628A as an UP/DOWN Decade Counter. The count value will be displayed on a Seven-Segment Display and will be incremented/decremented by two push buttons on the board.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Experimental Setup: &lt;/b&gt;&lt;br /&gt;The board has built in interface for a multiplexed 4-digit seven segment display (HS-5461AS2 from &lt;a href="http://www.futurlec.com/"&gt;www.futurlec.com&lt;/a&gt;).We will select only one digit by connecting a Digit Select pin to Vcc, as shown in figure below. A black jumper wire is used for this purpose. The seven segments will be driven through PORTB (already wired on the board). Connect Push Buttons (PB3 and PB4) to RA1 and RA0 female headers using jumper wires.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/Sqxn28bjLNI/AAAAAAAAADQ/ZgaultClI-8/s1600-h/EXP_No_2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/Sqxn28bjLNI/AAAAAAAAADQ/ZgaultClI-8/s320/EXP_No_2.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Software:&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;We will use in-built 'Button Library' to detect push button press.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/Sq0N2YO4B5I/AAAAAAAAADY/fGgfqYcT9g0/s1600-h/button.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/Sq0N2YO4B5I/AAAAAAAAADY/fGgfqYcT9g0/s320/button.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Here is the complete C program written for mikroC for PIC 2009.&lt;br /&gt;&lt;div style="color: #0b5394;"&gt;/*&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;* Project name:&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UP/DOWN Decimal Counter with Push Button and 7-Segment Interface&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;* Copyright:&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (c) Rajendra Bhatt, 2009.&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;* Description:&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This code is an example of Seven Segment Display and Push Button interface.&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A decimal counter value will be displayed on the seven segment display.&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The value of the counter can be incremented or decremented through push&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buttons.&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;* Test configuration:&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MCU:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC16F628A&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The two push buttons are connected to RA0(Increment) and RA1(Decrement)&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; and the seven segment display connected to PORTB (Segment a to PB.0,&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Segment b to PB.1 and so on)&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;*/&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;//-------------- Function to Return mask for common cathode 7-seg. display&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;unsigned short mask(unsigned short num) {&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp; switch (num) {&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0 : return 0x3F;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 1 : return 0x06;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 2 : return 0x5B;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 3 : return 0x4F;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 4 : return 0x66;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 5 : return 0x6D;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 6 : return 0x7D;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 7 : return 0x07;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 8 : return 0x7F;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 9 : return 0x6F;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp; } //case end&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;}&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;unsigned int&amp;nbsp;&amp;nbsp; digit;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // To Hold Decimal Value&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;unsigned short number;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // To Hold Equivalent Seven Segment Value&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;void main() {&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp; CMCON&amp;nbsp; |= 7;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable Comparators&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp; TRISB = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Set PORTB direction to be output&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp; PORTB = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Turn OFF LEDs on PORTB&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp; TRISA0_bit = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // PA.0 Input for Increment&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp; TRISA1_bit = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // PA.1 Input for Decrement&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp; digit&amp;nbsp;&amp;nbsp; =&amp;nbsp;&amp;nbsp;&amp;nbsp; 0;&amp;nbsp; // Initial Value of Counter&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp; number&amp;nbsp; = mask(digit)&amp;nbsp;&amp;nbsp; ;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp; PORTB&amp;nbsp;&amp;nbsp; = number;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp; do {&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Button(&amp;amp;PORTA, 0, 1, 0)) {&amp;nbsp; // Detect logical one to zero&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_ms(300);&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; digit ++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Increase Counter&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; number&amp;nbsp; = mask(digit)&amp;nbsp;&amp;nbsp; ;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB&amp;nbsp;&amp;nbsp; = number;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Button(&amp;amp;PORTA, 1, 1, 0)) {&amp;nbsp; // Detect logical one to zero&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_ms(300) ;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; digit = digit-1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Decrease Counter&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; number&amp;nbsp; = mask(digit)&amp;nbsp;&amp;nbsp; ;&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB&amp;nbsp;&amp;nbsp; = number;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Update flag&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;&amp;nbsp; } while(1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // endless loop&lt;/div&gt;&lt;div style="color: #0b5394;"&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Experiment Output Video:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/T6LGvYgbEt4&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/T6LGvYgbEt4&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="334"&gt;&lt;/embed&gt;&lt;/object&gt; &lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-2875887422488068401?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/2875887422488068401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/experiment-no-2-push-button-and-seven.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/2875887422488068401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/2875887422488068401'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/experiment-no-2-push-button-and-seven.html' title='Experiment No. 2 : Push Button and Seven Segment Display Interface'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_92HIn_KJDYY/Sqxn28bjLNI/AAAAAAAAADQ/ZgaultClI-8/s72-c/EXP_No_2.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-3566032428688243343</id><published>2009-09-09T13:38:00.000-07:00</published><updated>2009-09-10T10:34:35.099-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC Tutorials'/><title type='text'>PIC microcontrollers: Nebojsa Matic (Free Online Book)</title><content type='html'>If you are a beginner to PIC microcontroller, I would recommend you to read this free e-book on PIC16F84 microcontroller. PIC16F84 is one of the most popular PIC family microcontrollers that resembles very much with PIC16F628A. &lt;br /&gt;In this book you will find:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Introduction to microcontrollers&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Learn what they are, how they work, and how they can be helpful in your work.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Practical connection samples for&amp;nbsp; Relays, Optocouplers, LCD's, Keys, Digits, A to D Converters, Serial communication etc.&lt;/li&gt;&lt;li&gt;How to write your first program, use of macros, addressing modes...&lt;/li&gt;&lt;li&gt;Instruction Set&lt;/li&gt;&lt;ul&gt;&lt;li&gt; Description, sample and purpose for using each instruction...&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;MPLAB program package&lt;/li&gt;&lt;ul&gt;&lt;li&gt; How to install it, how to start the first program, following the program step by step in the simulator...&lt;br /&gt;&lt;br /&gt;Ready to read now? &lt;a href="http://www.mikroe.com/en/books/picbook/picbook.htm"&gt;Click Here&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-3566032428688243343?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/3566032428688243343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/pic-microcontrollers-nebojsa-matic-free.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3566032428688243343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/3566032428688243343'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/pic-microcontrollers-nebojsa-matic-free.html' title='PIC microcontrollers: Nebojsa Matic (Free Online Book)'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-4211851323733983495</id><published>2009-09-09T11:11:00.001-07:00</published><updated>2011-06-24T11:11:49.313-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='4-Bit Counter'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Experiments'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Counter'/><title type='text'>Experiment No. 1 : 4-Bit Binary Counter</title><content type='html'>&lt;b&gt;Experimental Setup: &lt;/b&gt;&lt;br /&gt;The first experiment that we are going to do with our PIC16F628A board is a 4-bit binary counter that counts from 0(00h) to 15(0Fh) with 1sec delay between each count. The output will be at RB.0 through RB.3 and will be displayed on 4 LEDs. Use four jumper wires to connect RB.0 through RB.3 to LEDs. The picture below shows these connections.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/Sqfsi9mdkdI/AAAAAAAAACQ/p5NbL-ZCt2Y/s1600-h/EXP1_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_92HIn_KJDYY/Sqfsi9mdkdI/AAAAAAAAACQ/p5NbL-ZCt2Y/s320/EXP1_1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Figure 1. Jumper Connections for a 4-bit Binary Counter&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Software:&lt;/b&gt;&lt;br /&gt;Here is the C program written for mikroC for PIC 2009 compiler.&lt;br /&gt;&lt;div style="color: #0b5394; text-align: left;"&gt;/*&lt;br /&gt;&amp;nbsp;* Project name:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4-bit Counter&lt;br /&gt;&amp;nbsp;* Copyright:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (c) Rajendra Bhatt, 2009.&lt;br /&gt;&amp;nbsp;* Description:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This is a simple 4-bit counter. The output will be displayed on 4 LEDs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; connected to PORT RB.0-RB.3&lt;br /&gt;&amp;nbsp;* Test configuration:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MCU:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC16F628A&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dev.Board:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC16F628A Board&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Oscillator:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XT, 04.0000 MHz&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;void main() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; TRISB = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set direction to be output&lt;br /&gt;&amp;nbsp; PORTB = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Turn OFF LEDs on PORTB&lt;br /&gt;&amp;nbsp; do {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_ms(1000);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 1 second delay&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB ++ ;&lt;br /&gt;&amp;nbsp; } while(PORTB &amp;lt; 0x0F);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Till PORTB &amp;lt; 15&lt;br /&gt;}&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Experiment Output Video:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1QxyweZDupw&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/1QxyweZDupw&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="334"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-4211851323733983495?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/4211851323733983495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/experiment-no-1-4-bit-binary-counter_09.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/4211851323733983495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/4211851323733983495'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/experiment-no-1-4-bit-binary-counter_09.html' title='Experiment No. 1 : 4-Bit Binary Counter'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_92HIn_KJDYY/Sqfsi9mdkdI/AAAAAAAAACQ/p5NbL-ZCt2Y/s72-c/EXP1_1.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-5938694326565516439</id><published>2009-09-09T11:06:00.000-07:00</published><updated>2011-10-14T10:14:07.805-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Development Board'/><title type='text'>mikroC PRO for PIC 2009</title><content type='html'>mikroC PRO for PIC 2009 is a C compiler for PIC microcontrollers. We are going to use the demo version of this for our PIC board.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mikroe.com/en/compilers/mikroc/pro/pic/"&gt;Download Here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mikroe.com/pdf/mikroc_pic_pro/mikroc_pic_pro_manual_v100.pdf"&gt;mikroC PRO for PIC 2009 Manual &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Install the Compiler and read the manual before doing experiments.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;Read this from &lt;a href="http://www.elektor.com/news/new-mikroc-pro-for-pic-2009.929884.lynkx"&gt;Elektor Magazine&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;Belgrade-based MikroElektronika have recently launched a new C compiler for PIC® microcontrollers: mikroC PRO for PIC 2009. The IDE features project-based design and supports an impressive range of PIC microcontrollers. mikroC PRO for PIC 2009 offers a set of libraries which simplify the initialization and use of PIC MCU and its modules including libraries for ADC, CAN, CANSPI, Compact Flash, EEPROM, Ethernet, Flash Memory, Graphic LCD, I²C, Keypad, LCD, Manchester Code, MMC/SD Card, OneWire, Port Expander, PrintOut, PS/2, PWM, RS-485, Sound, SPI, Graphic LCD, UART, USB HID, Standard ANSI C, T6963C GLCD, Miscellaneous, SPI and more ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;MikroC PRO for PIC also has plenty of practical examples and a comprehensive set of documentation which allows a quick start in programming PIC devices. PIC hardware development tools that completely support mikroC PRO for PIC 2009 are also available. A fully functional demonstration version (hex output is limited to 2k of program words) is available on the mikroElektronika website.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";google_ad_host = "pub-1556223355139109";/* 336x280, BlueTemp, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-5938694326565516439?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/5938694326565516439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/mikroc-pro-for-pic-2009.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5938694326565516439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5938694326565516439'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/mikroc-pro-for-pic-2009.html' title='mikroC PRO for PIC 2009'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-5209450848150139846</id><published>2009-09-02T07:16:00.000-07:00</published><updated>2011-06-24T11:09:47.241-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC16F628A Development Board'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC Kit'/><title type='text'>PIC16F628A Development Board</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/Sp587m7HWcI/AAAAAAAAABQ/3ZCHoTrjhgE/s1600-h/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_92HIn_KJDYY/Sp587m7HWcI/AAAAAAAAABQ/3ZCHoTrjhgE/s320/1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The development board we are going to make for our experimental microcontroller PIC16F628A will look like this. Here are the features it is going to have:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Access to all I/O pins through female header pins&lt;/li&gt;&lt;li&gt;4 Push Buttons for Input&lt;/li&gt;&lt;li&gt;4 LEDs for Output&lt;/li&gt;&lt;li&gt;An LCD Interface Port&lt;/li&gt;&lt;li&gt;A 4-digit Seven-Segment Display Interface&lt;/li&gt;&lt;li&gt;LCD Backlight Switch and Contrast Adjustment&lt;/li&gt;&lt;li&gt;ICSP Programming (Very Important)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;Here is the outline of my design.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TMhFEfcz1II/AAAAAAAAAcY/yT5AGDh1gDE/s1600/Picture+1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="290" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TMhFEfcz1II/AAAAAAAAAcY/yT5AGDh1gDE/s400/Picture+1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;Things you need:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A protoboard : I used 116 x 96 mm protoboard from &lt;a href="http://www.futurlec.com/ProtoBoards.shtml"&gt;Futurlec&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;An 18 pin IC socket for PIC16F628A&lt;/li&gt;&lt;li&gt;A 4.0MHz Crystal&lt;/li&gt;&lt;li&gt;2 22pF capacitors&lt;/li&gt;&lt;li&gt;4 Push Buttons&lt;/li&gt;&lt;li&gt;4 BC547 transistors for multiplexing 4-digit Seven Segment Display&lt;/li&gt;&lt;li&gt;4 Red LEDs&lt;/li&gt;&lt;li&gt;1 Green LED for Power Supply indicator&lt;/li&gt;&lt;li&gt;1 10K Trimmer Potentiometer for LCD Contrast&lt;/li&gt;&lt;li&gt;5 10K resistors&lt;br /&gt;&lt;/li&gt;&lt;li&gt;12 220 Ohm resistors&lt;/li&gt;&lt;li&gt;4 4.7K resistors (Driving the base of Multiplexing Transistors) &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Connection Header pins Male and Female both as required&lt;/li&gt;&lt;li&gt;A 4-digit common cathode 7-Segment Display (I used &lt;span style="color: black; font-family: Arial; font-size: x-small;"&gt;&lt;a href="http://www.futurlec.com/LEDDisp.shtml"&gt;7FR5641AS&lt;/a&gt;&lt;/span&gt; from Futurlec)&lt;/li&gt;&lt;li&gt;A 2X16 LCD Display Module (Total 16-pins including LED back light) &lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;After you have all these stuff, lets work on the circuit connections. First mark the different areas with a pencil on your protoboard according to the various blocks shown in the outline figure above. We will work one by one.&lt;br /&gt;&lt;i&gt;1. PIC16F628A Power Supply and Crystal Connections&lt;/i&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/SqFfLHnTXvI/AAAAAAAAABg/Jl06gDzl4zU/s1600-h/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_92HIn_KJDYY/SqFfLHnTXvI/AAAAAAAAABg/Jl06gDzl4zU/s320/1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;You decide how you gonna supply +5V to the board. I am going to use 4 AAA Size NiCd rechargeable battery for power supply. Use 4.0MHz crystal with two 22pF capacitors. This is a standard circuit for PIC16F628A. Pin 4 should be held high, a low pulse on this pin will reset the PIC. I used a diode in series with 1K resistor to prevent the backward current flow when the programming voltage appears on Pin 4 during ICSP. Remember, Pin 4 of PIC16F628A is used as programming voltage input during ICSP.&lt;/div&gt;&lt;br /&gt;&lt;i&gt;2. ICSP Header&lt;/i&gt; &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/SqFfNBgpSQI/AAAAAAAAABw/DKdZKo-vgZk/s1600-h/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/SqFfNBgpSQI/AAAAAAAAABw/DKdZKo-vgZk/s400/3.png" /&gt;&lt;/a&gt;&lt;/div&gt;ICSP header pins may have different names. I am following what I have got in my PIC Programmer which I bought from mcumall (www.mcumall.com). Connect the ICSP header as shown above.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;3. Push Buttons&lt;/i&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/SqFfN85uQFI/AAAAAAAAAB4/d9gGkAuCsKI/s1600-h/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/SqFfN85uQFI/AAAAAAAAAB4/d9gGkAuCsKI/s400/4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The standard push button circuit uses a pull up resistor. At normal condition, the output is HIGH (+5V), and when the button is pushed, the output is LOW (GND). I have connected the push button output to female header pin so that I could connect it to any Port of the PIC using a jumper wire. There will be 4 push button circuits like this.&lt;/div&gt;&lt;br /&gt;&lt;i&gt;4. 4-Digit Seven Segment Display Interface&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/SqFnlGzICqI/AAAAAAAAACI/36ravloqgDQ/s1600-h/Picture+6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_92HIn_KJDYY/SqFnlGzICqI/AAAAAAAAACI/36ravloqgDQ/s320/Picture+6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;4-digit Seven Segment interface will be achieved using multiplexing circuit. I have not connected the Seven Segment Display to the board, rather the circuit is built on the board and the displayy will fit on the 12 pin female headers.&amp;nbsp; I used &lt;span style="color: black; font-family: Arial; font-size: x-small;"&gt;&lt;a href="http://www.futurlec.com/LEDDisp.shtml"&gt;7FR5641AS&lt;/a&gt;&lt;/span&gt; Seven Segment module from Futurlec. The series resistance connected with the seven segments are valued 220 Ohm, and the ones connected to the bases of transistors are 4.7K. Connect a, b, c, d, e, f, g points to PortB.0, B.1, B.2, ..., B.6. Transistors I used were BC547. Connect Aout, Bout, Cout, Dout to a female header pins so that you can later connect to the appropriate PIC port using jumper wires.&lt;/div&gt;&lt;br /&gt;&lt;i&gt;5. LED Connection&lt;/i&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/SqFfMHH1xoI/AAAAAAAAABo/q9PU5VDHZWo/s1600-h/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/SqFfMHH1xoI/AAAAAAAAABo/q9PU5VDHZWo/s400/2.png" /&gt;&lt;/a&gt;&lt;/div&gt;This is the simplest circuit. Again, the LED connections go to a female header so that it can be connected to the desired port of the PIC using a jumper wire.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;6. LCD Interface&lt;/i&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/SqFfOi08CvI/AAAAAAAAACA/BJ3ESMbfV6c/s1600-h/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_92HIn_KJDYY/SqFfOi08CvI/AAAAAAAAACA/BJ3ESMbfV6c/s320/5.png" /&gt;&lt;/a&gt;&lt;/div&gt;I used HD44780 compatible 2x16 LCD panel with backlight. It comes with 16 pin, to which I soldered &lt;br /&gt;16 pin male header. Now place a 16 pin female header on board and connect the pins as shown above. We will use LCD in 4-bit mode to save microcontroller pins. The pins 15 and 16 are Backlight LED pins. I used jumpers to make it ON/OFF.&lt;br /&gt;&lt;br /&gt;Here's the complete circuit diagram:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/TMhFNPhniuI/AAAAAAAAAcc/hGFHEjOEbLs/s1600/Picture+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_92HIn_KJDYY/TMhFNPhniuI/AAAAAAAAAcc/hGFHEjOEbLs/s400/Picture+2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/TH2CidE-nhI/AAAAAAAAATo/_WD1uiO2HFs/s1600/DevBoardwithLCD.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="322" src="http://3.bp.blogspot.com/_92HIn_KJDYY/TH2CidE-nhI/AAAAAAAAATo/_WD1uiO2HFs/s400/DevBoardwithLCD.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_92HIn_KJDYY/TH2Cmm-AdYI/AAAAAAAAATw/WW3d6iKm0JM/s1600/DevBoardwithLED.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="302" src="http://2.bp.blogspot.com/_92HIn_KJDYY/TH2Cmm-AdYI/AAAAAAAAATw/WW3d6iKm0JM/s400/DevBoardwithLED.JPG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PIC Programmer&lt;/b&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;I have got a PIC programmer from MCUMALL(www.mcumall.com) named&lt;span style="font-style: italic;"&gt; PRG-017 U&lt;/span&gt;&lt;span style="font-style: italic;"&gt;SB PIC programmer&lt;/span&gt;. This is a low cost USB based PIC programmer that can be used in Windows Vista platform too. It acquires power from the USB port itself, and works on laptop which has no RS232 serial port. This can program a wide variety of PIC devices. The complete list can be found on the website. The price for this item is $24.99 on their websites, and it comes with a link for software and a USB cable. It has ICSP programming capability but does not come with the cable. I made my own ICSP cable.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_92HIn_KJDYY/Sq0TFUP6s_I/AAAAAAAAADg/ibdOzOZ4CkE/s1600-h/mcu_programmer.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_92HIn_KJDYY/Sq0TFUP6s_I/AAAAAAAAADg/ibdOzOZ4CkE/s400/mcu_programmer.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="font-weight: bold;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-5209450848150139846?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/5209450848150139846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/pic16f628a-development-board-part-1.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5209450848150139846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/5209450848150139846'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/pic16f628a-development-board-part-1.html' title='PIC16F628A Development Board'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_92HIn_KJDYY/Sp587m7HWcI/AAAAAAAAABQ/3ZCHoTrjhgE/s72-c/1.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2265599632708789206.post-2062413022453634276</id><published>2009-09-02T06:07:00.000-07:00</published><updated>2011-06-24T11:08:49.514-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Why PIC?'/><title type='text'>Why use the PIC?</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_92HIn_KJDYY/Sp5tSgjtC7I/AAAAAAAAABA/Gtm0fZJ0vPE/s1600-h/Picture+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_92HIn_KJDYY/Sp5tSgjtC7I/AAAAAAAAABA/Gtm0fZJ0vPE/s320/Picture+3.png" /&gt;&lt;/a&gt;&amp;nbsp; &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_92HIn_KJDYY/Sp5tUu_2ORI/AAAAAAAAABI/49dC57rW02w/s1600-h/Picture+4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_92HIn_KJDYY/Sp5tUu_2ORI/AAAAAAAAABI/49dC57rW02w/s320/Picture+4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Source:&lt;/b&gt; &lt;i&gt;PICmicro MCU C : An introduction to programming the Microchip PIC in CCS C &lt;/i&gt;by Nigel Gardner&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;a name='more'&gt;&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;&lt;center&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3251335376149574";/* PIC16F628A_336x280, Sep10, 2010 */google_ad_slot = "6243703931";google_ad_width = 336;google_ad_height = 280;//--&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2265599632708789206-2062413022453634276?l=pic16f628a.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pic16f628a.blogspot.com/feeds/2062413022453634276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/welcome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/2062413022453634276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2265599632708789206/posts/default/2062413022453634276'/><link rel='alternate' type='text/html' href='http://pic16f628a.blogspot.com/2009/09/welcome.html' title='Why use the PIC?'/><author><name>Raj</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_92HIn_KJDYY/Srbdo5a5f7I/AAAAAAAAAHI/9q_AIiz1G4w/S220/raj+small2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_92HIn_KJDYY/Sp5tSgjtC7I/AAAAAAAAABA/Gtm0fZJ0vPE/s72-c/Picture+3.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
