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 03-08-2006, 08:18 AM   #1
briantk_1988
Đệ tử 2 túi
 
Tham gia ngày: May 2006
Nơi Cư Ngụ: Princeton University, NJ, US
Bài gửi: 42
:
Send a message via Yahoo to briantk_1988
Cám ơn bác hpecom, cháu hoc lớp chồi THPT (sinh năm 1988 mà lị) :-), hết lớn rồi, ăn nhiều cũng không lớn nổi.

Các bác cho cháu hỏi cau này về CCS: trong hầu hết các ví dụ của CCS C, họ đều dùng printf (RS232) để xuất dữ liệu. Cháu không hiểu làm như thể để làm gì. Cháu cũng không biết vẽ mạch thế nào để xuất hiện các dòng chữ trong printf.

Cám ơn các bác...
briantk_1988 vẫn chưa có mặt trong diễn đàn  
Old 21-07-2006, 10:48 AM   #2
dohoangnam
Đệ tử 1 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 22
:
Tỗi sẽ thử CCS này xem sao. Thú thực tôi cũng có dùng qua nó, với Mikro C, với HTPIC, thì thấy khả năng tối ưu mã của nó không tốt lắm nên không thích thôi nhưng thấy mọi người khen nhiều quá tôi phải xem lại. Tôi thấy Mikro rất tốt, chuyên nghiệp nhanh nhẹn và có nhiều hỗi trợ, dễ sử dụng.
dohoangnam vẫn chưa có mặt trong diễn đàn  
Old 01-08-2006, 09:56 AM   #3
heliman
Nhập môn đệ tử
 
Tham gia ngày: Jul 2006
Bài gửi: 2
:
Tôi chạy thử bài LCDFirst của bác nhh rồi, bác kiếm con LCD HD4470 (16_X_2) màu vàng này ở đâu thế(Nó không có trong thư viện của Proteus). Tôi ghép song song với LCD LM016L (trong TV Proteus) mà cái hiện, cái không.

Sao không gửi hình JPG được nhỉ. tôi sẽ gửi cho bác nhh dể bác gửi lên vậy.

thay đổi nội dung bởi: heliman, 01-08-2006 lúc 10:03 AM.
heliman vẫn chưa có mặt trong diễn đàn  
Old 01-08-2006, 05:38 PM   #4
heliman
Nhập môn đệ tử
 
Tham gia ngày: Jul 2006
Bài gửi: 2
:
Bác nhh ơi , bác ghi tiêu đề là "dùng 4 bít LCD dữ liệu", nhưng bác lại gửi nhầm file " lcd_pvn.rar" lên . File này đã được gửi trước đó, nhưng là file "dùng 8 bit dữ liệu" .
Bác gửi file rar đó (4 bit dl , sơ đồ + code) lên cho anh em cùng tham khảo.

Trích:
Nguyên văn bởi nhh
Cái này trong thư viện của CCS C đã có file lcd.c trong thư mục Drivers rất là hay rồi, nên không cần viết lại làm gì.File này rất hay,nhưng chỉ dùng cho LCD 2 line.Các bác tự nghiên cíu nhé!

Chương trình hiển thị chữ "HI!" bắt đầu tại hàng 1, cột 7.Dùng LCD 4bit interface và thư viện lcd.c của CCS C

Code:
/*-----------------------------------------------------------------------------
* Author  	: nhh
* Date    	: 05/14/06
* Hardware	: PIC16F877A
* Compiler  	: CCS C 3.249
* Description   : Hien thi LCD
*=============================================================================*/
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>

void main(void)
{

    delay_ms(100);          // tao tre 100ms cho LCD khoi dong
    lcd_init();
    lcd_gotoxy(7,1);        // vi tri (x,y)=(7,1)= hang 1, cot 7
    lcd_putc('H');
    lcd_putc('I');
    lcd_putc('!');
}
heliman vẫn chưa có mặt trong diễn đàn  
Old 01-08-2006, 07:15 PM   #5
linhnc308
Đệ tử 5 túi
 
Tham gia ngày: Oct 2005
Bài gửi: 117
:
Lập trình CCS cho PIC6F877A tôi đã pót khá nhiều bài lập trình bên đien tử VN rồi:
http://dientuvietnam.net/forums/showthread.php?t=1008

Bạn nào quan tâm thjif qua đó down về, có đủ cả code và mạch.

Chúc thành công!
__________________
CallerID, Ethernet-RS232, PICWEB, Cảnh báo BTS
Giải pháp toàn diện giám sát - điều khiển từ xa qua GSM/Internet
0988006696

http://linhnc308.blogspot.com
linhnc308@gmail.com
linhnc308 vẫn chưa có mặt trong diễn đàn  
Old 03-08-2006, 10:07 AM   #6
hpecom
Đệ tử 2 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 45
:
Hàm printf() xuất một chuỗi ra cổng nối tiếp.
Nếu kết nối PIC với máy tính bằng RS232 và cấu hình thích hợp cho cổng thì máy tính sẽ nhận được chuỗi mà bé đặt trong dấu ().
Vẽ mạch thì bé vẽ theo các mạch giao tiếp máy tính mà các chú đã vẽ trên diễn đàn: Chỉ cần 3 sợi dây Rx (receive), Tx (Transfer) và chân Gnd. Cần có con đệm Max232 nằm ở giữa. Nghĩa là PIC - Max232 - PC.
Nhưng tại sao bé không làm các bài tập đơn giản trước như điều khiển LED chớp tắt, hiển thị số trên LED 7 đoạn hay điều khiển nhiều đèn LED chớp theo nhiều kiểu, .. mà lại làm giao tiếp máy tính cho khó khăn vậy?
Dù sao hpecom cũng chúc bé thành công và đừng để ảnh hưởng đến việc học!
hpecom.
__________________
Biết thì nói là biết,
Không biết thì nói là không biết,
..
hpecom vẫn chưa có mặt trong diễn đàn  
Old 03-08-2006, 09:54 PM   #7
briantk_1988
Đệ tử 2 túi
 
Tham gia ngày: May 2006
Nơi Cư Ngụ: Princeton University, NJ, US
Bài gửi: 42
:
Send a message via Yahoo to briantk_1988
Cám ơn sư huynh đã quan tâm :-)

Bé đã tập viết bằng ASM, điều khiển LED, Interupt... rồi. Hôm nay mới chuyến sang CCS C. Theo lời huynh nói thì mọi ví dụ trong CCS C phải được nối với PC mới có thể xem kết quả được.

Cám ơn rất nhiều.
briantk_1988 vẫn chưa có mặt trong diễn đàn  
Old 04-08-2006, 10:24 AM   #8
hpecom
Đệ tử 2 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 45
:
Công nhận bé này mau lớn thật! Mới hôm qua gọi bác hôm này đã gọi là huynh, không biết ngày mai là cái gì?. 1988 là đã tốt nghiệp THPT rồi.

Không phải mọi ví dụ mà chương trình nào có lệnh printf() thì cần máy tính nếu đệ muốn xem kết quả của lệnh.
Chúc đệ thành công.
__________________
Biết thì nói là biết,
Không biết thì nói là không biết,
..
hpecom vẫn chưa có mặt trong diễn đàn  
Old 04-08-2006, 11:40 PM   #9
briantk_1988
Đệ tử 2 túi
 
Tham gia ngày: May 2006
Nơi Cư Ngụ: Princeton University, NJ, US
Bài gửi: 42
:
Send a message via Yahoo to briantk_1988
Cám ơn, cám ơn.

Chatchit một chút: hôm qua mới để tử mởi nhập môn, gọi là bác; hôm nay, thành đệ tử một túi rồi nên gọi là huynh.

b
briantk_1988 vẫn chưa có mặt trong diễn đàn  
Old 07-08-2006, 09:31 AM   #10
hpecom
Đệ tử 2 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 45
:
Chào boys!
* set_timer0(6); đây là phương thức gọi hàm. set_timer0() là một hàm, 6 là tham số. Còn hàm này làm gì thì bạn phải tự tìm hiểu lấy.
* ++count; là thực hiện tăng biến count lên 1 đơn vị. Nó giống lệnh count=count+1. Còn có một cú pháp nhữa là count++. Hai lệnh lệnh này có sự khác nhau về thứ tự thực hiện khi nằm trong một biểu thức so sánh.
* if(count==2000) là phép so sánh. Nếu giá trị của biến count bằng 2000 thì kết quả của phép so sánh là True ngược lại là False.
* a là .. mình chịu thua!?!? Còn dịch trái là để nhân đôi giá trị biết. Bạn hãy xem lại đại số bool có rất nhiều điều hay ở đó.
Bạn nên tìm một cuốn sách lập trình C của Quách Tuấn Ngọc để hiểu về những điều này.
Chúc bạn thành công.
hpecom.
__________________
Biết thì nói là biết,
Không biết thì nói là không biết,
..
hpecom vẫn chưa có mặt trong diễn đàn  
Old 13-08-2006, 03:37 PM   #11
boys3509_2006
Đệ tử 2 túi
 
Tham gia ngày: Feb 2006
Bài gửi: 32
:
CCS for pic6F877A

cảm ơn anh hpecom đã chỉ giáo
boys3509_2006 vẫn chưa có mặt trong diễn đàn  
Old 13-08-2006, 03:48 PM   #12
boys3509_2006
Đệ tử 2 túi
 
Tham gia ngày: Feb 2006
Bài gửi: 32
:
CCS C for PIC16F877A

Nhân tiện anh cho em hỏi thêm : giả sử em viết một ct nháy led (cho nó chạy như vòng lặp ), đầu tiên kt các khóa để biết ct sẽ nháy led kiểu nào. sau đó thì ct sẽ thực hiện lệnh nháy đèn led, nếu như sau khi ta bấm nút chọn kiểu nháy, ct sẽ tiếp tục thực hiện lệnh tiếp theo mà ta đổi ý bấm nút khác để đổi kiểu thì ct sẽ không nhận vì đang thực hiện các lệnh bật-tắt led. Bài tập này hình như có ở trang 2, 3 dùng interrup và timer0, Tại sao nhỉ ?
boys3509_2006 vẫn chưa có mặt trong diễn đàn  
Old 14-08-2006, 09:58 AM   #13
hpecom
Đệ tử 2 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 45
:
Nếu bạn sử dụng vòng lặp thì nút bấm sẽ ko được nhận trong khi vòng lặp đang thực hiện. Cách giải quyết bài toán như sau:
_ Bạn hãy khai báo 1 biến toàn cục. Biến này lưu kiểu chớp. Hàm chớp sẽ dựa vào giá trị biến này mà đổi kiểu chớp.
_ Sử dụng timer0 làm thời gian chuẩn để trì hoãn chớp tắt (vì nếu dùng làm thời gian trì hoãn chớp tắt thì nó quá ngắn ta không thể thấy chớp được).
_ Khai báo một biến toàn cục làm hệ số cho thời gian trì hoãn. Trong ngắt Timer0 bạn sẽ đếm biến này đến một giá trị nào đó thì gọi hàm chớp tắt.
_ Bạn cũng cần khai báo một biến toàn cục để cho hàm chớp tắt biết mình phải làm gì. Hoặc nếu ko bạn có thể truyền tham số cho hàm.
_ Trong chương trình main, bạn dùng vòng lặp để bắt phím nhấn (hoặc dùng ngắt) và thực hiện thay đổi giá trị của biến kiểu chớp.
Trên đây là giải thuật, đó là phương pháp để giải quyết bài toán. Tất nhiên trong quá trình viết bạn có thể khai báo thêm các biến toàn cục hay cục bộ để thực hiện thuật toán. Tốt nhất là bạn nên viết trước và gặp khó khăn thì đưa cả code lên để mọi người giúp bạn giải quyết.
Đây là một bài toán khá hay, mong rằng bạn sẽ thành công.
hpecom.
__________________
Biết thì nói là biết,
Không biết thì nói là không biết,
..
hpecom vẫn chưa có mặt trong diễn đàn  
Old 19-08-2006, 04:51 PM   #14
boys3509_2006
Đệ tử 2 túi
 
Tham gia ngày: Feb 2006
Bài gửi: 32
:
CCS C for PIC16F877A

Em mượn tạm đoạn code của nhh anh mổ xẻ nó giùm em nhé

//************************************************** **
// Author : nhh
// Date : 02/04/06
// Hardware: PIC16F877A
//************************************************** **
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#define led pin_B0
int16 count;
int8 a;

//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count==2000)
{
count=0;
a=a<<1; // dich trai a 1bit
}
if(a==256)
{
a=1;
count=0;
}
}

//Chuong trinh chinh
main()
{
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(6);
count=0;
a=1;
while(true)
{
portb=a;
}
}

Anh giải thích mấy cỗ có giùm em. Tại sao phải setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); mà ko Div 3, 4,... hở anh ?
boys3509_2006 vẫn chưa có mặt trong diễn đàn  
Old 21-08-2006, 05:07 PM   #15
hpecom
Đệ tử 2 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 45
:
Trích:
Nguyên văn bởi boys3509_2006
Em mượn tạm đoạn code của nhh anh mổ xẻ nó giùm em nhé

//************************************************** **
// Author : nhh
// Date : 02/04/06
// Hardware: PIC16F877A
//************************************************** **
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#define led pin_B0
int16 count;
int8 a;

//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count==2000)
{
count=0;
a=a<<1; // dich trai a 1bit
}
if(a==256)
{
a=1;
count=0;
}
}

//Chuong trinh chinh
main()
{
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(6);
count=0;
a=1;
while(true)
{
portb=a;
}
}

Anh giải thích mấy cỗ có giùm em. Tại sao phải setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); mà ko Div 3, 4,... hở anh ?
*Dấu thứ nhất:
[CODE:]
a=a<<1; // dich trai a 1bit
[/CODE]
Như tác giả đã chú thích đó là lệnh dịch trái 1 bit.
VD: trước khi dịch, a có giá trị 0 0 0 0 0 0 0 1 (0x01) thì sau lệnh dịch này giá trị biến a sẽ là 0 0 0 0 0 0 1 0 (0x02).
Vậy lệnh dịch trái sẽ làm tăng giá trị biến bị dịch lên 2 lần: 2 thành 4. Giống như bạn dịch trong hệ thập phân số 0500 thì được 5000 tức tăng 10 lần. Hệ nhị phân (2 số) dịch trái 1 bit sẽ tăng giá trị 2 lần, hệ thập phân (10 số) dịch trái một bit, số sẽ tăng giá trị 10 lần.
Vậy nhiều lệnh dịch sẽ làm cho a thay đổi như sau
0 0 0 0 0 1 0 0
0 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
* Dấu thứ 2:
[CODE:]
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
[/CODE]
mode may be one or two of the constants defined in the devices .h file. RTCC_INTERNAL, RTCC_EXT_L_TO_H or RTCC_EXT_H_TO_L

RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16, RTCC_DIV_32, RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256
Bạn hãy đọc Help và các ví dụ của nó thì bạn sẽ hiểu được cách tính.
Bạn hãy tìm hiều kỹ về bộ chia tần trong DataSheet của chip sẽ hiểu tại sao chỉ làm 2 mũ n.
* Dấu thứ 3:
[CODE:]
portb=a;
[/CODE]
Đây là lệnh xuất giá trị biến a ra PortB. a có 8 bit, PortB có 8 chân B7 đến B0.
Lệnh trên sẽ áp các bit của a vào PortB theo đúng trọng số.
Chúc bạn thành công. (và lần sau hỏi dễ xíu ).
hpecom.
__________________
Biết thì nói là biết,
Không biết thì nói là không biết,
..

thay đổi nội dung bởi: hpecom, 22-08-2006 lúc 09:00 AM.
hpecom 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à 09:19 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