PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   hỏi về đọc kết quả ADC hiển thị lên LCD (http://www.picvietnam.com/forum/showthread.php?t=10539)

maruko 09-08-2011 03:01 AM

hỏi về đọc kết quả ADC hiển thị lên LCD
 
1 Attachment(s)
em làm 1 ví dụ nhỏ về hỏi về đọc kết quả ADC hiển thị lên LCD nhưng nó cứ báo lỗi ở lệnh xuất dữ liệu ra LCD cụ thể là dòng lcd_putc_int(adc);
nhờ các bác suẳ giùm giúp em đoạn code này với :


#include <16f877A.h>
#device *=16, adc = 10
#use delay(clock = 20M)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT

#define LCD_ENABLE_PIN PIN_D3
#define LCD_RS_PIN PIN_D2
#define LCD_RW_PIN PIN_D6
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#include <lcd.c>
void main(){
int i;
int16 adc;

setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0); // Chon cong RA0 lam cong vao ADC
set_adc_channel(0);

lcd_init();
lcd_putc("STARTING");
for(i = 1; i < 10; i++){
lcd_putc('.');
delay_ms(100);
}
lcd_putc('\f');

while(1){
lcd_putc("\f");
adc = read_adc();
lcd_putc_int(adc);
//printf(" gia tri doc la : %u", adc );
delay_ms(200);
}
}

goldstar09 09-08-2011 02:14 PM

Chào bạn
Mình lâu rồi cũng không dùng CCS, mà cũng chẳng thạo về CCS lắm. Nhưng mình nghĩ trong chương trình của bạn có một số điểm nên sửa đổi một chút. Mình nghĩ do sự đơn giản của CCS, che dấu về phần cứng, nên có thể khiến người dùng ít quan tâm đến datasheet của chip. Dù là viết bằng trình dịch nào, thì bạn cũng nên làm theo các thủ tục như trong datasheet.
+Với thạch anh 20mhz, bạn nên chọn hàm: setup_adc(ADC_CLOCK_DIV_32),(==>Tad = 1.6us) thay vì chọn là: setup_adc(ADC_CLOCK_INTERNAL).

+Bạn chọn kênh RA0 làm kênh chuyển đổi ADC nhưng lại chưa thiết lập nó là input (nhưng có lẽ CCS đã làm hộ bạn việc này trong lệnh setup_adc_port rồi nhỉ?? thông cảm nếu nói sai).

+Sau lệnh set_adc_channel(0), bạn nên delay thời gian cỡ 10us, để chờ cho tụ điện trong mạch lấy mẫu nạp đầy đến điện áp vào của pin adc.

+Hàm khởi tạo lcd, bạn nên cho lên đầu chương trình chính.

+Bạn khai báo adc là biến chứa giá trị chuyển đổi ADC, nhưng lại dùng hàm gửi ký tự lcd_putc (mình nghĩ có thể là chỗ này). Bạn viết lcd_putc_int(adc) thì có lẽ trình dịch báo lỗi vì nó gọi sai tên hàm. Bạn cũng chưa sét vị trị hiển thị giá trị này ở đâu trên LCD.

+Mình nghĩ bạn thử bỏ hàm lcd_putc_int(adc), chỉ cần dùng hàm printf là được, bạn có thể tham khảo cách viết hàm này trong help của CCS.

+Bạn cũng chưa kiểm soát việc khi nào thì chuyển đổi ADC hoàn tất, và cập nhật giá trị. Điều này mình cũng thấy hay gặp khi người dùng viết bằng CCS.

Thân.

lionking 09-08-2011 06:15 PM

Trích:

Nguyên văn bởi maruko (Post 47947)
em làm 1 ví dụ nhỏ về hỏi về đọc kết quả ADC hiển thị lên LCD nhưng nó cứ báo lỗi ở lệnh xuất dữ liệu ra LCD cụ thể là dòng lcd_putc_int(adc);
nhờ các bác suẳ giùm giúp em đoạn code này với :


#include <16f877A.h>
#device *=16, adc = 10
#use delay(clock = 20M)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT

#define LCD_ENABLE_PIN PIN_D3
#define LCD_RS_PIN PIN_D2
#define LCD_RW_PIN PIN_D6
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#include <lcd.c>
void main(){
int i;
int16 adc;

setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0); // Chon cong RA0 lam cong vao ADC
set_adc_channel(0);

lcd_init();
lcd_putc("STARTING");
for(i = 1; i < 10; i++){
lcd_putc('.');
delay_ms(100);
}
lcd_putc('\f');

while(1){
lcd_putc("\f");
adc = read_adc();
lcd_putc_int(adc);
//printf(" gia tri doc la : %u", adc );
delay_ms(200);
}
}

thế này mới đúng:
while(1){
lcd_putc("\f");
adc = read_adc();

lcd_putc_int(adc/1000);
lcd_putc_int( (adc%1000)/100 );
lcd_putc_int( ((adc%1000)%100)/10 );
lcd_putc_int( ((adc%1000)%100)%10 );


//printf(" gia tri doc la : %u", adc );
delay_ms(200);
}

tdm 09-08-2011 10:14 PM

Trích:

Nguyên văn bởi maruko (Post 47947)
em làm 1 ví dụ nhỏ về hỏi về đọc kết quả ADC hiển thị lên LCD nhưng nó cứ báo lỗi ở lệnh xuất dữ liệu ra LCD cụ thể là dòng lcd_putc_int(adc);
nhờ các bác suẳ giùm giúp em đoạn code này với :


#include <16f877A.h>
#device *=16, adc = 10
#use delay(clock = 20M)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT

#define LCD_ENABLE_PIN PIN_D3
#define LCD_RS_PIN PIN_D2
#define LCD_RW_PIN PIN_D6
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#include <lcd.c>
void main(){
int i;
int16 adc;

setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0); // Chon cong RA0 lam cong vao ADC
set_adc_channel(0);

lcd_init();
lcd_putc("STARTING");
for(i = 1; i < 10; i++){
lcd_putc('.');
delay_ms(100);
}
lcd_putc('\f');

while(1){
lcd_putc("\f");
adc = read_adc();
lcd_putc_int(adc);
//printf(" gia tri doc la : %u", adc );
delay_ms(200);
}
}

nếu bạn dùng thư viện " lcd.c" của ccs c thì không có hàm lcd_putc_int(). do vây nó báo lỗi.
adc khai báo là 16 bit thì dùng %lu : printf(" gia tri doc la : %lu", adc );

maruko 10-08-2011 01:48 AM

1 Attachment(s)
bác tmd ơi. em dùng hàm printf(" gia tri doc la : %lu", adc ); như bác nói nhưng vẫn k dc
nhưng nếu em dùng hàm printf(lcd_putc,"\fGia tri adc:\n\%lu", adc); thì kết quả adc lại hiển thị dc bác ah.nhưng nó lại phát sinh ra mấy lỗi sau :
- kết quả hiển thị bị nhấp nháy . em nghĩ là do hàm delay 200 cuối cùng em để ít nhưng khi em tăng delay len 1000 thì nó cũng vẫn nhấp nháy,chỉ có điều thời gian nó nhấp nháy lâu hơn thôi, nhờ bác suẳ dùm giúp em
- khi em để giá trị biến trở (biến trở nối với chân RW) lớn hơn 50% thì nó k hiển thị đc( khi đang đọc kết quả ta ấn nút dừng lại và ta tăng giá trị biến trở lên quá 50%.ta cho chạy thì lại không thể đọc dc, nó chỉ có thể dọc dc kêt quả khi giá trị biến trở đó là dưới 50% thôi )

tiện thể các bác giải thích giúp em giá trị adc hiển thị lên dc tính như thế nào với
code của em sau khi sửa :
#include <16f877A.h>
#device *=16, adc = 10
#use delay(clock = 20M)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT

#define LCD_ENABLE_PIN PIN_D3
#define LCD_RS_PIN PIN_D2
#define LCD_RW_PIN PIN_D6
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#include <lcd.c>
void main(){
lcd_init();
int i;
int16 adc;

setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0); // Chon cong RA0 lam cong vao ADC
set_adc_channel(0);
delay_ms(10);


lcd_putc("STARTING");
for(i = 1; i < 10; i++){
lcd_putc('.');
delay_ms(100);
}
lcd_putc('\f');

while(1){
lcd_putc("\f");
adc = read_adc();
//lcd_putc_int(adc);

printf(lcd_putc,"\fGia tri adc:\n\%lu", adc);
delay_ms(200);

}
}


em có uo mạch mô phỏng lên phiền các bác suẳ giúp em với
em cảm on các bác

tdm 10-08-2011 02:09 PM

1 Attachment(s)
Trích:

