PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT 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

Ðề tài đã khoá
 
Ðiều Chỉnh Xếp Bài
Old 15-08-2007, 05:05 PM   #1
cuopbienquin
Đệ tử 2 túi
 
cuopbienquin's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 43
:
Mình mới học về PIC.Cho hỏi ADC module có chức năng gì,công dụng ntn trên PIC? Mình nghĩ cho một điện thế analog thì nó xuất ra tín hiệu digital.Mình đã có đọc đoạn code này nhưng chưa hiểu rõ :
Code:
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=8 
#use delay(clock=10000000)
Int8 adc;
main()
{
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);
set_adc_channel(0);
delay_ms(10);
while(true)
{
adc=read_adc();
output_B(adc);
}
}
Bạn nào đã đi trước thì giải thích giùm mình nhé,mình cần luôn file mô phỏng proteuss để hiểu rõ hơn.Cám ơn nhiều.Chúc vui.

thay đổi nội dung bởi: namqn, 15-08-2007 lúc 05:44 PM.
cuopbienquin vẫn chưa có mặt trong diễn đàn  
Old 15-08-2007, 11:15 PM   #2
thaithienanh
Đệ tử 7 túi
 
thaithienanh's Avatar
 
Tham gia ngày: Jul 2006
Bài gửi: 189
:
Send a message via Yahoo to thaithienanh
Red face Ui sao hông có anh nào replay luồng này hết vậy

To @c828 : việc quét 2 led rất đơn giản, chắc là do bạn chưa nắm đuợc quét led là gì rồi, bây giờ mình sẽ cho bạn một ví dụ cơ bản nhất về quét led (có kèm file Proteus và notepad), sau đó thì bạn nghiền ngẫm code khoảng vài phút chắc sẽ hiểu thui

To @sphinx9 : Cách diễn giải câu hỏi của bạn hơi khó hiểu một chút nhưng mình cũng loáng thoáng hiểu đuợc và xin trả lời là : đó là điểm yếu của Proteus nên không cần thắc mắc và cũng không thể giải thích (mình nói thật đó đừng nghe giọng văn trả lời cụt ngủn mà hiểu lầm nhá )

To @dvnccbmacbt : Ngắt RB dùng để ghi nhận sự kiện "có sự thay đổi bất kỳ" trên các chân từ RB4 đến RB7 cho nên việc chọn sườn ngắt không có vai trò ý nghĩa ở đây

To @cuopbienquin : ADC = Analog Digital Convert như vậy ý nghĩa của nó là một bộ chuyển đổi từ tín hiệu "tương tự" sang giá trị "số" tương ứng. Tuỳ vào việc lựa chọn điện áp tham chiếu và độ phân giải mà giá trị cho ra sẽ khác, ví dụ khi ta lựa chọn là ADC=8 và Vref = 5V thì khi đó nếu tín hiệu đưa vào bộ ADC là 5V thì giá trị số trả ra là 11111111 (8bit) = 255, công thức tổng quát lúc này sẽ là :
Value (giá trị "số") = 255 (max value của 8 bit) * X (tín hiệu đưa vào) / 5 (Vref)
Bạn tham khảo thêm tại bài trước nhá link đây :
http://www.picvietnam.com/forum//sho...?t=357&page=17
File Kèm Theo
File Type: zip New Folder.zip (6.8 KB, 385 lần tải)
__________________
_____________________________Tri nhân tri tự bất tri tâm_____________________________
_ _ _ _ _ _ _ _ Yêu mến tất cả anh em Picvietnam.com _ _ _ _ _ _ _ _
. . . . . . . . . . . . . . . . Để post đuợc một câu hỏi rõ ràng xin tham khảo link sau : . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . http://www.picvietnam.com/forum/showthread.php?t=1263. . . . . . . . . . . . . . . .
thaithienanh vẫn chưa có mặt trong diễn đàn  
Old 18-08-2007, 09:57 AM   #3
huybo02
Đệ tử 4 túi
 
Tham gia ngày: Aug 2006
Bài gửi: 61
:
Trích:
Nguyên văn bởi cuopbienquin View Post
Mình mới học về PIC.Cho hỏi ADC module có chức năng gì,công dụng ntn trên PIC? Mình nghĩ cho một điện thế analog thì nó xuất ra tín hiệu digital.Mình đã có đọc đoạn code này nhưng chưa hiểu rõ :
Code:
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=8 
#use delay(clock=10000000)
Int8 adc;
main()
{
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);
set_adc_channel(0);
delay_ms(10);
while(true)
{
adc=read_adc();
output_B(adc);
}
}
Bạn nào đã đi trước thì giải thích giùm mình nhé,mình cần luôn file mô phỏng proteuss để hiểu rõ hơn.Cám ơn nhiều.Chúc vui.
ADC là chức năng chuyển đổi tín hiệu analog -> digital (Analog Digital Converter). Nó dùng 1 điện áp để so sánh (Vref) tùy độ phân giải mà điện áp này được chia là nhiểu mức khác nhau (2^n) với 16F877A ADC 10 bit tức Vref dc chia thành 2^10 = 1024 mức. Mỗi mức ADC cách nhau tương ứng với Vref/số mức. Vref = 5V thì mỗi mức ADC của 16F877 ứng với 5V/1024 = 4.88mV. Điện áp trên cổng AN sẽ được so sánh để ra được mức ADC tương ứng. 0V ứng với ADC =0, 4.88mV ứng với ADC =1...Kết quả được chứa trong 2 thanh ghi ADRESH:ADRESL.
Còn mạch cho code trên thì bạn mắc 1 cầu chia áp để đưa điện áp vào chân AN0 là được. Dùng biến trở cho gọn.
Còn PWM thì bạn đọc trong datasheet đó chương 8 phần CAPTURE/COMPARE/PWM MODULES và xem thêm bên ứng dụng điều khiển PID cho động cơ DC.

thay đổi nội dung bởi: namqn, 18-08-2007 lúc 06:18 PM.
huybo02 vẫn chưa có mặt trong diễn đàn  
Old 21-08-2007, 08:38 PM   #4
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
[QUOTE][QUOTE]

cho em hỏi] về đo nhiệt độ dùng pic 16f877A với ạ.code này em copy của anh linhnc308.nhưng về lắp vẫn chưa chay.trong code nó bị báo lỗi
[QUOTE] // trisa = 0xFF;
// trisb = 0x01;
// trisd = 0x00;[QUOTE]
em nghĩ là nó khai báo cho cổng ra vào nên em đã thay nó bằng :
set_tris_a(0xff);
set_tris_b(0x01);
set_tris_d(0x00);
thế là nó hết báo lỗi,nhưng vẫn ko đc.em đã lắp mạch thật cho nó nhưng nó vẫn im lìm ko báo biếc gì cả(bứ lắm cơ!)
các anh cho em lời khuyên với.
note: đây là mạch và code em mượn của anh linhnc308,mong anh cố gắng giúp cho kẻ ngốc nghếch này.em đã lắp mạch đúng,và mặc dù em đã lấy file hex của anh nạp vào mà nó vẫn im lìm ạ,
anh_gioi vẫn chưa có mặt trong diễn đàn  
Old 17-08-2007, 04:45 PM   #5
cuopbienquin
Đệ tử 2 túi
 
cuopbienquin's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 43
:
PWm là bộ điều chế đọ rộng xung.Mình đang tìm hiểu cái module này nó hoạt độnh ntn?Mình đã đọc tổng quan về nó là dùng để điều khiển động cơ như tốc độ,tần số..
Mình muốn hiểu rõ hơn cấu trúc mạch ntn trong VDK PIC,kết nối với động cơ ra sao.BẠn nào đã tìm hiểu rồi thì hướng dẫn gíp mình nha.Mình đang rất cần.Chúc vui
cuopbienquin vẫn chưa có mặt trong diễn đàn  
Old 21-08-2007, 08:44 PM   #6
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
sao ko post file từ máy tính đc nhỉ? thui khi khác post sau vậy.lại vẫn dậm chân 1 chỗ.chán thật
anh_gioi vẫn chưa có mặt trong diễn đàn  
Old 28-08-2007, 09:34 PM   #7
dtdat1909
Đệ tử 1 túi
 
Tham gia ngày: Jun 2007
Bài gửi: 11
:
không phải như bạn nghĩ đâu. mad thời gian định thời được tính theo công thức:
t=4*256*prescaler/Fosc
ở đây 4 hình như là số chu kỳ trong một lệnh đếm
prescaler là tỷ lệ mà ta quy định cho Timer, nó được xem là clock cho timer khi timer đếm(tần số dùng để đếm cho Timer bằng OSC/prescaler).
Fosc là tần số xung clock cung cấp cho mạch.
khi viết rtcc_div_2 có nghĩa là: tần số cung cấp cho bộ đếm Timer0 bằng
Fosc/2.
dtdat1909 vẫn chưa có mặt trong diễn đàn  
Old 29-08-2007, 09:16 PM   #8
cuopbienquin
Đệ tử 2 túi
 
cuopbienquin's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 43
:
Đây là mã code mình viết ngắt đơn giản cho LCD.Khi nhấn button 1(RB4) thì LCD hiển thị chữ 'X' dòng 1,button 2 thì LCD hiển thị dòng 2 chữ 'K'.Nhưng khi chạy thì nó bào lỗi ở dòng "void main(void)" là 'A numeric expression must be here'

Code:
=============================================================================*/
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define RS  RD0
#define RW  RD1
#define E   RD2
#define LCD PORTC
/*Ham yeu cau goi lenh dieu khien LCD*/
void comnwrt(void)
{
 RS = 0;
 RW = 0;
 E  = 1;
 E  = 0;
 delay_ms(1);
}
/*Ham yeu cau goi du lieu hien thi len LCD*/
void datawrt(void)
{
 RS = 1;
 RW = 0;
 E  = 1;
 E  = 0;
 delay_ms(1);
}
#int_RB
 void ngat_RB(void)
 {
  if(RBIE && RBIF)
    {
     if (RB4==0)
      {
      while(RB5==1)
       {
        LCD = 0x83;
        comnwrt();
        LCD = 'X';
        datawrt();
        
       }
      }
     if (RB5==0)
      {
      while(RB4==1)
       {
        LCD = 0xC3;
        comnwrt();
        LCD = 'K';
        datawrt();
        
       }
      }
    }
   
  void main(void)
    {
     set_tris_b(0b01100000);
     set_tris_c(0);
     set_tris_d(0);
     LCD = 0x38;      //   Hai hang, ma tran dot 5*7, 8 bit interface
     comnwrt();
     LCD = 0x0C;      //   Bat hien thi, tat con tro
     comnwrt();
      while(true)
      {
      }
    }

thay đổi nội dung bởi: namqn, 29-08-2007 lúc 11:52 PM.
cuopbienquin vẫn chưa có mặt trong diễn đàn  
Old 29-08-2007, 11:56 PM   #9
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
Khi chạy chương trình đó bạn nhận được thông báo lỗi đó? Thông báo lỗi đó xuất hiện ở đâu?

Nếu bạn chạy chương trình với phần cứng của bạn theo cách thông thường, chỉ có bộ vi điều khiển và LCD, bộ phận hiển thị duy nhất mà bạn có là màn hình LCD, làm cách nào bạn nhận được thông báo lỗi đó, khi LCD chưa hoạt động đúng.

Tôi đoán là bạn muốn nói khi biên dịch chương trình thì nhận được thông báo lỗi đó. Bạn xem thử các ví dụ mẫu của CCS C để biết người ta khai báo main() ra sao. Bạn cũng kiểm tra lại code xử lý ngắt RB của bạn, dường như bạn đang thiếu một dấu '}'.

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  
Old 30-08-2007, 12:55 AM   #10
thaithienanh
Đệ tử 7 túi
 
thaithienanh's Avatar
 
Tham gia ngày: Jul 2006
Bài gửi: 189
:
Send a message via Yahoo to thaithienanh
Talking Tội nặng, nặng tội

Bạn phạm phải trọng tội rùi chắc hình phạt phải là "tử hình" thui đó mà

Lỗi của bạn là thiếu một dấu móc khoá "}" ở cuối hàm, ngay trên void main ấy thêm vào là OK

Lần này tha lần sau là tử hình thiệt đó nghen .
Thân.
__________________
_____________________________Tri nhân tri tự bất tri tâm_____________________________
_ _ _ _ _ _ _ _ Yêu mến tất cả anh em Picvietnam.com _ _ _ _ _ _ _ _
. . . . . . . . . . . . . . . . Để post đuợc một câu hỏi rõ ràng xin tham khảo link sau : . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . http://www.picvietnam.com/forum/showthread.php?t=1263. . . . . . . . . . . . . . . .
thaithienanh vẫn chưa có mặt trong diễn đàn  
Old 30-08-2007, 12:42 PM   #11
cuopbienquin
Đệ tử 2 túi
 
cuopbienquin's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 43
:
Cám ơn các bạn nhiều,mình đã biết sai rồi.Nhưng khi mô phỏng bằng Proteuss thì không như ý muốn,LCD cứ lặng thinh.Đây là mạch mô phỏng

code:#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define RS RD0
#define RW RD1
#define E RD2
#define LCD PORTC
/*Ham yeu cau goi lenh dieu khien LCD*/
void comnwrt(void)
{
RS = 0;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}
/*Ham yeu cau goi du lieu hien thi len LCD*/
void datawrt(void)
{
RS = 1;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}
#int_RB
void ngat_RB(void)
{
if(RBIE && RBIF)
{
if (RB4==0)
{
while(RB5==1)
{
LCD = 0x83;
comnwrt();
LCD = 'X';
datawrt();

}
}
if (RB5==0)
{
while(RB4==1)
{
LCD = 0xC3;
comnwrt();
LCD = 'K';
datawrt();

}
}
}
}

void main(void)
{
set_tris_b(0b00110000);
set_tris_c(0);
set_tris_d(0);
LCD = 0x38; // Hai hang, ma tran dot 5*7, 8 bit interface
comnwrt();
LCD = 0x0C; // Bat hien thi, tat con tro
comnwrt();
while(true)
{
}
}

Mình làm mạch này chủ yếu để hiểu cơ bản và tiếp tục làm phần kết hợp keypadphone và LCD ,mạch nhu cầu như sau

Mình cần :nhấn phím trên keypad thì LCD sẽ hiển thị trên LCD và khi nhấn button thì nó xóa một ký tự hiển thị .Mình có tham khảo source code trong CCS nhưng chả biết dùng như thế nào,đây là code ứng dụng:
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)



#include <lcd.c>
#include <kbd.c>


void main() {
char k;

lcd_init();
kbd_init();

lcd_putc("\fReady...\n");

while (TRUE) {
k=kbd_getc();
if(k!=0)
if(k=='*')
lcd_putc('\f');
else
lcd_putc(k);
}
}

thay đổi nội dung bởi: cuopbienquin, 30-08-2007 lúc 07:13 PM.
cuopbienquin vẫn chưa có mặt trong diễn đàn  
Old 31-08-2007, 09:36 PM   #12
thaithienanh
Đệ tử 7 túi
 
thaithienanh's Avatar
 
Tham gia ngày: Jul 2006
Bài gửi: 189
:
Send a message via Yahoo to thaithienanh
Bạn Cướp biển chuẩn bị chạy trước đi nhé, mình đã "lắp đạn vào súng" rùi đây này

Do bạn phạm các tội sau :
- Chưa khai báo cho phép ngắt RB ở void main : phải thêm vào đó 2 dòng : enable_interrupts(global);
enable_interrupts(int_RB);
- Ở trên mạch ứng dụng chẳng thấy điện trở treo lên nguồn đâu nữa

Tài liệu thì mình không có và rất ít đọc (do lười )

Nhưng góp ý thế này : muốn học từ Sample của CCS thì phải :

Bạn mở code cái Driver mà CCS hỗ trợ lên, đọc kỹ định nghĩa của các hàm mà Driver hỗ trợ (để khi dùng thì gọi ra trong chương trình), xem Driver đó sử dụng những chân nào của VDK, nối đúng chân mà dùng
__________________
_____________________________Tri nhân tri tự bất tri tâm_____________________________
_ _ _ _ _ _ _ _ Yêu mến tất cả anh em Picvietnam.com _ _ _ _ _ _ _ _
. . . . . . . . . . . . . . . . Để post đuợc một câu hỏi rõ ràng xin tham khảo link sau : . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . http://www.picvietnam.com/forum/showthread.php?t=1263. . . . . . . . . . . . . . . .
thaithienanh vẫn chưa có mặt trong diễn đàn  
Old 31-08-2007, 11:13 AM   #13
cuopbienquin
Đệ tử 2 túi
 
cuopbienquin's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 43
:
Xin lỗi mình pót bài này mà không thấy bác nào trả lời giùm .Có lẽ do nhiều luồng mới quá nên các bác không để ý.Hôm nay mình post lại vậy.Mình có cuốn Interfacing PIC nhưng viết bằng ASM,mà mình thì đang cần C.Không biết bác nào có sách Interfacing PICmaf viết bằng C khồng nhỉ?
cuopbienquin vẫn chưa có mặt trong diễn đàn  
Old 31-08-2007, 11:55 PM   #14
cuopbienquin
Đệ tử 2 túi
 
cuopbienquin's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 43
:
chà mình đã chuẩn bị chạy rồi .mình biết sau khi mình post bài mình đã thiếu yêu cầu như bạn comment và vẽ lại mạch mô phỏng như bạn nhắc nhở.Nhưng vẫn cứ lặng thinh.Mong bạn và các bạn trong diễn đàn chạy thử lại và test giùm mình như bạn đã nói,và cùng correct lại mạch và code như yêu cầu mình mong muốn xem sao.Còn về ứng dụng trong CCS ,rất phức tạp.Mình muốn tự mình lập trình theo yêu cầu ,post code xem mình sai đúng chỗ nào,để sữa lỗi và tiện học hỏi luôn như vạy dễ hiểu hơn.Mong các bạn thông cảm .Chúc vui
cuopbienquin vẫn chưa có mặt trong diễn đàn  
Old 01-09-2007, 12:24 AM   #15
thaithienanh
Đệ tử 7 túi
 
thaithienanh's Avatar
 
Tham gia ngày: Jul 2006
Bài gửi: 189
:
Send a message via Yahoo to thaithienanh
Đã test lại giúp bạn, tất cả đều ổn, mình gửi luôn cái hình để bạn xem lại, còn về code mình chỉ thêm đúng vào 2 câu mà mình đã nói ở trên
Hình Kèm Theo
File Type: jpg picture.JPG (105.8 KB, 48 lần tải)
__________________
_____________________________Tri nhân tri tự bất tri tâm_____________________________
_ _ _ _ _ _ _ _ Yêu mến tất cả anh em Picvietnam.com _ _ _ _ _ _ _ _
. . . . . . . . . . . . . . . . Để post đuợc một câu hỏi rõ ràng xin tham khảo link sau : . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . http://www.picvietnam.com/forum/showthread.php?t=1263. . . . . . . . . . . . . . . .
thaithienanh vẫn chưa có mặt trong diễn đàn  
Ðề tài đã khoá


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

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
TUT về USART trong PIC16F877A mafd_47a MPASM 16 19-02-2025 05:32 AM
TUT ve I2C ( pic16f877a ) mafd_47a MPASM 28 28-01-2025 10:45 PM
Lập nhóm PIC16F877A nhh Cơ bản về vi điều khiển và PIC 285 08-03-2017 11:08 PM
Bộ so sánh và PWM cho PIC16F877A anhquangngai Cơ bản về vi điều khiển và PIC 24 08-09-2012 09:00 AM
Pic16f877a TỪ DỄ TỚi KhÓ ntc Cơ bản về vi điều khiển và PIC 373 23-05-2009 10:24 PM


Múi giờ GMT. Hiện tại là 02:42 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