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 21-04-2011, 11:20 PM   #1
saobang
Đệ tử 1 túi
 
Tham gia ngày: Apr 2011
Nơi Cư Ngụ: Quảng Nam
Bài gửi: 13
:
Nhờ các anh chị giải thích giúp em đoạn code

Em tìm được đoạn code này ( đọc encode và tính toán hiển thị số vòng động cơ lên LCD 16x2) nhưng còn vài chỗ chưa hiểu vì ngôn ngữ C em chưa bik nhiều lắm, mong anh chị giải thích giùm em. Em cũng mới tìm hiểu về Pic.
Code:
#include <16f877a.h>
#include <def_877a.h>
#include <lcd_lib_4bit.c>
#use delay(clock=20000000)
int8 nghin,tram,chuc,donvi;
void tinhtoan_hienthi(int16 x);
int16 count,so_vong,int_count1,x;
#define INTS_PER_SECOND1 25
#int_rtcc                           // Ngat Timer 0
void Timer0_isr()                   // Dem so vong quay dong co
{
   count++;
}

#INT_TIMER1                        // Chuong trinh ngat Timer 1
void Timer1_isr()
 {                // Ham duoc goi khi Timer1 tran (65535->0)   //
                    //Timer1 dinh thoi 1s                                 //
                                   
    if(--int_count1==0)                                                   //Em chưa hiểu cái hàm timer 
    {                                                          //này nó như thế nào
      int_count1 = INTS_PER_SECOND1;
      so_vong = (count*255 + get_timer0())/400;                 //
      count = 0;
      set_timer0(0);
    }
}
void tinhtoan_hienthi(int16 x) // giải thích lun giúp em hàm này
{nghin = x / 1000 + 0x30;
x = x % 1000;
 tram = x / 100 + 0x30; // tach so hang tram
 x = x % 100; // chia lay phan du
 chuc = x / 10 + 0x30; // tach lay phan chuc
 donvi = x % 10 + 0x30; // phan don vi
 lcd_putcmd(0xC0);
 printf(lcd_putchar,"toc do=");
 lcd_putchar(nghin);
 lcd_putchar(tram);
 lcd_putchar(chuc);
 lcd_putchar(donvi);
}
void init()
{  
   lcd_putcmd(0x80);
   int_count1 = INTS_PER_SECOND1;//19 lan 1 giay
   setup_timer_0 (RTCC_DIV_1|RTCC_EXT_H_TO_L);  // Timer0 is Counter
   set_timer0(0);
   set_timer1(15535);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);    // Timer1 is Timer
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
    count = 0;
   lcd_init();
  delay_ms(200);
  printf(lcd_putchar,"toc do dong co");
}
void main()
{
   init();

//setup_adc_ports(NO_ANALOGS);
//setup_adc(ADC_OFF);
//setup_psp(PSP_DISABLED);
//setup_spi(FALSE);


  so_vong = 0;// khoi tao gia tri
while(1) // doan chuong trinh hien thi len LCD
{
   tinhtoan_hienthi(so_vong);
   delay_ms(500);
}
}
chỗ cái hàm timer đó cách tính số vòng như thế nào vậy?
với lại các lệnh tách số đó em nên hiểu như thế nào ?
Em hỏi hơi nhiều nhỉ? hihi. nhưng mà nghĩ ko ra nên đành lên đây hỏi vậy!
em cảm ơn trước ạh!
saobang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-04-2011, 12:40 AM   #2
tanbka
Đệ tử 5 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
:
Trích:
Nguyên văn bởi saobang View Post
Em tìm được đoạn code này ( đọc encode và tính toán hiển thị số vòng động cơ lên LCD 16x2) nhưng còn vài chỗ chưa hiểu vì ngôn ngữ C em chưa bik nhiều lắm, mong anh chị giải thích giùm em. Em cũng mới tìm hiểu về Pic.
Code:
#include <16f877a.h>
#include <def_877a.h>
#include <lcd_lib_4bit.c>
#use delay(clock=20000000)
int8 nghin,tram,chuc,donvi;
void tinhtoan_hienthi(int16 x);
int16 count,so_vong,int_count1,x;
#define INTS_PER_SECOND1 25
#int_rtcc                           // Ngat Timer 0
void Timer0_isr()                   // Dem so vong quay dong co
{
   count++;
}

#INT_TIMER1                        // Chuong trinh ngat Timer 1
void Timer1_isr()
 {                // Ham duoc goi khi Timer1 tran (65535->0)   //
                    //Timer1 dinh thoi 1s                                 //
                                   
    if(--int_count1==0)                                                   //Em chưa hiểu cái hàm timer 
    {                                                          //này nó như thế nào
      int_count1 = INTS_PER_SECOND1;
      so_vong = (count*255 + get_timer0())/400;                 //
      count = 0;
      set_timer0(0);
    }
}
void tinhtoan_hienthi(int16 x) // giải thích lun giúp em hàm này
{nghin = x / 1000 + 0x30;
x = x % 1000;
 tram = x / 100 + 0x30; // tach so hang tram
 x = x % 100; // chia lay phan du
 chuc = x / 10 + 0x30; // tach lay phan chuc
 donvi = x % 10 + 0x30; // phan don vi
 lcd_putcmd(0xC0);
 printf(lcd_putchar,"toc do=");
 lcd_putchar(nghin);
 lcd_putchar(tram);
 lcd_putchar(chuc);
 lcd_putchar(donvi);
}
void init()
{  
   lcd_putcmd(0x80);
   int_count1 = INTS_PER_SECOND1;//19 lan 1 giay
   setup_timer_0 (RTCC_DIV_1|RTCC_EXT_H_TO_L);  // Timer0 is Counter
   set_timer0(0);
   set_timer1(15535);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);    // Timer1 is Timer
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
    count = 0;
   lcd_init();
  delay_ms(200);
  printf(lcd_putchar,"toc do dong co");
}
void main()
{
   init();

//setup_adc_ports(NO_ANALOGS);
//setup_adc(ADC_OFF);
//setup_psp(PSP_DISABLED);
//setup_spi(FALSE);


  so_vong = 0;// khoi tao gia tri
while(1) // doan chuong trinh hien thi len LCD
{
   tinhtoan_hienthi(so_vong);
   delay_ms(500);
}
}
chỗ cái hàm timer đó cách tính số vòng như thế nào vậy?
với lại các lệnh tách số đó em nên hiểu như thế nào ?
Em hỏi hơi nhiều nhỉ? hihi. nhưng mà nghĩ ko ra nên đành lên đây hỏi vậy!
em cảm ơn trước ạh!
Theo minh nghĩ chương trình này đọc encoder rồi quy ra số vòng quay. Hàm ngắt timer 1 chỉ để định một thời gian nhất định để cập nhật số vòng quay, quy ra bởi giá trị đọc được của timer0
Còn lệnch tách số, mỗi đơn vị(hàng nghìn, trăm...) phải cộng thêm giá trị 0x30 để giải mã hiển thị trên LCD.
Không bit có giúp gì được cho bạn không...
tanbka vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-04-2011, 01:23 AM   #3
hcmut.khoamaisi
Đệ tử 4 túi
 
hcmut.khoamaisi's Avatar
 
Tham gia ngày: Dec 2009
Nơi Cư Ngụ: TPHCM
Bài gửi: 79
:
Send a message via Yahoo to hcmut.khoamaisi
void tinhtoan_hienthi(int16 x) :Hàm này tách các số của x ra thành từng số(hàng đơn vị ,chục trăm .Vì LCD của bạn chỉ xuất ra dữ liệu từng số một theo bảng mã riêng của nó (nên phải cộng thêm 0x30 phía sau mỗi phép tính để ra đúng cái số cần hiển thị)
void Timer0_isr():cập nhật giá trị biến count ,rồi từ count suy ra số vòng.
Bạn hỏi không nhiều !Với cách post bài rõ ràng sẽ luôn có người trả lời
__________________
My blog: http://autumnneverreturn.blogspot.com/
Đối thủ khó chiến thắng nhất là bản thân !!!
hcmut.khoamaisi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-04-2011, 10:15 AM   #4
saobang
Đệ tử 1 túi
 
Tham gia ngày: Apr 2011
Nơi Cư Ngụ: Quảng Nam
Bài gửi: 13
:
Em cảm ơn 2 a nhiều! Nhưng mà 2 a chưa có hiểu ý e hỏi, nói đúng hơn là e cũng ko biết nói sao cho mấy a hiểu nữa ( e tệ về khoảng diễn đạt ý này lắm). Ý của em đại loại là như thế này:
ví dụ như trong đoạn code này:
Code:
void Timer1_isr()
 {                // Ham duoc goi khi Timer1 tran (65535->0)   //
                    //Timer1 dinh thoi 1s                                 //
                                   
    if(--int_count1==0)                                                   //Em chưa hiểu cái hàm timer 
    {                                                          //này nó như thế nào
      int_count1 = INTS_PER_SECOND1;
      so_vong = (count*255 + get_timer0())/400;                 //
      count = 0;
      set_timer0(0);
    }
câu lệnh "if(--int_count1==0) " thì em hỉu câu lệnh đó là: " cứ mỗi khi timer1 tràn thì biến int_count1 giảm đi 1, đến khi int_count1=0 thì sẽ thực hiện các lệnh tiếp theo trong hàm. (không biết đúng không nữa) hì hì
Còn những lệnh tiếp theo em chưa hiểu. Mong các ace chỉ rõ rõ giùm.
vd như sao lại phải gán int_count1=INTS_PER_SECOND1
saobang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-04-2011, 11:19 AM   #5
tanbka
Đệ tử 5 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
:
Trích:
Nguyên văn bởi saobang View Post
Em cảm ơn 2 a nhiều! Nhưng mà 2 a chưa có hiểu ý e hỏi, nói đúng hơn là e cũng ko biết nói sao cho mấy a hiểu nữa ( e tệ về khoảng diễn đạt ý này lắm). Ý của em đại loại là như thế này:
ví dụ như trong đoạn code này:
Code:
void Timer1_isr()
 {                // Ham duoc goi khi Timer1 tran (65535->0)   //
                    //Timer1 dinh thoi 1s                                 //
                                   
    if(--int_count1==0)                                                   //Em chưa hiểu cái hàm timer 
    {                                                          //này nó như thế nào
      int_count1 = INTS_PER_SECOND1;
      so_vong = (count*255 + get_timer0())/400;                 //
      count = 0;
      set_timer0(0);
    }
câu lệnh "if(--int_count1==0) " thì em hỉu câu lệnh đó là: " cứ mỗi khi timer1 tràn thì biến int_count1 giảm đi 1, đến khi int_count1=0 thì sẽ thực hiện các lệnh tiếp theo trong hàm. (không biết đúng không nữa) hì hì
Còn những lệnh tiếp theo em chưa hiểu. Mong các ace chỉ rõ rõ giùm.
vd như sao lại phải gán int_count1=INTS_PER_SECOND1
Cau lenh int_count1=INTS_PER_SECOND1 de gan lai gia tri int_cont1 ma (luc nay no da giam het ve 0), lan sau ve 0 so_vong lai duoc tinh tiep ma.
count là số lần ngắt của timer0 => count*255+gia tri hien thoi cua timer0 suy ra so xung encoder ma no nhan duoc, phai chia cho 400 la so xung trong 1 vong=> so vong quay
tanbka vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-04-2011, 11:25 AM   #6
maidona
Nhập môn đệ tử
 
Tham gia ngày: Apr 2011
Bài gửi: 1
:
Download tài liệu nghiên cuws khoa học nghành cơ khí

Tên bài báo: Nghiên cứu khoa học nghành cơ khí

Tác giả: Jackson
Chủ đề bài báo: Động lực
đề tài đang nghiên cứu: Cơ cấu tăng tôc ô tô
Email gửi về;Hooconghai@gmail.com
maidona vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-04-2011, 12:52 PM   #7
saobang
Đệ tử 1 túi
 
Tham gia ngày: Apr 2011
Nơi Cư Ngụ: Quảng Nam
Bài gửi: 13
:
Cảm ơn a tanbka và các a. Bây giờ thì em đã hiểu rồi! các ace nhiệt tình quá! nhưng mà khi dịch đoạn code sang file hex thì nó báo lỗi "undefined identifier--delay_ms","undefined identifier--delay_us" trên file <lcd_lib_4bits.c> như hình dưới . mấy a chỉ em cách khắc phục với!
Hình Kèm Theo
File Type: jpg Untitled.jpg (236.5 KB, 1 lần tải)

thay đổi nội dung bởi: saobang, 22-04-2011 lúc 12:54 PM. Lý do: thêm file đính kèm
saobang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-04-2011, 03:00 PM   #8
tanbka
Đệ tử 5 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
:
Trích:
Nguyên văn bởi saobang View Post
Cảm ơn a tanbka và các a. Bây giờ thì em đã hiểu rồi! các ace nhiệt tình quá! nhưng mà khi dịch đoạn code sang file hex thì nó báo lỗi "undefined identifier--delay_ms","undefined identifier--delay_us" trên file <lcd_lib_4bits.c> như hình dưới . mấy a chỉ em cách khắc phục với!
Bạn phải khai báo sử dụng hàm delay của trình dịch
#use delay(clock=20000000)
tanbka vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-04-2011, 08:13 PM   #9
saobang
Đệ tử 1 túi
 
Tham gia ngày: Apr 2011
Nơi Cư Ngụ: Quảng Nam
Bài gửi: 13
:
Trích:
Nguyên văn bởi tanbka View Post
Bạn phải khai báo sử dụng hàm delay của trình dịch
#use delay(clock=20000000)
Em dịch đoạn code mà em đưa lên hỏi đó anh! em đã khai báo dùng delay rồi mà!
nó cứ báo lỗi trên file <lcd_lib_4bit.c> í!
file đó em down trên 4rum này!
tìm lỗi giúp giùm em ạh!
Em đính kèm file lcd_lib_4bit lên cho mấy a kiểm tra giúp có phải lỗi nằm trong file đó ko nha! Còn đoạn code thì em dịch đoạn code trên #1 í!
File Kèm Theo
File Type: rar lcd_lib_4bit.rar (748 Bytes, 14 lần tải)
saobang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-04-2011, 09:34 PM   #10
caremlanh
Đệ tử 3 túi
 
caremlanh's Avatar
 
Tham gia ngày: Jul 2010
Nơi Cư Ngụ: hcm
Bài gửi: 52
:
Send a message via Yahoo to caremlanh
Đổi
#use delay(clock=20000000)
lên truớc
#include <lcd_lib_4bit.c>
caremlanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-04-2011, 11:48 PM   #11
tanbka
Đệ tử 5 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
:
Bac caremlanh noi dung day, ban thu xem
tanbka vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-04-2011, 12:19 AM   #12
saobang
Đệ tử 1 túi
 
Tham gia ngày: Apr 2011
Nơi Cư Ngụ: Quảng Nam
Bài gửi: 13
:
oh! đc rồi! thanks caremlanh với tanbka nhìu nha! hihi!
Mai nạp dzô mạch test thử coi!
saobang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-04-2011, 04:47 PM   #13
hcmut.khoamaisi
Đệ tử 4 túi
 
hcmut.khoamaisi's Avatar
 
Tham gia ngày: Dec 2009
Nơi Cư Ngụ: TPHCM
Bài gửi: 79
:
Send a message via Yahoo to hcmut.khoamaisi
Hì hì thông thừong nạp vô lần đầu không bao giờ chạy!phải sửa nhiều lần
__________________
My blog: http://autumnneverreturn.blogspot.com/
Đối thủ khó chiến thắng nhất là bản thân !!!
hcmut.khoamaisi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-04-2011, 12:34 AM   #14
tanbka
Đệ tử 5 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
:
Trích:
Nguyên văn bởi hcmut.khoamaisi View Post
Hì hì thông thừong nạp vô lần đầu không bao giờ chạy!phải sửa nhiều lần
hì hì... phải có sai mới có sửa, mà có sửa mới có tiến bộ...
tanbka vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-04-2011, 04:14 PM   #15
saobang
Đệ tử 1 túi
 
Tham gia ngày: Apr 2011
Nơi Cư Ngụ: Quảng Nam
Bài gửi: 13
:
đúng thiệt! chưa test được. đấu encoder vào mà quên mắc thêm cái trở hạn dòng nên cái encoder đi lun! cái miếng tròn nó bị chảy ngay chỗ cặp mắt thu phát! hic!
saobang 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à 08:10 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