PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Hỏi về thanh ghi của PIC (http://www.picvietnam.com/forum/showthread.php?t=6581)

sit_alone76816 27-06-2010 12:18 AM

Hỏi về thanh ghi của PIC
 
Em đang có 1 project, trong đó em cần lấy từng bit, cụ thể như sau : em có 1 con số hex 1 byte nằm trong biến x, vậy làm sao em có thể lấy từng bit của số hex đó gán cho 8 biến khác nhau, tức là lấy từng con số A7 A6 A5 ... A1 A0 ra. Em có ý định là gán x vào thanh ghi nào đó giả sử TMR1H đi, khi đó em sẽ lấy các bit đó như sau : ví dụ : i = TMR1Hbits.bit7 , j = TMR1Hbits.bit6 ... như vậy có được không nhỉ ?

Cho em hỏi là trong pic 18F452 có thanh ghi nào 16bit, mà thanh ghi đó chỉ để danh cho người dùng sử dụng,thanh ghi không có làm gì hết, giống như là nơi tạm giữ dữ liệu thôi đó mà .

namqn 27-06-2010 08:45 PM

Trích:

Nguyên văn bởi sit_alone76816 (Post 36962)
Em đang có 1 project, trong đó em cần lấy từng bit, cụ thể như sau : em có 1 con số hex 1 byte nằm trong biến x, vậy làm sao em có thể lấy từng bit của số hex đó gán cho 8 biến khác nhau, tức là lấy từng con số A7 A6 A5 ... A1 A0 ra. Em có ý định là gán x vào thanh ghi nào đó giả sử TMR1H đi, khi đó em sẽ lấy các bit đó như sau : ví dụ : i = TMR1Hbits.bit7 , j = TMR1Hbits.bit6 ... như vậy có được không nhỉ ?

Cho em hỏi là trong pic 18F452 có thanh ghi nào 16bit, mà thanh ghi đó chỉ để danh cho người dùng sử dụng,thanh ghi không có làm gì hết, giống như là nơi tạm giữ dữ liệu thôi đó mà .

Giả sử bạn đang dùng MPLAB C18, TMR1Hbits chưa được khai báo sẵn trong các header file của các PIC18. Do đó, cách làm trên của bạn về nguyên tắc là ổn, nhưng sẽ bị báo lỗi vì chưa có khai báo cho struct TMR1Hbits.

Bạn có thể tự khai báo các struct tương tự như LATAbits để truy xuất đến từng bit của byte (đọc tài liệu hướng dẫn cơ bản về C, hoặc tham khảo các header file của một PIC18 nào đó trong thư mục cài đặt MPLAB C18).

Để dùng một số 16 bit, bạn chỉ việc khai báo một biến có kiểu là unsigned int (hoặc unsigned short), trình dịch sẽ tự động dùng hai thanh ghi (ô nhớ) nằm trong vùng RAM công dụng chung (general purpose) cho biến đó.

Thân,

sit_alone76816 28-06-2010 12:15 AM

Cảm ơn anh Nam!

Tất nhiên là khi em dùng timer1 thì em phải khai báo header của nó chứ ạ: include"timers.h"

Em chưa hiểu phần LATA là như thế nào, khi mình khai báo giả sử như là LATA=0 thì có khác gì so với câu khai báo PORTA=0 không vậy anh ? Em chỉ biết với câu PORTA=0:

- với PortA là ouput thì tất cả 8 pins của PORTA sẽ là mức 0, vậy lúc này giả sử em dùng câu lệnh : x=PORTAbits.RA0 + 1; nó có ok không anh ?

- Với PORTA là input: thì câu lệnh PORTA=0; có ý nghĩa gì không anh ?

Trích:

Nguyên văn bởi namqn (Post 36975)
Để dùng một số 16 bit, bạn chỉ việc khai báo một biến có kiểu là unsigned int (hoặc unsigned short), trình dịch sẽ tự động dùng hai thanh ghi (ô nhớ) nằm trong vùng RAM công dụng chung (general purpose) cho biến đó.

Vậy ví dụ như em khai báo như sau :

unsigned int x;

rồi em cho : y = xbits.x1; ( y là bit 1 của x) câu lệnh này có được không anh, hay là em tự chế ra nhỉ ? Vậy có cách nào làm được câu lệnh đó ( y = xbits.x1; ), em phải thay thế biến x bằng thanh ghi nào cho thích hợp, để em có thể lấy từng bit của nó 1 cách dễ dàng hơn, linh động hơn. Giả sử em gọi thanh ghi đó là h (thanh ghi 16 bits) , và em muốn thực hiện dòng lệnh sau :

h ++;
x = hbits.h1;
z = hbits.h10;
PORTCbits.RC0 = hbits.h15;

Anh giúp em chuyển thành chương trinh trong C18 nha anh.

Chân thành cảm ơn anh !

sit_alone76816 28-06-2010 12:22 AM

Anh cho em hỏi vậy trong MCC18 thì có phải 1 câu lệnh là 1 chu kỳ ( tức là bằng 1/Fosc) phải không anh, các câu lệnh đều tốn 1 lượng thời gian là như nhau hay có câu tốn ít, có câu tốn nhiều chu kỳ hơn ? Giả sử như các câu : Nop(), if() , switch(), while(), goto ,các hàm toán tử ...

namqn 28-06-2010 08:31 AM

Trích:

Nguyên văn bởi sit_alone76816 (Post 36978)
Cảm ơn anh Nam!

Tất nhiên là khi em dùng timer1 thì em phải khai báo header của nó chứ ạ: include"timers.h"

Em chưa hiểu phần LATA là như thế nào, khi mình khai báo giả sử như là LATA=0 thì có khác gì so với câu khai báo PORTA=0 không vậy anh ? Em chỉ biết với câu PORTA=0:

- với PortA là ouput thì tất cả 8 pins của PORTA sẽ là mức 0, vậy lúc này giả sử em dùng câu lệnh : x=PORTAbits.RA0 + 1; nó có ok không anh ?

- Với PORTA là input: thì câu lệnh PORTA=0; có ý nghĩa gì không anh ?



Vậy ví dụ như em khai báo như sau :

unsigned int x;

rồi em cho : y = xbits.x1; ( y là bit 1 của x) câu lệnh này có được không anh, hay là em tự chế ra nhỉ ? Vậy có cách nào làm được câu lệnh đó ( y = xbits.x1; ), em phải thay thế biến x bằng thanh ghi nào cho thích hợp, để em có thể lấy từng bit của nó 1 cách dễ dàng hơn, linh động hơn. Giả sử em gọi thanh ghi đó là h (thanh ghi 16 bits) , và em muốn thực hiện dòng lệnh sau :

h ++;
x = hbits.h1;
z = hbits.h10;
PORTCbits.RC0 = hbits.h15;

Anh giúp em chuyển thành chương trinh trong C18 nha anh.

Chân thành cảm ơn anh !

Về phần LATA và PORTA, đã có nhiều bài viết trên diễn đàn (việc dùng LATx trong các PIC18 là để khắc phục hiện tượng read-modify-write, đã được nói đến nhiều lần trên diễn đàn, bạn hãy dùng công cụ tìm kiếm của diễn đàn).

Để truy xuất từng bit của một biến 16-bit, bạn hãy dùng kết hợp struct và union. Bạn có thể đọc chương 6 của tài liệu đính kèm trong luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=3151

Thân,

sit_alone76816 28-06-2010 12:24 PM

Trích:

Nguyên văn bởi namqn (Post 36982)
Về phần LATA và PORTA, đã có nhiều bài viết trên diễn đàn (việc dùng LATx trong các PIC18 là để khắc phục hiện tượng read-modify-write, đã được nói đến nhiều lần trên diễn đàn, bạn hãy dùng công cụ tìm kiếm của diễn đàn).

Để truy xuất từng bit của một biến 16-bit, bạn hãy dùng kết hợp struct và union. Bạn có thể đọc chương 6 của tài liệu đính kèm trong luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=3151

Thân,

Chân thành cảm ơn anh ! Nhờ có anh chỉ dạy mà em đã làm đuợc rồi.

Còn vấn đề về LAT đó, thì em tìm rồi, mà cũng chưa hiểu ra sao nữa, em cũng có đọc datasheet của PIC, cũng có nói sơ về vấn đề đó, nhưng mà em vẫn chưa xác định đuợc nó khác với hàm PORT như thế nào cả.

Em thử viết code như sau : Em cho PORTC là output, rồi em so sánh câu lệnh PORTC và LATC bằng cách em cho PORTC=0xf0; sau đó em thay lại bằng LATC=0xf0; Thì kết quả như nhau, không thấy có gì khác cả.

Anh có nói là LAT để khắc phục hiện tượng read-modify-write là như thế nào ? Mong anh phân tích giùm em !!!

Chân thành cảm ơn anh !

wait89 01-07-2010 12:42 PM

thành viên mới
 
Các anh ơi em rất muốn tham gia diễn đàn này.Em là một sinh viên cơ khí nhưng thực sự em rất thích điện tử. Vì vậy em rất muốn tham gia diễn đàn để tìm hiểu thêm về điện tử nhưng em không biết cách tham gia diễn đàn thế nào cả.Cụ thể là em chưa tham gia diễn đàn bao giờ nên em không biết làm thế nào để liên lạc được với các bạn trên diễn đàn. Em rất mong được sự giúp đỡ của các anh.

huuducel 14-07-2010 06:14 PM

Thầy Nam ơi Em đang viết chương trình nhận tín hiệu remote của cái set top box, phân tích từ OSC thì nó có frame data là 32bit. Em viết chương trình để nhận tín hiệu, nhưng chỉ nhận được 8bit đầu. Bây giờ em muốn khai báo một biến x chứa 32 bit IR (b32 b31 ...b0) và chỉ nhận bit (b24 b23...b16) thì mình làm sao để dịch bit và lấy bit theo ý muốn được hả thầy.


Múi giờ GMT. Hiện tại là 11:42 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam