May 2024 | Mon | Tue | Wed | Thu | Fri | Sat | Sun |
---|
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | Calendar |
|
Latest topics | » simviettel.net bán sim đẹp Viettel, số đẹp Vinaphone, sim số đẹp Mobifone 10 sốThu Nov 07, 2013 2:59 pm by simviettel.net » đo nhiệt độFri Nov 09, 2012 11:56 pm by trongthanh » Mạch cầu H kích FET dùng IR2110Tue Aug 07, 2012 7:26 pm by Ultra » HƯỚNG DẪN THIẾT KẾ FANLED CỦA CLBTue Jan 10, 2012 11:17 pm by dcthuan.cdt » Thông báo! Giải bóng đá CUP KSTN mùa giải 2011Mon Nov 07, 2011 8:52 pm by lethanhtoan » điểm danh xem ai đang làm gìThu Sep 22, 2011 12:18 pm by vanquy311 » về ngày hội việc làm và phỏng vấn thử thành công thậtThu Sep 22, 2011 12:07 pm by vanquy311 » cần trao đổiThu Sep 22, 2011 11:19 am by blue » cùng nhau hoàn thành tốt luận vănWed Sep 21, 2011 2:56 pm by biganaru |
| | ADC_XUẤT LCD | |
| | Tác giả | Thông điệp |
---|
Lee phó tổng giám đốc
Tổng số bài gửi : 106 Join date : 29/12/2009 Age : 34 Đến từ : Tây Ninh
| Tiêu đề: ADC_XUẤT LCD Tue Jun 01, 2010 4:55 pm | |
|
Được sửa bởi Lee ngày Tue Jun 01, 2010 6:49 pm; sửa lần 1. | |
| | | rockc4 trưởng phòng
Tổng số bài gửi : 35 Join date : 30/03/2010
| Tiê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 }
| |
| | | Lee phó tổng giám đốc
Tổng số bài gửi : 106 Join date : 29/12/2009 Age : 34 Đến từ : Tây Ninh
| Tiê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! | |
| | | rockc4 trưởng phòng
Tổng số bài gửi : 35 Join date : 30/03/2010
| Tiê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 | |
| | | 40903079 Khách viếng thăm
| Tiê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!!! |
| | | Lee phó tổng giám đốc
Tổng số bài gửi : 106 Join date : 29/12/2009 Age : 34 Đến từ : Tây Ninh
| Tiêu đề: Re: ADC_XUẤT LCD Sun Jan 02, 2011 2:15 pm | |
| | |
| | | 40903079 Khách viếng thăm
| Tiê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! |
| | | Lee phó tổng giám đốc
Tổng số bài gửi : 106 Join date : 29/12/2009 Age : 34 Đến từ : Tây Ninh
| Tiê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ì ? Để 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. | |
| | | 40903079 Khách viếng thăm
| Tiêu đề: Re: ADC_XUẤT LCD Sun Jan 02, 2011 11:58 pm | |
| |
| | | Sponsored content
| Tiêu đề: Re: ADC_XUẤT LCD | |
| |
| | | | ADC_XUẤT LCD | |
|
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
| |
| |
| |