Senin, 27 Juni 2011

Termometer dengan PIC Microcontroller


Dalam tutorial terakhir kita belajar tentang teknik multiplexing yang digunakan dengan tujuh segmen menampilkan. Kami belajar bagaimana menghemat garis i / o dengan menggunakan visi ketekunan. Hanya satu digit menyala pada suatu waktu, tetapi pada mata manusia itu terlalu cepat untuk menangkap, jadi kami melihat semua empat digit menyala saat yang sama. Dalam tutorial ini kita akan membuat penggunaan praktis dari multiplexing menampilkan tujuh segmen.Kami akan menggunakan mereka untuk menunjukkan suhu kamar saat ini menggunakan sensor suhu LM35.
Sebelum membaca lebih lanjut pastikan Anda tahu konsep berikut

Skema untuk PIC Thermometer

Harap dicatat bahwa skema ini sedikit berbeda dari kita skematik sebelumnya pada multiplexing tujuh segmen layar . Layar pilih i / o pin yang RA0, RA1, RA2, RA3 pada skema yang. Tapi dalam skema ini garis tampilan RA1, RA2, RA3, RA4 ini adalah karena RA0 digunakan sebagai saluran analog input untuk output LM35 itu.
PIC Thermometer

PIC Thermometer menggunakan LM35

Tujuh Segmen Multiplexing dengan PIC

Tujuh Segmen kabel multiplex

Kami menggunakan kami Dewan Pengembangan PIC untuk membuat proyek demo di atas. ParaDewan Pengembangan PIC memiliki semua sirkuit inti untuk mempertahankan MCU sedangkan bagian proyek tertentu dikembangkan pada expansion board .
PIC Pengembangan papan dengan tujuh segmen tampilan

Multiplex Tujuh Segmen Tampilan Setup

Tujuh Segmen Setup

Multiplex Tujuh Segmen Tampilan Setup

HI-TECH C Kode untuk Proyek Thermometer

