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)
-   -   Pic16f877a TỪ DỄ TỚi KhÓ (http://www.picvietnam.com/forum/showthread.php?t=238)

totite 27-02-2006 02:14 PM

Các bác vui lòng chỉ giúp em cách nào truy xuất vào vùng data trong bộ nhớ chương trình sau khi được định nghĩa bằng chỉ dẫn DB của Assembly. Em cần lập một bảng tra các giá trị cho led 7 đoạn giống như trong hợp ngữ của MCS51.

hpecom 27-02-2006 02:33 PM

Trích:

Nguyên văn bởi ngkdong
void main()
{ printf("\r\n\Hello! \r\n");
do
{ delay_ms(2000);
printf("\r\n\Running...\r\n");
} while (TRUE);
}

Chương trình của bạn, nếu chạy đúng thì nó sẽ
xuất ra dòng Hello,
và tiếp theo cứ mỗi 2s nó lại xuất ra dòng Running...
dòng Running... trước sẽ cách dòng Running... sau nó hai dòng trắng.:D
và vòng lặp là vô tận.

LEO-XBS 01-03-2006 07:23 PM

bác ntc co thể chỉ giúp em cách sử dụng cổng analog duoc ko
làm thế nào để sử dụng cổng đó trong việc thu tín hiệu từ led thu-phat va chuyển thành tín hiệu số (không dùng khuếch đại thuật toán) cộng với cách xư lý tín hiệu đó

ntc 05-03-2006 01:19 PM

Bảng tra giá trị cho vi điều khiển PIC sử dụng kĩ thuật bảng. Mình đã viết tutorial về kĩ thuật này rồi. Một hai bữa nữa sẽ post lên diễn đàn.
:D

ntc 05-03-2006 01:22 PM

Dùng bộ ADC đi. Trong PIC16F877A có tích hợp sẵn bộ ADC đó. Bạn nên tham khảo cái datasheet để biết được cấu trúc ADC trong PIC và cách sử dụng nó.:)

ntc 06-03-2006 02:51 PM

Tutorial thứ 3.:D

http://www.picvietnam.com/download/T...TCR.050306.pdf

Đây là bài viết về kĩ thuật bảng. Sau bài này, có thể nói ta đã trang bị được những cơ sở cơ bản nhất cho việc lập trình cho vi điều khiển PIC.
Có thể tham khảo thêm một số tutorial trong diễn đàn để xây dựng một số ứng dụng cho mình dựa trên các kĩ năng đã có được.
Bài thứ 4 mình định viết về một số ứng dụng, phần quan trọng nhất là các thao tác về chức năng input của các cổng của vi điều khiển, nhưng nghĩ lại thấy không cần, bạn có thể tham khảo rồi tự thực hiện các ứng dụng cũng được. Có gì thắc mắc thì hỏi vậy. Mọi người thấy thế nào.
Nếu không có gì thay đổi, bài tới mình dự định sẽ viết về LED 7 đoạn và các thao tác hiển thị cơ bản với LED 7 đoạn dùng vi điều khiển PIC.

ahchu 18-03-2006 08:45 AM

Cho em hỏi là làm thế nào biết được 1 chương trình bắt đầu từ address nào? VD như trong tutor của ntc thì tất cả đều bắt đầu tại 0x000. Khi em đọc datasheet của con 16F877a thì địa chỉ 0x000 là "Reset vector", chứ đâu phải là "On-chip program memmory"???
Vậy thì em phải thể bắt đầu từ address 0x000 hay là 0005h?Em không hiểu rõ phần này.

ntc 20-03-2006 11:57 AM

0x000 là reset vector, có nghĩa là khi được reset, bộ đếm chương trình sẽ nhảy đến địa chỉ này và bắt đầu thực hiên lệnh tại đây.

0x004 là interrupt vector, có nghĩa là khi có ngắt xảy ra, bộ đếm chương trình sẽ quay về địa chỉ này để thực hiện lệnh từ đây.

Ví dụ ta có một đoạn code như sau:
ORG 0x000
GOTO start

Có nghĩa là lệnh "GOTO start" sẽ được đưa vào bô nhớ chương trình của vi điều khiển tại địa chỉ 0x000. Khi vi điều khiển được reset, bộ đếm chương trình quay về "reset vector" tại địa chỉ 0x000, ở đó nó đọc được lệnh "GOTO start" và nhảy đến label "start".

Còn việc label start nằm ở chỗ nào thì còn tùy thuộc vào việc ta đặt cái label "start" tại vị trí nào trong chương trình, hoặc ta có thể điều khiển địa chỉ đặt nó bằng cách sử dụng lệnh "ORG ....". Ví dụ ta viết như sau:

ORG 0x050
start
; đoạn chương trình start

Thì khi đó đoạn chương trình "start" sẽ được bắt đầu tại địa chỉ 0x050 của bộ nhớ chương trình.

Như vậy bạn có thể tổ chức bộ nhớ chương trình theo như mình mong muốn.

:D

ngoalongdochanh 25-03-2006 04:10 PM

Cho toi hoi tai sao khi khai bao:
#device PIC16F877 *=16 ADC=10

thi CCSC bao loi: "Can not change device type this far into the code"
Cach khac phuc

dohoangnam 27-03-2006 09:26 AM

Bác port tiếp lên đi, chờ bác lâu quá. Giống như việc 1 bữa ăn ngon nhưng cứ vừa ăn vừa nghỉ vậy. Bác cố gắng vì anh em với!!!!
Trân thành,
Nam.

nhh 27-03-2006 07:57 PM

Trích:

Nguyên văn bởi ngoalongdochanh
Cho toi hoi tai sao khi khai bao:
#device PIC16F877 *=16 ADC=10

thi CCSC bao loi: "Can not change device type this far into the code"
Cach khac phuc

Hi!

CCS C báo lỗi tại vị trí câu lệnh này,nhưng bản thân nó hoàn toàn đúng đắn,vì bạn không post toàn bộ chương trình của bạn lên nên không thể biết chỉ độc mỗi tội bạn đã cố tình thay đổi device type,nên chương trình báo lỗi.
Tớ có post 1 bài ADC đơn giản ở luồng này :
http://www.picvietnam.com/forum/show...=2113#post2113

Hy vọng nó sẽ có ích cho bạn !

nhh 27-03-2006 08:17 PM

Tớ cũng đang nóng lòng đọc những module tiếp theo của mod Chính !
Nhưng thông cảm,hình như Chính đang thi giữa kì thì phải !:D

ntc 27-03-2006 10:17 PM

Hì hì. Không phải là bận thi giữa kì. Trường mình không thi giữa kì.

Mình đang bận phát triển một hai sản phẩm trên PICVIETNAM.

Nên mấy cái Tutorial, cho nợ lại vài bữa nghe!

Nợ hoài mang tiếng quá.

:D

anhviet 30-03-2006 01:59 PM

các bác giải thích dùm em
list p=16f873A,r=dec ; list directive to define processor ; constantes syst?e d?imal
#include <p16f873A.inc>
#include <Delay.inc>

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _CPD_OFF & _LVP_OFF


TRONG DOẠN #INCLUDE <DELAY.INC> CÓ NGHĨA LÀ GÌ

Khoa 31-03-2006 11:04 AM

chú nào có tài liệu đầy đủ về asm của pic thì cho anh xin

Khoa 31-03-2006 11:06 AM

nhất là các khai báo directive,khai baó hàm module....

ntc 31-03-2006 12:21 PM

#include <delay.inc> là một cái file đính kèm được tạo ra bởi người sử dụng. Thông thường các file này sẽ chứa các hàm asm được viết dưới dạng các macro để thuận tiện trong quá trình viết chương trình bằng asm.

Nguyên tắc hoạt động của nó đại khái giống như mấy cái header file vậy đó. Nó sử dụng chức năng thay thế của trình biên dịch để làm tăng thêm tính linh động và thân thiện cho một chương trình asm. Khác biệt ở chỗ mấy cái header file thì dùng để định nghĩa phần cứng cho một vi điều khiển, còn các file tạo bởi người lập trình thông thường là dùng để định nghĩa các hàm.

Ví dụ, trong cái header file "p16f877a.inc" của PIC6F877A nó có một lệnh define như sau:

#define PCLATH 0x0A

Lệnh này dùng để định nghĩa địa chỉ của thanh ghi PCLATH trong bộ nhớ chương trình của vi điều khiển.

Do đó trong chương trình chính, nếu ta có một lệnh nào đó liên quan tới thanh ghi PCLATH, ví dụ lệnh:

CLRF PCLATH (lệnh 1)

Thì trình biên dịch sẽ thay thế như sau:

CLRF 0x0A (lệnh 2)

Và trình biên dịch sẽ dựa vào lệnh này để tạo thành mã máy (file hex), chứ không phải là dựa vào lệnh 1.

Trong trường hợp ta không đính kèm file <p16f877a.inc> thì nếu viết chương trình như lệnh 1, thì trình biên dịch sẽ không hiểu, vì thực chất trình biên dịch sẽ không biết PCLATH là cái quái gì (do ta chưa định nghĩa). Việc định nghĩa các tham số phần cứng này có thể thông qua các file <... .inc> được tạo sẵn hoặc định nghĩa trực tiếp trong chương trình ứng dụng.

Tương tự như các file đính kèm khác, trong trường hợp này là file <delay.inc>. Thông thường nó bao gồm việc định nghĩa một số hàm asm được viết dưới dạng các macro. Khi macro đó được gọi trong chương trình ứng dụng, nó sẽ thay thế macro đó bằng đoạn code tương ứng với macro đó trong file đính kèm.

Thực ra ta vẫn có thể viết trực tiếp đoạn code đó trên chương trình ứng dụng mà không cần phải đính kèm hay gọi cho mất thời gian.

