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ọc PIC trong 1 ngày (Upd. 01/01/2006) (http://www.picvietnam.com/forum/showthread.php?t=5)

falleaf 20-06-2005 09:26 PM

Z,

1) Ngắt có nhiều tác vụ, có thể bị tràn stack, hoặc dùng nhiều ngắt cùng lúc, làm động tác này, khóa cứng tất cả luôn.

2) Đã có lệnh SWAPF trước đó để lưu lại giá trị thanh STATUS rồi, chú ý.

T,

Dạo này mình hơi bạn, chưa thể viết bài được, hẹn đầu tháng 7 viết tiếp.

Chúc vui.

tuanva 21-06-2005 09:48 AM

Mình hỏi thêm về không gian địa chỉ của PIC. Giới hạn mở rộng bộ nhớ của PIC (mấy loại thường dùng ấy, 16F... và 18F...) là bao nhiêu? Nếu như mình cần mở rộng đến 10MB bộ nhớ có được không nhỉ?

To Falleaf:
Xin lôĩ vì đã quấy rầy khi cậu đang bận. Mình sẽ đợi đến lúc cậu rảnh. Chúc cậu thành công.

falleaf 23-06-2005 09:44 PM

Chưa thể trả lời chi tiết lúc này, nhưng việc lắp thêm được bao nhiêu dung lượng nhớ, phụ thuộc vào chuẩn giao tiếp với ROM, RAM ngoài.

Để đơn giản, tôi lấy thí dụ một con ROM có 2 bit địa chỉ để enable nó. Như vậy, trên mạch, nếu bạn dùng 1 đường nối, bạn chỉ có thể nối tối đa 4 con ROM ngoài. Như vậy, điều này giới hạn số lượng ROM, RAM được nối vào PIC.

Điều thứ hai, khi truy cập bằng các chuẩn giao tiếp như I2C, SPI, tùy thuộc vào bạn sử dụng giao tiếp với bao nhiêu bit địa chỉ, thì bạn sẽ có số lượng giới hạn bấy nhiêu thiết bị có thể kết nối với PIC. Hiện nay, một số PIC hỗ trợ 2 cổng I2C, và thêm mấy cổng SPI.. nếu bạn có đủ can đảm dùng hết số cổng này cho việc kết nối vào ROM, thì đúng là tôi cũng chịu thua luôn.

Con số 10MB tôi chưa bao giờ tính toán thử khả năng tối đa của nó, nhưng theo ước tính sơ bộ thì là không thể.

Nhưng nếu bạn làm cách này, bạn thiết lập chuẩn giao tiếp, và kết nối với các con Flash, thì bạn thích kết nối đến bao nhiêu cũng được. Bởi vì theo tôi biết, con Flash lớn nhất hiện nay có dung lượng 1GB.

Bạn có bao giờ mở cái USB key của bạn ra chưa? Thực ra trong đó là một con Flash. Đáng tiếc, tôi chưa bao giờ thử kết nối với nó, nên không biết trả lời bạn cách nào.

Các con ROM thông dụng 512Kbit. Bạn có thể tìm trên www.microchip.com

Chúc vui.

zero2one 02-07-2005 02:09 AM

có điều này chưa hiểu, mong các bác chỉ giáo :
trong MPLAB, để khai báo biến có rất nhiều cách theo các derectives của nó : RES, EQU... với EQU có thể khai báo hằng, biến thanh ghi nhưng với một cấu trúc như vậy thì khi nào biết được nó là thanh ghi, khi nào nó là một hằng ?

falleaf 02-07-2005 02:44 AM

Nếu hiểu nôm na theo cách này, bạn có thể sẽ dễ hiểu nó hơn, một hằng là một giá trị. Giá trị đó có thể nằm trong thanh ghi dữ liệu (bộ nhớ dữ liệu), nhưng cũng có thể nằm trong lệnh điều khiển (bộ nhớ chương trình). Điều này khẳng định rằng, hằng là một giá trị.

Một khi bạn đặt một tên nào đó, để đại diện cho một hằng số, có nghĩa là thay vì bạn viết cái giá trị đó, thì bạn viết cái tên đại diện đó, để dễ nhớ. Chẳng hạn, bạn viết chữ pi, đại diện cho hằng số có giá trị 3.1415926....

Trong khi đó, nếu bạn đặt một biến pi, thì có nghĩa là bạn xác định địa chỉ của thanh ghi dữ liệu nào đó, mà mỗi khi bạn truy xuất đến biến pi, có nghĩa là bạn đang thao tác với thanh ghi ở địa chỉ mà biến pi đại diện. Ví dụ: bạn đặt biến pi ở thanh ghi 0x20 chẳng hạn. Điều đó có nghĩa là khi ban làm gì với biến pi, chính là bạn đang làm việc với thanh ghi ở địa chỉ 0x20.

Nhưng bạn sẽ thấy rằng, vậy biến pi và hằng số pi có gì khác nhau? Bây giờ biến pi và hằng pi cũng đều mang giá trị cả. Nhưng các bạn nên nhớ, trong câu lệnh lúc nào vị trí của biến (thanh ghi) F, và vị trí của hằng số k (trong cấu trúc một câu lệnh MPASM, tôi sẽ post lại bài này từ dddt). có sự phân biệt rõ ràng.

Vậy tùy theo vị trí bạn đặt nó ở đâu, nó sẽ là biến, hoặc là hằng. Nếu là biến, nó chỉ mang giá trị của dịa chỉ của thanh ghi nằm trong bộ nhớ dữ liệu, nếu là hằng, nó nằm đâu cũng được kể cả ở bộ nhớ dữ liệu và bộ nhớ chương trình.

Các bạn cần tham khảo bài viết tập lệnh MPASM và kiến trúc PIC và bài kỹ thuật bảng, đã được đăng tại www.diendandientu.com.

Khi có thời gian, tôi sẽ chuyển bài viết đó về đây để các bạn xem.

zero2one 02-07-2005 02:13 PM

Trích:

Nguyên văn bởi falleaf
Vậy tùy theo vị trí bạn đặt nó ở đâu, nó sẽ là biến, hoặc là hằng. Nếu là biến, nó chỉ mang giá trị của dịa chỉ của thanh ghi nằm trong bộ nhớ dữ liệu, nếu là hằng, nó nằm đâu cũng được kể cả ở bộ nhớ dữ liệu và bộ nhớ chương trình.

Em vẫn còn đôi điều khúc mắc, mong bác nhiệt tình chỉ bảo :
Khi viết :
LABLE1 EQU 0x20
....
MOVLW 0xFF
MOVWF LABLE1
-> lúc này em muốn LABLE1 là một biến, đặt nó ở vị trí 0x20 trong RAM -> OK.

Còn :
LABLE2 EQU 0x20
...
MOVLW LABLE2
-> em muốn LABLE2 là một hằng mang giá trị 0x20 và OK.

Nhưng nếu gộp lại :
LABLE3 EQU 0x20
...
MOVLW 0xFF
MOVWF LABLE3

MOVLW LABLE3 ;!!!!???? :confused:

thì W = ?, có gì sai không ?

Như vậy, chốt lại : cụ thể với câu lệnh "LABLE3 EQU 0x20" thì trình dịch nó có hiểu LABLE3 là hằng hay là một thanh ghi (biến) ? Hay là nó phải phụ thuộc vào những thao tác phía sau này, xem người dùng định nghĩa nó như hằng hay thanh ghi ? :confused:
Ý của em là vậy, vì mới học nên thắc mắc lung tung, thấy bác nhiệt tình nên em mới dám hỏi. Mong bác chỉ bảo :)

tuanva 02-07-2005 02:55 PM

Tôi đã làm mạch chạy theo hướng dẫn. Tôi dùng thạch anh 10Mhz. Xin hỏi nếu tôi muốn PIC chạy tốc độ < 10Mhz (8 MHz chẳng hạn) mà ko thay thạch anh có được không? Làm thế nào?

Thank.

tuanva 02-07-2005 06:00 PM

Re: Nút bấm
 
Phần nút bấm falleaf có thể cho 1 đoạn code mẫu (dùng cho mạch trong bài này) được không?

falleaf 03-07-2005 12:08 AM

Hiện nay tôi đang khá bận, cho nên các câu hỏi của các bạn, tôi sẽ trả lời sau.

Tôi đề nghị rằng chúng ta nên tạo ra một cái luồng khác để thảo luận, và đặt các câu hỏi ngắn. Phần bài viết này có lẽ các bạn chỉ nên nói về những cái đúng, cái sai trong bài viết của tôi, và những đề nghị cải tiến, hoặc những sản phẩm minh họa mà các bạn đã thực hiện từ bài viết này.

Bởi vì những bài viết này, sau này sẽ được tổng hợp thành tutorial về PIC, và tôi không đủ khả năng một mình viết hết tất cả các vấn đề như các cuốn sách lớn khác, nên tôi rất cần sự bổ sung sản phẩm thực tế của các bạn, sẽ làm cho cuốn sách có giá trị hơn.

Vì nếu không, các bạn cứ đặt câu hỏi ở đây, luồng này sẽ rất dài, và gây khó khăn cho người đọc.

Chân thành cảm ơn.

Falleaf.

zero2one 03-07-2005 12:50 AM

OK, ủng hộ bác falleaf.

falleaf 11-07-2005 10:45 PM

Hướng dẫn về thanh ghi W
 
Thanh ghi W



Trong bài này, chúng ta nói đôi nét về thanh ghi W để các bạn nắm rõ hơn phương thức hoạt động của PIC.

Khái niệm thanh ghi W:

Thanh ghi W là thanh ghi làm việc (Working register), và hầu hết mọi lệnh của PIC đều liên quan đến thanh ghi W này, lấy thí dụ như ADDLW (cộng một số vào giá trị đã có trong thanh ghi W), SUBWF (trừ giá trị của thanh ghi W cho một thanh ghi khác), XORLW (lấy XOR của một số và thanh ghi W)... Và các bạn để ý rằng, tổng số lệnh có thể tương tác với thanh ghi W là 23/35 lệnh, gần như chiếm toàn bộ tập lệnh của PIC. Vậy chúng ta ghi nhận điều thứ nhất, khi PIC làm việc, gần như luôn luôn tương tác với thanh ghi W.

Điều thứ hai, các bạn nhìn trong bản đồ bộ nhớ dữ liệu của PIC, các bạn sẽ thấy là thanh ghi W là thanh ghi không có mặt ở bất kỳ băng nào của bộ nhớ dữ liệu, trong khi đó thanh ghi STATUS có mặt ở cả 4 băng. Các bạn lại thấy một điều rằng, thanh ghi W và thanh ghi STATUS có thể được truy nhật từ tất cả các băng, và từ bất kỳ đâu trong chương trình, và vì vậy chúng trở thành những thanh ghi toàn cục nhất. Điểm khác biệt giữa chúng ra sao? Đâu là sự khác biệt giữa thanh ghi W và các thanh ghi khác?

Điểm thứ ba, trong tập lệnh của PIC, không có lệnh nào cho phép tương tác trực tiếp giữa một thanh ghi trong bộ nhớ dữ liệu dùng chung với một giá trị thêm vào, mà đều phải thông qua thanh ghi W. Như vậy, thanh ghi W là cầu nối của hầu hết các phép toán được thực hiện trên các thanh ghi nằm trong bộ nhớ dữ liệu.

Như vậy, thanh ghi W vô cùng quan trọng trong hoạt động của PIC.

Nhắc lại kiến trúc Harvard và Von Newmann:

Hình sau sẽ gợi lại cho các bạn nhớ về kiến trúc Harvard và Von Newmann, trong đó các bạn luôn nhớ rằng có sự phân biệt giữa bộ nhớ dữ liệu và bộ nhớ chương trình. Các bạn thấy rằng bus bộ nhớ chương trình của PIC midrange chỉ có 14 bit.


Với đặc điểm này, chúng ta sẽ phân tích vì sao cần phải có thanh ghi W, và sau đó chúng ta sẽ phân tích tất cả các hoạt động của thanh ghi W trong một chương trình viết bằng PIC, nếu có thể. Những gì còn lại, chúng ta sẽ xem trong bài tập lệnh của PIC midrange.

Vì sao cần phải có thanh ghi W?

Bạn sẽ làm thế nào để tính phép toán sau: lấy giá trị a của thanh ghi A cộng với giá trị b của thanh ghi B và đặt vào thanh ghi A? Một giới hạn của tập lệnh PIC là không cho phép cộng hai thanh ghi và đặt vào một thanh ghi khác. Do đó, các bạn sẽ phải thực hiện thao tác sau:

Chuyển giá trị b từ thanh ghi B vào thanh ghi W, sau đó lấy giá trị của thanh ghi W (lúc này là b) cộng với giá trị a ở thanh ghi A, sau đó gán lại vào thanh ghi A. Đoạn code được thực hiện như sau:

Code:

MOVF        B,        W                ; chuyển giá trị của thanh ghi B vào thanh ghi W
ADDWF        A,        F                ; cộng giá trị của thanh ghi A với giá trị b của thanh ghi W và gán lại vào A

Khi các thanh ghi A và B không nằm trong cùng một băng, khi thao tác với từng thanh ghi, các bạn chỉ việc đổi về băng chứa các thanh ghi đó là xong. Một đoạn lệnh hoàn chỉnh có thể thực hiện cho bất kỳ 2 thanh ghi nào được viết như sau:

Code:

                BANKSEL        B
                MOVF                B,        W
                BANKSEL        A
                ADDWF                A,        F


Đoạn chương trình này cũng minh hoạ luôn cho việc thanh ghi W là một thanh ghi toàn cục, khi chúng ta thao tác với thanh ghi B ở một băng bấ kỳ, nhưng khi chuyển giá trị b từ thanh ghi B vào thanh ghi W rồi, thì chúng ta không cần quan tâm rằng giá trị đó nằm ở đâu, chỉ cần chuyển về băng chứa thanh ghi A thì lệnh cộng sẽ được thực hiện một cách dễ dàng.

Một thí dụ khác về lệnh cộng, nhưng không phải là cộng giá trị nằm trong 2 thanh ghi, mà là cộng giá trị a của thanh ghi A với một số k cho trước nào đó, giả sử k = 5 và lưu vào thanh ghi A.

Chúng ta thấy rằng, hoàn toàn trong tập lệnh không có lệnh cộng trực tiếp một thanh ghi với một số, mà chỉ có lệnh cộng một số với thanh ghi W. Như vậy chúng ta phải thực hiện thao tác sau: chuyển giá trị a từ thanh ghi A vào thanh ghi W, cộng thanh ghi W với hằng số k = 5, sau đó chuyển giá trị mới của thanh ghi W trở lại thanh ghi A. Điều này được thực hiện như sau:

Code:

                MOVF                A,        W
                ADDLW                d'5'
                MOVWF                A

Trong thí dụ này, chúng ta sẽ không thấy W là một biến tạm nữa, mà trở thành một thanh ghi dùng để lưu kết quả cộng với một con số. Đến bây giờ, thì chúng ta sẽ giả thích rõ hơn vì sao chúng ta phải làm như vậy.

Chúng ta thấy rõ ràng rằng, một dòng lệnh của PIC midrange, được mô tả bằng 14 bit. Điều này có nghĩa là, khi thực hiện một lệnh cộng, không thể nào dòng lệnh đó vừa lưu địa chỉ của thanh ghi A, vừa lưu giá trị 8 bit của hằng số k được, vì một thanh ghi trong dòng PIC midrange cần tối thiếu 7 bit để biểu diễn địa chỉ thanh ghi, và một hằng số chiếm 8 bit. Nó vượt quá con số 14 bit cho phép để mã hoá lệnh. Chính vì vậy, không thể thực hiện lệnh cộng trực tiếp từ một thanh ghi với một số được. Quay lại thí dụ ở trên, chúng ta cũng thấy rằng không thể thực hiện việc cộng hai thanh ghi với nhau, nếu như cần lưu 2 địa chỉ thanh ghi, chúng ta sẽ mất 14 bit, và như vậy không có các bit mã hoá mô tả lệnh cần thực hiện là gì.

