PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và 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

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 22-04-2008, 08:46 AM   #91
tam_pascal
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 8
:
Bang chủ làm ơn cho hỏi: địa chỉ cổng b của 18f4550 là gì ?, mình tìm mãi không thấy nó ghi ở chỗ nào cả. Xin cảm ơn !!!
tam_pascal vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-04-2008, 04:59 PM   #92
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi tam_pascal View Post
Bang chủ làm ơn cho hỏi: địa chỉ cổng b của 18f4550 là gì ?, mình tìm mãi không thấy nó ghi ở chỗ nào cả. Xin cảm ơn !!!
Trong datasheet của PIC18F4550, bảng 5-1, có bản đồ bộ nhớ của vùng RAM dữ liệu. Thanh ghi TRISB có địa chỉ 0xF93, còn PORTB có địa chỉ 0xF81.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-08-2008, 05:36 PM   #93
bachelor
Đệ tử 2 túi
 
Tham gia ngày: Jun 2006
Bài gửi: 27
:
góp ý với bang chủ về mẫu chương trình

Trích:
Nguyên văn bởi falleaf View Post
Các bạn cần chú ý thêm, nếu phía trên chỗ biến ở băng 2, các bạn không đặt biến gì cả, thì các bạn cứ để nguyên như vậy, vì ngay bên dưới, các bạn đã đặt lại địa chỉ 0x0000, nó chẳng ảnh hưởng gì đến chương trình.

Cũng giống như, nếu bạn không viết gì ở đoạn ORG 0x0000 và GOTO MAIN, mà bạn để ngay dòng ORG 0x0005 thì chương trình vẫn chạy bình thường. Đơn giản là từ đoạn 0x0000 đến 0x0004, PIC sẽ không làm gì cả. Chúng tôi đang cố gắng từng bước hình thành cho bạn kết cấu chương trình viết bằng MPASM, mỗi ngày một hoàn thiện hơn, để các bạn nắm rõ lý do vì sao các chương trình được viết như vậy, và chúng ta cùng thống nhất với nhau ở điểm này khi viết chương trình. Nếu các bạn tin tưởng vào việc tạo ra một chuẩn viết chương trình MPASM cho Việt Nam, thì các bạn là người đang đặt nền móng cho nó. Tôi cũng có tham vọng này, cho nên các quy cách ký hiệu tôi cố gắng dùng một chuẩn thống nhất, và mong rằng các bạn cùng tôi làm việc này, để sau này tất cả mọi người khi làm việc cùng với nhau có thể hiểu và truyền tải ý tưởng một cách nhanh nhất.

Kể từ nay, các bạn đã biết cách đặt biến, biết cách viết phần khởi tạo, chúng ta sẽ chỉ còn bàn tới việc viết ở phần chương trình chính như thế nào nữa mà thôi.

Code:
;============================================================================
			ORG	0x0000
			GOTO	MAIN

			ORG	0x0005
MAIN
			BANKSEL	TRISB
			CLRF		TRISB		; đặt portb là output

			MOVLW		D'255'
			MOVWF		COUNT_L	; COUNT_L là 1 byte

			BANKSEL	PORTB
LOOP			BSF		PORTB,	0
			CALL		DELAY
			BCF		PORTB,	0
			CALL		DELAY
			GOTO		LOOP

;=============================================================================
; Các chương trình con
;=============================================================================
DELAY			DECFSZ		COUNT_L,	F
			GOTO		DELAY
			RETURN

;=============================================================================
			GOTO		$
			END
;=============================================================================
Các bạn vừa làm gì với đoạn chương trình trên?

Điểm thứ nhất các bạn nên chú ý, đó là việc tôi thêm phần các chương trình con vào trong phần chương trình chính. Phần cuối chương trình tôi vẫn luôn để là GOTO $ và kết thúc với lệnh END. Tạm thời các bạn cứ viết như vậy để khoá chương trình ở dòng GOTO $, khi chương trình nhảy đến đó, nó sẽ thực hiện vòng lặp vô cùng tại chỗ, còn lệnh END là lệnh bắt buộc.

Việc này giúp chúng ta phần tách rạch ròi phần chương trình con và chương trình chính để tránh nhầm lẫn. Bởi vì ở đây chúng ta mới bắt đầu các bài học cơ bản, cho nên tôi cho rằng các chương trình của các bạn viết là ngắn, nên chúng ta chưa đi xa hơn về việc phân bổ vị trí này. Các bạn chỉ đơn giản hiểu là chúng ta cần phải bỏ đoạn chương trình con ở đâu đó, và chúng ta nên tách thêm một phần nữa để dành riêng cho việc viết chương trình con. Việc làm này về sau sẽ rất có lợi, nhưng tạm thời chúng ta khoan bàn tới, và chúng ta cứ viết như vậy đã.

Phân tích về đoạn chương trình con này, chúng ta thấy chương trình con luôn bao gồm như sau:

Code:
[NHÃN]
			các câu lệnh
			RETURN
Lưu ý rằng ở trên, chúng ta gọi chương trình con CALL DELAY. Như vậy, việc gọi hàm được thực hiện bằng lệnh CALL [NHÃN].

Con trỏ chương trình sẽ nhảy về [NHÃN] được gọi. Nó thực hiện các lệnh nằm từ nhãn đó trở đi. Thực hiện cho đến khi gặp lệnh RETURN, nó sẽ quay trở về và thực hiện lệnh tiếp theo ngay bên dưới lệnh CALL. Ở đây, chúng ta gặp phải một vấn đề, đó là khái niệm Top of Stack. Tuy nhiên, chúng ta tạm gác nó lại cho bài học sau, còn bây giờ các bạn chỉ cần nắm được việc thực hiện lệnh CALL bao giờ cũng đi kèm với một nhãn. Con trỏ nhảy tới nhãn và thực hiện các lệnh bên trong đó, đến khi gặp lệnh RETURN thì nó nhảy trở về vị trí nằm sau lệnh CALL đó và thực hiện tiếp công việc đang làm.

Vì bỏ qua khái niệm Top of Stack, cho nên đề nghị các bạn không đặt ra câu hỏi nếu trong các lệnh thực hiện, nó lại có một lệnh CALL gọi đi chỗ khác thì làm thế nào? Chúng ta sẽ giải quyết vấn đề này ở phần sau.

Thế bên trong hàm DELAY chúng ta làm những gì?

Lưu ý rằng, ở trên chương trình chính, sau khi đã khởi tạo PORTB là ngõ output, các bạn thấy chúng ta đã ghi giá trị d'255' vào biến COUNT_L. Cách viết giá trị như sau:

b'11001010' để xác định số nhị phân
d'234' để xác định số thập phân
0xF3 để xác định số thập lục phân

Lưu ý:
Số nhị phân chỉ có các giá trị 0 và 1, và tối đa dài 8 bit. Số thập phân chỉ có thể có giá trị từ 0 đến 255, và số thập lục phân chỉ có giá trị từ 00 đến FF

Quay trở lại, biến COUNT_L đang mang giá trị 255.

Khi thực hiện hàm DELAY, các bạn thực hiện lệnh DECFSZ (DECrement File, Skip if Zero), có nghĩa là nó sẽ giảm giá trị của một thanh ghi nào đó một đơn vị. Nếu sau khi giảm xong, mà kết quả là 0, thì nó sẽ nhảy cách ra một ô nhớ trong bộ nhớ chương trình, và thực hiện lệnh tiếp theo đó. Nếu giá trị sau khi giảm một đơn vị chưa bằng 0, thì nó sẽ thực hiện lệnh liền kề với nó.

Như vậy, vòng lặp được thực hiện như sau:

Code:
COUNT_L = 255 (ở trên đã đặt)

DELAY     COUNT_L = COUNT_L - 1
if COUNT_L <> 0
	GOTO DELAY
if COUNT_L = 0
	RETURN
Code:
Lệnh DECFSZ	[File],	F/W
Nếu phía sau dấu phẩy, chúng ta để W, thì kết quả sẽ lưu vào thanh ghi W, và [File] không thay đổi giá trị gì hết. Nhưng ở đây, chúng ta muốn thực hiện như đoạn mã giả ở trên, nên chúng ta phải để là F.

COUNT_L sẽ giảm dần từ 255 đến 1, trong quá trình đó nó cứ chạy lên DELAY, rồi giảm COUNT_L một đơn vị, xong lại nhảy về DELAY, lại thực hiện việc giảm 1 đơn vị của COUNT_L

Khi COUNT_L = 1 nó lại giảm 1 đơn vị, lúc này COUNT_L = 0. Và nó không thực hiện lệnh GOTO nữa, mà thay bằng lệnh NOP, sau đó nó thực hiện lệnh RETURN, có nghĩa là quay về lại lệnh CALL ở trên.

Như vậy, các bạn đã hiểu rõ hàm DELAY rồi. Nhưng quan trọng nhất là làm sao tính toán được thời gian hao tốn của đoạn vòng lặp này kể từ khi bắt đầu thực hiện lệnh CALL, vì thực ra chúng ta muốn là muốn biết chính xác thời gian thực hiện lệnh của nó.

Thời gian thực hiện của lệnh CALL DELAY là bao lâu?

Lệnh CALL khi thực hiện tốn 2 chu kỳ máy, như vậy chúng ta ghi chú là (2) ở đây.

Lệnh DECFSZ tốn 1 chu kỳ máy khi giá trị trả về khác 0. Như vậy, trong quá trình thực hiện giảm từ 255 xuống 1, nó thực hiện 255 - 1 = 254 lần. Mỗi lần thế này nó tốn 1 chu kỳ máy, chúng ta ký hiệu (254) ở đây.

Khi thực hiện lệnh GOTO, lệnh GOTO tốn 2 chu kỳ máy, vậy nó cũng thực hiện 254 lần, chúng ta ký hiệu (254 x 2 = 506) ở đây.

Khi COUNT_L = 1, nó vẫn thực hiện lệnh DECFSZ, vậy nó tốn thêm 1 chu kỳ máy nữa (1). Sau khi thực hiện lệnh này, kết quả trả về là 0, vậy nó sẽ thực hiện một lệnh NOP (1), và sau đó thực hiện lệnh RETURN, lệnh RETURN tốn 2 chu kỳ máy (2)

Kết quả:

(2) + (254) + (508) + (1) + (1) + (2) = 768 chu kỳ máy

Nếu chúng ta dùng thạch anh 10MHz, mỗi chu kỳ máy tốn 0.4 us, có nghĩa là lệnh CALL DELAY tốn:

768 * 0.4 us tức là khoảng 1/3000 giây.

Chúng ta khoan bàn đến việc xa hơn, vậy thì chúng ta đã biết cách tính thời gian hao tốn của hàm DELAY rồi. Nhưng nếu tính như thế này thì quá mất công, chúng ta có thể chuyển nó thành công thức cụ thể như sau:

CALL = 2

DELAY (COUNT_L) = [COUNT_L - 1] * (DECFSZ + GOTO) + 1 + 1

RETURN = 2

Các bạn nên nhớ công thức này để sau này phát triển lên tính các công thức khác.

Có lẽ hôm nay chúng ta tạm dừng bài học ở đây


Các bạn lưu ý, tôi có tính sai một đoạn phía trên, vì quáng gà hay sao đó, tính từ 255 xuống 1 giảm chỉ có 253 lần. Đúng là phải 254 lần. Như từ 2 giảm xuống 1 thì chỉ có 1 lần thôi. Xin thành thật cáo lỗi với các bạn.
trong ví dụ mẫu trên theo tôi có một chỗ không hợp lý, đó là việc để các hàm con (ở ví dụ là hàm delay) nằm trên dòng lệnh goto $. ở ví dụ này sẽ không có lỗi vì bản thân vòng lặp loop là vòng lặp vô hạn nên không có vấn đề gì. nếu không phải là vòng lặp vô hạn thì chương trình sẽ được thực hiện tiếp tục và các lệnh trong hàm con sẽ được thực hiện sau đó mới đến dòng lệnh goto $ vì vậy chương trình sẽ chạy sai.
theo tôi nên đặt các hàm con nằm giữa dòng lệnh goto $ và end
mạn phép bang chủ có mấy lời góp ý xin mọi người cho ý kiến !
bachelor vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-08-2008, 07:21 PM   #94
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi bachelor View Post
trong ví dụ mẫu trên theo tôi có một chỗ không hợp lý, đó là việc để các hàm con (ở ví dụ là hàm delay) nằm trên dòng lệnh goto $. ở ví dụ này sẽ không có lỗi vì bản thân vòng lặp loop là vòng lặp vô hạn nên không có vấn đề gì. nếu không phải là vòng lặp vô hạn thì chương trình sẽ được thực hiện tiếp tục và các lệnh trong hàm con sẽ được thực hiện sau đó mới đến dòng lệnh goto $ vì vậy chương trình sẽ chạy sai.
theo tôi nên đặt các hàm con nằm giữa dòng lệnh goto $ và end
mạn phép bang chủ có mấy lời góp ý xin mọi người cho ý kiến !
PIC là một bộ xử lý nhúng, và thông thường chỉ chạy chương trình ứng dụng duy nhất (ở đây không tính đến các RTOS nhé). Do đó, luôn luôn có một vòng lặp vô tận (vòng lặp chính) trong chương trình.

Do đó, mệnh đề "nếu không phải là vòng lặp vô hạn" của bạn chỉ có giá trị true khi chương trình cho PIC được viết tồi. Và cấu trúc của chương trình mẫu không có gì bất hợp lý.

Lệnh goto $ ngay phía trước directive end của chương trình mẫu vốn là một lệnh thừa. Việc đặt các chương trình con ở đâu trong chương trình hợp ngữ vốn không quan trọng, trừ một số trường hợp liên quan đến kỹ thuật bảng.

Lập trình cho PIC có một số điểm khác biệt so với lập trình cho PC, vì sự hạn chế tài nguyên cùng cấu trúc đặc biệt của PIC so với một máy vi tính (đa dụng).

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-08-2008, 01:11 AM   #95
bachelor
Đệ tử 2 túi
 
Tham gia ngày: Jun 2006
Bài gửi: 27
:
Trích:
Nguyên văn bởi namqn View Post
PIC là một bộ xử lý nhúng, và thông thường chỉ chạy chương trình ứng dụng duy nhất (ở đây không tính đến các RTOS nhé). Do đó, luôn luôn có một vòng lặp vô tận (vòng lặp chính) trong chương trình.

Do đó, mệnh đề "nếu không phải là vòng lặp vô hạn" của bạn chỉ có giá trị true khi chương trình cho PIC được viết tồi. Và cấu trúc của chương trình mẫu không có gì bất hợp lý.

Lệnh goto $ ngay phía trước directive end của chương trình mẫu vốn là một lệnh thừa. Việc đặt các chương trình con ở đâu trong chương trình hợp ngữ vốn không quan trọng, trừ một số trường hợp liên quan đến kỹ thuật bảng.

Lập trình cho PIC có một số điểm khác biệt so với lập trình cho PC, vì sự hạn chế tài nguyên cùng cấu trúc đặc biệt của PIC so với một máy vi tính (đa dụng).

Thân,
Đó, chính bản thân lệnh goto $ theo namqn đã là thừa, vậy nên phải sửa chg trình mẫu là đúng rồi
Tuy nhiên, theo tôi lệnh goto $ chỉ thừa trong trường hợp này thôi (trong vi dụ mẫu) còn trong một số trg hợp khác bản thân nó là một "vòng lặp vô hạn không làm gì cả " (kiểu như: while(TRUE) {}; ) thì lại không thừa. Chẳng hạn một chương trình không làm gì cả mà chỉ khởi tạo các giá trị ban đầu rồi chờ các sự kiện ngắt để phục vụ thì không thể coi đó là một chương trình tồi và lẽ đương nhiên là cần phải có một lệnh goto $ để tạo ra vòng lặp vô hạn (tất nhiên mọi người có thể nói là không cần lệnh goto $ mà dùng lệnh loop goto loop )
Tất nhiên chương trình con thì đặt đâu mà chả được, nhưng đây là nói tới cái chương trình mẫu mà F tạo ra dành cho người mới học (như tôi chẳng hạn), cứ copy nguyên về, thay cái phần nội dung trong main và chương trình con cho phù hợp với bài toán của mình rồi biên dịch rồi chạy rồi thấy nó chạy loạn lên vì các lý do mà tôi đã đề cập ở bài trước. vì thế mới góp ý để F sửa đổi một chút chương trình mẫu để cho những người mới học khác có muốn copy về, xào xáo lại như tôi sẽ không bị nhầm lẫn nữa
bachelor vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-08-2008, 01:39 AM   #96
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi bachelor View Post
Đó, chính bản thân lệnh goto $ theo namqn đã là thừa, vậy nên phải sửa chg trình mẫu là đúng rồi
Tuy nhiên, theo tôi lệnh goto $ chỉ thừa trong trường hợp này thôi (trong vi dụ mẫu) còn trong một số trg hợp khác bản thân nó là một "vòng lặp vô hạn không làm gì cả " (kiểu như: while(TRUE) {}; ) thì lại không thừa. Chẳng hạn một chương trình không làm gì cả mà chỉ khởi tạo các giá trị ban đầu rồi chờ các sự kiện ngắt để phục vụ thì không thể coi đó là một chương trình tồi và lẽ đương nhiên là cần phải có một lệnh goto $ để tạo ra vòng lặp vô hạn (tất nhiên mọi người có thể nói là không cần lệnh goto $ mà dùng lệnh loop goto loop )
Tất nhiên chương trình con thì đặt đâu mà chả được, nhưng đây là nói tới cái chương trình mẫu mà F tạo ra dành cho người mới học (như tôi chẳng hạn), cứ copy nguyên về, thay cái phần nội dung trong main và chương trình con cho phù hợp với bài toán của mình rồi biên dịch rồi chạy rồi thấy nó chạy loạn lên vì các lý do mà tôi đã đề cập ở bài trước. vì thế mới góp ý để F sửa đổi một chút chương trình mẫu để cho những người mới học khác có muốn copy về, xào xáo lại như tôi sẽ không bị nhầm lẫn nữa
Không đồng ý với bạn, vì bạn nêu lên một chi tiết không hợp lý ở post trước đó, bây giờ lại bắt sang một chi tiết (được cho là) không hợp lý khác, mà không thể hiện được cái bất hợp lý mà bạn đã nêu ở post trước.

Trong cấu trúc của chương trình mẫu, vòng lặp chính là vòng lặp giữa nhãn loop và lệnh goto loop. Nếu muốn biến nó thành while (true) {} thì không cần viết lệnh gì vào vòng lặp đó là xong. Do vậy, lệnh goto $ phía trước dẫn hướng end vẫn là thừa. Hơn nữa, viết theo kiểu loop goto loop hay goto $ đều dịch ra cùng kết quả.

Cấu trúc của chương trình mẫu là ổn, đảm bảo không có chuyện "copy nguyên về, thay cái phần nội dung trong main và chương trình con cho phù hợp với bài toán của mình rồi biên dịch rồi chạy rồi thấy nó chạy loạn lên". Đề nghị bạn post những chương trình kiểu đó lên để minh họa cho lý luận của bạn.

Về việc lệnh goto $ nằm trước dẫn hướng end: nó thừa nhưng chẳng ảnh hưởng gì đến chương trình ứng dụng (được viết đúng quy tắc) nên việc loại bỏ nó hay không vốn không phải là vấn đề.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-08-2008, 01:06 PM   #97
bachelor
Đệ tử 2 túi
 
Tham gia ngày: Jun 2006
Bài gửi: 27
:
Trích:
Nguyên văn bởi namqn View Post
Không đồng ý với bạn, vì bạn nêu lên một chi tiết không hợp lý ở post trước đó, bây giờ lại bắt sang một chi tiết (được cho là) không hợp lý khác, mà không thể hiện được cái bất hợp lý mà bạn đã nêu ở post trước.

Trong cấu trúc của chương trình mẫu, vòng lặp chính là vòng lặp giữa nhãn loop và lệnh goto loop. Nếu muốn biến nó thành while (true) {} thì không cần viết lệnh gì vào vòng lặp đó là xong. Do vậy, lệnh goto $ phía trước dẫn hướng end vẫn là thừa. Hơn nữa, viết theo kiểu loop goto loop hay goto $ đều dịch ra cùng kết quả.

Cấu trúc của chương trình mẫu là ổn, đảm bảo không có chuyện "copy nguyên về, thay cái phần nội dung trong main và chương trình con cho phù hợp với bài toán của mình rồi biên dịch rồi chạy rồi thấy nó chạy loạn lên". Đề nghị bạn post những chương trình kiểu đó lên để minh họa cho lý luận của bạn.

Về việc lệnh goto $ nằm trước dẫn hướng end: nó thừa nhưng chẳng ảnh hưởng gì đến chương trình ứng dụng (được viết đúng quy tắc) nên việc loại bỏ nó hay không vốn không phải là vấn đề.

Thân,
Theo mẫu:
Code:
;======================================
processor p16f84a
include    <p16f84a.inc>
__config  _cp_off & _wdt_off & _xt_osc
;======================================
org        0x0c
count0   res  1
count1   res  1
count2   res  1
;======================================
org        0x00
goto      main
org        0x05
;-------------------------------------------------
main
banksel   trisa
clrf         trisa
movlw     0xff
movwf    trisb
banksel   porta
clrf         porta
movlw     0x09
movwf    count0
clrw
btfsc      portb, 0
iorlw       b'00001'
btfsc      portb, 1
iorlw       b'00010'
btfsc      portb, 2
iorlw       b'00100'
btfsc      portb, 3
iorlw       b'01000'
btfsc      portb, 4
iorlw       b'10000'
addwf     count0, 1
delay0    call   delay100m
decfsz    count0,  f
goto       delay0
bsf         porta,  0
;-------------------------------------------------
delay100m
movlw     0x4e
movwf     count2
delay2
nop
nop
call         delay1278
decfsz     count2, f
goto        delay2
movlw     0xf0
movwf     count2
delay3
nop
decfsz    count2, f
goto       delay3
return
;-------------------------------------------------
delay1278
movlw    0xff
movwf    count1
delay1
nop
nop
decfsz   count1, f
goto      delay1
return
;-------------------------------------------------
goto     $
end
;======================================
thì chạy sai
nhưng chuyển các chương trình con xuống giữa 2 dòng goto $ và end thì chạy đúng
bây giờ quay trở lại chương trình mẫu: để như vậy đương nhiên vẫn chạy đúng chuyển các chương trình con xuống giữa 2 dòng goto $ và end vẫn chạy đúng
lẽ đương nhiên quẳng các chương trình con ở đâu mà chẳng được, thế nhưng với tiêu chí "học pic trong một ngày" tức là dành cho người mới học thì mẫu càng tổng quát càng tốt đúng không, vậy thì tại sao lại không chỉnh sửa một chút (chẳng sai gì và chẳng thiệt hại gì) để chương trình mẫu có thể tránh thêm một lỗi có thể gặp trong thực tế.
To Namqn: Từ đầu tôi vẫn nhất quán là chuyển chương trình con xuống thôi. còn những cái khác có thể là do cách diễn đạt làm bạn hiểu sai. Thế còn goto $ hay loop goto loop ai chả biết bản chất nó là một, ý tôi muốn nói ở đây là tôi thì thích dùng goto $ để làm vòng lặp while(TRUE); còn có thể ng khác lại thích dùng loop goto loop để làm vòng lặp while(TRUE);

thay đổi nội dung bởi: namqn, 02-08-2008 lúc 06:37 PM.
bachelor vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-08-2008, 06:44 PM   #98
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Bạn đã phá vỡ cấu trúc của chương trình mẫu. Trong chương trình mẫu, phần code của chương trình chính bắt đầu với các lệnh khởi tạo ban đầu, sau đó đi vào vòng lặp chính, còn các chương trình con nằm dưới vòng lặp chính.

Bạn đã bỏ mất vòng lặp chính (loop ... goto loop), dẫn đến chương trình con của bạn trở thành một phần trong đoạn mã khởi tạo, và sau đó bạn mượn lệnh goto $ thừa ngay trước dẫn hướng end để làm vòng lặp while (true) của bạn. Nếu bạn vẫn giữ vòng lặp chính loop ... goto loop nhưng không viết gì vào giữa thì cấu trúc của chương trình mẫu vẫn được giữ, và bạn đạt được mục đích của mình.

Do đó, tôi xin khẳng định rằng bạn viết code không tuân theo cấu trúc của chương trình mẫu, và chương trình mẫu không có vấn đề gì cần phải sửa.