Tuy nhiên việc xây dựng các file đính kèm như vậy mang lại nhiều tác dụng:
- Thứ nhất, nó cho phép ta tạo các hàm bằng asm, giống như các module chương trình được viết sẵn, khi cần chỉ việc gọi nó ra.
- Thứ 2, chương trình asm viết bằng cách sử dụng các chức năng thay thế của trình biên dịch giúp cho ngôn ngữ asm trở nên thân thiện hơn, giống như một dạng ngôn ngữ lập trình cấp cao hơn.

Nếu để ý kĩ, thì các ngôn ngữ lập trình cấp cao khác, ví dụ như C cũng có cách xây dựng tương tự. Các hàm xử lí thuật toán được viết trong một file riêng, các hàm hiển thị được viết trong một file riêng, ... Khi cần sử dụng một hàm nào đó trong C, ta vẫn phải đính kèm cái file đó vào chương trình ứng dụng thông qua các lệnh "#include ...". Nếu không đính kèm thì trình biên dịch sẽ báo kỗi, vì nó sẽ không hiểu được hàm ta vừa viết.

Như vậy ta có thể hiểu chức năng thay thế của trình biên dịch là một trong những cơ sở để xây dựng các ngôn ngữ lập trình cấp cao .Thực chất các ngôn ngữ cấp cao khi biên dịch sẽ có giai đoạn nó thay thế các hàm của nó bằng các hàm của ngôn ngữ ...asm, rồi dựa trên đó để tạo ra mã máy (file hex). Mã máy là cái duy nhất mà vi điều khiển thực sự hiểu được để biết được nó cần phải làm gì.

Do việc lập trình bằng mã máy đối với con người là quá khó khăn, cho nên mới có chuyên ra đời các ngôn ngữ lập trình asm, cấp cao, cao hơn nữa, ..., Như vậy con người không phải thao tác trực tiếp với mã máy, mà công việc đó được chuyên giao cho các trình biên dịch.

Nói nhiều quá!

:D

namqn 31-03-2006 06:31 PM

Trích:

Nguyên văn bởi Khoa
chú nào có tài liệu đầy đủ về asm của pic thì cho anh xin

Trích:

Nguyên văn bởi Khoa
nhất là các khai báo directive,khai baó hàm module....

Bạn download tài liệu sau đây của Microchip nhé.
http://ww1.microchip.com/downloads/e...Doc/33014J.pdf
Và tài liệu sau nếu muốn dùng các chip PIC16:
http://ww1.microchip.com/downloads/e...Doc/33023A.pdf
Tài liệu sau dành cho các chip PIC18:
http://ww1.microchip.com/downloads/e...Doc/39500a.pdf

Thân,

anhviet 31-03-2006 08:09 PM

cảm ơn các bác rất nhiều . các bác viết càng nhiều càng tốt vì rất rễ hiểu cho người mới học ltr pic

dohoangnam 03-04-2006 09:01 AM

cảm ơn các bạn đã share các đường link!

zero_OR_one 03-04-2006 12:15 PM

các bác cho em hỏi tý:

Code:

; Bài toán yêu cầu :nhấn 2 lần nút button(nối tại RA0) led nối với RB0
 ; sẽ sáng(mạch dùng luôn của bác Chính vậy chỉ khác có cái button
 ; nối với VCC qua RA0 xuống đất)
 ; chương trình sẵn:
 ; Project: Two pushes to turn on a LED

        Processor  16F84a
        include <p16F84a.inc>
        __CONFIG    _CP_OFF & _PWRTE_ON & _WDT_OFF & _RC_OSC


        ORG 0                ;This is the start of memory for the program.
SetUp       
            BSF 03,5                    ;Go to Bank 1
        CLRF 06                ;Make all port B output
        MOVLW 01        ;Load W with 0000 0001
        MOVWF 05        ;Make RA0 input
        BCF 03,5        ;Go to Bank 0 - the program memory area.
        CLRF 1F                ;Clear the button file
        CLRF 06                ;Blank the output
        GOTO Main
               
Delay       
            NOP                ;Create approx 250mS delay
        DECFSZ 1A,1
        GOTO Delay
        DECFSZ 1B,1
        GOTO Delay
        RETURN       

Delay2       
            NOP                ;Create 1mS debounce delay       
        DECFSZ 1A,1
        GOTO Delay2
        RETURN

Sw       
            BTFSS 05,0        ;Test the push button
        GOTO Sw3        ;Button not pressed       
        BTFSC 1F,2        ;Test end-of-flash flag
        RETURN
        BTFSC 1F,0        ;First pass?
        RETLW 00        ;No
        BTFSS 1F,1        ;Test first-press flag
        GOTO Sw2        ;First press
        BSF 06,0                    ;Button has been pressed twice. Illuminate LED
        CALL Delay        ;Keep LED on
        CALL Delay        ;Keep LED on
        BCF 1F,1                    ;Clear second-push flag bit
        BSF 1F,2                    ;Set end-of-flash flag
        BCF 06,0                    ;Turn LED off
        RETURN
Sw2       
            BSF 1F,1                    ;Set the first-press flag
        BSF 1F,0                    ;Set button pass flag bit
        RETURN       
Sw3       
            BCF 1F,0                      ;Clear button pass flag bit
        BCF 1F,2                      ;Clear end-of-flash flag
        RETURN

Main       
            CALL Sw
        CALL Delay2        ;Debounce switch       
        GOTO Main

        END                ;Tells assembler end of program

Một số chỗ em chưa hiểu:
1.Các file 1A,1B mặc định bao nhiêu mà tạo được các thời gian trễ như trên
2.File 1F với các bit hoạt động ra sao
3.Chương trình này hoạt động thế nào :em chư hiểu giải thuật ,tại sao nhấn nút button lần 1 led chưa sáng,lần 2 led mới sáng
Chỗ này:
Code:

Sw       
            BTFSS 05,0        ;Test the push button
        GOTO Sw3        ;Button not pressed       
        BTFSC 1F,2        ;Test end-of-flash flag
        RETURN
        BTFSC 1F,0        ;First pass?
        RETLW 00        ;No
        BTFSS 1F,1        ;Test first-press flag
        GOTO Sw2        ;First press
        BSF 06,0        ;Button has been pressed twice. Illuminate LED
        CALL Delay        ;Keep LED on
        CALL Delay        ;Keep LED on
        BCF 1F,1        ;Clear second-push flag bit
        BSF 1F,2        ;Set end-of-flash flag
        BCF 06,0        ;Turn LED off
        RETURN

Nhấn lần 1:->BTFSC 1F,2->BTFSC 1F,0->BTFSS 1F,1->GOTO Sw2
Sw2 BSF 1F,1 ;Set the first-press flag
BSF 1F,0 ;Set button pass flag bit
RETURN
Vậy thì sau khi nó trở về từ Sw2 sẽ BSF 06,0 ;Button has been pressed twice. Illuminate LED.
Em hiếu sai ở đâu ,mong anh Chính và mọi người trả lời hộ(Giait thích kĩ hộ em sử dụng các file 1A,1B,nhất là 1F)
Em cảm ơn nhiều

ntc 03-04-2006 01:24 PM

Mọi người khi post phần code nhớ post theo cách như trên nghe. Nhìn nó sáng sủa, dễ đọc, dễ hiểu, dễ trả lời.

Hic, viết code kiểu gì mà đọc muốn túi mắt túi mũi luôn.

Cái thời gian delay còn phụ thuộc vào tần số hoạt động của con PIC nữa, không biết làm sao tính được. Bạn coi lại coi tần số của thạch anh là bao nhiêu?

1A, 1B là 2 thanh ghi nằm trong RAM sử dụng cho chương trình delay. Nó không được khởi tạo nên có thể xem giá trị ban đầu bằng 0. Khi giảm lần đầu tiên thì 0 sẽ giảm về 255.

Cách tính thời gian delay cho đoạn chương trình delay này nhh đã giải thích rất cụ thể ở các bài trước. Bạn xem lại các bài trước trong luồng này sẽ thấy (cái chương trình điều khiển LED chớp tắt trong 1 giây á).

Còn cái thanh ghi 1F. Hic, chóng mặt quá, để từ từ xem sau vậy. Đại khái nó dùng 3 bit LSB để chỉ thị trạng thái cái nút bấm nó như thế nào mà xử lí. Chưa bấm thì giá trị trong thanh ghi 1F nó như thế nào đó, bấm 1 lần thì như thế nào đó, 2 lần thì như thế nào đó.

falleaf 03-04-2006 02:50 PM

Anh đề nghị em quản lý luồng như sau:

1) Nếu post bài hướng dẫn, thì việc post source code là rất tốt, vì người dùng có thể thử nghiệm ngay

2) Nếu post bài câu hỏi, nếu không phải code người đó viết, sẽ không trả lời, vì không có đủ thời gian để đọc code và xem code. Trước đây anh đọc code rất nhanh, nhưng trả lời một thời gian sau, quá nhiều người nhờ, lại viết email nhờ về code. Chúng ta không có thời gian để làm việc đó.

3) Nếu các bạn muốn hỏi về code, các bạn phải đọc hiểu, và trích ra những phần mà các bạn không hiểu để hỏi, chứ không post toàn bộ đoạn code lên để hỏi như thế này. Mỗi người lập trình, có một tư duy lập trình khác nhau. Không thể nào trả lời các câu hỏi về code được, nếu như bạn không trình bày ý đồ của bạn một cách rõ ràng, nhất là khi các bạn muốn lấy code của những người khác.

4) Nếu như các bạn muốn đặt câu hỏi về các chương trình, cấu trúc, và việc tận dụng các chức năng của PIC, cũng như vận dụng các chức năng đó một cách hợp lý, với dạng câu hỏi này, các bạn lưu ý post lưu đồ giải thuật, hoặc nội dung cần làm, chứ không post đoạn code.

Chúc vui

zero_OR_one 08-04-2006 05:56 PM

Trích:

Nguyên văn bởi ntc
Mọi người khi post phần code nhớ post theo cách như trên nghe. Nhìn nó sáng sủa, dễ đọc, dễ hiểu, dễ trả lời.

Hic, viết code kiểu gì mà đọc muốn túi mắt túi mũi luôn.

Cái thời gian delay còn phụ thuộc vào tần số hoạt động của con PIC nữa, không biết làm sao tính được. Bạn coi lại coi tần số của thạch anh là bao nhiêu?

1A, 1B là 2 thanh ghi nằm trong RAM sử dụng cho chương trình delay. Nó không được khởi tạo nên có thể xem giá trị ban đầu bằng 0. Khi giảm lần đầu tiên thì 0 sẽ giảm về 255.

Cách tính thời gian delay cho đoạn chương trình delay này nhh đã giải thích rất cụ thể ở các bài trước. Bạn xem lại các bài trước trong luồng này sẽ thấy (cái chương trình điều khiển LED chớp tắt trong 1 giây á).

Còn cái thanh ghi 1F. Hic, chóng mặt quá, để từ từ xem sau vậy. Đại khái nó dùng 3 bit LSB để chỉ thị trạng thái cái nút bấm nó như thế nào mà xử lí. Chưa bấm thì giá trị trong thanh ghi 1F nó như thế nào đó, bấm 1 lần thì như thế nào đó, 2 lần thì như thế nào đó.

Xin lỗi anh C,em sẽ rút kinh nghiệm lần sau.
Thạch anh ở đây dùng 4 MHZ anh à
Em vẫn chưa hiểu giải thuật,ai hiểu giải thuật thì chỉ cho em với.
Em thấy bài toán này khó đấy chứ nhỉ

nhh 12-04-2006 10:34 AM

Trích:

Nguyên văn bởi vpic16f877
Hey,mấy đồng bào có thể hướng dẫn viết C trên pic6f877a ko?

Mình đã có những bài viết ở luồng này rồi mà !
http://www.picvietnam.com/forum//showthread.php?t=357

picpicpic 16-04-2006 12:54 PM

hihi....Đợi mãi vẫn chưa thấy bài mới....

nguyenan 18-04-2006 02:49 PM

cac bac xem dum em sao no lai bao noi vay,co can phai bo phan khai bao khong vay:

Code:

MPASM  5.02                        TEXT3.ASM  4-18-2006  12:05:38        PAGE  1


LOC  OBJECT CODE    LINE SOURCE TEXT
  VALUE

                      00001    ;CHUONG TRINH HIEN THI RA PORTB
                      00002        processor  16f877a
                      00003
                      00004    include  <p16f877a.inc>
                      00001        LIST
                      00002 ; P16F877A.INC  Standard Header File, Version 1.00    Microchip Technology, Inc.
                      00400        LIST
                      00005 
Warning[207]:  Found label after column 1. (_config)
Error[122]  :    Illegal opcode (_cp_off)
                      00006  _config  _cp_off &_wdt_off &_pwrte_on &_xt_osc &_lvp_off
                      00007
0000                00008  org 0x000
                      00009 ;bat dau chuong trinh 
0000  2801      00010    goto START
0001                00011 START
0001  1303          00012    bcf STATUS,RP1
0002  1283          00013    bcf STATUS,RP0
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0003  0186          00014    clrf TRISB
0004  1283          00015    bcf STATUS,RP0
0005  308F          00016    movlw B'10001111'
0006  0086          00017    movwf PORTB
0007                  00018 lop
0007  2807          00019    goto lop
Warning[205]: Found directive in column 1. (end)
                      00020 end ;ket thuc chuong trinh


newuser 20-04-2006 11:59 PM

uhm...chán quá, gõ bài gửi cho bạn,đến khi gửi thì chẳng hiểu sao mình lại bị log out. Mình trả lời bạn ngắn gọn thôi vậy, ngại gõ lại quá...
bạn thấy dòng thông báo rồi đó, nó nói rằng bạn không thể tác động lên thanh ghi TRISB vì đơn giản là thanh ghi này không nằm ở bank0, nó nằm ở bank1/bank3 bạn à, vì thế bạn phải sửa lại đoạn code như sau:
BSF STATUS,RP0;chọn bank 1
BCF STATUS,RP1
bạn nên viết macro cho việc chọn bank thanh ghi cho tiện vì nếu bạn viết chương trình bằng asm thì phải nhảy qua nhảy lại các bank thanh ghi rất nhiều. Ví dụ như:
bank0 macro
bcf STATUS,RP0
bcf STATUS,RP1
endm
bank1 macro
bsf STATUS,RP0
bcf STATUS,RP1
endm
....
lưu lại với đuôi *.inc trong cùng thư mục với file *.asm
đặt dòng include *.inc vào đầu chương trình bạn nhé.

ntc 21-04-2006 01:08 PM

Một số vấn đề về các thông báo, cảnh báo và lỗi khi biên dịch dùng MPASM. Mấy cái này, trong mấy cái Tutorial, mình đã rất cẩn trọng khi viết, để tránh được những thông báo không cần thiết của trình biên dịch, nhưng chắc có một số bạn không để ý.

Trích:

Error[122] : Illegal opcode (_cp_off)
Cái "config" phải có tới hai dấu gạch ở đằng trước nó lận. Viết như thế này nó mới hiểu "__config". Nếu chỉ có một dấu gạch ở đằng trước, trình biên dịch sẽ không hiểu được đó là một derective, mà chỉ hiểu là một cái label bình thường.

Trích:

Warning[207]: Found label after column 1. (_config)
Do trình biên dịch chỉ hiểu cái derective "_config" của bạn là một label khi bạn viết sai, nên mới xuất hiện thông báo này. Các label phải được đặt ở cột đầu tiên khi soạn thảo các file asm. Khi đó các thông báo tương tự sẽ không xuất hiện nữa.

Trích:

Warning[205]: Found directive in column 1. (end)
Các lệnh phải được đặt ở các cột tiếp theo, mà không viết ở đầu hàng như các label. Nếu bạn cho lệnh "END" thụt vào bên trong hàng đầu tiên (trở về đầu dòng và nhấn "tab" một cái cho cái lệnh "END" nó thụt vô bên trong, khi đó, nếu biên dịch lại, dòng thông báo này sẽ không xuất hiện nữa. Các lệnh khác cũng vậy, bạn nên viết thụt vào trong một cột.

Trích:

Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
Đây không phải là một thông báo lỗi, mà chỉ là một cảnh báo để bạn xem lại việc truy xuất thanh ghi đó có nằm trong bank hiện hành hay không. Trình biên dịch không kiểm tra các thao tác này cho bạn, mà chỉ đưa ra một thông báo như vậy để bạn kiểm tra lại thôi. Xin nhắc lại, đây không phải là một thông báo lỗi. Bằng chứng là, mặc dù các thông báo này xuất hiện rất nhiều khi biên dịch, nhưng nếu không có lỗi nào khác ngoài các thông báo này, thì việc build vẫn "success".

Trong chương trình của bạn, bạn truy xuất thanh ghi TRISB ở BANK 1 trong khi vẫn đang ở BANK 0. Như vậy là không đúng, và giả sử, không còn lỗi nào khác, thì trình biên dịch vẫn báo "build success", nhưng chương trình khi thực thi sẽ không đúng. Phải sửa dòng lệnh 00013 thành "bsf STATUS,RP0" mới đúng.

Trích:

Error[122] : Illegal opcode (_cp_off)
Phải có thêm dấu "&" ở đằng trước mới được.

Vạn sự khởi đầu nan hả. :D

Như vậy, có một số điểm cần lưu ý khi soạn thảo chương trình asm cho trình biên dịch MPASM như sau:

Các label nên được viết ở cột đầu tiên của trình soạn thảo. Như vậy các cảnh báo "warning[207]" sẽ không xuất hiện khi biên dịch.

Các lệnh, kể cả lệnh END nên được viết ở các cột tiếp theo (nên cách một khoảng tab từ đầu dòng rồi viết lệnh). Khi đó các "warning[205]" sẽ không xuất hiện khi biên dịch.

Các thông báo (message) và cảnh báo (warning) không phải là lỗi. Trình biên dịch chỉ đưa ra các thông điệp này để lưu ý bạn rằng các chỗ này đã được kiểm tra chưa, đã bảo đảm đúng hay chưa, và không gây ảnh hưởng đến việc build chương trình có "successed" hay "failed".

Các thông báo lỗi (error) mới là những lỗi thực sự. Nếu không sửa lại cho đúng thì biên dịch không thành công (failed).

Vậy đó.

:D

ntc 24-05-2006 05:50 PM

1 Attachment(s)
Parallel Slave Port _ Một phương pháp khá đơn giản để giao tiếp giữa các vi điều khiển PIC cũng như giữa PIC và các thiết bị ngoại vi.

Mọi người đọc rồi cho biết ý kiến nhá.

:D

Cái này chủ yếu mang tính ... academic nhiều hơn. Mình xây dựng một số module cơ bản cho giao tiếp này dựa trên 2 vi điều khiển PIC16F877A.

falleaf 29-05-2006 02:12 PM

Trích:

Nguyên văn bởi ntc
Parallel Slave Port _ Một phương pháp khá đơn giản để giao tiếp giữa các vi điều khiển PIC cũng như giữa PIC và các thiết bị ngoại vi.

Mọi người đọc rồi cho biết ý kiến nhá.

F đặt ra vấn đề này cho mọi người suy nghĩ để giải quyết, và mong rằng có thể đưa ra những giải pháp tốt.

Giả sử, có một mạng 16 con vi điều khiển nằm chung với nhau. Bây giờ, chúng ta có một con master, chỉ làm nhiệm vụ truyền dữ liệu xuống cho 16 con kia. Hãy thiết kế mạch nguyên lý, và đưa ra giải pháp firmware cho mạng các vi điều khiển này.

Bài toán cụ thể đơn giản hơn:

Có 4 con slave, và 1 con master, tất cả đều là 16F877A. Cho một giá trị khởi tạo là b'11111111' đặt trong thanh ghi GIATRI của con master. Giảm đi 1 đơn vị sau mỗi lần thực hiện:

- Nếu GIATRI chia hết cho 4, gửi giá trị của GIATRI vào con slave 1 và hiển thị ra LED.
- Nếu GIATRI chia 4 dư 1, gửi giá trị của GIATRI vào slave 2 và hiển thị ra LED
- Nếu GIATRI chia 4 dư 2, gửi giá trị của GIATRI vào slave 3 và hiển thị ra LED
- Nếu GIATRI chia 4 dư 3, gửi giá trị của GIATRI vào slave 4 và hiển thị ra LED.

Hay nói cách khác, thực ra là cứ giảm GIATRI đi một đơn vị, rồi gửi theo thứ tự đến các slave, cứ lặp lại, cho đến khi GIATRI = 0.

Chú ý, thử dùng PSP để giao tiếp, và thử không dùng PSP mà chỉ nối port với port. Có nghĩa là tất cả các portD của các master và slave được nối chung với nhau, portD của master là ngõ xuất, portD của các slave là nhập.

Như vậy, chúng ta thử tìm giải pháp dùng giao tiếp PSP và giao tiếp song song giống như giao tiếp với cổng LPT của máy tính vậy.

Từ bài học này, chúng ta sắp nhấn một bước tới việc thực hành giao tiếp LPT, và một số thuật toán xử lý tín hiệu song song.

Mong rằng các bạn đầu tư thời gian để đưa ra một giải pháp tốt, phân tích tốc độ tính toán của giải pháp.

Chúc vui.

hungnp 29-05-2006 02:43 PM

Chao ban nhh. ban co cong nhan voi toi la loi viet bai nhu cua ban ntc thi da co qua nhieu bai viet trong nuoc va nuoc ngoai roi khong? co can toi chi ra mot it khong?. ban doc lai tu dau den cuoi cai forum nay di. co bao nhieu ban cho bai moi cua ban ntc. nhu the chang qua cac bai viet truoc chang co y nghia gi nhieu voi ho ca. Con van de toi co viet bai hay khong con tuy thuoc trinh do cua toi den muc do nao nua. Toi cam thay minh chua the du nang luc de viet nhung bai co chat luong that su nen toi chua viet duoc.

hungnp 29-05-2006 03:01 PM

De thuc hien duoc mot mang nhu cua bac F co the su dung mang 485. cho phan cung va giao thuc master/slave cho phan mem. giao tiep uart

giao thuc master/slave co the tuy bien theo ý thich cua nguoi dung.

Uu diem cua mang nay la: co the ket noi duoc nhieu slave tren mang(tat nhien con tuy thuoc vao mach chuyen hoi 232-485). truoc day toi da lam den 6 slave bang 89c51 ma chua co van de gi ca.

co kha nang tuyen data di xa do tin hieu truyen di va nhan ve cua VĐk la hieu cua tin hieu tren 2 day cua 485. do vay khi bi nhieu thi nhieu tren 2 day la dong deu nhu nhau nen khi lay hieu cua chung thi nhieu do bi triet tieu.

thoi dang ban khi khac noi tiep neu nhu co ai quan tam den cai mang nay cua toi.

hungnp 31-05-2006 06:26 PM

Sao không ai nói tiếp chuyện của bác F thế. Buồn Wá. Tôi đưa ra thuật toán thế này nhé. thuật toán này chỉ dùng cho mạng 485 của tôi.

hungnp 31-05-2006 06:29 PM

mạng 485
 
1 Attachment(s)
Các bác tham khảo và cho ý kiến nhé.

ntc 31-05-2006 09:41 PM

Trích:

Chao ban nhh. ban co cong nhan voi toi la loi viet bai nhu cua ban ntc thi da co qua nhieu bai viet trong nuoc va nuoc ngoai roi khong? co can toi chi ra mot it khong?. ban doc lai tu dau den cuoi cai forum nay di. co bao nhieu ban cho bai moi cua ban ntc. nhu the chang qua cac bai viet truoc chang co y nghia gi nhieu voi ho ca. Con van de toi co viet bai hay khong con tuy thuoc trinh do cua toi den muc do nao nua. Toi cam thay minh chua the du nang luc de viet nhung bai co chat luong that su nen toi chua viet duoc.
Ý nghĩa của bài viết có thể không quan trọng với những thành viên đã rành về vi điều khiển PIC, nhưng mình tin rằng nó sẽ rất bổ ích cho những ai mới chập chững làm quen với nó, vì đó là những vấn đề rất cơ bản, được viết rất cơ bản, chi tiết và có trách nhiệm với cộng đồng quan tâm đến PIC.

Mình không có tham vọng biên soạn tất cả các vấn đề liên quan đến vi điều khiển PIC, và không thể viết với tốc độ nhanh để đáp ứng yêu cầu của cộng đồng, nhưng mình sẽ xây dựng nó theo tiêu chí "chậm mà chắc", từ dễ tới khó, rồi đây nó sẽ đầy đủ hơn, nhiều vấn đề hơn và có tác dụng tham khảo, ứng dụng nhiều hơn.

Tất nhiên một người không thể làm hết được tất cả, sự giới hạn về thời gian cũng như kiến thức không cho phép mình thực hiện điều đó. Mình vẫn luôn hy vọng có nhiều thành viên tham gia vào công việc này hơn, để cùng xây dựng một cái gì đó có ích cho cộng đồng, đồng thời tiết kiệm được nhiều thời gian và công sức hơn cho những thành viên muốn làm chủ công cụ PIC.

Vấn đề về năng lực có quan trọng hay không trong trường hợp này. Quan trọng là bạn muốn làm một cái gì đó thực sự có ích hay không. TÙy theo năng lực mà có được những đóng góp thích hợp. Bản thân mình cũng không thể khẳng định là có năng lực, nhưng tinh thần trách nhiệm và nỗ lực đóng góp đã thúc đẩy mình làm điều đó.

Mình tin rằng bạn hoàn toàn có thể có những bài viết có chất lượng cho diễn đàn, quan trọng là có muốn làm hay không thôi.

Đâu có cái gì hoàn toàn mới mẻ, vì mình đâu có phát minh ra con PIC, sử dụng nó không đã mệt lắm rồi. Bạn không nên dựa vào việc đã có nhiều bài viết trong nước và nước ngoài viết về các vấn đề tương tự mà đưa ra các nhận định rằng các bài viết của mình là không cần thiết như vậy. Mình tin rằng vẫn có nhiều thành viên cần đến nó, vì người mới học PIC bao giờ cũng có, và luôn hy vọng rằng những đóng góp của mình sẽ giúp ích được cho những thành viên đó.

Rất mong bạn đóng góp những tài liệu trong nước và nước ngoài đó. Chỉ nó ra để mọi người cùng tham khảo đi.

Một vài góp ý như vậy.

:D

ntc 31-05-2006 10:02 PM

Trích:

Sao không ai nói tiếp chuyện của bác F thế. Buồn Wá. Tôi đưa ra thuật toán thế này nhé. thuật toán này chỉ dùng cho mạng 485 của tôi.
Hìhì. Bác Falleaf đang đặt ra các vấn đề về giao tiếp song song mà.

Mạo muội đưa ra một giải pháp về giao tiếp nhiều PIC qua PSP như sau:

Module PSP có chân CS*, ta có thể chọn chân này làm giải pháp để giao tiếp nhiều PIC qua PSP. Các PIC sẽ được nối với nhau theo dạng BUS (nối tất cả các chân data của Slave và Master lại với nhau). Muốn giao tiếp với chip nào chỉ cần đưa chân CS* của chip đó xuống mức logic thấp (tất nhiên, bàn đầu đưa tất cả các chân CS* lên cao). Đại khái cách nối giống như nối nhiều LED 7 đoạn. Các chân RD* và WR* cũng được nối chung với nhau.

Trong trường hợp có nhiều PSP Slave, có thể dùng thêm các IC ghi dịch hoặc giải mã để tiết kiệm chân điều khiển cho PIC, ngõ ra các IC ghi dịch và giải mã sẽ được nối với các chân CS* của PIC.

PSP Master không nhất thiết phải sử dụng module PSP, mà có thể sử dụng bất cứ port 8 chân nào để làm ngõ data và một số chân để điều khiển việc chọn chip. PSP Slave nên sử dụng module PSP để việc truyền nhận dữ liệu đơn giản hơn.

Về firmware, cách đọc và ghi dữ liệu có thể dùng ngắt, và cách điều khiển cũng tương tự như giao tiếp giữa 2 PSP, các vấn đề phát sinh cần xử lí là chọn chip và xử lí thuật toán chia lấy phần dư.

Tuy nhiên cần tối ưu code xử lí ngắt để cải thiện thời gian truyền. Vì cứ mỗi lần phát sinh ngắt, phải mất một số chu kì lệnh phát sinh để vào ngắt và thoát ngắt.

ntc 31-05-2006 10:06 PM

À, quên nữa. Cái TUT của mình phân tích quá trình hoạt động của PSP dựa vào giản đồ xung. Nếu vừa đọc bài của mình, vừa nhìn vào giản đồ xung của PSP trong cái datasheet của PIC thì sẽ dễ hiểu hơn rất nhiều.

:D

hungnp 02-06-2006 05:08 PM

bạn có khẳng định được là PSP hay hơn 485 không?. Nếu bạn khẳng định được điều này thì hãy sử dụng PSP.

hungnp 02-06-2006 05:13 PM

Tôi muốn hỏi bạn một chút về PSP:

Khả năng chống nhiễu của nó thế nào. Nếu mang sản phẩm của bạn sử dụng PSP vào trong một nhà máy công nghiệp thì nó có hoạt động ổn định không?

Khoảng cách truyền của PSP có thể tối đa là bao nhiêu mà tín hiệu vẫn có thể đảm bảo.

PSP có thể kết nối được bao nhiêu PSP slave trên cùng một mạng.



PSP dùng 8 sợi dây để truyền tín hiệu nhưng 485 chỉ cần 3 dây thôi. 2 dây tín hiệu và một dây GND


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