|
Tài trợ cho PIC Vietnam |
PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip |
|
Ðiều Chỉnh | Xếp Bài |
|
13-09-2014, 07:58 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Aug 2013
Bài gửi: 4
: |
ai biết đo adc 2 kênh ko giúp mình với
Mình định đo adc 2 kênh nhưng khi viết code nếu setup kênh nào sau thì chỉ đo đc adc kênh đó thôi .ai giúp mình đây là code của mình
NHƯ CODE Ở DƯỚI THÌ CHỈ ĐO ĐC ADC CỦA KÊNH AN1 THÔI #include <16f877a.h> #device adc=10 #include <def_877a.h> #fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20M) #include <lcd_lib_4bit.c> unsigned int16 nghin, tram, chuc, donvi, adc; float value; #int_timer0 void interrupts_timer0() { TMR0IF = 0; } void hienthi(unsigned int16 giatri) { nghin=giatri/1000; tram=(giatri-nghin*1000)/100; chuc=(giatri-nghin*1000-tram*100)/10; donvi=giatri%10; lcd_putchar(nghin+48); lcd_putchar(tram+48); lcd_putchar(chuc+48); lcd_putchar(donvi+48); lcd_putchar(" "); } void doc_adc_0(void) { set_adc_channel(0); delay_us(10); value=read_adc(); adc=(value*2200)/1023; } void doc_adc_1(void) { lcd_putcmd(0xc0); set_adc_channel(1); delay_us(10); value=read_adc(); adc=(value*4500)/1023; } void main() { set_tris_a(0x01); set_tris_d(0x00); lcd_init(); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); set_timer0(6); enable_interrupts(int_timer0); setup_adc_ports(all_analog); setup_adc(adc_clock_internal); while(true) { doc_adc_0(); delay_ms(100); doc_adc_1(); lcd_putcmd(0x80); lcd_putchar(" adc: "); hienthi(adc); } } thank nha |
17-09-2014, 11:11 PM | #2 |
Làm quen với PIC
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
: |
Bạn chú ý chổ này . Sau khi đọc giá trị ADC kênh 0 xong thì nên lưu riêng giá trị ra một biến . VD ADC0_value . Sau đó mới set cho đọc kênh 1 . Cũng lưu riêng giá trị ra . VD ADC1_value . Sau đó mới xuất cả hai ra giá trị ra LCD .
Theo như code của bạn thì sau khi đọc giá trị ADC thì đều lưu vào cùng 1 biến nên giá trị kênh 0 sẽ bị thay thế bằng giá trị của kênh 1 được đọc liền sau đó . Hoặc bạn cũng có thể đọc giá trị kênh 0 xong và xuất ra LCD liền rồi sau đó mới tiếp tục đọc kênh 1 và xuất ta LCD . Code:
while(true) { doc_adc_0(); delay_ms(100); doc_adc_1(); lcd_putcmd(0x80); lcd_putchar(" adc: "); hienthi(adc); } } |
|
|