PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 09-08-2011, 03:01 AM   #1
maruko
Đệ tử 1 túi
 
Tham gia ngày: Aug 2011
Bài gửi: 24
:
hỏi về đọc kết quả ADC hiển thị lên LCD

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);
}
}
File Kèm Theo
File Type: rar mach mo phong adc.rar (15.0 KB, 61 lần tải)
maruko vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-08-2011, 02:14 PM   #2
goldstar09
Đệ tử 1 túi
 
Tham gia ngày: Aug 2009
Bài gửi: 18
:
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.
goldstar09 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-08-2011, 06:15 PM   #3
lionking
Đệ tử 3 túi
 
lionking's Avatar
 
Tham gia ngày: May 2011
Bài gửi: 47
:
Trích:
Nguyên văn bởi maruko View Post
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);
}
lionking vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-08-2011, 10:14 PM   #4
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi maruko View Post
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 );
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.

thay đổi nội dung bởi: tdm, 09-08-2011 lúc 10:21 PM.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-08-2011, 01:48 AM   #5
maruko
Đệ tử 1 túi
 
Tham gia ngày: Aug 2011
Bài gửi: 24
:
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
File Kèm Theo
File Type: rar mach mo phong va code.rar (50.5 KB, 36 lần tải)
maruko vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-08-2011, 02:09 PM   #6
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi maruko View Post
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);
   }
  }
File Kèm Theo
File Type: zip mach mo phong va code.zip (26.9 KB, 59 lần tải)
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.

thay đổi nội dung bởi: tdm, 10-08-2011 lúc 02:35 PM.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-08-2011, 04:57 PM   #7
maruko
Đệ tử 1 túi
 
Tham gia ngày: Aug 2011
Bài gửi: 24
:
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
maruko vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-08-2011, 09:25 PM   #8
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi maruko View Post
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
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam