PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   CCS C cho PIC/dsPIC phiên bản 4.xxx (http://www.picvietnam.com/forum/showthread.php?t=2296)

namqn 06-05-2008 02:13 AM

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,

tyhon 06-05-2008 07:49 AM

Trích:

Nguyên văn bởi namqn (Post 15993)
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,



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ư!

namqn 06-05-2008 09:24 AM

Trích:

Nguyên văn bởi tyhon (Post 15994)
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ư!

Bạn hỏi như vậy tôi đoán là bạn chưa học gì về kỹ thuật số, lập trình C, ... Bạn có thể cho biết bạn đang học ở bậc nào, nếu học đại học thì đến năm thứ mấy, ngành gì. Thông tin về nền tảng kiến thức của bạn sẽ giúp người khác có cách giải thích phù hợp cho bạn (mặc dù đôi khi bạn có thể đặt người khác vào tình huống tương tự như giải thích về tích phân cho học sinh cấp hai).

Thân,

tyhon 06-05-2008 05:30 PM

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?

vandungevn 06-05-2008 11:28 PM

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.

tyhon 07-05-2008 04:57 AM

Trích:

Nguyên văn bởi vandungevn (Post 16008)
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.

Anh cho em hỏi:
code
Trích:

Nguyên văn bởi tyhon (Post 16009)
while(TRUE)
{
adcValue = read_adc(); // Get ADC reading

adcHI = (char)((adcValue >> 5)& 0x1f);
adcLO = (char)((adcValue & 0x1f)|0x80);

putc(adcHI);
putc(adcLO);

delay_ms(10); // Preset delay, repeat every 10ms
}
}.

Thế ở đây không biết dịch bit để làm gì anh nhỉ ? Tại sao không cho adcHI nhận luôn 5 bit cao của adc trong PIC

tungtot_vl 22-05-2008 03:04 PM

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

love_ac 22-05-2008 03:47 PM

Trích:

Nguyên văn bởi tungtot_vl (Post 16428)
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

Bạn thử link này:
http://rs152.rapidshare.com/files/10..._4.069_Upd.rar

hanspkt 22-05-2008 03:48 PM

Trích:

Nguyên văn bởi tungtot_vl (Post 16428)
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

bạn vào đây:
http://www.picvietnam.com/forum//forumdisplay.php?f=10

tungtot_vl 23-05-2008 11:57 AM

cảm ơn 2 bác nhiều.

bean984 02-06-2008 10:35 AM

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.

andyhug 03-06-2008 12:05 PM

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!

igbt 07-06-2008 07:26 PM

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>
#include <def_877a.h>
#fuses NOWDT,PUT,XT,NOPROTECT, NOLVP
#use delay(clock=4000000)
#use fast_io(b)
main()
{
set_tris_b(0);
set_tris_d(255);
output_low(PIN_B1);
output_low(PIN_B2);
if(RD0=0)
output_high(PIN_B2);
delay_ms(5000);
output_low(PIN_B2);
output_high(PIN_B1);
delay_ms(5000);
}


namqn 07-06-2008 08:33 PM

Chương trình của bạn nên được sửa lại như sau:
Code:

#include <16F877a.h>
#include <def_877a.h>
#fuses NOWDT,PUT,XT,NOPROTECT, NOLVP
#use delay(clock=4000000)
#use fast_io(b)
main()
{
        set_tris_b(0);
        set_tris_d(255);
        output_low(PIN_B1);
        output_low(PIN_B2);
        if(RD0 == 0) {
                output_high(PIN_B2);
                delay_ms(5000);
                output_low(PIN_B2);
                output_high(PIN_B1);
                delay_ms(5000);
        }
        while (1);
}

Bạn hãy tự so sánh với code cũ của bạn để tìm ra những thay đổi, và suy nghĩ xem tại sao phải thay đổi như vậy.

Thân,

igbt 07-06-2008 09:43 PM

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)


Múi giờ GMT. Hiện tại là 07:46 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