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 11-11-2009, 10:43 AM   #1
pk178
Đệ tử 5 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 100
:
Các bác cho em hỏi về ADC và LCD

Chào các bác !!!

Vấn đề của em là như thế này, em thấy trong PIC (16f877A), bộ ADC max là 10 bit, tuy nhiên lại có rất nhiều đầu vào analog, các bác thử tư vấn cho em xem có cách nào nâng độ phân giải của ADC lên ko ? Chứ nếu sử dụng bộ ADC ở ngoài thì tốn kém quá, lại lãng phí tài nguyên sẵn có trong PIC.

Em nghĩ nếu mình chia điện áp ở đầu vào analog thành 2, rồi đưa và 2 chân analog, như vậy liệu có nâng được độ phân giải của ADC lên thành 11 bit ko nhỉ ?

Các bác cho em hỏi 1 câu nữa về LCD, em muốn lập trình cho con LCD 20x4, trong CCS có sẵn driver, nhưng nó lại cố định các chân điều khiển LCD rồi, mình ko tác động được, em có down driver từ trên mạng, nhưng khi mô phỏng, thấy chỉ dùng được cho con 16f877, còn với con 16f877A thì chịu, ko bit đây có phải là lỗi của proteus hay ko, vì em chưa thử mạch thực tế nên chưa biết nó có chạy được ko !!!

Nếu bác nào có driver cho lcd 20x4 thì share cho em với nhé. Em xin cảm ơn rất nhiều ạ !
pk178 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 10:47 AM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi pk178 View Post
Chào các bác !!!

Vấn đề của em là như thế này, em thấy trong PIC (16f877A), bộ ADC max là 10 bit, tuy nhiên lại có rất nhiều đầu vào analog, các bác thử tư vấn cho em xem có cách nào nâng độ phân giải của ADC lên ko ? Chứ nếu sử dụng bộ ADC ở ngoài thì tốn kém quá, lại lãng phí tài nguyên sẵn có trong PIC.

Em nghĩ nếu mình chia điện áp ở đầu vào analog thành 2, rồi đưa và 2 chân analog, như vậy liệu có nâng được độ phân giải của ADC lên thành 11 bit ko nhỉ ?

...
Bạn dùng cho mục đích gì mà cần độ phân giải cao hơn 10-bit? Bạn có biết một số PIC18 có bộ ADC 12-bit không?

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 11:29 AM   #3
pk178
Đệ tử 5 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 100
:
Em định dùng cho bộ cân điện tử bác ạ !

PIC18 em chưa tìm hiểu , nhưng chắc giá cả đắt hơn con PIC16 nhiều đúng ko ạ ? Em chỉ nghĩ với phần cứng như vậy (con PIC16 ấy), mình làm thế nào để tận dụng hết khả năng của nó, chứ nếu dùng con khác, thì có nhiều cách lắm.

À, bác có driver cho lcd 20x4 ko ạ, bác send cho em với nhé ! Em xin cảm ơn bác rất nhiều ạ !!!
pk178 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 05:38 PM   #4
nhanh0112
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 81
:
Driver cho LCD CCS có sẵn thư viện mà bạn. chỉ cần khai báo
#include <lcd.c>//đường dẫn đến driver của thư viện
hoặc
#include "lcd.c" // đường dẫn đến driver nằm cùng thư mục project
sau #use delay là đc
còn định nghĩa cho các chân thì bạn thêm đoạn này vào đoạn đầu của driver lcd.c
Code:
#define LCD_ENABLE_    PIN  PIN_B3                                    ////
#define LCD_RS_PIN      PIN_B1                                    ////
#define LCD_RW_PIN     PIN_B2                                    ////
#define LCD_DATA0       PIN_B4                                    ////
#define LCD_DATA1       PIN_B5                                    ////
#define LCD_DATA2       PIN_B6                                    ////
#define LCD_DATA3       PIN_B7                                    ////
(đã test trên cả proteus và mạch thật với 16F877A)
Nếu bạn nào chưa có (hoặc có nhưng phiên bản khác thì có thể tham khảo) file đính kèm http://www.mediafire.com/?iqzzwmiurtm
(sao diễn đàn ko up đc file nhỉ?!)

Ý tưởng ADC của bạn khá hay nhưng phải làm mạch ngoài và vref khá chính xác
Tui có thể nói lại ý tưởng của bạn như sau:
Chia đôi mức điện áp với Vref bằng mức điện áp chia đôi này giả sử Vref=2.5V
Vậy từ 0-2.5V bạn đưa vào AN0. Từ 2.5 đến 5V bạn đưa vào AN1 (có thể dùng điôt ổn áp hoặc mạch giới hạn để mức điện áp vào từ 2.5-5V đưa vào AN1 cũng là 0 -2.5v)
trong phần mềm... bạn đọc giá trị của AN0 và AN1 rồi cộng dồn... sẽ đc 11bit ngay.
Mạch ngoài cũng khá phức tạp đây
nhanh0112 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 06:37 PM   #5
pk178
Đệ tử 5 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 100
:
Cám ơn bạn đã cho ý kiến !

Việc chỉnh Vref mình nghĩ có thể dùng 1 con DAC, như vậy chắc điện áp ra chính xác (đây mới chỉ là ý tưởng thôi chứ mình cũng chưa test thử).

Cái file lcd.c của bạn hình như chỉ dùng được cho lcd 2 dòng thôi thì phải, mình đã thử add vào chương trình, nhưng ko hiểu sao nó lại báo lỗi 133 : "Interrupt handler uses too much stack".

Bạn nào biết lỗi này xử lí thế nào ko ? Mình dùng thư viện chuẩn trong ccs thì ok, nhưng cứ dùng thư viện down trên mạng là bị báo lỗi.

Xin cám ơn các bạn rất nhiều !!!
pk178 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 09:21 PM   #6
nhanh0112
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 81
:
Xin lỗi vì ko đọc kỹ đầu bài, đó đúng là cho LCD20x2 nhưng nó chạy tốt với 2 dòng mà.
Tui vừa sửa sang lại chút xíu driver LCD gốc để hoạt động cho 4 line (và mới test bằng proteus, chưa làm thử thực tế)
http://www.mediafire.com/?tvjmzfchrxm
Code:
#include <16F877A.h>

#fuses XT, NOWDT, NOPROTECT, PUT, BROWNOUT, NOLVP
#use delay(clock=4000000)
#include "lcd.c"


void main() 
{ 
lcd_init();
lcd_gotoxy(1,1); 
lcd_putc("Test LCD");
lcd_gotoxy(1,2);
lcd_putc("nhanh0112");
//lcd_putc("\f");
lcd_gotoxy(1,3);
lcd_putc("pk178");
lcd_gotoxy(1,4);
lcd_putc("picvietnam");

while(TRUE) 
  {
  } 
}
và kết quả
http://farm3.static.flickr.com/2681/...b6f948c205.jpg
nhanh0112 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 09:52 PM   #7
pk178
Đệ tử 5 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 100
:
Cám ơn bạn nhé, để mình test xem thế nào đã, thực tế mình cũng hơi lười , ngại ko đọc code LCD, nên chỉ lên mạng tìm có code sẵn nào rồi down về thôi
pk178 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 10:15 PM   #8
pk178
Đệ tử 5 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 100
:
Bạn ạ, cái thư viện đó của bạn chạy tốt khi mình test, nhưng ko hiểu sao cứ add vào cái đoạn code mà mình đang viết là nó lại báo cái lỗi trên :lỗi 133 : "Interrupt handler uses too much stack".

Mình thử bỏ ngắt ngoài (tại chân B0) đi thì ok. Ko hiểu sao có ngắt nó lại ko chạy được.

Bạn biết vì sao ko ? giúp mình với, cảm ơn bạn nhiều nhé !!!
pk178 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 10:41 PM   #9
Delfy_Coltech
Đệ tử 4 túi
 
Delfy_Coltech's Avatar
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Hanoi, Vietnam
Bài gửi: 78
:
Thumbs up !!!

Trích:
Nguyên văn bởi pk178 View Post
Bạn ạ, cái thư viện đó của bạn chạy tốt khi mình test, nhưng ko hiểu sao cứ add vào cái đoạn code mà mình đang viết là nó lại báo cái lỗi trên :lỗi 133 : "Interrupt handler uses too much stack".

Mình thử bỏ ngắt ngoài (tại chân B0) đi thì ok. Ko hiểu sao có ngắt nó lại ko chạy được.