Chương trình mẫu là tổng quát, đúng cho cả trường hợp bạn thích đặt cái gì vào vòng lặp chính, hay chỉ muốn có một vòng lặp vô tận ở đó. Nếu bạn thích dùng goto $ cho vòng lặp chính, thì sau khi loại bỏ hết code giữa loop và goto loop, bạn có thể viết nó lại thành goto $ (chứ không phải xóa hẳn cái vòng lặp đó đi như bạn đã làm).

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-08-2008, 07:49 PM   #99
bachelor
Đệ tử 2 túi
 
Tham gia ngày: Jun 2006
Bài gửi: 27
:
Trích:
Nguyên văn bởi namqn View Post
Bạn đã phá vỡ cấu trúc của chương trình mẫu. Trong chương trình mẫu, phần code của chương trình chính bắt đầu với các lệnh khởi tạo ban đầu, sau đó đi vào vòng lặp chính, còn các chương trình con nằm dưới vòng lặp chính.

Bạn đã bỏ mất vòng lặp chính (loop ... goto loop), dẫn đến chương trình con của bạn trở thành một phần trong đoạn mã khởi tạo, và sau đó bạn mượn lệnh goto $ thừa ngay trước dẫn hướng end để làm vòng lặp while (true) của bạn. Nếu bạn vẫn giữ vòng lặp chính loop ... goto loop nhưng không viết gì vào giữa thì cấu trúc của chương trình mẫu vẫn được giữ, và bạn đạt được mục đích của mình.

Do đó, tôi xin khẳng định rằng bạn viết code không tuân theo cấu trúc của chương trình mẫu, và chương trình mẫu không có vấn đề gì cần phải sửa.

Chương trình mẫu là tổng quát, đúng cho cả trường hợp bạn thích đặt cái gì vào vòng lặp chính, hay chỉ muốn có một vòng lặp vô tận ở đó. Nếu bạn thích dùng goto $ cho vòng lặp chính, thì sau khi loại bỏ hết code giữa loop và goto loop, bạn có thể viết nó lại thành goto $ (chứ không phải xóa hẳn cái vòng lặp đó đi như bạn đã làm).

Thân,
Có lẽ stop việc tranh luận ở đây bởi vì thực ra chẳng ai sai cả (chỉ có khác nhau ở cách nhìn nhận vấn đề, mà đó lại thuộc về suy nghĩ riêng rồi, miễn là giải quyết tốt bài toán của chính mình) mà người khác đọc vào lại chẳng tiếp nhận được thông tin gì mới
Nhân đây cũng xin hỏi namqn (và mọi người ) : những định nghĩa trong các tệp .inc (vd p16f84a.inc) có cần thời gian không nhỉ ? (ý tôi muốn hỏi là có cần thời gian để thực hiện như các lệnh không)
mong mọi người chỉ giúp, thanks !
bachelor vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-08-2008, 12:35 AM   #100
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi bachelor View Post
Có lẽ stop việc tranh luận ở đây bởi vì thực ra chẳng ai sai cả (chỉ có khác nhau ở cách nhìn nhận vấn đề, mà đó lại thuộc về suy nghĩ riêng rồi, miễn là giải quyết tốt bài toán của chính mình) mà người khác đọc vào lại chẳng tiếp nhận được thông tin gì mới
Nhân đây cũng xin hỏi namqn (và mọi người ) : những định nghĩa trong các tệp .inc (vd p16f84a.inc) có cần thời gian không nhỉ ? (ý tôi muốn hỏi là có cần thời gian để thực hiện như các lệnh không)
mong mọi người chỉ giúp, thanks !
Nếu không sai thì tại sao bạn lại góp ý sửa chương trình mẫu?

Bạn đã nói rằng "copy nguyên về, thay cái phần nội dung trong main và chương trình con cho phù hợp với bài toán của mình rồi biên dịch rồi chạy rồi thấy nó chạy loạn lên", nhưng cái chương trình bị "chạy loạn lên" của bạn thì lại phá vỡ cấu trúc của chương trình mẫu (xóa mất vòng lặp vô tận loop ... goto loop), và dẫn đến góp ý của bạn rằng chương trình mẫu có chỗ không hợp lý. Góp ý của bạn do đó là không hợp lý.