Nguyên văn bởi maruko (Post 48021)
bác tmd ơi. em dùng hàm printf(" gia tri doc la : %lu", adc ); như bác nói nhưng vẫn k dc
nhưng nếu em dùng hàm printf(lcd_putc,"\fGia tri adc:\n\%lu", adc); thì kết quả adc lại hiển thị dc bác ah.nhưng nó lại phát sinh ra mấy lỗi sau :
- kết quả hiển thị bị nhấp nháy . em nghĩ là do hàm delay 200 cuối cùng em để ít nhưng khi em tăng delay len 1000 thì nó cũng vẫn nhấp nháy,chỉ có điều thời gian nó nhấp nháy lâu hơn thôi, nhờ bác suẳ dùm giúp em
- khi em để giá trị biến trở (biến trở nối với chân RW) lớn hơn 50% thì nó k hiển thị đc( khi đang đọc kết quả ta ấn nút dừng lại và ta tăng giá trị biến trở lên quá 50%.ta cho chạy thì lại không thể đọc dc, nó chỉ có thể dọc dc kêt quả khi giá trị biến trở đó là dưới 50% thôi )

tiện thể các bác giải thích giúp em giá trị adc hiển thị lên dc tính như thế nào với
code của em sau khi sửa :
#include <16f877A.h>
#device *=16, adc = 10
#use delay(clock = 20M)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT

#define LCD_ENABLE_PIN PIN_D3
#define LCD_RS_PIN PIN_D2
#define LCD_RW_PIN PIN_D6
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#include <lcd.c>
void main(){
lcd_init();
int i;
int16 adc;

setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0); // Chon cong RA0 lam cong vao ADC
set_adc_channel(0);
delay_ms(10);


lcd_putc("STARTING");
for(i = 1; i < 10; i++){
lcd_putc('.');
delay_ms(100);
}
lcd_putc('\f');

while(1){
lcd_putc("\f");
adc = read_adc();
//lcd_putc_int(adc);

printf(lcd_putc,"\fGia tri adc:\n\%lu", adc);
delay_ms(200);

}
}


em có uo mạch mô phỏng lên phiền các bác suẳ giúp em với
em cảm on các bác

thứ nhất bạn dịnh nghĩa chân LCD_RW_PIN PIN_D6 trùng với chân #define LCD_DATA6 PIN_D6.
phần cứng sai một vài chỗ.
hiện tượng nháy là do trong vòng lặp while bạn xóa lcd rồi lại cập nhập dữ liệu liên tục.
code và phần cứng sửa lại:
Code:

#include <16f877A.h>
#device *=16, adc = 10
#use delay(clock = 20M)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT

#define LCD_ENABLE_PIN  PIN_D3                                 
#define LCD_RS_PIN      PIN_D2                                 
#define LCD_RW_PIN      PIN_D1                               
#define LCD_DATA4      PIN_D4                                 
#define LCD_DATA5      PIN_D5                                 
#define LCD_DATA6      PIN_D6                             
#define LCD_DATA7      PIN_D7 

#include <lcd.c>
void main(){
  lcd_init();
  int i;
  int16 adc;
 
  setup_adc(ADC_CLOCK_INTERNAL);
  setup_adc_ports(AN0);        // Chon cong RA0 lam cong vao ADC
  set_adc_channel(0);
    delay_ms(10);
    lcd_putc('\f'); 
  lcd_putc("STARTING");
  for(i = 1; i < 10; i++){
      lcd_putc('.');
      delay_ms(100);
  }
      while(1){
      adc = read_adc();
      //lcd_putc_int(adc);
        lcd_gotoxy(1,2);    // cot 1 hang 2
        printf(lcd_putc,"Gia tri adc:%lu", adc);
      delay_ms(200);
  }
  }


maruko 10-08-2011 04:57 PM

bác tdm ơi .. sau khi hiển thị em muốn chỉ mình kết quả adc nhấp nháy thì làm thế nào vậy . em đang định làm mạch đo nhiệt độ hiển thị lcd .khi nhiêt độ k nằm trong ngưỡng cho phép thì nó sẽ cảnh báo bằng cách nhấp nháy giá trị adc

tiện thể bác giả thích cho em cách tính giá trị adc hiển thị với. (mình tính tay ấy)
em cảm ơn bác nhiều

tdm 10-08-2011 09:25 PM

Trích:

Nguyên văn bởi maruko (Post 48050)
bác tdm ơi .. sau khi hiển thị em muốn chỉ mình kết quả adc nhấp nháy thì làm thế nào vậy . em đang định làm mạch đo nhiệt độ hiển thị lcd .khi nhiêt độ k nằm trong ngưỡng cho phép thì nó sẽ cảnh báo bằng cách nhấp nháy giá trị adc

tiện thể bác giả thích cho em cách tính giá trị adc hiển thị với. (mình tính tay ấy)
em cảm ơn bác nhiều

tham khảo luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1858


Múi giờ GMT. Hiện tại là 09:46 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam