CCS C cho PIC/dsPIC phiên bản 4.xxx
Luồng này tiếp theo luồng CCS C cho PIC16F877A.
- Tutorial của nhh đã cũ, CCS C có nhiều thay đổi, do vậy từ CCS C 4.xxx một số câu lệnh và ký hiệu được thay đổi. - Luồng trước quá dài, chúng tôi tạm khoá để mở luồng mới, các thành viên sẽ dễ theo dõi hơn. Chúc vui |
Trích:
Trích:
Trích:
Luồng này tiếp tục thảo luận ở đây Chúc vui |
bác F cho em vài link về CCS C 4.xxx
|
tìm trong diễn đàn này mệt quá
|
to hard : chắc phải tháo ra cài lại thôi, lưu là thằng này và thằng Deepfreeze ko ưa gì nhau, nên cài vào ko chạy dc, báo lỗi tùm lum, lúc trước tui bị một lần rồi.
|
Hi,
Đành phải xin phép câu thêm một bài vậy. Bác có thể giải quyết vấn đề bằng cách down phiên bản 4.065 về. Trong phiên bản này có IDEUTILS sẵn, chỉ cần chạy file này để cài đặt, nó tương thích cho cả version 4.068. Bên thread Trình biên dịch và mô phỏng đã đề cập đến vấn đề này rồi. Chúc bác thành công. Thân ái. |
Giao tiếp Pic(16f877a) với máy tính
em đang làm về phần giao tiếp giữa pic(16f877a) với máy tính dùng phần mềm ccs để lập trình
anh nào có tài liệu thì có thể giúp đơ em, em đang rất cần mail của em là qvinh_bk86@yahoo.com.vn, em cảm ơn nhiều Rất mong thư! |
Trích:
Chúc vui |
Hic cac bac oi help me,em down các tài liệu trên điễn đàn về nhà và làm theo như các bác nói,nhưng mà sao nó không chạy,em đang dùng CCS V4.057 hôm nay em quên không mang theo đoan code em làm,nhưng đại loại là em đã khai báo #include <16F877A.h> nhưng không hiểu sao khi compiler lại báo là lỗi "A#device" cần phải thêm vào là sao các bác(hi em dịch ra đầy không biết có đúng không),các bác giúp em nhé,em đang làm đồ án liên quan đến Pic mà lại lập trình bằng C
|
tui đang dùng phiên bản CCS 4.065
không biết còn phiên bản nào cao hơn không hả anh em ??? |
Trích:
Chúc vui |
Thắc mắc ngắt timer
Em viết chương trình ngắt timer nhấp nháy led, nhưng nạp vào pic phải đợi 1 lúc sau nó mới bắt đầu nháy led, bác nào khắc phục jùm em với.
Đây là code. Code:
#include <16F877A.h> |
Trước khi vào vòng while(true) trong main(), bạn nên đặt trước giá trị của count, nếu không thì count có thể mang giá trị bất kỳ, và điều kiện (count == 500) của bạn có thể phải sau khi count được tăng vài chục ngàn giá trị mới thỏa mãn (nếu tình cờ sau khi PIC reset biến count mang giá trị ngẫu nhiên là 501 chẳng hạn).
Tôi thường khởi tạo biến count ngay trước khi vào vòng while(true) trong main(), và dùng điều kiện (count >= 500) thay cho (count == 500) trong phần xử lý ngắt. Thân, |
hi hi em sửa được lỗi đó rùi,nhưng vẫn không hiểu,bác nào giải thích hộ em với,khi em tạo một project mới,ví dụ em tạo trong thư mục "C:\Bai_tap" thỉ trong phần soạn thảo của em xuất hiện khai báo #include "C:\Bai_tap\nhapnhayB.h" nếu em để nguyên như này thì khi compiler sẽ báo lỗi " a #device" gì đó,nhưng khi em bỏ dòng này đi thì mọi việc ok,hic
|
Em có đoạn code sau nhưng em không hiểu là lệnh adcHI và adcLO làm gì (với khai báo
char adcHI,adcLO).Anh nào giải thích hộ em Code:
while(TRUE) |
adcHI và adcLO là các biến kiểu char (8-bit), không phải là lệnh.
Trong đoạn lệnh mà bạn đã đưa ra, kết quả của việc biến đổi A/D được tách thành 2 phần, phần cao chứa trong adcHI, còn 5 bit thấp hơn của kết quả được chứa trong adcLO. Bit 7 của adcLO được bật. Sau đó adcHI và adcLO được xuất ra thông qua hàm putc(). Thân, |
Trích:
Cảm ơn anh , nhưng anh có thể giải thích rõ hơn cho em doạn lệnh sau :(ví dụ như (adcValue>>5)&0x1f có nghĩa như thế nào) adcHI = (char)((adcValue >> 5)& 0x1f); adcLO = (char)((adcValue & 0x1f)|0x80); Anh còn bảo là bit 7 của adcLO được bật là sao ha anh? Rất mong thư! |
Trích:
Thân, |
Vâng em cũng mới bắt đầu làm quen mà
Anh cũng cho em biết thêm là adcHI và adcLO là 8 bit, thế sao khi A/D tách thành 2 phần thì như anh nói 5 bit thấp hơn lại chứa trong adcLO? |
ADC trong PIC có 10bit. adcHI là chứa 5 bits cao của 10 bits, còn adcLO chứa 5 bit thấp như vậy là ghép lại thành 10 bit ad rồi đó:d. còn '>>' có nghĩa là dịch trai 1111100000 >> 5 = 0000011111 => giá trị của adcHI được đưa vào 1 byte là 00011111, như vậy có 5 bit cao của adc 10 bit . x 0x1f, giữ nguyên giá trị của 5 bit cao để khỏi lẫn giá trị của byte thấp, em thử lấy 1 phép toán nào đó làm ví dụ thì thấy ngay. adcLO việc bit 7 của adcLO được bật để phân biệt adcHI và adcLO khi chuyển lên nếu ko thì ko biết mình nhận nó là byte thấp hay byte cao.
|
Trích:
code Trích:
|
em đang sai ccsc p3.249. các anh có phiên bản nào mới cho tôi xin link với
|
Trích:
http://rs152.rapidshare.com/files/10..._4.069_Upd.rar |
Trích:
http://www.picvietnam.com/forum//forumdisplay.php?f=10 |
cảm ơn 2 bác nhiều.
|
mình đang làm về giao tiếp 2 con 16f877a theo chuẩn RS485. Con slave đọc giá trị adc. Con master thì liên tục yêu cầu con slave gửi trả giá trị adc để hiển thị lên lcd.
mình thực hiện như sau: main() { //khởi tao các gtri ban đầu ... while(true) { transmit(2,0,0,0);//gửi chuỗi '2000' để yêu cầu slave truyền về giá trị adc delay_ms(500);//trễ thời gian nhận giá trị adc } } nếu như để lệnh hỏi ngoài vòng while thì nó hoạt động tốt, nhưng khi cho vào trong vòng while thì nó chỉ thực hiện được một lệnh đầu tiên. các lần tiếp theo thì lại không đúng nữa. thanks mọi người nhiều. |
Em mới hoc PIC, em đã load dược CCSC For PIC 4.09, MPLAB IDE 8.10, ICProg105D, các bác ai biết thì chỉ giúp em cách mô phỏng cụ thể với? (Từ mô phỏng các cổng, timer, các thanh ghi...)
Cảm ơn các bác! |
1 Attachment(s)
Em có một đoạn code muốn nhờ các anh đi trước giúp đỡ mà ko biết cách chèn lên thế nào, đành phải làm thủ công thế này. Đoạn code của em có mục đích là: đầu tiên cho 2 chân RB1 và RB2 ở mức thấp, sau đó kiểm tra trạng thái của RD0 (chân RD0 được nối lên cao qua điện trở 10k), nếu RD0 = 0 thì đưa ra chân RB2 mức 1, trễ 5s, đưa RB2 xuống 0 và RB1 lên 1 trễ 5s và thoát khỏi điều kiện if và tiếp tục kiểm tra RD0. Nhưng khi chạy thử mạch thì RB2 có mức 1 trễ 5s sau đó RB1 có múc 1... mặc dù RD0 vẫn chưa = 0, mà sau đó chương trình cũng chẳng thoát khỏi điều kiện if. Em biết ngày trước đã có bạn hỏi như em và đã được giúp đỡ nhưng em tim lại mãi mà không thấy. Em mới học, mong các anh giúp đỡ! Đoạn code của em như sau:
Code:
#include <16F877a.h> |
Chương trình của bạn nên được sửa lại như sau:
Code:
#include <16F877a.h> Thân, |
1 Attachment(s)
Cảm ơn anh Nam đã giúp đỡ! Nhưng ko biết do Kit của em hay lý do gì mà khi thử mạch, nếu ngắt đường nối lên cao của RD0 thì RB2 có trạng thái 1 sau 5s đến RB1 có trạng thái 1 RB2 xuống 0 và giữ ở trạng thái đó suốt. Nếu giữ đúng sơ đồ, thì ấn nút bấm, chẳng thấy gì xảy ra cả. Anh xem giúp em với! (em dùng Kit của anh SGT)
|
Nếu bạn muốn việc kiểm tra trạng thái chân RD0 được thực hiện liên tục thì code của bạn có thể sửa thành như sau:
Code:
#include <16F877a.h> Thân, |
nhờ mọi người giúp đỡ giao tiếp 2 pic16f877a theo chuẩn 485.
ý tưởng của mình như sau: con master truyền một ký tự 'a' sang cho con slave.sau đó set chân đk của con mas để nó chờ tín hiệu gửi về từ con slave. con slave nhận đc ký tự từ master gửi đến và kiểm tra nếu đúng ký tự cần thì thực hiện gửi lại ký tự 'b'. quá trình cứ liên tục như vậy. |
mình đã thử con master chỉ liên tục truyền và con slave liên tục nhận thì không có vấn đề gì. nhưng khi thực hiện hỏi đáp như trên thì ctr không chạy đc.
đây là đoạn code: Code:
/////////////////////////////////////////////////////////////////// |
còn đây là code con slave:
Code:
////////////////////////////////////////////////////////////*/ |
nhờ mọi người kiểm tra giúp xem đoạn code trên có vấn đề gì không.
cảm ơn mọi người nhiều!!! |
các bác cho em hỏi về counter của con 16F877A :
em chưa hiểu được lệnh này setup_COUNTERS (rtcc_state, ps_state); rtcc_state là một trong những constant sau: RTCC_INTERNAL // tham số này có nghĩa j ?? em tưởng nó chỉ lấy xung từ chân RA4/TOCK1 RTCC_EXT_L_TO_H // RTCC_EXT_H_TO_L // ps_state là một trong những constant sau: RTCC_DIV_2 // chọn cái tỉ số chia này có nghĩa j , có fai cứ 2 xung thì nó tăng bộ đếm lên 1 RTCC_DIV_4 RTCC_DIV_8 RTCC_DIV_16 RTCC_DIV_32 RTCC_DIV_64 RTCC_DIV_128 em viết một chương trình cho timer1 mà nó ko chạy , em sửa nó từ timer0 (đã chạy) #include <16f877a.h> #include <def_877a.h> #fuses NOWDT ,NOPUT ,NOPROTECT ,NODEBUG,NOBROWNOUT,NOLVP,HS #use delay(clock=20000000) int16 count; #int_timer1 void interrupt_timer1() { set_timer1(0); ++count; if(count==20) { count=0; PORTC=~PORTC; } } void main() { TRISC=0x00; PORTC=0x55; enable_interrupts(int_timer1); setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); enable_interrupts(global); set_timer1(0); // TODO: USER CODE!! while(true){} } các bác cho ý kiến |
Hiển thị LCD
Help Me ........ :geek:
Mình đang tìm hiểu và viết chương trình cho LCD( 2 dòng x 20 ký tự ) Nhưng mình đang gặp một khó khăn nho nhỏ cần các bạn giúp đỡ... Mình viết chương trình để hiển thị các ký tự và chuỗi ký tự thì rất ok . Nhưng để hiển thị giá trị chứa trong một thanh nghi ,một byte nhớ hay giá trị của một biến INT lên LCD thì mình bị mắc quá ko hiển thị được. Huynh đệ nào biết giúp mình ngay nha :ugeek: - Bài mình đang mắc như sau : hiển thị giá trị chuyển đổi ADC khi thay đổi tín hiệu đầu vào chân AN0 của pic16f877a lên LCD ( value = read_adc() , giá trị trong biến value cần hiển thị lên LCD ) **************** THANHK ************** |
bạn tách lấy số hàng đơn vị,tách lấy số hàng chục,....
cộng mỗi số với 0x30 rồi putc() lên LCD |
hic khong ai trả lời mình ah`
|
Cám ơn bác đã chỉ bảo ,Em đã tách được các số và cho hiển thị lên LCD...
Nhưng em chuă hiểu vì sao khi tách các số ra lại phải cộng với 0x30 ?Có phải khi cộng với 0x30 ta sẽ được mã ASII của số đó không? Mọi người cho em hỏi đường link để dowload file : lcd_lib_4bit.c ***************** THANKS ************** |
Múi giờ GMT. Hiện tại là 06:59 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam