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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 13-08-2008, 06:11 PM   #1
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
Với C (kiểu dữ liệu của CCS C), bạn có thể viết tổng quát như sau:
Code:
	value = (int16 (percent*period))/100;
Trong trường hợp cụ thể mà bạn dùng để thử xem nút nhấn có thay đổi được duty cycle hay không, period = 200, do đó có thể viết gọn lại là:
Code:
	value = percent*2;
sẽ không xảy ra tràn số đối với value.

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 14-08-2008, 11:35 AM   #2
cong1810
Đệ tử 4 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 62
:
Send a message via Yahoo to cong1810
Trích:
Nguyên văn bởi picpen View Post
Cong1810 ! Mình nghĩ biểu thức bạn dùng để tính giá trị value ko ổn ," value=percent*period/100; " , 3 biến value,percent,period bạn đều định nghĩa dạng INT8 ,vậy khi chương trình thực hiện biểu thức nó sẽ làm phép nhân trước " percent*period " ,giá trị của phép nhân này có thể lớn hơn 8 bit ( thường phải lưu vào biến 16 bit) ,nếu giá trị này lưu vào biến 8 bit nó có thể bị tràn và dẫn tới kết quả tính toán bị sai .
Mình thấy đoạn khai báo chương trình chính của bạn sai cú pháp : phải là , VOID main() ( thiếu VOID nha )
ừ nhỉ.mình ko để ý đến việc này.
cái void main.mình thấy ko có void nó vẫn hoạt động bình thường mà!!
nhưng mà mình sửa như bạn và anh namqn nói.mô phỏng vẫn ko chạy.
nhưng khi đổi sang ngắt ngoài thì ok!!
vậy tại sao vậy nhỉ!!
cong1810 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-08-2008, 10:48 PM   #3
picpen
Đệ tử 5 túi
 
picpen's Avatar
 
Tham gia ngày: Jun 2008
Bài gửi: 112
:
Cool Số thực với LCD & Led7seg....

Khi mới học lập trình thì những bài toán giao tiếp với LCD và led 7 thanh là rất cơ bản và đơn giản.
Vậy mà đã học được 1 thời gian rùi nay mình lại bị mắc một bài toán : " Hiển thị giá trị số thực lên LCD và Led 7 thanh "
Nhờ các bá cao thủ trên diễn đàn chỉ giáo, ko biết làm thế nào để xác định giá trị trong một biến là số thực hay số nguyên ??? Rồi lại còn phải tách phần nguyên và phần thập phân nữa chứ ....... hóc búa quá .** Mong được mọi người chỉ giáo ...thank ****
__________________
** xin hãy cho tôi là tượng đá
** Để muôn đời không nhớ thương ai ..!!
picpen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-08-2008, 12:07 AM   #4
picpen
Đệ tử 5 túi
 
picpen's Avatar
 
Tham gia ngày: Jun 2008
Bài gửi: 112
:
trả lời cong810

Cong810 ! mình đã load bài của bạn về và chỉnh sửa 1 chút xíu, và giờ thì nó chạy ngon lành rùi, bạn bị mắc một lỗi rất nhỏ lên khó phát hiện ra khi chỉnh sửa.
Khi chương trình nhảy đến trình phục vụ ngắt Rb,nó sẽ thực hiện các câu lệnh trong đó,bạn dùng chân Rb4 để thực hiện phục vụ ngắt,nếu trong trình phục vụ ngắt bạn kiểm tra xem Rb4 có =1 ko, nếu =1 thì thực hiện việc thay đổi giá trị biến " percent " ,nếu ko thoát khỏi trình phục vụ ngắt ,như vậy chương trình sẽ chạy ngon lành
đây là chương trình mình đã sử và cho chạy mo fong được rồi

Code:
...#include<16f877a.h>
#fuses XT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#byte portb=0x06
int8 value=0,period=200,percent=0;
#int_RB
void inter_RB()
{
if( rb4 =1)       // phai kiem tra Rb4 nhe 
   {   
      if(percent==100)percent=100;
         
      else percent=percent+5;
   }    
}
main()
{
set_tris_c(0x00);
set_tris_b(0b00010000);
portb=0x00;
enable_interrupts(INT_RB);
enable_interrupts(global);
ext_int_edge(l_to_h);
setup_CCP1(CCP_PWM);
setup_timer_2(t2_div_by_1,199,1);

while(1)
{
 value=percent*period/100; 
  set_pwm1_duty(value);
}
}
__________________
** xin hãy cho tôi là tượng đá
** Để muôn đời không nhớ thương ai ..!!

thay đổi nội dung bởi: picpen, 17-08-2008 lúc 12:17 AM.
picpen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-08-2008, 01:29 PM   #5
picpen
Đệ tử 5 túi
 
picpen's Avatar
 
Tham gia ngày: Jun 2008
Bài gửi: 112
:
có ai biết thì giúp mình giải quyết vấn đề : Hiển thị giá trị số thực lên LCD và led 7 thanh với *********** thank ***********
__________________
** xin hãy cho tôi là tượng đá
** Để muôn đời không nhớ thương ai ..!!
picpen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-08-2008, 12:01 AM   #6
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 picpen View Post
có ai biết thì giúp mình giải quyết vấn đề : Hiển thị giá trị số thực lên LCD và led 7 thanh với *********** thank ***********
Bạn đã đọc tài liệu hướng dẫn của CCS C chưa? Tôi không dùng CCS C, nhưng đọc qua tài liệu hướng dẫn của CCS C thì nhận thấy những điểm sau:

- Hàm printf có thể in số thực (float), có định dạng
- Hàm printf có thể xuất kết quả đến một hàm khác, thay vì ra stdout

Vậy có thể dùng hàm printf() để in số thực (float) của bạn đến một hàm nào đó, mà hàm đó sẽ xuất kết quả này lên LCD/LED 7 thanh.

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 21-08-2008, 12:52 AM   #7
phamminhtuan
Super Moderator
 
phamminhtuan's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 150
:
Trích:
Nguyên văn bởi picpen View Post
có ai biết thì giúp mình giải quyết vấn đề : Hiển thị giá trị số thực lên LCD và led 7 thanh với *********** thank ***********
Bạn có thể sử dụng như sau cho LCD, dùng thư viện lcd.c của CCS luôn, nếu cần xuất cho led 7 thanh hay cái gì đó thì bạn viết lại 1 hàm giống như hàm lcd_putc() của thư viện này cũng được.
PHP Code:
float fvar 1.2345;
printf(lcd_putc"Float: %f"fvar); 
Nếu muốn in ra LED 7 thanh thì bạn có thể viết 1 hàm chuyển đổi ascii sang mã 7 thanh lưu trong 1 vùng RAM, tham số truyền vào là kí tự ascii, chương trình của bạn sẽ hiển thị vùng RAM đó ra LED 7 thanh, hàm này viết cấu trúc giống như lcd_putc là ok
Hàm lcd_putc như thế này
PHP Code:
void lcd_putcchar 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;
   }

có thể sửa lại giống thế này
PHP Code:
unsigned char ptr 0;
unsigned char buffer[10]; //vùng RAM chứa mã LED 7 đoạn để xuất ra, ở đây là 10 LED
void led7segchar c) {
    
unsigned num;
    
num 0x30;
    
buffer[ptr] = table_led7doan[num];
    
ptr++;
    if(
ptr>=10ptr 0;
}
//với table_led7doan[] là bảng const chứa mã 7 đoạn từ 0-9
//Bạn muốn in từ vị trí nào thì cho ptr bằng giá trị đó


//Bạn sử dụng hàm printf như sau
printf(led7seg"Float: %f",fvar);
//đảm bảo chạy 100% 
phamminhtuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-08-2008, 11:39 PM   #8
picpen
Đệ tử 5 túi
 
picpen's Avatar
 
Tham gia ngày: Jun 2008
Bài gửi: 112
:
Mòn mỏi đợi chờ ,ý kiến góp ý ,gợi ý giúp đỡ chỉ giáo của anh em trong gia đình pic mà ko có ai quan tâm giúp đỡ hic ... hic ... Chắc câu hỏi của mình chuối quá hay thiếu " I ỐT " ko biết nữa..hic ...hic
__________________
** xin hãy cho tôi là tượng đá
** Để muôn đời không nhớ thương ai ..!!
picpen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-08-2008, 09:23 AM   #9
kebitmat_f
Đệ tử 1 túi
 
Tham gia ngày: May 2006
Bài gửi: 12
:
Mình thấy khi lập trình ccs khai báo clock=20MHz, nhưng mô phỏng bằng proteus, mục processor clock frequency =4Mhz. 1 cái nữa là thiết kế mạch dao động chọn thạch anh là 20Mhz. Như thế chương trình sẽ chạy theo 4Mhz hay 20Mhz? Tóm lại nó sẽ chạy theo ccs,proteus hay mạch cứng thạch anh? rối quá.... Mong bà kon chỉ bảo sớm.
kebitmat_f vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-08-2008, 11:49 AM   #10
phamminhtuan
Super Moderator
 
phamminhtuan's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 150
:
Trích:
Nguyên văn bởi kebitmat_f View Post
Mình thấy khi lập trình ccs khai báo clock=20MHz, nhưng mô phỏng bằng proteus, mục processor clock frequency =4Mhz. 1 cái nữa là thiết kế mạch dao động chọn thạch anh là 20Mhz. Như thế chương trình sẽ chạy theo 4Mhz hay 20Mhz? Tóm lại nó sẽ chạy theo ccs,proteus hay mạch cứng thạch anh? rối quá.... Mong bà kon chỉ bảo sớm.
Khai báo #use delay(clock=xxMhz) là chỉ dẫn để CCS tạo ra mã delay đúng với tần số thạch anh mà mình sử dụng, ví dụ bạn sử dụng thạch anh 4Mhz, thì khai báo #use delay(clock=4Mhz), như thế thì cái hàm delay_ms(100) mới delay đúng 100ms, còn nếu bạn khai báo 4Mhz, nhưng sử dụng thạch anh 20Mhz thì dĩ nhiên hàm delay đó sẽ không còn đúng nữa, lúc này thay vì 100ms thì nó chỉ còn 100/5 = 20ms thôi, ngoài ra nếu bạn sử dụng UART cũng không đúng, vì clock bạn khai báo sai mà.

Thế nên, bạn cứ ép buộc nó chạy thì nó vẫn chạy, không theo ý bạn thôi, muốn nó chạy đúng thì phần cứng ra làm sao, khai báo trong phần mềm như vậy
phamminhtuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-08-2008, 09:32 AM   #11
kebitmat_f
Đệ tử 1 túi
 
Tham gia ngày: May 2006
Bài gửi: 12
:
Cho mình hỏi thêm 1 cái nữa : khi sử dụng thạch anh 4Mhz thì chu kì thực thi 1 lệnh của vi điều khiển là 1micros. khi sử dụng thạch anh 20Mhz thì chu kì sẽ khác. Vì trong cái tutor của Nguyễn Trung Chính ở bài " Pic6f877a từ dễ tới khó" có đề cập đến vấn đề này. Sử dụng hàm tạo trễ: thời gian trễ = số chu kì lệnh*thời gian 1 lệnh .Như vậy có điều gì khác khi gọi hàm delay_ms(100) ứng với chọn thạch anh 4Mhz và 20Mhz?
kebitmat_f vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-08-2008, 05:33 PM   #12
kebitmat_f
Đệ tử 1 túi
 
Tham gia ngày: May 2006
Bài gửi: 12
:
Thanks nhiều nha. Mình hiểu rồi
kebitmat_f vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-08-2008, 10:24 PM   #13
picpen
Đệ tử 5 túi
 
picpen's Avatar
 
Tham gia ngày: Jun 2008
Bài gửi: 112
:
Cám ơn bác Nam và bác PhạmMinhTuan nhiều !! đúng là em lười biếng quá ,trong tài liệu về css có nói tới hàm printf(), em thấy hàm này rất mạnh và ngắn ngọn, cách use nó trong ccs giống hệt khi use nó trong tubo c ( c căn bản ) hi ..hi..
Từ giờ em phải chịu khó đọc thật nhiều tài liệu mới được, không cái gì cũng đem hỏi các bác thế này thì " quê" quá hic..hic
Như 2 bác chỉ thì em đã hiển thị được số thực lên LCD một cách ngon lành rùi ..... Nhưng vấn đề về led 7 thanh thì em chưa rõ nắm .theo em suy luận thì thế này nhé : giả sử ta có 1 biến giá trị là " VALUE " chẳng hạn , nếu giá trị này là số nguyên thì em biết cách hiển thị rồi ,nhưng nếu nó là số thực thì theo em đầu tiên ta phải tách các chữ số ( bcd) trong giá trị đó ra thành các số như: số hàng trăm,chục,đơn vị..( các số phần nguyên),sau đó xác định các chữ số phần thập phân rồi xác định dấu chấm nằm ở đâu . sau đó ta mới xuất các giá trị đó ra cổng kết nối với led 7 thanh ........
Dù đã cố gấng đọc ct của bác Phamminhtuan em vẫn chưa hiểu sao lại dùng hàm printf() xuất ra led 7 thanh
printf(led7seg, "Float: %f",fvar);???????
**** Cám ơn bác ,mong bác chỉ rõ hơn ********** Thank ********
__________________
** xin hãy cho tôi là tượng đá
** Để muôn đời không nhớ thương ai ..!!
picpen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-08-2008, 11:56 PM   #14
phamminhtuan
Super Moderator
 
phamminhtuan's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 150
:
Trích:
Nguyên văn bởi picpen View Post
Cám ơn bác Nam và bác PhạmMinhTuan nhiều !! đúng là em lười biếng quá ,trong tài liệu về css có nói tới hàm printf(), em thấy hàm này rất mạnh và ngắn ngọn, cách use nó trong ccs giống hệt khi use nó trong tubo c ( c căn bản ) hi ..hi..
Từ giờ em phải chịu khó đọc thật nhiều tài liệu mới được, không cái gì cũng đem hỏi các bác thế này thì " quê" quá hic..hic
Như 2 bác chỉ thì em đã hiển thị được số thực lên LCD một cách ngon lành rùi ..... Nhưng vấn đề về led 7 thanh thì em chưa rõ nắm .theo em suy luận thì thế này nhé : giả sử ta có 1 biến giá trị là " VALUE " chẳng hạn , nếu giá trị này là số nguyên thì em biết cách hiển thị rồi ,nhưng nếu nó là số thực thì theo em đầu tiên ta phải tách các chữ số ( bcd) trong giá trị đó ra thành các số như: số hàng trăm,chục,đơn vị..( các số phần nguyên),sau đó xác định các chữ số phần thập phân rồi xác định dấu chấm nằm ở đâu . sau đó ta mới xuất các giá trị đó ra cổng kết nối với led 7 thanh ........
Dù đã cố gấng đọc ct của bác Phamminhtuan em vẫn chưa hiểu sao lại dùng hàm printf() xuất ra led 7 thanh
printf(led7seg, "Float: %f",fvar);???????
**** Cám ơn bác ,mong bác chỉ rõ hơn ********** Thank ********
Có lẽ cũng là bạn bên dientuvietnam.net: http://dientuvietnam.net/forums/show...68&postcount=6
Mình đã viết rõ trong luồng này rồi, cái bảng table_led7doan[] định nghĩa const với 20 giá trị là mã 7 đoạn từ 0-9 và mã 7 đoạn từ 0-9 có dấu chấm,
phamminhtuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-08-2008, 03:06 AM   #15
luanktd
Đệ tử 2 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 35
:
Mình muốn hỏi các bác.Mình có viết một chương trình sau với PIC8F4431 nhưng khi dịch ra chạy thì chạy không đươc
Code:
#include<18f4431.h>
#fuses NOWDT,NOLVP,PUT,XT
#byte PORTB=0xF81
#byte TRISB=0xF93
void main()
{ 
 While(1)
  {
   TRISB=0x00;
   PORTB=0x0F;
  }
}
Các chân ở portB đều là 0V hết.Mong các bác chỉ giáo

thay đổi nội dung bởi: namqn, 23-08-2008 lúc 05:56 AM.
luanktd 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à 11:26 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