Vấn đề ở đây không phải ai đúng ai sai, mà là vấn đề bạn phá vỡ cấu trúc chương trình rồi đề nghị sửa lại chương trình mẫu để những người học sau đều phá vỡ cấu trúc giống như bạn. Đó là điều tôi không muốn xảy ra.

Với câu hỏi về các tập tin .inc: những định nghĩa trong đó được trình biên dịch sử dụng khi dịch ra mã máy cho PIC, và không hề liên quan đến việc thực thi chương trình trong PIC, do đó không hề tiêu tốn một chu kỳ máy nào của PIC.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-09-2008, 04:17 PM   #101
window
Nhập môn đệ tử
 
Tham gia ngày: Sep 2008
Bài gửi: 6
:
Mình đọc luồng này và rất cảm ơn các bạn rất nhiều .
window vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-09-2008, 04:46 PM   #102
window
Nhập môn đệ tử
 
Tham gia ngày: Sep 2008
Bài gửi: 6
:
Mình đang làm đồ án về con PIC 16F877 , thiết lập hệ thồng tổng đài điện thoại nội bộ :
_2 trunk
_8 Tel ra
_Giao tiếp PC
Hiện mình đang tìm tài liệu và mong các bạn hổ trợ những kiến thức kinh nghiệm trong quá trình thực hiện... .
Cảm ơn rất nhiều
window vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-01-2009, 10:45 PM   #103
NATO308
Nhập môn đệ tử
 
Tham gia ngày: May 2008
Bài gửi: 9
:
Cám ơn sự nhiệt tình của bang chủ và các câu hỏi của thành viên nhiều lắm . Mình học được rất nhiều từ các bạn . Cám ơn 1 lần nữa . Chúc picvietnam năm mới phát triển hơn trước và mọi người có được sức khỏe tốt để chúng ta tiếp tục tranh luận ^^
NATO308 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-02-2009, 10:25 PM   #104
thaithien
Đệ tử 7 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 213
:
Trích:
Nguyên văn bởi falleaf View Post
Cơ bản về PIC





Mình hỏi cái này hơi newbie chút nghen,trong cái hình đầu thread của anh falleaf thì làm cái mạch tạo nguồn 5V-500A ở bên dưới như thế nào vậy?Cụ thể :
-Con U3 C78l05/TO29 là con gì vậy ?
-Nguồn 9V-12V DC thì mua ở đâu ra ?Bao nhiêu ampe ?
-Liệu có trực tiếp nguồn 5V-500A mà không qua mạch trên kia không?
-Con thạch anh chọn bao nhiêu MHZ là tốt nhất ?

Hic,câu hỏi quá newbie luôn chứ không còn hơi hơi nữa,mong mọi người giúp đỡ với !!!Thanks
thaithien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-02-2009, 11:24 PM   #105
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi thaithien View Post
Mình hỏi cái này hơi newbie chút nghen,trong cái hình đầu thread của anh falleaf thì làm cái mạch tạo nguồn 5V-500A ở bên dưới như thế nào vậy?Cụ thể :
-Con U3 C78l05/TO29 là con gì vậy ?
-Nguồn 9V-12V DC thì mua ở đâu ra ?Bao nhiêu ampe ?
-Liệu có trực tiếp nguồn 5V-500A mà không qua mạch trên kia không?
-Con thạch anh chọn bao nhiêu MHZ là tốt nhất ?

Hic,câu hỏi quá newbie luôn chứ không còn hơi hơi nữa,mong mọi người giúp đỡ với !!!Thanks
- Nguồn 5V-500 mA chứ không phải 5V-500A!

- C78L05/TO92 là vi mạch ổn áp 5 V thuộc dòng 7805 (phiên bản 78L05 chỉ có định mức 100 mA chứ không phải 500 mA như trong sơ đồ của falleaf), có kiểu vỏ TO92 (3 chân loại nhỏ, giống như các transistor C1815 hay A1015).

- Nguồn 9 - 12 VDC mua ở chợ (Ở Tp. HCM thì đến chợ Nhật Tảo), số ampe tối thiểu bằng với định mức của vi mạch ổn áp 5 V (chắc chắn có thể tìm được).

- Các thạch anh 4 MHz, 10 MHz, và 20 MHz tốt như nhau.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


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


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