Bạn biết vì sao ko ? giúp mình với, cảm ơn bạn nhiều nhé !!!

Cái thông báo lỗi 133 như sau: " Bộ quản lý ngắt sử dụng quá nhiều ngăn xếp"

--> Mình nghĩ nguyên nhân là do chân PB0 đã được định nghĩa dùng cho LCD.
Code:
#define LCD_ENABLE_PIN  PIN_B2                         ////
#define LCD_RS_PIN      PIN_B0                                    ////
#define LCD_RW_PIN      PIN_B1                                    ////
#define LCD_DATA0       PIN_B4                                    ////
#define LCD_DATA1       PIN_B5                                    ////
#define LCD_DATA2       PIN_B6                                    ////
#define LCD_DATA3       PIN_B7
Bạn thử sửa lại cái thư viện LCD xem nhé.
__________________
Mechatronics Department
University of Engineering and Technology, VNUH.
Delfy_Coltech vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 11:03 PM   #10
nhanh0112
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 81
:
Trích:
Nguyên văn bởi pk178 View Post
Bạn ạ, cái thư viện đó của bạn chạy tốt khi mình test, nhưng ko hiểu sao cứ add vào cái đoạn code mà mình đang viết là nó lại báo cái lỗi trên :lỗi 133 : "Interrupt handler uses too much stack".

Mình thử bỏ ngắt ngoài (tại chân B0) đi thì ok. Ko hiểu sao có ngắt nó lại ko chạy được.

Bạn biết vì sao ko ? giúp mình với, cảm ơn bạn nhiều nhé !!!
Nếu bạn sử dụng chân B0 làm ngắt ngoài rồi thì bạn chuyển LCD sang portC hoặc portD đi. Bạn vào trong lcd.c và sửa lại phần định nghĩa chân (PIN_Bx thành PIN_Dx chẳng hạn)
nhanh0112 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 11:20 PM   #11
pk178
Đệ tử 5 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 100
:
Cám ơn các bạn đã giúp đỡ !

Mình vừa sửa lại rồi, đổi hết các chân nối với LCD vào cổng D, nhưng nó vẫn báo lỗi như vậy bạn ạ !!!

Đúng là trong ngắt mình có sử dụng hàm của LCD, nhưng mình nghĩ chắc ko ảnh hưởng gì cả, mình dùng thư viện of CCS thì vẫn dùng bình thường mà.

Trong thiết kế of mình, bắt buộc phải sử dụng ngắt, mình ko hiểu lỗi trên là do đâu nữa !!!

Rất mong các bạn giúp đỡ !!!
pk178 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 11:34 PM   #12
Delfy_Coltech
Đệ tử 4 túi
 
Delfy_Coltech's Avatar
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Hanoi, Vietnam
Bài gửi: 78
:
Bạn post cái Project lên đây cho mọi người cùng kiểm tra nào!
Thực mục sở thị sẽ dễ bắt lỗi hơn đó. :')
__________________
Mechatronics Department
University of Engineering and Technology, VNUH.
Delfy_Coltech vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 11:42 PM   #13
rikimaru87
Đệ tử 3 túi
 
rikimaru87's Avatar
 
Tham gia ngày: Apr 2009
Bài gửi: 53
:
cho em hỏi tí mọi người .
em dùng 6 kenh ADC trong pic 16f877a.
khi setup_adc_ports(AN0);
.....để đọc gia trị thì ok .
setup_adc_ports(AN1);
CCS báo lỗi không AN1 không dc định nghĩa.
nhưng khi tạo ccs em đã chọn là dùng 6 bộ ADC rùi mà ?
mọi người giúp em với
rikimaru87 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-11-2009, 11:55 PM   #14
pk178
Đệ tử 5 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 100
:
Đây là code của mình :

Code:
//==============================================================================
// Project 3
// Author : pk
// Date 26/10/2009
// Description : ...........
/* Function :
      - Su dung ngat ngoai RB0 de cho phep viec nhap du lieu     
*/      
//==============================================================================

#include <16f877A.h>
#device *=16, ADC = 10
#use delay(clock = 4000000)
//#include <LCD420.c>
//#include <lcd4x20.c>
#include <lcd.h>
#include <keypad_input.c>

#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT

#use fast_io(d)
#use fast_io(b)
#use fast_io(c)

int32 so_bao;     // So bao dat
int khoi_luong;   // Khoi luong moi bao
int32 so_bao_ok;  // So bao da can xong

//==============================================================================

void hien_thi_thong_so(){  // Hien thi cac thong so tren LCD
   lcd_putc("\f");
   lcd_putc("SO LUONG : ");
   //lcd_putc("\n");
   lcd_put_int(so_bao);
   lcd_putc("\n");
   
   lcd_putC("KHOI LUONG : ");
   lcd_put_int(khoi_luong);   
   
/*   lcd_putc("SO BAO DA XUAT : ");
   lcd_put_int(so_bao_ok);
   lcd_putc("\n");
   
   //lcd_putc("KHOI LUONG LIEU TRONG THUNG : ");
*/   
}

//==============================================================================

#int_ext
void interrupt_rb0(){  
   
   lcd_putc("\f");
   
   //Nhap so bao yeu cau  

   lcd_putc("SO LUONG : ");
   so_bao = input_key();
   while(!so_bao){         // Neu khong nhap phim nao => nhap lai
      lcd_putc("\f");
      lcd_putc("SO LUONG : ");      
      so_bao = input_key();
   }           
   lcd_putc("\f");
   
   // Nhap khoi luong moi bao
   
   lcd_putc("KHOI LUONG : ");
   khoi_luong = input_key();
   while(!khoi_luong){         // Neu khong nhap phim nao => nhap lai
      lcd_putc("\f");
      lcd_putc("KHOI LUONG : ");
      khoi_luong = input_key();
   }         
   lcd_putc("\f");
   hien_thi_thong_so();
}

//==============================================================================

void khoi_dong(){
   int i;
   
   lcd_init();
   lcd_putc("STARTING");
   for(i = 1; i < 9; i++){
      lcd_putc(".");
      delay_ms(100);
   }
   lcd_putc("\f"); 

   // Nhap gia tri lan dau  
   
   lcd_putc("\f");
   
   //Nhap so bao yeu cau 

   lcd_putc("SO LUONG : ");
  // lcd_putc("\n");
   so_bao = input_key();
   while(!so_bao){         // Neu khong nhan phim nao => nhap lai
      lcd_putc("\f");
      lcd_putc("SO LUONG : ");      
      so_bao = input_key();
   }           
   lcd_putc("\f");
   

   lcd_putc("KHOI LUONG :");
  // lcd_putc("\n");
   khoi_luong = input_key();
   while(!khoi_luong){         // Neu khong nhan phim nao => nhap lai
      lcd_putc("\f");
      lcd_putc("KHOI LUONG :");
      //lcd_putc("\n");
      khoi_luong = input_key();
   }         
   lcd_putc("\f");
      
   hien_thi_thong_so();
}

//==============================================================================

void main(){  
   
   set_tris_C(0x07); 
   set_tris_D(0x00);
   set_tris_B(0x01);
  
   output_b(0x00);
   setup_adc(ADC_CLOCK_DIV_32);   // sample time = IC clock 
   setup_adc_ports(AN0_AN1_AN3);        // Set PIN_A0 as analog input 1  
   enable_interrupts ( int_ext ) ; 
   enable_interrupts ( global ) ; 
   
   khoi_dong();
   lcd_putc("\n");
  
  
}

//==============================================================================
Hàm keypad_input là để quyét phím, nó sẽ trả về giá trị sau khi nhập xong !!!

Rất mong được các bạn giúp đỡ. Xin cảm ơn rất nhiều !!!
pk178 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-11-2009, 12:06 AM   #15
pk178
Đệ tử 5 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 100
:
Trích:
Nguyên văn bởi rikimaru87 View Post
cho em hỏi tí mọi người .
em dùng 6 kenh ADC trong pic 16f877a.
khi setup_adc_ports(AN0);
.....để đọc gia trị thì ok .
setup_adc_ports(AN1);
CCS báo lỗi không AN1 không dc định nghĩa.
nhưng khi tạo ccs em đã chọn là dùng 6 bộ ADC rùi mà ?
mọi người giúp em với
Không có định nghĩa setport cho AN1, nếu bạn muốn sử dụng cổng AN1 là cổng vào analog, phải dùng lệnh set_adc_channel(1)
pk178 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à 10:07 AM.


Đượ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