LM35 Temperature Sensor INTERFACING TEST PROGRAM --------------------------------------------------------- Simple Program to connect with LM temperature sensor using the internal ADC of PIC MCU. The program displays the current environment temperature on LED Module. MCU: PIC18FXXXX Series from Microchip. Compiler: HI-TECH C Compiler for PIC18 MCUs (http://www.htsoft.com/) Copyrights 2008-2011 Avinash Gupta eXtreme Electronics, India For More Info visit http://www.eXtremeElectronics.co.in Mail: me@avinashgupta.com ********************************************************************/ #include <htc.h> #include <math.h> #include "types.h" #define _XTAL_FREQ 20000000ul //Chip Settings __CONFIG(1,0x0200); __CONFIG(2,0X1E1F); __CONFIG(3,0X8100); __CONFIG(4,0X0081); __CONFIG(5,0XC00F); //Configure i/o ports where display is connected //below is segment data port #define SEVENSEG_TRIS TRISD #define SEVENSEG_PORT PORTD //below is disp select data port #define SEVENSEG_CMN_TRIS TRISA #define SEVENSEG_CMN_PORT PORTA #define SEVENSEG_CMN_POS 1 //Simple Delay Routine void Wait(unsigned int delay) { for(;delay;delay--) __delay_us(100); } //Function to Initialise the ADC Module void ADCInit() { //We use default value for +/- Vref //VCFG0=0,VCFG1=0 //That means +Vref = Vdd (5v) and -Vref=GEN //Port Configuration //Only AN0 pin is analog //Other ANx pins are digital i/o PCFG3=1; PCFG2=1; PCFG1=1; PCFG0=0; /* ADCON2 *ADC Result Right Justified. *Acquisition Time = 2TAD *Conversion Clock = 32 Tosc */ ADCON2=0b10001010; } //Function to Read given ADC channel (0-12) unsigned int ADCRead(unsigned char ch) { if(ch>12) return 0; //Invalid Channel ADCON0=0x00; ADCON0=(ch<<2); //Select ADC Channel ADON=1; //switch on the adc module GODONE=1;//Start conversion while(GODONE); //wait for the conversion to finish ADON=0; //switch off adc return ADRES; } uint8_t digits[4]={0,0,0,0}; void SevenSegment(uint8_t num) { switch(num) { case 0: // .GFEDCBA SEVENSEG_PORT= 0B00111111; break; case 1: // .GFEDCBA SEVENSEG_PORT= 0B00000110; break; case 2: // .GFEDCBA SEVENSEG_PORT= 0B01011011; break; case 3: // .GFEDCBA SEVENSEG_PORT= 0B01001111; break; case 4: // .GFEDCBA SEVENSEG_PORT= 0B01100110; break; case 5: // .GFEDCBA SEVENSEG_PORT= 0B01101101; break; case 6: // .GFEDCBA SEVENSEG_PORT= 0B01111101; break; case 7: // .GFEDCBA SEVENSEG_PORT= 0B00000111; break; case 8: // .GFEDCBA SEVENSEG_PORT= 0B01111111; break; case 9: // .GFEDCBA SEVENSEG_PORT= 0B01101111; break; } } void SevenSegInit() { //Setup i/o ports SEVENSEG_TRIS=0X00; SEVENSEG_CMN_TRIS=~((0B00001111)<<SEVENSEG_CMN_POS); SEVENSEG_CMN_PORT=(0B00000001<<SEVENSEG_CMN_POS); //Setup Timer0 T0PS0=1; //Prescaler is divide by 256 T0PS1=1; T0PS2=1; PSA=0; //Timer Clock Source is from Prescaler T0CS=0; //Prescaler gets clock from FCPU (5MHz) T08BIT=1; //8 BIT MODE TMR0IE=1; //Enable TIMER0 Interrupt PEIE=1; //Enable Peripheral Interrupt GIE=1; //Enable INTs globally TMR0ON=1; //Now start the timer! } void SevenSegPrint(uint16_t num) { /* This function breaks apart a given integer into separete digits and writes them to the display array i.e. digits[] */ uint8_t i=0; uint8_t j; if(num>9999) return; while(num) { digits[i]=num%10; i++; num=num/10; } for(j=i;j<4;j++) digits[j]=0; } void SevenSegISR() { /* This interrup service routine (ISR) Updates the displays */ TMR0=150; static uint8_t i; if(i==3) { //If on last display then come //back to first. i=0; } else { //Goto Next display i++; } //Acivate a display according to i SEVENSEG_CMN_PORT=((SEVENSEG_CMN_PORT & (~(0x0F<<SEVENSEG_CMN_POS)))|(1<<(i+SEVENSEG_CMN_POS))); //Write the digit[i] in the ith display. SevenSegment(digits[i]); } //Main Interrupt Service Routine (ISR) void interrupt ISR() { //Check if it is TMR0 Overflow ISR if(TMR0IE && TMR0IF) { //Call the SevenSegISR SevenSegISR(); //Clear Flag TMR0IF=0; } } void main() { //Initialize the Seven Segment Subsystem SevenSegInit(); //Initialize the ADC Module ADCInit(); while(1) { unsigned int val; //ADC Value unsigned int t; //Temperature val=ADCRead(0); //Read Channel 0(pin2 on PIC18f4520, RA0) t=round(val*0.48876);//Convert to Degree Celcius //Print temperature to display SevenSegPrint(t); Wait(1000); } }

Untuk mengkompilasi kode di atas Anda akan memerlukan MPLAB IDE dan HI-TECH C untuk PIC18 . Keduanya tersedia gratis di website Microchip.
Jika Anda baru ke alat ini maka silahkan lihat tutorial berikut: -
  • PIC Proyek Hello Word (Silahkan membaca dengan seksama dan setup perangkat lunak persis seperti yang dijelaskan)

Burning File HEX untuk PIC MCU

Hex file berisi data untuk tiga segmen yang berbeda,
  • FLASH (Toko program)
  • EEPROM (Ini adalah memori non volatile yang dapat diakses (baca / tulis) oleh program Ini mempertahankan data bahkan ketika MCU matikan, Anda dapat menentukan konten EEPROMs awal dalam hex file.. Dalam proyek ini fitur ini tidak diperlukan agar hex file kami TIDAK mengandung isi EEPROM awal.
  • Byte CONFIG adalah lokasi khusus di dalam chip yang digunakan untuk mengkonfigurasi banyak aspek dari chip seperti sumber jam, cokelat keluar detektor, menonton timer, waktu startup. Lihat halaman 249 pada datasheet PIC18F4520 itu . Bagian ini yang paling penting untuk bekerja dengan baik program jadi pastikan bagian ini diprogram ketika Anda menulis chip. Jika Anda menggunakan kita USB PIC Programmer . Kemudian segera setelah Anda memuat file hex itu menunjukkan bagian-bagian yang ada pada file hex.
PIC Programmer HEX File Konten

HEX File Laporan

Seperti yang anda lihat itu menyatakan bahwa Flash Data (Program Anda), dan Data Konfigurasi yang hadir pada file hex, sementara data EEPROM tidak hadir. Ketika Anda siap untuk mentransfer data ke chip pilih "Write Semua" dari toolbar atau Pilih menu Write-> Semua. Hal ini memastikan bahwa memori Konfigurasi ini juga ditulis. Jika Anda hanya menulis bagian Flash (Dengan memilih Write-> Flash) program TIDAK AKAN BEKERJA.
Anda perlu mengambil langkah yang sama ketika menggunakan programmer lain seperti PICKIT3 dll
◄ Newer Post Older Post ►