LỚP DD07KSTN

LỚP DD07KSTN


 
Trang ChínhCalendarTrợ giúpTìm kiếmThành viênNhómĐăng kýĐăng Nhập
December 2018
MonTueWedThuFriSatSun
     12
3456789
10111213141516
17181920212223
24252627282930
31      
CalendarCalendar
Latest topics
Keywords

Share | 
 

 ADC_XUẤT LCD

Go down 
Tác giảThông điệp
Lee
phó tổng giám đốc
phó tổng giám đốc
avatar

Tổng số bài gửi : 106
Join date : 29/12/2009
Age : 29
Đến từ : Tây Ninh

Bài gửiTiêu đề: ADC_XUẤT LCD   Tue Jun 01, 2010 4:55 pm

Chương trình đã chạy trên phần cứng.
Trích dẫn :
/****************************************************************
*
* PIC Training Course
*
****************************************************************/

/****************************************************************
*
* Module : main.c
* Description : ADC_LCD
* Tool : HI-TECH PIC
* Chip : 16F887A
* History : 19/05/2010
*
* Author : Mai Khac Hiep, CLB NCKH
* Notes :
*
*
****************************************************************/


/****************************************************************
* IMPORT
****************************************************************/

#include <htc.h>
#include "lcd.h"
#include "stdlib.h"
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. word

__CONFIG(BORV21); //2st config. word



/*****************************************************************
GLOBAL VARIABLE
******************************************************************/

unsigned char ngan=1,tram=1,chuc=1,dvi=1;

/*****************************************************************
* ROUTINES
******************************************************************/
void setup_ADC(void);
void setup_LCD(void);
void hienthi(void);
void setup_interrupt(void);
/*****************************************************************
******************************************************************/
void setup_ADC(void)
{ unsigned char i=0;
ANSEL=0xFF;// NGO VAO ANALOG
ADFM=1; // KET QUA LAP DAY BEN PHAI
VCFG1=0; // TAM TOAN THANG=5V
VCFG0=0;
ADCON0=0b00001111;// Fs=Fosc/2...CHON KENH AN3...BAT ADON
TRISA3=1;
ADRESH=0x00;
ADRESL=0x00;
for(;i<10;i++) __delay_ms(100);
}
void setup_LCD(void)
{lcd_init();
lcd_puts("Vin = ");
}
void setup_interrupt(void)
{ GIE=1;
ADIE=1;
ADIF=0;
PEIE=1;
}
void hienthi(void)
{ unsigned char i=0;
lcd_gotoxy(7,0);
lcd_putc(0x30+ngan);
lcd_putc('.');
lcd_putc(0x30+tram);
lcd_putc(0x30+chuc);
lcd_putc(0x30+dvi);
lcd_puts(" V");
for(;i<10;i++) __delay_ms(100);
}
void interrupt isr()
{ long von=0;
if(ADIE && ADIF && PEIE)
{
ADIF = 0;
von=ADRESH*256+ADRESL;
von=(5*von*1000/1024) ; // lay chinh xac 0.001
dvi= von%10;
von=(von-dvi)/10; //
chuc=von%10;
von=(von-chuc)/10;
tram=von%10;
von=(von-tram)/10;
ngan=von%10;
}
}

/****************************************************************
* MAIN
****************************************************************/

/* -- void main (void) -----------------------------------------
*
* Description : Doc dien ap tu chan RA3, xuat len LCD
*/

void main(void)
{ setup_LCD();
setup_interrupt();
setup_ADC();
while(1)
{ GODONE=1;
while(GODONE); //cho xu li xong moi xuat
hienthi();
}
}

/****************************************************************
* END OF standard form.c
****************************************************************


Được sửa bởi Lee ngày Tue Jun 01, 2010 6:49 pm; sửa lần 1.
Về Đầu Trang Go down
Xem lý lịch thành viên
rockc4
trưởng phòng
trưởng phòng


Tổng số bài gửi : 35
Join date : 30/03/2010

Bài gửiTiêu đề: Re: ADC_XUẤT LCD   Tue Jun 01, 2010 5:25 pm

Góp ý:
Các rountines viết trước main không cần khai báo như thế này:

Trích dẫn :

void setup_ADC(void);
void setup_LCD(void);
void hienthi(void);
void setup_interrupt(void);
---> chỉ cần khai báo nếu rontines được viết sau main().

Trích dẫn :

unsigned char ngan=1,tram=1,chuc=1,dvi=1;
Khi có cách khác thì không nên đặt biến toàn cục nhiều (tốn bộ nhớ)
ví dụ:

Trích dẫn :

void hienthi(char ngan, char chuc, char tram, char dvi)
{ unsigned char i=0;
lcd_gotoxy(7,0);
lcd_putc(0x30+ngan);
lcd_putc('.');
lcd_putc(0x30+tram);
lcd_putc(0x30+chuc);
lcd_putc(0x30+dvi);
lcd_puts(" V");
for(;i<10;i++) __delay_ms(100);
}

gọi hàm hiển_thị() trong chương trình ngắt luôn, trong main() không cần phải làm j cả.
Cách gọi sẽ như sau:
Trích dẫn :

hienthi(ngan, chuc, tram, dvi);

Theo cách Hiệp đang viết, tất nhiên trong chương trình ngắt phải khai báo các biến ngan, chuc, tram, dvi là biến kiểu char ở đoạn đầu chtrinh ngắt.

Cách viết khác có thể tốt hơn như sau:
trong chương trình ngắt chỉ tính toán tới von=(5*von*1000/1024) ; thôi,
đối số truyền cho hàm con hien_thi() là von, như sau
(von chọn kiểu unsinged int là được 16bit rồi)

- trong chương trình ngắt gọi hàm con
Trích dẫn :

hien_thi(von);
- chương trình con hien_thi() sửa lại như sau:
Trích dẫn :

void hien_thi(unsigned int von)
{
khai báo các biến chuc, tram, dvi ...
tính các giá trị đó từ von
hiển thị lên LCD từng kí tự 1
}
Về Đầu Trang Go down
Xem lý lịch thành viên
Lee
phó tổng giám đốc
phó tổng giám đốc
avatar

Tổng số bài gửi : 106
Join date : 29/12/2009
Age : 29
Đến từ : Tây Ninh

Bài gửiTiêu đề: Re: ADC_XUẤT LCD   Tue Jun 01, 2010 6:15 pm

1. Em đã thử để chương trình con hienthi() trong ngắt rồi, nhưng biên dịch báo lỗi tràn bộ nhớ, chắc có lẽ do vòng lặp hay sao ấy, nên để nó trong main.
2. Biến von trong chương trình con phải để kiểu long chị àh, tại phép toán von=von*5*1000 chắc chắn là sẽ tràn nếu von là unsigned int( vì kiểu unsigned int tầm từ 0-65535), gây sai kết quả! Nếu chia 1024 trước để tránh tràn số thì kết quả cũng sai luôn do đây là phép chia nguyên, nó tự động bỏ phần thập phân, do đó sẽ ko lấy được kết quả chính xác tới 0.001.
3. Phần chương trình con, lần sau em sẽ cố gắng tránh sử dụng biến toàn cục. Thanks!
Về Đầu Trang Go down
Xem lý lịch thành viên
rockc4
trưởng phòng
trưởng phòng


Tổng số bài gửi : 35
Join date : 30/03/2010

Bài gửiTiêu đề: Re: ADC_XUẤT LCD   Tue Jun 01, 2010 6:56 pm

Chị chỉnh lại 1 chút bài của Hiệp
(biến Von để kiểu long như Hiệp nói)
Trích dẫn :

/****************************************************************
*
* PIC Training Course
*
****************************************************************/

/****************************************************************
*
* Module : main.c
* Description : ADC_LCD
* Tool : HI-TECH PIC
* Chip : 16F887A
* History : 30/05/2010
*
* Author : Mai Khac Hiep, CLB NCKH
* Notes :
*
*
****************************************************************/


/****************************************************************
* IMPORT
****************************************************************/

#include <htc.h>
#include "lcd.h"
#include "stdlib.h"
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. word

__CONFIG(BORV21); //2st config. word



/*****************************************************************
GLOBAL VARIABLE
******************************************************************/

//unsigned char ngan=1,tram=1,chuc=1,dvi=1;

/*****************************************************************
* ROUTINES
******************************************************************/
/*void setup_ADC(void);
void setup_LCD(void);
void hienthi(void);
void setup_interrupt(void);*/
/*****************************************************************
******************************************************************/
void setup_ADC(void)
{ unsigned char i=0;
ANSEL=0xFF;// NGO VAO ANALOG
ADFM=1; // KET QUA LAP DAY BEN PHAI
VCFG1=0; // TAM TOAN THANG=5V
VCFG0=0;
ADCON0=0b00001111;// Fs=Fosc/2...CHON KENH AN3...BAT ADON
TRISA3=1;
ADRESH=0x00;
ADRESL=0x00;
for(;i<10;i++) __delay_ms(100);
}
void setup_LCD(void)
{lcd_init();
lcd_puts("Vin = ");
}
void setup_interrupt(void)
{ GIE=1;
ADIE=1;
ADIF=0;
PEIE=1;
}
void hienthi(long von)
{
unsigned char i=0, dvi, chuc, ngan, tram;

dvi= von%10;
von=(von-dvi)/10;
chuc=von%10;
von=(von-chuc)/10;
tram=von%10;
von=(von-tram)/10;
ngan=von%10;
lcd_gotoxy(7,0);
lcd_putc(0x30+ngan);
lcd_putc('.');
lcd_putc(0x30+tram);
lcd_putc(0x30+chuc);
lcd_putc(0x30+dvi);
lcd_puts(" V");

for(;i<10;i++) __delay_ms(100);
}

/* -- void interrupt isr() -----------------------------------------
*
* Description : Cho ngat ADC, hien thi ket qua len LCD, 3 chu so thap phan
*/
void interrupt isr()
{ long von=0;
if(ADIE && ADIF && PEIE)
{
ADIF = 0;
von=ADRESH*256+ADRESL;
von=(5*von*1000/1024) ; // lay chinh xac 0.001
hienthi(von);
}
}

/****************************************************************
* MAIN
****************************************************************/

/* -- void main (void) -----------------------------------------
*
* Description : Doc dien ap tu chan RA3, xuat len LCD
*/

void main(void)
{ setup_LCD();
setup_interrupt();
setup_ADC();
while(1)
{
__delay_us(50); //delay giua 2 lan doc ADC
GODONE=1; //bat dau doc
//while(GODONE); khong can thiet, cho ngat
}
}

/****************************************************************
* END OF standard form.c
****************************************************************/

Lệnh while(GODONE); là không cần thiết, vì em chờ ngắt ADC, lệnh này chỉ dùng khi polling xem đã đọc ADC xong chưa.
P/S: Viết cách của Hiệp cũng tốt, chị chỉ hướng dẫn thêm việc gọi 1 hàm con có chứa đối số thì phải làm thế nào cho các bạn chưa biết
Smile
Về Đầu Trang Go down
Xem lý lịch thành viên
40903079
Khách viếng thăm



Bài gửiTiêu đề: Re: ADC_XUẤT LCD   Sun Jan 02, 2011 1:47 pm

Các anh chị cho em hỏi, có thể dùng nhiều chân ADC trong con PIC16f887 được k ạh?
Cảm ơn các anh chị nhiều!!!
Về Đầu Trang Go down
Lee
phó tổng giám đốc
phó tổng giám đốc
avatar

Tổng số bài gửi : 106
Join date : 29/12/2009
Age : 29
Đến từ : Tây Ninh

Bài gửiTiêu đề: Re: ADC_XUẤT LCD   Sun Jan 02, 2011 2:15 pm

Pic 16F887 có đến 13 kênh ADC . Nhiêu đó đủ chưa em ! Smile Smile Smile
Về Đầu Trang Go down
Xem lý lịch thành viên
40903079
Khách viếng thăm



Bài gửiTiêu đề: Re: ADC_XUẤT LCD   Sun Jan 02, 2011 6:20 pm

Ý em muốn hỏi là dùng cùng lúc nhiều chân ấy!
Về Đầu Trang Go down
Lee
phó tổng giám đốc
phó tổng giám đốc
avatar

Tổng số bài gửi : 106
Join date : 29/12/2009
Age : 29
Đến từ : Tây Ninh

Bài gửiTiêu đề: Re: ADC_XUẤT LCD   Sun Jan 02, 2011 8:01 pm

À dĩ nhiên là được rồi, nếu ko dùng cùng lúc đc thì người ta làm ra 13 kênh đó để làm gì ? Very Happy Very Happy

Để config sử dụng dc thì chỉ cần config cho nó là chân analog bằng ANSEL và ANSELH, rồi trong code ADC thì mình config thanh ghi chọn kênh là xong.

Thân.
Về Đầu Trang Go down
Xem lý lịch thành viên
40903079
Khách viếng thăm



Bài gửiTiêu đề: Re: ADC_XUẤT LCD   Sun Jan 02, 2011 11:58 pm

Cảm ơn anh nhiều!
Về Đầu Trang Go down
Sponsored content




Bài gửiTiêu đề: Re: ADC_XUẤT LCD   

Về Đầu Trang Go down
 
ADC_XUẤT LCD
Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
LỚP DD07KSTN :: Câu lạc bộ nghiên cứu khoa học :: PIC 16-
Chuyển đến