Đây chính là điểm khác biệt giữa tập lệnh RISC và tập lệnh CISC. Tập lệnh CISC có thể thực hiện lệnh phức, vì nó có thể tạo ra một lệnh dài 8 bit, 16 bit, 24 bit... và là bộ số của 8 bit. Do đó, nếu cần cộng 2 thanh ghi 8 bit, nó hoàn toàn có thể tạo ra một lệnh dài 24 bit, trong đó 8 bit dùng để mã hoá, 8 bit dành cho địa chỉ của thanh ghi thứ nhất, 8 bit dành cho địa chỉ cua thanh ghi thứ 2. Trong khi đó, tập lệnh CISC là tập lệnh rút gọn, cho dù nó là lệnh gì, nó cũng luôn luôn chỉ có 14 bit (đối với PIC midrange).

Thanh ghi W giống như một thanh ghi mặc định duy nhất, vì vậy, khi thực hiện, bộ xử lý trung tâm có thể giải mã được nếu lệnh đó có cần thao tác với thanh ghi W hay không, mà không cần lưu địa chỉ của thanh ghi W bên trong đoạn mã lệnh.

Chúng ta xem hình dưới đây để biết được bộ xử lý logic hoạt động như thế nào với thanh ghi W.


Vậy chúng ta đã thấy rõ sự cần thiết của thanh ghi W, bởi vì chúng ta cần có một thanh ghi tạm cho các công việc tính toán, và chúng ta cần mã hoá thanh ghi mà không cần tốn quá nhiều bit, vậy thì thanh ghi W vừa là thanh ghi có tính toàn cục, vừa là thanh ghi tạm, vừa là thanh ghi không cần thiết nhiều bit để biểu diễn địa chỉ.

Các bạn đã biết vì sao chúng ta phải cần thanh ghi W, bây giờ chúng ta cần biết thanh ghi W hoạt động như thế nào trong các chương trình của PIC.

falleaf 25-07-2005 03:11 AM

Kỹ thuật bảng
 
Các bạn có thể download bài viết Kỹ Thuật Bảng tại đây để tham khảo và hiểu kỹ thuật thiết lập một bảng dữ liệu với PIC.

Kỹ thuật bảng này dùng trong một số trường hợp như: Xuất dữ liệu ra LCD, ra màn hình, sử dụng làm các vector điều khiển vận tốc gia tốc động cơ, dùng để điều khiển động cơ bước...

planandwork 10-10-2005 10:43 PM

tuyệt quá tuyệt quá .
em phải mua ngay 1 mạch nạp pic mới được .

tinhthanthep 20-10-2005 11:28 PM

Sao vẫn chưa thấy bác falleaf viết tiếp về phần nút bấm nhỉ? trong phần này còn có kỹ thuật xử lý rung của nút bấm nữa. Và cả ngắt nữa...

falleaf 21-10-2005 09:40 AM

Thí dụ về nút bấm
 
Đây là một thí dụ về nút bấm:

Nối nút bấm với RA0, RA1, RA2, RA3 với điện trở kéo lên. Nối đèn LED vào RB0, RB1, RB2, RB3 với điện trở nối tiếp và đèn LED được nối xuống mass.

(hình vẽ sẽ post lên sau vì chưa có thời gian)

Thuật toán quét sẽ như sau:

Nếu SW0 là cao thì bật LED0
Nếu SW0 là thấp thì tắt LED0
Nếu SW1 là cao thì bật LED1.... cứ như thế cho các nút bấm khác.

Chương trình như sau:

Code:

;---------------------------------
; Khoi tao
;---------------------------------
; Đặt PORTA có RA0 - RA3 là input
; Đặt PORTB có RB0 - RB3 là output
; Xóa PORTA, xóa PORTB

SW0          BTFSC            PORTA,        0
                GOTO            TURNON0
                BCF                PORTB,        0

SW1          BTFSC            PORTA,        1
                GOTO            TURNON1
                BCF                PORTB,        1

SW2          BTFSC            PORTA,        2
                GOTO            TURNON2
                BCF                PORTB,        2

SW3          BTFSC            PORTA,        3
                GOTO            TURNON3
                BCF                PORTB,        3

                GOTO            SW0                          ; quay lại quét từ đầu

TURNON0    BSF              PORTB,          0
                GOTO            SW1

TURNON1    BSF              PORTB,          1
                GOTO            SW2

TURNON2    BSF              PORTB,          2
                GOTO            SW3

TURNON3    BSF              PORTB,          3
                GOTO            SW0

END.


Xong!


Các bạn làm thử chơi vui... Chúc một cuối tuần vui vẻ.


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