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 29-05-2007, 06:38 PM   #1
hawinter
Đệ tử 1 túi
 
hawinter's Avatar
 
Tham gia ngày: Dec 2006
Bài gửi: 20
:
Em làm mạch đo nhiệt độ sử dụng LM335Z để hiển thị LCD .
Code:
#include <16F877A.h>
#include <DEFS_16F877A.h>
#device*=16 adc=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#define RS RB3
#define RW RB4
#define E RB5
#byte lcd_data = PORTD   // Dia chi PORTD
int8 hight,low,i;
float value;
void convert_bcd(int8 a){
   low=a%10;
   hight=a/10;
   low+=0x30;//doi ra ma ASCII de hien thi LCD
   hight+=0x30;
}

byte lcd_read_byte()
{
   byte read_byte;
   set_tris_D(0xFF);       // PORTD = input
   RW = 1;
   delay_cycles(1);
   E  = 1;
   delay_cycles(1);
   read_byte = lcd_data;
   E  = 0;
   set_tris_D(0x00);       // PORTD = output
   return(read_byte);
}
/* Goi 1byte den LCD */
void lcd_send_byte( byte address, byte n )
{
   RS = 0;
   while ( bit_test(lcd_read_byte(),7) ) ;
   RS = address;
   delay_cycles(1);
   RW = 0;
   delay_cycles(1);
   E  = 0;
   lcd_data = n;
   delay_cycles(1);
   E = 1;
   delay_us(2);
   E = 0;
}

/* Khoi tao ban dau cho LCD */
void lcd_init()
{
    byte const lcd_init_string[4] = {0x38, 0x0C, 1 , 6};
    byte i;
    set_tris_D(0x00);
    RS = 0;
    RW = 0;
    E  = 0;
    delay_ms(15);
    for(i=1;i<=3;++i)
       {
         lcd_data = 3;
         delay_cycles(1);
         E = 1;
         delay_us(2);
         E = 0;
         delay_ms(5);
       }
    lcd_data = 2;
    delay_cycles(1);
    E = 1;
    delay_us(2);
    E = 0;
    delay_ms(5);
    for(i=0;i<=3;++i)
      {
         lcd_send_byte(0,lcd_init_string[i]);
      }
}
void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   if(y!=1)
     address=0x40;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}
main()
{
   set_tris_B(0);
   set_tris_D(0);
   set_tris_A(0xFF);
   lcd_init();
   delay_ms(100);
   lcd_gotoxy(3,1);
   lcd_putc("hello");
   lcd_gotoxy(1,2);
   lcd_putc("Welcom Everybody");
   delay_ms(2000);
   lcd_send_byte(0,1);//xoa LCD
   lcd_send_byte(0,6);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(AN0);
   set_adc_channel(0);
   delay_ms(100);
   value=(float)read_adc();
   value=(value-558.5)/2.048;
   convert_bcd((int8)value);
   delay_us(20);
   lcd_putc("nhiet do:");
   while(1)
   {
      value=(float)read_adc();
      value=(value-558.5)/2.048;
      convert_bcd((int8)value);
      delay_ms(1000);
      lcd_gotoxy(2,4);
      lcd_putc(hight);
      lcd_putc(low);
      lcd_putc(" do C");
      //delay_ms(1000);
   }
 }
Chương trình có tham khảo từ các bài viết trên Picvietnam và dientuvietnam.
khi chay chương trình thì giá trị nhiệt độ hiển thị chỉ quanh các giá trị 50,52,54,56,48,58 em cũng không biết tại sao .Xin các bậc tiền bối giải đáp hộ .
__________________
Học mà không yêu là phí hoài tuổi trẻ
Yêu mà không học là bán rẻ tương lai.

thay đổi nội dung bởi: hawinter, 30-05-2007 lúc 01:55 PM.
hawinter vẫn chưa có mặt trong diễn đàn  
Old 29-05-2007, 10:18 PM   #2
hawinter
Đệ tử 1 túi
 
hawinter's Avatar
 
Tham gia ngày: Dec 2006
Bài gửi: 20
:
Các sư huynh dúp em với đau đầu quá mà vẫn chưa tìm ra nguyên nhân ???
Cho em hỏi thêm là trong CCS để truy cập đến các thanh ghi thì làm thế nào nhỉ .
__________________
Học mà không yêu là phí hoài tuổi trẻ
Yêu mà không học là bán rẻ tương lai.

thay đổi nội dung bởi: hawinter, 29-05-2007 lúc 10:59 PM.
hawinter vẫn chưa có mặt trong diễn đàn  
Old 30-05-2007, 09:28 PM   #3
huybo02
Đệ tử 4 túi
 
Tham gia ngày: Aug 2006
Bài gửi: 61
:
Bạn kiểm tra lại Vref trên LM335 thử xem. Chương trình trên ứng với Vref = 5V. Nếu Vref có giá trị khác bạn phải tính lại các số cho biểu thức
" value=(value-558.5)/2.048;"
Với 5V thì:
5V = 1024 muc (ADC 10bit 2^10 = 1024) => 10mV tuong ung voi 2.048 muc ADC
0oC = 273oK => 0oC ung voi muc dien the 2.73V ung voi 559 muc ADC
Nhiet do = dien the Analog/10 - 273
Tuong ung
Nhiet do = (adc -559)/2.024

Còn truy cập thanh ghi thì có lẽ giống như khai báo địa chỉ port I/O lúc đầu
VD: #byte portb = 0x06;
Lúc này ta có thể gán giá trị vào portb:
portb = 0xFF;
hay đọc giá trị từ portb ra ngoài:
data = portb;
Đối với các thanh ghi khác chắc cũng như vậy. Đặt tên thanh ghi, định nghĩa địa chỉ và truy xuất
Bạn thử xem <<< chưa thử
huybo02 vẫn chưa có mặt trong diễn đàn  
Old 26-06-2007, 11:54 AM   #4
An Hiep
Đệ tử 1 túi
 
An Hiep's Avatar
 
Tham gia ngày: May 2007
Bài gửi: 15
:
To LeDuc:
Bạn nên sử dụng ngắt sẽ rất dễ dàng.
1. Nạp cho Timer giá trị cần tạo ra
2. Cho phép ngắt Timer(Ví dụ Timer0(8bit) hoặc Timer1(16bit))
3. Xử lý ngắt(Không cho phép ngắt để lấy giá trị và tính toán)
4. Cho phép ngắt
Giá trị nạp cho Timer được tính tương tự như đối với 8051.

Chúc bạn thành công!

An Hiệp
An Hiep vẫn chưa có mặt trong diễn đàn  
Old 26-06-2007, 12:01 PM   #5
An Hiep
Đệ tử 1 túi
 
An Hiep's Avatar
 
Tham gia ngày: May 2007
Bài gửi: 15
:
Bạn chú ý đối với từng Timer thì việc nạp giá trị là khác nhau.
Ví dụ Timer0: 8bit = 256 giá trị
Nếu bạn sử dụng lệnh set_timer0(10); thì thời gian bạn thu được là 256-10 = 246 giá trị. Còn set_timer1(10); thì thời gian bạn thu được là 65536-10 =65526 giá trị.

Chúc bạn thành công!


An Hiệp
An Hiep vẫn chưa có mặt trong diễn đàn  
Old 27-06-2007, 10:32 AM   #6
dvnccbmacbt
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 65
:
Cool Hỏi về ngắt trên chân RB4-RB7!!

Em viết chương trình như sau: chương trình dùng để chạy led thuận trên portD, khi có ngắt trên RB7 thì chạy led ngược lại.
Code:
/#include <16F877A.h>
#device *=16
#fuses NOWDT,HS,NOPROTECT
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(a)
#use fast_io(d)
#use fast_io(e)

#byte intcon=0x000B
#bit RBIF=intcon.0

int8 const led[]={1,2,4,8,16,32,64,128};
int8 a=0,j=0,i=0;
int16 dem=0;
//========ham ngat timer0==========//
#int_rb
void ngat_rb()
 {
   for(j=8;j>0;j--)
    {
     output_d(led[j-1]);
     delay_ms(10);
    }output_d(0);RBIF=0;
 }
//===========ham chinh=============//
void main()
{set_tris_d(0);
 set_tris_b(0xff);
 enable_interrupts(global);
 enable_interrupts(int_rb);
ext_int_edge(L_TO_H );
 while(1)
 {   for(i=0;i<8;i++)
    {
     output_d(led[i]);
     delay_ms(10);
    }output_d(0);
 }
}
còn đây là sơ đồ mạch:



đầu tiên nó chạy thuận thì đúng rồii. khi bấm nut thì nó chạy ngược lại cũng đúng nhưng sau đó thì nó cứ chạy ngược mãi mà không chạy thuận lại. Em nghĩ khi nó chạy xong chương trình ngắt rồi thì nó sẽ thực hiện chương trình chính chứ. Ở đây hàm delay có gây ra lỗi ko?

Cho em Hỏi thêm 1 ý nữa: Ngắt sẽ xảy ra khi có chuyển trạng thái trên chân RB4-Rb7. vây nếu trong chương trinh ta thiêt lập là output và cho chuyển trạng thái bằng lệnh thì có xảy ra ngắt ko? Sự khác nhau giữa ngắt ngoài trên chân RBO và ngắt trên RB4->RB7 là gì?
dvnccbmacbt vẫn chưa có mặt trong diễn đàn  
Old 27-06-2007, 06:39 PM   #7
LeDuc
Đệ tử 6 túi
 
LeDuc's Avatar
 
Tham gia ngày: Mar 2007
Bài gửi: 150
:
Code:
#include <16F877A.h>
#device *=16 ADC=8
#fuses NOWDT,HS,NOPROTECT

#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(a)
#use fast_io(d)
#use fast_io(e)

#byte intcon=0x000B
#byte portb=0x6

#bit RB7 =portb.7
#bit RBIF=intcon.0
#bit RBIE=intcon.3
//-----------------------------
int8 const led[]={1,2,4,8,16,32,64,128};
int8 j=0,i=0;

//========ham ngat tren RB ==========//
#int_rb
void ngat_rb()
{
   if(rb7==0)
   for(j=8;j>0;j--)
   {
      output_d(led[j-1]);
      delay_ms(10);
   }
}
//===========ham chinh=============//
void main()
{
   set_tris_d(0);
   set_tris_b(0xff);
   enable_interrupts(global);
   enable_interrupts(int_rb);
   ext_int_edge(L_TO_H );
   while(true)
   { 
      for(i=0;i<8;i++)
      {
          output_d(led[i]);
          delay_ms(10);
      }
   }
}
Mình đã sửa lại đoạn code của bạn rồi ..thay đổi một chút thôi.
Mình đã kiểm tra và chạy ok rồi... Nhưng có lẽ dùng delay trong hàm ngắt là ko nên . Nên tìm 1 giải thuật khác , dịch bit chẳng hạn ...
Còn sự khác biệt giữa các ngắt :" bạn xem lại phía trên các anh có chỉ dẫn đó ...
hy vọng mọi người sẽ cùng nhau tìm hiểu nhiều hơn...có sai nhiều .. có sửa nhiều ..--->> tiến bộ nhiều (^_^)!!!
Rất cảm ơn vì đã gởi thắc mắc lên đây.. qua bài trên mình đã tìm hiểu thêm được nhiều điều mới..
__________________
_________________________________________________
Le Trung Duc
Industry Research & Application Center
NTT Institute of Hi_technolog
ltduc@ntt.edu.vn
leduc_cktd@yahoo.com.vn
http://www.nttc.edu.vn
CNC DIY : http://quangcaosanpham.com/shop/driverservo
0909300332
LeDuc vẫn chưa có mặt trong diễn đàn  
Old 27-06-2007, 06:02 PM   #8
picpicpic
Đệ tử 2 túi
 
picpicpic's Avatar
 
Tham gia ngày: Jan 2006
Bài gửi: 36
:
Bác nhh này biến đi đâu lâu quá ko thấy xuất hiện, ko biết làm mod kiểu gì đây ???

To dvnccbmacbt: mô phỏng bằng proteus, bạn ko cần mắc thạch anh vào đâu.

To anh_gioi: thì chương trình đó chỉ viết cho ngắt RB0 mà bạn.
__________________
************************************************** **
The only wrong thing would be to deny what your heart truly feels!
************************************************** **
picpicpic vẫn chưa có mặt trong diễn đàn  
Old 28-06-2007, 12:03 AM   #9
dvnccbmacbt
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 65
:
Em đã làm thử một bài tập về RB4-Rb7. Có phải chỉ khi nào các chân từ RB4-Rb7 là chân input thì mới có thể tạo ra ngắt được đựoc không? Nếu là output thì dù có chuyển trạng thái cũng không tạo ra ngắt, đúng không? Nếu vậy tại sao các chân này không gọi là ngắt ngoài nhỉ? Các bác giải thích giùm em với. Nếu có 1 đoạn code mẫu thì càng tốt. Cảm ơn các bác nhiều.
dvnccbmacbt vẫn chưa có mặt trong diễn đàn  
Old 28-06-2007, 12:14 AM   #10
picpicpic
Đệ tử 2 túi
 
picpicpic's Avatar
 
Tham gia ngày: Jan 2006
Bài gửi: 36
:
Trích:
Nguyên văn bởi dvnccbmacbt View Post
Em đã làm thử một bài tập về RB4-Rb7. Có phải chỉ khi nào các chân từ RB4-Rb7 là chân input thì mới có thể tạo ra ngắt được đựoc không? Nếu là output thì dù có chuyển trạng thái cũng không tạo ra ngắt, đúng không? Nếu vậy tại sao các chân này không gọi là ngắt ngoài nhỉ? Các bác giải thích giùm em với. Nếu có 1 đoạn code mẫu thì càng tốt. Cảm ơn các bác nhiều.
Tất nhiên, đã là ngắt RB4-RB7 thì nó phải là các ngõ input, ngắt RB0 cũng vậy. Ngắt RB0 đã gọi là ngắt ngoài rồi, chả lẽ lại gọi trùng tên, nên tiên sư microchip nó đặt là ngắt RB.
http://www.picvietnam.com/forum/show...p?t=357&page=2
__________________
************************************************** **
The only wrong thing would be to deny what your heart truly feels!
************************************************** **
picpicpic vẫn chưa có mặt trong diễn đàn  
Old 28-06-2007, 01:10 AM   #11
dvnccbmacbt
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 65
:
Các bác giúp em một câu nữa nhé. Em thắc mác chỗ TIMER1. Chế độ đếm đồng bộ là sao và không đồng bộ là sao? Em thấy trong các tài liệu và HELP giải thích dơn giản quá chẳng hiểu gì cả. Các bác cho em xin một ví dụ và ứng dụng của món này với. Cảm ơn các bác nhiều.
dvnccbmacbt vẫn chưa có mặt trong diễn đàn  
Old 28-06-2007, 01:54 PM   #12
HL2
Nhập môn đệ tử
 
Tham gia ngày: Jun 2007
Bài gửi: 6
:
Tuyệt vời, cảm ơn các bác nhiều lắm. Cảm ơn bác nhh đã khởi xướng ra chuyên mục này để anh em có cơ hội trao đổi kinh nghiệm, học hỏi.
HL2 vẫn chưa có mặt trong diễn đàn  
Old 28-06-2007, 09:16 PM   #13
NBC
Nhập môn đệ tử
 
NBC's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 3
:
Ghi và đọc bộ nhớ ngoài

Đây là đoạn chương trình có chức năng đọc giá trị ADC, sau đó ghi vào RAM ngoài, rồi đọc từ RAM ngoài để xử lí.
Có một vấn đề là khi tôi xóa dòng
output_high( PIN_D7 );
ở cuối hàm if thì các hàm này không thực thi được. Bác nào biết xin chỉ giúp tại sao.
File Kèm Theo
File Type: rar GhiDocRamNgoai.rar (17.2 KB, 287 lần tải)
NBC vẫn chưa có mặt trong diễn đàn  
Old 28-06-2007, 11:53 PM   #14
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
mình đánh lại chương trình trên ,CCS thông báo không có lỗi gì nhưng khi mô phỏng không chạy được.
mong mọi người tìm ra chỗ sai hộ mình!
thank!

Code:
#include "C:\Documents and Settings\Administrator\Desktop\thu\giai ma ban phim\giai ma ban phim.h"

#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
//giai ma ban phim
#use fast_io(b)
#use fast_io(c)
#byte portb = 0x06
#byte portc = 0x07
#byte intcon = 0x000B
#bit RB0 = portB.0
#bit RB1 = portB.1
#bit RB2 = portB.2
#bit RB3 = portB.3
#bit RB4 = portB.4
#bit RB5 = portB.5
#bit RB6 = portB.6
#bit RB7 = portB.7
#bit RBIF = intcon.0 //dinh nghia ham ngat cong RB
#bit RBIE = intcon.3 //dinh nghia bit ngat RB
int a;
const unsigned char digital[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f\
                                 0x77,0x7c,0x39,0x5e,0x79,0x71};
      
//tao ham ngat
#int_ext
void ngat_RB(){
                     IF((RBIF)&&(RBIE)){
                                            if(RB4&&RB0)
                                            { a = digital[0];}
                                             
                                             if(RB5&&RB0)  
                                             {a = digital[1];}
                                             
                                            if(RB6&&RB0) 
                                            { a = digital[2];}
                                             
                                             if(RB7&&RB0) 
                                             {a = digital[3];}
                                             ////
                                             if(RB4&&RB1)
                                             { a = digital[4];} 
                                              
                                             if(RB5&&RB1)  
                                             {a = digital[5];}
                                             
                                             if(RB6&&RB1)  
                                             {a = digital[6];}
                                             
                                             if(RB7&&RB1) 
                                             {a = digital[7];}
                                             ////
                                             if(RB4&&RB2)
                                             {a = digital[8];} 
                                             
                                             if(RB5&&RB2)  
                                             {a = digital[9];}
                                             
                                             if(RB6&&RB2) 
                                             {a = digital[10];}
                                             
                                             if(RB7&&RB2) 
                                             {a = digital[11];}
                                             RBIF =0; //xoa co ngat                                          
} 
}
                                                                       
                     
                     
   //tao ham chinh
   void main(){
                    set_tris_b(0xf0);
                    set_tris_c(0x00);
                    portb = 0;
                    portc = 0;
                    enable_interrupts(int_ext); //ngat toan bo
                    ext_int_edge(H_to_L);
                    enable_interrupts(global);
                    while(true){
                              portb = 1;
                              portb = 2;
                              portb = 4;
                              portb = 8;
                              portc = a;
                    }
                        }

thay đổi nội dung bởi: falleaf, 29-06-2007 lúc 03:20 PM.
anh_gioi vẫn chưa có mặt trong diễn đàn  
Old 29-06-2007, 11:55 AM   #15
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Trích:
Nguyên văn bởi anh_gioi View Post
mình đánh lại chương trình trên ,CCS thông báo không có lỗi gì nhưng khi mô phỏng không chạy được.
mong mọi người tìm ra chỗ sai hộ mình!
thank!

#include "C:\Documents and Settings\Administrator\Desktop\thu\giai ma ban phim\giai ma ban phim.h"

#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
...
Ở đây có cả giải thuật và code, đã test trên mạch thật. Bạn tham khảo thêm:
http://www.picvietnam.com/forum/showthread.php?t=839
nhh 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à 03:54 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