Ðăng Nhập

View Full Version : Lập nhóm PIC16F877A


Pages : [1] 2

nhh
05-03-2006, 05:53 PM
Như các bác đều biết con 16F877A này phổ biến nhất dòng 16F.PIC việt nam chuyên thảo luận về PIC,ra đời khá lâu....(:confused: )nhưng số lượng về những bài viết từ cơ bản đến nâng cao cho con pic này nói chung và những con khác nói riêng về phần lập trình hầu như rất ít nếu không nói là cả tháng (:D ) không thấy bài nào nói về module mới.
Trái ngược với picvietnam, dientuvietnam là forum chung về điện tử nhưng nói về pic cực nhiều,một phần vì nó lớn tuổi hơn picvietnam.NHH không có ý so sánh gì ở đây cả, NHH chỉ nghĩ là làm sao kêu gọi mọi người đóng góp nhiều bài viết xây dựng cho picvietnam đủ mạnh để khi tịt ngòi thì có thể tìm được cách gỡ rối ngay trong chính diễn đàn của mình!
Lý do là vậy cho sự ra đời của thread này.Mong rằng sẽ có nhiều hơn những bài viết về con 16F877A này để chúng ta có thể làm chủ nó trong một thời gian sớm nhất.
Xin các bác xem xét và cho ý kiến về thread này!
Nào các bác, ta bắt đầu thôi!

nhh
05-03-2006, 06:00 PM
Đây là chương trình đếm số lần switch on từ 1 đến 9 hiển thị lên LED 7 đoạn,dùng ngắt ngoài RB0 và kỹ thuật bảng.


;========================================
;Auhor: NHH
;Date: 02/03/06
;Hardware: PIC16F877A ,Crystal 10MHz
;========================================
TITLE "Count button on by Interrupt RB0"
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF
;========================================
COUNT EQU 0x20
w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
pclath_temp EQU 0x73 ; variable used for context saving

;================================================= ============================
;CHUONG TRINH CHINH
;================================================= ============================
ORG 0000h
GOTO MAIN
ORG 0004h
GOTO INTERRUPT

;==============================INTERRUPT PROGRAM===========================
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into w register
movwf pclath_temp ; save off contents of PCLATH register
;************************************************* *****************************
BCF INTCON,INTF ;xoa co int
INCF COUNT,F
MOVLW d'10'
SUBWF COUNT,W
BTFSS STATUS,0
GOTO $+2
GOTO NODISPLAY
MOVF COUNT,W
CALL TABLE
MOVWF PORTD
retfie ; return from interrupt
NODISPLAY ;khong hien thi neu vuot qua 9
MOVLW d'10'
CALL TABLE
MOVWF PORTD
RETFIE

;************************************************* *****************************
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;============== CHUONG TRINH CHINH===============
MAIN
BCF STATUS,RP1
BSF STATUS,RP0 ; chon BANK 1
MOVLW b'11111111' ;RB0=Input
MOVWF TRISB
CLRF TRISD
BCF OPTION_REG,INTEDG ;interrupt canh xuong
BCF STATUS,RP0 ; chon BANK 0
BSF INTCON,GIE ;cho phep interrupt toan cuc
BSF INTCON,INTE ;cho phep interrupt RB0

CLRF COUNT
MOVLW d'0'
CALL TABLE
MOVWF PORTD

GOTO $
;----------------------------------------------------------
; Bang tra ve Digital tu 0 den 9 va OFF
; Chi so dau truy cap la 0
; Bang o PAGE 0

ORG 0x80
TABLE
;----------------------------------------------------------
ADDWF PCL, F ; bat dau tai 0x80
RETLW b'00111111' ; 0
RETLW b'00000110' ; 1
RETLW b'01011011' ; 2
RETLW b'01001111' ; 3
RETLW b'01100110' ; 4
RETLW b'01101101' ; 5
RETLW b'01111101' ; 6
RETLW b'00000111' ; 7
RETLW b'01111111' ; 8
RETLW b'01101111' ; 9
RETLW b'00000000' ; OFF

END

nhh
05-03-2006, 06:11 PM
:020000040000fa
:020000002028b6
:080008000528f1000308f200d5
:100010000a08f3008b10a00a0a302002031c1128e2
:10002000152820088020880009000a3080208800d8
:10003000090073088a0072088300f10e710e09002e
:1000400003138316ff3086008801011383128b1778
:0c0050000b16a0010030802088002d2835
:1001000082073f3406345b344f3466346d347d34bb
:0801100007347f346f34003422
:02400e00323f3f
:00000001ff

nhh
05-03-2006, 06:18 PM
Đấy là chương trình quét 16 phím bấm hiển thị lên LED 7 đoạn các số từ 0 đến 9 và các chữ A,b,C,d,E,F.
Xem hình ở file đính kèm!

;========================================
;Auhor: NHH
;Date: 02/03/06
;Hardware: PIC16F877A connect PORTB by R220
;========================================
TITLE "Giai ma ban phim dung interrupt RB4...RB7"
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF
;========================================
COUNT EQU 0x20
w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
pclath_temp EQU 0x73 ; variable used for context saving

;================================================= ============================
;CHUONG TRINH CHINH
;================================================= ============================
ORG 0000h
GOTO MAIN
ORG 0004h
GOTO INTERRUPT

;==============================INTERRUPT PROGRAM===========================
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into w register
movwf pclath_temp ; save off contents of PCLATH register
;************************************************* *****************************
BCF INTCON,RBIF

MOVLW b'00000001'
MOVWF PORTB
BTFSS PORTB,4
GOTO DIS_1
MOVLW d'0' ;0
CALL TABLE
MOVWF PORTC
retfie
DIS_1
BTFSS PORTB,5
GOTO DIS_2
MOVLW d'1' ;1
CALL TABLE
MOVWF PORTC
retfie
DIS_2
BTFSS PORTB,6
GOTO DIS_3
MOVLW d'2' ;2
CALL TABLE
MOVWF PORTC
retfie
DIS_3
BTFSS PORTB,7
GOTO DIS_4
MOVLW d'3' ;3
CALL TABLE
MOVWF PORTC
retfie
DIS_4
MOVLW b'00000010'
MOVWF PORTB
BTFSS PORTB,4
GOTO DIS_5
MOVLW d'4' ;4
CALL TABLE
MOVWF PORTC
retfie
DIS_5
BTFSS PORTB,5
GOTO DIS_6
MOVLW d'5' ;5
CALL TABLE
MOVWF PORTC
retfie

DIS_6
BTFSS PORTB,6
GOTO DIS_7
MOVLW d'6' ;6
CALL TABLE
MOVWF PORTC
retfie
DIS_7
BTFSS PORTB,7
GOTO DIS_8
MOVLW d'7' ;7
CALL TABLE
MOVWF PORTC
retfie
DIS_8
MOVLW b'00000100'
MOVWF PORTB
BTFSS PORTB,4
GOTO DIS_9
MOVLW d'8' ;8
CALL TABLE
MOVWF PORTC
retfie
DIS_9
BTFSS PORTB,5
GOTO DIS_A
MOVLW d'9' ;9
CALL TABLE
MOVWF PORTC
retfie
DIS_A
BTFSS PORTB,6
GOTO DIS_b
MOVLW d'11' ;A
CALL TABLE
MOVWF PORTC
retfie
DIS_b
BTFSS PORTB,7
GOTO DIS_C
MOVLW d'12' ;b
CALL TABLE
MOVWF PORTC
retfie
DIS_C
MOVLW b'00001000'
MOVWF PORTB
BTFSS PORTB,4
GOTO DIS_d
MOVLW d'13' ;C
CALL TABLE
MOVWF PORTC
retfie
DIS_d
BTFSS PORTB,5
GOTO DIS_E
MOVLW d'14' ;d
CALL TABLE
MOVWF PORTC
retfie
DIS_E
BTFSS PORTB,6
GOTO DIS_F
MOVLW d'15' ;E
CALL TABLE
MOVWF PORTC
retfie
DIS_F
BTFSS PORTB,7
GOTO $+4
MOVLW d'16' ;F
CALL TABLE
MOVWF PORTC
retfie




;************************************************* *****************************
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;============== CHUONG TRINH CHINH===============
MAIN
BCF STATUS,RP1
BSF STATUS,RP0 ; chon BANK 1
MOVLW b'11110000' ;RB0=Input
MOVWF TRISB
CLRF TRISC

BCF STATUS,RP0 ; chon BANK 0
BSF INTCON,GIE
BSF INTCON,RBIE ;cho phep ngat RB4...RB7

MOVLW d'10'
CALL TABLE
MOVWF PORTC
LOOP
MOVLW b'00001111'
MOVWF PORTB
GOTO LOOP
;----------------------------------------------------------
; Bang tra ve Digital tu 0 den 9 va A....F
; Chi so dau truy cap la 0
; Bang o PAGE 0

ORG 0x90
TABLE
;----------------------------------------------------------
ADDWF PCL, F ; bat dau tai 0x80
RETLW b'00111111' ; 0
RETLW b'00000110' ; 1
RETLW b'01011011' ; 2
RETLW b'01001111' ; 3
RETLW b'01100110' ; 4
RETLW b'01101101' ; 5
RETLW b'01111101' ; 6
RETLW b'00000111' ; 7
RETLW b'01111111' ; 8
RETLW b'01101111' ; 9
RETLW b'00000000' ; NODISPLAY
RETLW b'01110111' ; A
RETLW b'01111100' ; B
RETLW b'00111001' ; C
RETLW b'01011110' ; d
RETLW b'01111001' ; E
RETLW b'01110001' ; F

END

nhh
05-03-2006, 06:21 PM
:020000040000FA
:020000007A285C
:080008000528F1000308F200D5
:100010000A08F3000B1001308600061E132800307A
:10002000902087000900861E192801309020870043
:100030000900061F1F280230902087000900861F34
:100040002528033090208700090002308600061E14
:100050002D280430902087000900861E33280530A3
:10006000902087000900061F39280630902087005D
:100070000900861F3F2807309020870009000430C0
:100080008600061E47280830902087000900861E3B
:100090004D280930902087000900061F53280B3097
:1000A000902087000900861F59280C309020870077
:1000B000090008308600061E61280D309020870058
:1000C0000900861E67280E30902087000900061F51
:1000D0006D280F30902087000900861F722810308D
:1000E00090208700090073088A0072088300F10ECF
:1000F000710E090003138316F03086008701831206
:100100008B178B150A30902087000F3086008528CA
:1001200082073F3406345B344F3466346D347D349B
:1001300007347F346F34003477347C3439345E34A0
:040140007934713469
:02400E00323F3F
:00000001FF

Hy vọng rằng đến khi nhh post bài tiếp theo thì đã nhận được 20 bài viết mới từ các bác về chú Pic này! :D

chuabietgi
05-03-2006, 06:45 PM
Chào bác!
Em mới làm quen với PIC nên có thể gọi là chưa biết gì.
Em ủng hộ hai tay cho luồng mà bác mở ra.Nó rất hữu ích cho những thằng chưa biết gì như em.Em sẽ ngâm cứu những gì bác viết và cũng hy vọng em cũng sẽ post lại những gì mà em đã học được.
Thanks bác nhiều!
Bác có thể cho em hỏi về kỹ thuật bảng 1 tí được không ạ!
Và bác dùng phần mềm gì để mô phỏng cho pic như hình trên vậy,trông nó rất hấp dẫn!

picpicpic
05-03-2006, 07:01 PM
Chào các bác!
Em cũng ủng hộ luồng này của bác.Hy vọng các bác sẽ có nhiều bài viết tốt để anh em tham khảo!

nhh
05-03-2006, 07:22 PM
Thanks các bác đã ủng hộ!

Bác có thể cho em hỏi về kỹ thuật bảng 1 tí được không ạ!
Và bác dùng phần mềm gì để mô phỏng cho pic như hình trên vậy,trông nó rất hấp dẫn!

Cái kỹ thuật bảng anh F đã viết một bài rất dễ hiểu,bạn có thể tải ở file đính kèm.
Còn phần mềm mô phỏng mà nhh dùng là Protues,hình như nó là cái mô phỏng xịn nhất về điện tử thì phải.Bạn có thể qua dientuvietnam.net search và load về dùng.
Mong rằng bạn sẽ có nhiều bài viết về chú này!

nhh
05-03-2006, 07:26 PM
À tiện thể xin hỏi các bác có bác nào có cái crack của protues 6.8 không.
Cái 6.7 tại hạ đang xài dù đã crack nhưng nó vẫn còn lủng củng dùng nhiều khi phát bực vì nó không cho save nếu để lâu!
Thanks!

Longlife
05-03-2006, 10:19 PM
Nếu bạn mới dùng PIC thì mô phỏng bằng PIC simulator IDE v5.21, giao diện thân thiện dễ sử dụng.

falleaf
06-03-2006, 09:16 AM
Đôi lời giải thích với các bạn như sau:

- picvietnam hay dientuvietnam hoặc diendandientu cũng chỉ là nơi để trao đổi và học tập. F cũng là mod của dientuvietnam và diendandientu. Do vậy, khi phát triển hoạt động, chúng ta phát triển cho cộng đồng điện tử VN. Vì vậy không có sự khác biệt và so sánh.

- Điều F quan tâm ở đây, đó là chúng ta có một nơi chuyên để thảo luận những vấn đề chúng ta quan tâm, và đi sâu vào đó. Ở dientuvietnam hay diendandientu, đó là những diễn đàn rộng, vì vậy, có rất nhiều người có những kiến thức khác nhau về điện tử tập hợp lại, và nó hình thành được nhiều bài viết khi ứng dụng PIC vào những vấn đề thực tế, và kinh nghiệm thực tế được trao đổi và thảo luận.

- Trong khi đó ở picvietnam, nó là một lớp học online, do chính những thành viên tự học và tự dạy cho nhau. Có thể về mặt thảo luận và đề tài ứng dụng, thì việc trao đổi không nhiều. Nhưng F sẽ phân tích dưới đây để các bạn thấy được vấn đề tại sao picvietnam vẫn được xây dựng và tồn tại, và đó là lời động viên của F dành cho các bạn.

Diễn đàn của chúng ta chủ yếu nghiên cứu các tool, các công cụ, các vấn đề lý thuyết, thuật toán, và tập trung vào việc khai thác PIC. Ví dụ như trong luồng đố vui của dientuvietnam, một câu đố vui đó, có thể ứng dụng cho rất nhiều loại vi điều khiển, không chỉ riêng gì PIC, nhưng lực lượng người dùng PIC online hiện nay đã và đang phát triển rất mạnh. Chính vì vậy, vấn đề thảo luận này được đặt trong luồng về PIC, và do những người dùng PIC phát triển ra.

Nhưng đó là nhưng bài toán mang tính chất ứng dụng vào thực tế. Và bài toán ứng dụng thì không thể trang bị tool, công cụ, lý thuyết, để phát triển tất cả những sản phẩm sau này.

Các bạn để ý một điều rằng, hầu như các bạn sinh viên học PIC, khởi đầu ở picvietnam, sau đó bắt đầu học dần lên, và có thể tự học, tự làm, rồi bắt đầu "đủ công lực" sẽ đem nhưng học thuật, hiểu biết của mình, phát triển ở các diễn đàn khác.

Trong khi đó, picvietnam cung cấp các công cụ làm việc, những bài học cơ bản, nhằm mục đích phát triển riêng về PIC. Vd như khi nói về điều khiển LED ma trận, hoặc khi điều khiển LCD, LED 7 đoạn... tất cả những cái đó là những ứng dụng thực tế. Trong khi đó, trên picvietnam, chúng ta thảo luận về cái gỉ? PORT I/O và kỹ thuật bảng.

Đứng trên vị trí của PIC mà nói, chỉ cần PORT I/O và kỹ thuật bảng, đã đủ và dư sức để có thể làm được LED ma trận, led 7 đoạn và LCD... có phải vậy không?

Chính vì điều này, chúng ta nghiên cứu các công cụ, các bước cơ bản, các thuật toán tính toán cơ sở để có thể phát triển các giải thuật trên PIC.

Ở các luồng thảo luận về PIC khác, ít người chú ý đến việc tính toán các hàm delay, nhưng ở đây, chúng ta viết khá nhiều cách để xây dựng hàm delay. Chúng ta cũng viết nhiều bằng MPASM để hiểu PIC và đi vào các tương tác gần nhất với PIC.

Có thể điều này hơi mang tính chất academic với các bạn, và nó hơi mơ hồ!

Nhưng không, chính những gì chúng ta làm và chuẩn bị ở đây, đó là những công cụ, những có sở nền tảng vững chắc. Chúng ta sẽ đi chậm, nhưng rồi chúng ta sẽ có những nghiên cứu xử lý thuật toán, và những bài toán dần dần đang được nhóm PIC vietnam thực hiện.

Ví dụ như một niềm tự hào của picvietnam, đó là bộ thư viện ORCAD. Kể cả những trang nước ngoài cũng không làm được. Bộ thư viện này đã có ít nhất 100 lượt người tải về sử dụng, chưa kể những người download bằng đường link trực tiếp.

Có ít nhất 300 lượt người duyệt bài và link vào trang. Các bạn hãy thử tưởng tượng rằng 1 người hết 5 phút để vẽ một con linh kiện. Vậy 10 người là 50 phút (coi như 1 giờ cho chẵn). Thì 100 người là 10 giờ (một ngày làm việc).

Đó là thời gian 1 tháng sau khi nó được đưa lên. Cứ 1 tháng thì nó tiết kiệm 1 ngày làm việc.

Đây chính là xu hướng mà picvietnam sẽ đi và sẽ phát triển xã hội bằng việc mỗi một việc làm của picvietnam sẽ tiết kiệm một ngày làm việc cho toàn cộng đồng. Hãy vững tin về điều đó. Chúng ta sẽ làm được nhiều và rất nhiều.

Sắp tới, bộ tiny bootloader sẽ được picvietnam chuẩn hoá, kèm theo việc giới thiệu về I2C bằng CCS C (I2C bằng MPASM đã được bạn Mạnh phổ biến rồi). Tiến tới là multi master I2C. Đó là hai công việc picvietnam đang làm và sắp xong.

Giao tiếp RS232 cũng đã tạm ổn (chưa được ổn cho lắm hehehe...) Nhưng sẽ xong. Như vậy, sau khi xong tinybootloader cũng đồng thời xong luôn phần cứng cho RS232. Cứ như vậy, từng bước, từng bước, chúng ta không đi sau mà đi sâu các bạn ạ.

Những câu hỏi và trả lời không thể làm thành cơ sở thư viện được, chỉ có những bài viết như nhh vừa gửi mới có thể hình thành cơ sở, thư viện, và tài liệu hữu ích cho sự phát triển mà thôi. Đó là hướng đi của picvietnam.

Mong rằng các bạn hiểu và vững tin theo ý nghĩa này của picvietnam.

Chúc vui.

ntc
06-03-2006, 02:25 PM
Các ứng dụng của nhh được xây dựng dựa trên một số thông tin cơ bản:
_ Về phần cứng: đó là các thông tin về phím nhấn, thông tin về LED 7 đoạn, thông tin về cấu tạo, tổ chức các PORT I/O và các ngắt ngoài của PORT B, ...
_ Về phần mềm: đó là thông tin về kĩ thuật bảng, thông tin về chương trình ngắt và cách xử lí ngắt, một số thao tác lập trình với PIC (khai báo biến,...) ...
_ Về kĩ năng: đó là các kĩ năng phân tích tìm hiểu thông tin trong tài tiệu (datasheet chẳng hạn), kĩ năng xây dựng ứng dụng dựa trên các thông tin thu thập được.
Ứng dụng của nhh rất hay, nhưng nhìn chung lại, hầu hết mọi ứng dụng đều được xây dựng dựa trên một số thông tin và kĩ năng cơ bản. Trường hợp ứng dụng của nhh cũng không ngoại lệ.
Bây giờ, nhh thử tưởng tượng coi, nếu một thành viên mới tìm hiểu PIC, đọc ứng dụng của nhh thì số lượng thông tin thu thập được là bao nhiêu. Sẽ có rất nhiều thắc mắc: làm sao mà viết chương trình như vậy thì con PIC sẽ hiển thị được con số đó ra LED 7 đoạn, làm sao mà viết như vậy thì PIC sẽ nhận diện được sự thay đổi muắc logic ở PORT B để tạo ra ngắt.
Đó là cái mà picvietnam đang cố gắng lí giải thông qua các tutorial được viết rất cơ bản, thông qua các module, các công cụ, ...đó là một phần vai trò của picvietnam trong các diễn đàn điện tử. Hướng đi này có thể hơi khác biệt, nhưng không hề lạc hướng.

Nếu tìm hiểu thêm một số thông tin về timer, nhh có thể xây dựng được một ứng dụng mới: một đồng hồ điện tử.:D. Chỉnh giờ được luôn (bạn đã có được các module cơ bản về xử lí nút bấm, về hiển thị LED 7 đoạn, rồi một số module về kĩ thuật lập trình, ...). Thử coi. Phần cứng cũng đã có sẵn rồi, chỉ còn mỗi việc viết chương trình.

PIC16F877A nếu chỉ để tìm hiểu thì được, chứ nếu để xây dựng các ứng dụng thực tế thì có đôi khi ... hơi phí phạm, vì hiếm khi nào ta sử dụng được hết các chức năng của nó trong một ứng dụng. Việc xây dựng các module và trang bị các thông tin cơ bản có thể cho phép ta sử dụng bất cứ PIC nào mà không hề cảm thấy bỡ ngỡ.:D

nhh
06-03-2006, 04:06 PM
Thanks bác F và mod NTC!
Vậy thì phần tutorial cơ bản bác sẽ viết bên đó,còn về vọt những ứng dụng viết được anh em có thể post bên "PIC6F877A từ dễ đến khó" hoặc trong luồng này cũng tốt!
NHH sẽ cố gắng viết những ứng dụng bậy bạ từ những cái tutorial của bác mod!
Cùng nhau phá PIC bà con ơi!
À phiền bác F sửa lại giúp tiêu đề cái thread này,do sơ ý nên em viết nhầm tên Pic !
Thanks!

nhh
06-03-2006, 04:09 PM
Nếu bạn mới dùng PIC thì mô phỏng bằng PIC simulator IDE v5.21, giao diện thân thiện dễ sử dụng.
Cái này mình cũng có dùng,nhưng dùng nó chỉ để hiểu pic làm gì với mấy cái thanh ghi khi chạy chương trình.Dùng protues mô phỏng thì sẽ thấy kết quả trực quan và sống động hơn!:D

picpicpic
07-03-2006, 07:52 PM
Chào cả nhà!
picpicpic đã copy và cho chạy thử bài viết của bác nhh,kết quả rất tốt!Bác có viết vài ý về các cách ngắt của con pic này được không?
Hẹn câu trả lời của các bác!

minhquancdt
07-03-2006, 08:04 PM
Em là thành viên mới của diễn đàn.
Em muốn học pic nhưng không biết bắt đầu từ đâu.
Bác nào có kinh nghiệm chỉ giáo giúp em với.
Em xin cảm ơn!

pb1
08-03-2006, 12:08 AM
Em cũng đồng ý cả hai tay.
nhưng có bác có thể viết chương trình bằng picc không?. Em thấy PICC rất hay bởi vì chương trình viết rất gọn, có thể ứng dụng vào các bài toán lớn. Còn Assembler thì cũng có thể như thế, nhưng viết khó và dài. Em thấy,với các bài cơ bản thì các bác cố gắng viết cả Assembler và PICC để cho nhiều người có thể học tập

tungnguyen
08-03-2006, 04:07 PM
chào các bác, tôi mới lần đầu vào diễn đàn và mới làm quen với PIC, nên các bác có thể giúp mình tài liệu về PIC này không ạ, cảm ơn

chuthong1
09-03-2006, 09:19 AM
Cac Anh co the cho em Bo ma Lenh cua Dong Pic16f877a duoc khong
Em moi buoc chan vao hoc ve Pic nen khong biet gi` ca
Xin cac Dai gia chi giao gium

nhh
09-03-2006, 12:08 PM
Chào các bạn!
Ai mới bắt đầu với pic thì vào luồng "Cơ bản về vi điều khiển và pic",tìm trong các luồng "Học pic như thế nào","Học pic trong vòng một ngày",ở đó anh F hướng dẫn rất cơ bản và tỉ mỉ.

Khi mới học pic,bạn nên chọn ASM vì chương trình viết gần gũi,cấu trúc lệnh đơn giản (chỉ mỗi tội phải kè kè thanh ghi W),biết nó tác động như thế nào lên các thanh ghi.Sau khi vững ASM chuyển qua C thì tốc độ sẽ nhanh hơn.

Các bạn vào luồng "MPASM" của mod Mạnh để tìm hiểu con 16f628a,vào "PIC6F877A từ dễ tới khó" của mod Chính để vọt con 16F877A.

Còn tập lệnh của pic16 đều giống nhau cả,có 35 lệnh,trong tất cả các datasheet đều có và ví dụ rất rõ.Datasheet lên google search với tên pic là có cà ngàn luôn!

Chúc các bạn học tốt!

nhh
09-03-2006, 12:16 PM
Chào cả nhà!
picpicpic đã copy và cho chạy thử bài viết của bác nhh,kết quả rất tốt!Bác có viết vài ý về các cách ngắt của con pic này được không?
Hẹn câu trả lời của các bác!

Ăc ăc...Cái này picpicpic làm khó anh em rồi ! Mình biết rất lung tung không thể trình bày một cách bài bảng và chuyên nghiệp được, viết ra làm các bác khó hiểu....nhh nghĩ cái này nên để mod Chính viết!

linhnc308
12-03-2006, 01:54 PM
Muốn nhanh chóng làm việc được với PIC, các bạn nên tiếp xúc với ngôn ngữ C cho PIC, nhất là CCS. Các bạn sẽ thấy được những điểm mạnh mà C đem lại.
Tài liệu thì bạn qua luồng Compiler về CCS để tìm hiểu. Có tài liệu của bác txt rất hay, cùng với help của CCS.

ntc
12-03-2006, 04:15 PM
Không biết mọi người học PIC thế nào, còn mình, mình in cái datasheet của con PIC ra và nghiền ngẫm trong vòng ... 1 tháng. Tất nhiên là phải dựa trên một số kiến thức cơ bản về điện tử.

thunglungvang
12-03-2006, 06:23 PM
Sao em thấy các bác phần lớn đều viết chương trình cho con PIC này bằng Assembly thế nhỉ?? Đọc khó hiểu bỏ xừ. Mặc dù dung lượng cua file dịch ra của nó là nhỏ hơn so với viết bằng C nhưng em thấy viết bằng C dễ hiểu và dễ tiếp cận hơn nhiều chứ nhỉ??

namqn
12-03-2006, 07:41 PM
Sao em thấy các bác phần lớn đều viết chương trình cho con PIC này bằng Assembly thế nhỉ?? Đọc khó hiểu bỏ xừ. Mặc dù dung lượng cua file dịch ra của nó là nhỏ hơn so với viết bằng C nhưng em thấy viết bằng C dễ hiểu và dễ tiếp cận hơn nhiều chứ nhỉ??
Đương nhiên là viết bằng ngôn ngữ cấp cao thì dễ hơn nhiều so với ngôn ngữ cấp thấp. Nhưng nếu bạn không biết chính xác chương trình của mình viết ra được thực hiện như thế nào, hoặc khi cần tối ưu mã cho chương trình, hoặc cần viết một số đoạn mã tới hạn nào đó để chạy thật nhanh thì lúc đó bạn sẽ làm thế nào? Tôi cũng rất thích ngôn ngữ cấp cao, nhưng giải pháp tốt nhất theo tôi là viết bằng cả hai ngôn ngữ, phần nào thích hợp với ngôn ngữ nào thì viết bằng ngôn ngữ đó, để tận dụng sức mạnh của nó.
Còn việc bắt đầu làm quen với PIC mà sợ khó, không tìm hiểu các vấn đề cơ bản thì khi bạn viết chương trình lớn, phức tạp sẽ khó có giải pháp hiệu quả.

Thân,

chuthong1
15-03-2006, 01:34 PM
Không biết mọi người học PIC thế nào, còn mình, mình in cái datasheet của con PIC ra và nghiền ngẫm trong vòng ... 1 tháng. Tất nhiên là phải dựa trên một số kiến thức cơ bản về điện tử.



Minh Dang dc mot so VD cua ban va thay rat re hieu
Ban lam on pot het len de minh Xem co' dc ko


Cam on Ban Nhieu
:D

ntc
16-03-2006, 10:53 AM
Không dấu gì bạn, mỗi bài viết như vậy thông thường mình phải viết trong vòng ... nửa tháng. :D . Làm sao để cho cô đọng, tập trung và dễ hiểu nhất. Chứ đâu có sẵn đâu mà post lên hết một lần được. :D

Mục đích của những bài viết trên không phải là hướng dẫn từ A tới Z mọi thứ liên quan đến con PIC, mà chỉ là những vấn đề cơ bản nhất, và những bạn mới làm quen có thể cảm thấy dễ dàng hơn khi bắt đầu với PIC. Còn việc phát triển và ứng dụng các vấn đề đó thì mỗi người phải tự làm thôi. :D .

Còn các ví dụ, bạn có thể tìm thấy rất nhiều trong diễn đàn, trong các tài liệu, các Tutorial cung cấp trên diễn đàn. Đọc cũng dễ hiểu, dễ làm. Bạn tham khảo thêm nhé.

Tất nhiên picvietnam vẫn sẽ thường xuyên cung cấp thêm các Tutorial mới. Hy vọng sẽ đáp ứng được yêu cầu của các thành viên.

:D

Dang Khoa
16-03-2006, 07:04 PM
Cac ban co biet gi ve chuong trinh MikroPalcal viet cho PIC khong

pb1
16-03-2006, 10:22 PM
em đã nghiền hết mấy bài của bác nhh rồi, em đang chờ các bài tiếp theo của bác nhh đây. Bác nhanh nhanh viết thêm nữa đi chứ.

ntc
17-03-2006, 10:41 AM
Cái Timer nhh làm tới đâu rồi. :D . Có gì trục trặc không.

Các ngôn ngữ lập trình cho PIC, theo mình không nên tìm hiểu nhiều ngôn ngữ quá, nhiều khi còn lộn từ ngôn ngữ này sang ngôn ngữ khác nữa. Cái này kiếm hiệp gọi là "tẩu hỏa nhập ma". :D

Mới tìm hiểu thì nên chọn ngôn ngữ ASM. Ngôn ngữ này tuy hơi khó viết nhưng nó giúp ta hiểu được sâu hơn bản chất cũng như cấu tạo của con PIC. Sau đó, khi đã vững phần căn bản, nếu thích có thể chuyển qua C. Đây là 2 ngôn ngữ thông dụng nhất cho PIC, càn các ngôn ngữ khác, hẳn phải có một nhược điểm nào đó nên được ít người chọn để làm công cụ lập trình.

Các ngôn ngữ cấp cao thực chất đều được xây dựng dựa trên các lệnh cơ bản của con PIC thôi. Trong quá trình sinh code của các ngôn ngữ cấp cao, như C, trước khi chuyển sang mã HEX còn có thêm một giai đoạn là chuyển sang mã Assembly của PIC. Như vậy có thể tạm hiểu là các hàm của ngôn ngữ cấp cao cho PIC được xây dựng dựa trên tập lệnh cơ bản của PIC. Các hàm này có thể giúp ta dễ viết và mang tính tổng quát cao, giống như các module chương trình được xây dựng sẵn. nhưng có nhược điểm là không linh động. Điều này một phần giải thích tại sao file biên dịch của ngôn ngữ cấp cao lớn hơn so với việc viết trực tiếp bằng ASM.

Tính tổng quát và thiếu linh động cũng sẽ gây trở ngại cho quá trình tối ưu, đồng thời khả năng kiểm soát quá trình thực thi của vi điều khiển không cao. Nếu viết bằng ASM, ta có thể kiểm soát được từng "cử chỉ" của PIC và thời gian thực thi của nó, như vậy ta có thể đáp ứng được các yêu cầu về tối ưu nhu anh Nam đã đề cập. Tuy nhiên điều đó đòi hỏi khả năng kiểm soát của người lập trình cũng cao hơn, có nghĩa là ta phải hiểu được từng ngóc ngách của con vi điều khiển PIC.

Nếu có khả năng xây dựng các module chương trình dựa trên tập lệnh của PIC (ví dụ như các module về xử lí thuật toán, các module về các khối chức năng trong PIC), ta hoàn toàn có thể xây dựng được một ngôn ngữ lập trình cho riêng mình. :D . Có thể vào trong luồng MPASM để tìn hiểu cách xây dựng một hàm bằng ngôn ngữ ASM của mod Mạnh.

Đây chỉ là một vài nhận xét mang tính chủ quan, mọi người góp ý thêm nhé. Anh Nam coi lại coi em hiểu như vậy có đúng không. Mong anh góp ý thêm.:D .

nhh
17-03-2006, 05:57 PM
em đã nghiền hết mấy bài của bác nhh rồi, em đang chờ các bài tiếp theo của bác nhh đây. Bác nhanh nhanh viết thêm nữa đi chứ.

Mấy tuần rày hơi nhát!:D
Bài tiếp chắc là cái đồng hồ điện tử.Hy vọng là tuần tới tớ sẽ cơ bản xong và post lên cho anh em chỉ giáo thêm!

namqn
17-03-2006, 06:14 PM
Những nhận xét của ntc là chính xác.
Cho dù bạn viết bằng ngôn ngữ gì thì cuối cùng con PIC cũng phải chạy chương trình của bạn, và bản thân nó chỉ hiểu mỗi mã nhị phân nằm trong bộ nhớ chương trình của nó mà thôi. Vì lập trình bằng mã nhị phân quá khó khăn đối với con người, nên mới có nhiều ngôn ngữ lập trình được tạo ra để giúp cho việc lập trình được dễ dàng hơn. Chẳng qua vào thời điểm này không có trình biên dịch (compiler) lý tưởng nào có thể thay thế được trình hợp dịch (assembler) trong mọi trường hợp mà thôi. Và để lập trình bằng hợp ngữ một cách hiệu quả thì thông thường bạn phải có một con vi điều khiển được mô phỏng trong chính bạn, để kiểm soát chương trình bạn đang viết, một công việc quá khó khăn cho những người mới học.
Không ít người đã tự xây dựng ngôn ngữ lập trình và trình biên dịch cho riêng mình, chẳng hạn như Vladimir Soso (viết Basic compiler) hay Wouter van Ooijen (sáng tạo JAL và viết JAL compiler).

Thân,

pb1
18-03-2006, 08:54 PM
em đang sử dụng PIC16f877A để điều khiển động cơ DC, yêu cầu điều khiển động cơ:(1) ổn định tốc độ động cơ khi địa hình thay đổi. (2) Chuyển từ RF sang RR(trái->phai) không bị giật. (3) Tùy ý thiết đặt tốc độ.

Có bác nào đã làm về vấn đề này, xin chỉ giáo giúp

pb1
18-03-2006, 08:56 PM
Bác nhh có thể giúp em một tay không?

nhh
19-03-2006, 09:12 AM
em đang sử dụng PIC16f877A để điều khiển động cơ DC, yêu cầu điều khiển động cơ:(1) ổn định tốc độ động cơ khi địa hình thay đổi. (2) Chuyển từ RF sang RR(trái->phai) không bị giật. (3) Tùy ý thiết đặt tốc độ.

Có bác nào đã làm về vấn đề này, xin chỉ giáo giúp

Chao ban!
De moi nguoi de hinh dung va tham gia nhiet tinh vao van de cua ban,ban co the post so do nguyen li va code ban viet len.Nhu the minh tin van de se duoc giai quyet nhanh hon!

Chao!

nhh
19-03-2006, 09:26 AM
Chào cả nhà!

Ý định tuần này của nhh là viết chương trình cho cái digital clock với timer, led 7 đoạn, phím nhấn,...nhưng nghĩ đi nghĩ lại giang hồ luyện chiêu này bằng IC thời gian thực DS1307, DS1337,...giao tiếp I2C...mình lại dùng timer định thì nhảy tới nhảy lui thật khó coi quá !

Mục đích cũng để tìm hiểu hoạt động của các timer, do vậy mà nhh tạm gác cái digital clock này lại. Bù lại mình sẽ làm một cái mạch đèn giao thông ,dùng ngắt timer0.

PIC16F877A có 3 timer ,timer0 và timer2 là hai timer 8bit còn timer1 là timer 16bit.
nhh chỉ đề cập đến những phần có liên quan đến timer0 trong ứng dụng này.Còn lại tham khảo trong datasheet viết rất rõ.
Các thanh ghi tác động timer0 gồm INTCON và OPTION_REG. Để khởi động timer0,xóa bit T0CS về 0.Lúc này thanh ghi TMR0 sẽ tự động tăng lên một ứng với mỗi chu kỳ lệnh

http://www.freewebtown.com/bantoi/PIC/Timer0.gif

Hoạt động ngắt của timer0 rất đơn giản,ngắt xảy ra khi tràn timer0 từ FFh về 00h
Khi ngắt này xảy ra cờ ngắt timer0 phất lên (bit TMR0IF được set lên 1) ,khi vào ngắt phải xóa cờ này về 0.
Bit PSA trên thanh ghi OPTION_REG chỉ định Prescaler cho timer0 hay WDT.Dùng timer0 thì xóa bit này.
Ba bit PS0,PS1,PS2 dùng chia tốc độ timer0 từ 2 đến 256 ,chia tốc độ WDT từ 2 đến 128.

Trong ứng dụng này do timer0 tràn sớm hơn 1s khi dùng thạch anh 10MHz,do vậy dùng thêm một biến đếm số lần tràn sao cho khi biến này giảm xuống 0 thì xấp xỉ 1s.

Trong 20s đầu,đèn xanh bật ON,từ giây 21 đến 30 có thêm đèn vàng ON, 20s cuối đèn đỏ ON.

Các chân từ a đến g của led 7 seg đầu nối với RC0 đến RC6, led còn lại nối RB0 đến RB6.

nhh
19-03-2006, 09:30 AM
;========================================
;Author: NHH
;Date: 18/03/06
;Hardware: PIC16F877A
; QUARTZ 10MHz
;========================================
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF
;========================================
COUNT1 EQU 0x20
COUNT2 EQU 0x21
COUNT3 EQU 0x22
w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
pclath_temp EQU 0x73 ; variable used for context saving
;===============MAIN PROGRAM===========
ORG 0x000
GOTO MAIN
ORG 0004h
GOTO INTERRUPT
;============INTERRUPT PROGRAM=========
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into w register
movwf pclath_temp ; save off contents of PCLATH register
;****************************************
BCF INTCON,TMR0IF

DECFSZ COUNT1,F
RETFIE
MOVLW d'154'
MOVWF COUNT1

INCF COUNT2,F
MOVF COUNT2,W
CALL TABLE
MOVWF PORTB

CALL CHECK_YELLOW
CALL CHECK_GREEN
CALL CHECK_RED

MOVLW d'10'
SUBWF COUNT2,W
BTFSS STATUS,0
RETFIE
CLRF COUNT2
INCF COUNT3,F
MOVF COUNT3,W
CALL TABLE
MOVWF PORTC

RETFIE
;****************************************
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;................................................. ............................................
MAIN
BCF STATUS,RP1
BSF STATUS,RP0 ; select BANK 1
CLRF TRISB ; PORTB,C,D output
CLRF TRISC
CLRF TRISD
BSF OPTION_REG,PS0 ;TMR0 rate 1: 64
BCF OPTION_REG,PS1
BSF OPTION_REG,PS2
BCF OPTION_REG,PSA ;Prescaler is assigned to the Timer0 module
BCF OPTION_REG,T0CS ;enable TMR0
BCF STATUS,RP0 ;select BANK 0

BSF INTCON,GIE
BSF INTCON,TMR0IE
BCF INTCON,TMR0IF

MOVLW d'154'
MOVWF COUNT1
MOVLW d'1'
MOVWF COUNT2
CLRF COUNT3
MOVLW b'00000110'
MOVWF PORTB
MOVLW b'00111111'
MOVWF PORTC

MOVLW b'00000100'
MOVWF PORTD
GOTO $
;========================================
CHECK_YELLOW
BTFSS PORTD,0
GOTO $+2
RETURN
MOVLW d'2'
SUBWF COUNT3,W
BTFSS STATUS,0
RETURN
MOVLW b'00000110'
MOVWF PORTD
RETURN
CHECK_GREEN
BTFSC PORTD,0
GOTO $+2
RETURN
MOVLW d'2'
SUBWF COUNT3,W
BTFSS STATUS,0
RETURN
GOTO MAIN
RETURN
CHECK_RED
MOVLW d'3'
SUBWF COUNT3,W
BTFSS STATUS,0
RETFIE

MOVLW d'1'
MOVWF COUNT2
CLRF COUNT3
MOVLW b'00000110'
MOVWF PORTB
MOVLW b'00111111'
MOVWF PORTC
MOVLW b'00000001'
MOVWF PORTD
RETURN
;-----------------------------------------------------------------------
; Bang tra ve Digital tu 0 den 9
; Chi so dau truy cap la 0
; Bang o PAGE 0

ORG 0x90
TABLE
;-----------------------------------------------------------------------
ADDWF PCL, F ; bat dau tai 0x80
RETLW b'11111111' ; NO DISPLAY
RETLW b'00000110' ; 1
RETLW b'01011011' ; 2
RETLW b'01001111' ; 3
RETLW b'01100110' ; 4
RETLW b'01101101' ; 5
RETLW b'01111101' ; 6
RETLW b'00000111' ; 7
RETLW b'01111111' ; 8
RETLW b'01101111' ; 9
RETLW b'00111111' ; 0

END



http://www.freewebtown.com/bantoi/PIC/Traffic%20light.gif

nhh
19-03-2006, 09:33 AM
Hex file

:020000040000FA
:020000002728AF
:080008000528F1000308F200D5
:100010000A08F3000B11A00B09009A30A000A10AF6
:1000200021089020860041204B2054200A302102D4
:10003000031C0900A101A20A2208902087000900E0
:1000400073088A0072088300F10E710E0900031311
:100050008316860187018801011481100115811121
:10006000811283128B178B160B119A30A00001306E
:10007000A100A201063086003F30870004308800CE
:100080004028081C4428080002302202031C0800F3
:1000900006308800080008184E28080002302202A6
:1000A000031C08002728080003302202031C090053
:1000B0000130A100A201063086003F3087000130E8
:0400C00088000800AC
:100120008207FF3406345B344F3466346D347D34DB
:0801300007347F346F343F34C3
:02400E00323F3F
:00000001FF

nhh
19-03-2006, 09:47 AM
Các bác xem xét và cho ý kiến,hình như nó vẫn chưa tối ưu.Thiên hạ chắc cũng không ai làm thế này!:D

pb1
20-03-2006, 12:06 AM
Sử dụng PIC chạy với thạch anh là 4MHz, tần số điều chế độ rộng xung là 1000Hz với duty cycle là 50%
;================================================= ========
1/ thiết lập chu kì PWM (1000Hz=0.001S) bằng cách ghi vào thanh ghi PR2.
Chu kì điều chế độ rộng xung(PWM Period)=(PR2+1)*4*Tosc*TMR2 Prescale value
tỉ lệ TMR2 prescale là 1:4, thì ta có
Tosc=1/4000000=2.5*10-7
ta cũng có
PR2=(Period/(4*Tosc*TMR2 prescale))-1
nên: PR2=(0.001/(4*2.5*10-7*4))-1=249
bằng cách thiết lập như vậy ta có chương trình như sau:(viết bằng assembler, lần sau sẽ là Hi-Tech PIC) :D
bsf STATUS,PR0;change from bank 1 to bank 0
movlw d'249'
movwf PR2
bcf STATUS,PR0
;================================================= ========
2/ thiết lập PWM duty cycle bằng cách ghi vào thanh ghi CCPR1L và hai bit 5 và 4 của thanh ghi CCP1CON.
ta có công thức sau:
PWM duty cycle= (CCPR1L:CCP1CON<5:4>)*Tosc*TMR2 Prescale value
nên suy ra: CCPR1L:CCP1CON<5:4>=PWM duty cycle/(Tosc*TMR2 prescale)
PWM duty cycle=50% của chu kỳ
PWM duty cycle=50%*0.001=0.0005
CCPR1L:CCP1CON<5:4>=0.0005/(2.5*10-7*4)
CCPR1L:CCP1CON<5:4>=500
Số 500 trong số nhị phân viết là:0111110100
vậy:CCPR1L=01111101 và CCP1CON<5:4>=00
do đó, ta có chương trình sau:
movlw b'01111101'
movwf CCPR1L
bcf CCP1CON,CCP1X;set bit 1
bcf CCP1CON,CCP1Y;set bit 0
;================================================= ========
3/thiết lập chân CCP1 là một lối ra bằng cách xóa bit TRISC<2>
bsf STATUS,PR0
movlw b'11111011'
andwf TRISC
bcf STATUS,PR0
:D
;================================================= ========
4/thiết lập giá trị prescale TMR2 và cho phép TMR2 bằng cách ghi vào T2CON(thanh ghi điều khiển Timer2)
Ta đã sử dụng từ trước là thiết lập giá trị prescale là 1:4.
Prescale TMR2 là các bit 1 và 0 trong thanh ghi T2CON
Để cho phép TMR2 là bit số 2.
Ta có đoạn chương trình như sau:
movlw b'00000101' ;Timer2 on,prescale=1:4
movwf T2CON
;================================================= ========
5/Thiết lập CCP1 ở chế độ điều chế độ điều chế độ rộng xung (PWM module)
movf CCP1CON,W
andlw b'00110000'
iorlw b'00001111';cho phép module PWM
movwf CCP1CON
;================================================= ========
thế đã nhỉ, mệt quá, đi ngủ thôi
:D
Đã lâu không viết băng assembler, hôm nay tiện làm về điều khiển động cơ, thế là hứng lên viết mấy dòng, có lẽ có nhiều thếu sot, mong các bác góp ý cho em

Khi nào em làm xong về điều khiển động cơ thì em sẽ port các sch lên diễn đàn cho cả nhà xem, rất mong cả nhà góp ý


thân!

falleaf
20-03-2006, 07:31 AM
Các bài viết trong luồng này rất hay, các bạn đang thảo luận về PWM, có thể nhấn thêm một bước bây giờ giả sử khi kết hợp 2 chân PWM nhưng làm xung trên 2 chân xen kẽ với nhau xem nào?

Đây có thể chỉ là một bài tập vui nhưng cũng có ứng dụng nhiều đấy.

Chúc vui.

pb1
20-03-2006, 09:50 AM
hì, thế còn capture module thì sao nhỉ, có ai viết tiếp không?

ntc
20-03-2006, 11:20 AM
Mình có một vài ý kiến về cách thiết kế mạch đèn giao thông của nhh như thế này: :D

Tất nhiên là chọn PORT điều khiển như thế nào cũng được, nhưng theo mình, khi thiết kế một ứng dụng, cần tìm cách để thiết kế là tối ưu.

Do PIC16F877A được tích hợp khá nhiều chức năng ngoài chức năng I/O thông thường, nên việc lựa chọn PORT điều khiển cũng nên cân nhắc. MÌnh nêu lên một số điểm như sau:

PORT C của PIC16F877A ngoài chức năng I/O là các chức năng CCP và giao tiếp nối tiếp (SPI, I2C,... ). Nếu nhh chọn PORT này làm PORT điều khiển các chân a-g của các LED thì các chức năng on-chip nêu trên sẽ không tương tác được nữa.

PORT D ngoài chức năng I/O là chức năng PSP (Parallel Slave Port). Chức năng giao tiếp này ít được sử dụng do số lượng chân cần cho giao tiếp khá lớn (8 chân PORT D và 3 chân PORT E), nhưng nhh đã sử dụng 3 chân để bật đèn giao thông. Như vậy chức năng này cũng bị mất luôn.

Có thể nói ta đã phí phạm 3 chức năng on-chip của PIC16F877A. Tất nhiên là trong ứng dụng của nhh ta chưa cần quan tâm đến vấn đề này, nhưng mình cũng muốn nêu lên để anh em cùng thảo luận.

Theo mình thì nên sửa lại như thế này:

Các chân data của Led 7 đoạn, mình sẽ đưa vào PORT D.
Các chân điều khiển đèn giao thông và quét LED sẽ đưa vào PORT B luôn.

Như vậy ta có thể tiết kiệm được các chức năng CCP và giao tiếp ở PORT C, cái mất đi chỉ là cái ít đụng tơi PSP, còn ngắt PORT B thì vẫn còn vài chân.

Trong các ứng dụng của mình có dính tới LED 7 đoạn, mình cũng bố trí các chân điều khiển như vậy.

Về chương trình cũng sẽ không có thay đổi lớn. Bạn nên "#define ..." các chân và PORT điều khiển. Như vậy khi cần thay đổi chân điều khiển, ta chỉ cần thay đổi cái phần define mà không cần phải sửa lại trong toàn bộ chương trình. Hơn nữa chương trình khi đọc cũng sẽ thân thiện và dễ hiểu hơn.

Một vài ý kiến góp vui như vậy. Anh em thấy thế nào.

:D

ntc
20-03-2006, 12:06 PM
Tiếc quá nhh không làm cái Timer. Nếu làm cái Timer, bạn sẽ có thêm một kinh nghiệm sương máu và một thủ thuật kinh điển khi lập trình bằng ASM. Cái kinh nghiệm này mĩnh cũng chỉ vừa mới rút ra thôi. :D.

Nó có liên quan tới kĩ thuật bảng. :D

ngohaibac
20-03-2006, 02:37 PM
Để khởi động timer0,xóa bit T0CS về 0.Lúc này thanh ghi TMR0 sẽ tự động tăng lên một ứng với mỗi chu kỳ lệnh

T0CS không phải dùng để khởi động Timer0 mà T0CS dùng để chọn cho Timer0 ở chế độ timer hay counter.

Chế độ timer (T0CS = 0) thì TMR0 sẽ tăng lên 1 sau mỗi chu kì lệnh (khi prescaler = 1, nếu khác 1 thì là bộ của chu kì lệnh).

Chế độ counter thì T0CS =1 khi đó TMR0 sẽ tăng lên mỗi khi có một sườn lên hoặc sườn xuống xuất hiện trên chân T0CKI (RA4) ( chân này dạng open - drain nên bình thường nếu set dạng I/O bình thường thì phải mắc thêm trở kéo lên). Và chúng ta phải chọn sườn lên hay sườn xuống qua bít T0SE.

Trong ứng dụng này do timer0 tràn sớm hơn 1s khi dùng thạch anh 10MHz,do vậy dùng thêm một biến đếm số lần tràn sao cho khi biến này giảm xuống 0 thì xấp xỉ 1s.

Trong 20s đầu,đèn xanh bật ON,từ giây 21 đến 30 có thêm đèn vàng ON, 20s cuối đèn đỏ ON.

Các chân từ a đến g của led 7 seg đầu nối với RC0 đến RC6, led còn lại nối RB0 đến RB6.
Mình nghĩ bạn nên làm một timer0 trễ 1ms. Sau đó tuỳ ứng dụng mình sẽ sử dụng là bội của 1ms này. Tức là dùng biến static để đếm sự kiện tràn timer0.

Lưu ý: timer0 là bộ free - auto counter sau khi thiết lập ở chế độ timer thì nó sẽ đếm mãi mà không dừng. thanh ghi OPTION ở chế độ sau reset = 0xFF nên ban đầu nó ở chế độ Counter sẽ đếm xung bên ngoài.

Mình xin ví dụ một hàm ngắt với timer0 dùng HTPIC. Với thạch anh 20MHZ thì hàm ngắt timer0 1ms -> TMR0 = 6

void interrupt inter0(void){
static unsigned char i;
static unsigned int counter; // bien dem su kien ngat timer0
if(T0IF & T0IE){ // neu co ngat Timer0 xay ra
TMR0 = 6;
T0IF = 0 ; // xoa co ngat, cong viec khong the thieu sau ham ngat
++ counter;
if (counter == a ) {
// do something
};
};
}

Trong hàm init chọn như sau: dùng pre cho timer0 với tỉ lệ 1:2
void init(void){
// khoi tao cho các port


// Khoi tao cho cac thanh ghi
OPTION = 0x00; // dung prescaler cho timer0 voi ti le la 1:2

// Khoi tao cho ngat Timer0
GIE = 1; // cho phep ngat toan cuc
T0IE = 1; // cho phep ngat timer0
T0IF = 0; // xoa co ngat timer0
TMR0 = 6; // khoi tao
}

ngohaibac
20-03-2006, 02:59 PM
Chương trình đèn giao thông tại sao bạn NHN lại tốn nhiều chân để điều khiển 2 led 7 thanh thế nhỉ? Sao bạn không dùng phương pháp quét led để quét 2 led này. Khi đó dùng 7 chânPORTD (a->g) và thêm 2 chân điều khiển nữa như vậy chỉ mất có 9 chân tất cả. Như vậy tiết kiệm các chân hơn.

Thực tế đèn giao thông này là rất đơn giản. Bạn có thể phát triển thành sơ đồ đền giao thông hiện đại mới trong thực tế không? Đứng ở ngã tư một lúc xem thế nào :D. Bạn đưa ra mô hình đi mình lập trình bằng HTPIC xem thế nào. Vì làm bằng ASM đúng là mình mệt lắm:D.

chúc mọi người thành công.

nhh
20-03-2006, 05:56 PM
Cảm ơn ngohaibac!

Ban đầu mình cũng nghĩ ghép chung dữ liệu cho hai led 7 seg,làm như vậy thì khi viết chương trình quét led có hơi phức tạp hơn một chút.Chương trình này mình dùng để tìm hiểu ngắt timer0 thôi chứ ko có ý định tiết kiệm chân VDK.:D

ngohaibac cứ mắc mạch như ntc:


Theo mình thì nên sửa lại như thế này:

Các chân data của Led 7 đoạn, mình sẽ đưa vào PORT D.
Các chân điều khiển đèn giao thông và quét LED sẽ đưa vào PORT B luôn.

Bạn viết và post lên cho anh em học HTPIC tham khảo!

Chào!

nhh
20-03-2006, 06:19 PM
Tiếc quá nhh không làm cái Timer. Nếu làm cái Timer, bạn sẽ có thêm một kinh nghiệm sương máu và một thủ thuật kinh điển khi lập trình bằng ASM. Cái kinh nghiệm này mĩnh cũng chỉ vừa mới rút ra thôi. :D.

Nó có liên quan tới kĩ thuật bảng. :D

Tuần này tớ sẽ làm cái timer để Chính phân tích những kinh nghiệm xương máu mà mình tích lũy được.
Hy vọng sớm hoàn thành!:D

Chào!

ngohaibac
20-03-2006, 06:41 PM
Mình đã viết chương trình quét 4 led 7 thanh rùi bằng HTPIC. Tại luồng này bên dientuvietnam.net. xin mời các bạn cho ý kiến về giải thuật và cấu trúc:

http://dientuvietnam.net/forums/showthread.php?t=1406&page=1&pp=10

Mình quen về lập trình bằng C nên có vấn đề gì về các câu lệnh về C thì các bạn cứ hỏi. Còn về ASM thì chào thua. Không dám lập trình vì dài lắm, khó chữa lỗi.

chúc các bạn thành công.

ngohaibac
20-03-2006, 11:52 PM
Còn về chú ý mà ntc nói thì đúng rồi. Nhưng mình hoàn toàn có thể làm được 2 công việc một lúc là vừa quét led vừa làm đầu vào Analog được. Điều này đã được nói trong App Note của bọn Microchip rồi.
Tài liệu AP557d: http://ww1.microchip.com/downloads/en/AppNotes/00557d.pdf

Bọn này chỉ dùng có con 16C71 với 18 chân mà làm được khối việc. Anh BA đã nói đến trong bài một số kiểu tiết kiệm chân vđk rồi tại luồng
http://dientuvietnam.net/forums/showthread.php?t=5

Đây là hình vẽ minh họa:
http://i36.photobucket.com/albums/e46/ngohaibac/PVN_00015.gif

Các bạn thấy thế nào. Mình nghĩ là nên lập một luồng để đưa lại các App Note của bọn Microchip để mọi người cùng học tập thì chắc chắn là hay hơn nhiêu. Vì bọn nó có nhiều chú ý về các vấn đề như I/O, về display led, LCD, PID, ...

Các bạn thấy thế nào?

nhh
22-03-2006, 05:44 PM
Các bài viết trong luồng này rất hay, các bạn đang thảo luận về PWM, có thể nhấn thêm một bước bây giờ giả sử khi kết hợp 2 chân PWM nhưng làm xung trên 2 chân xen kẽ với nhau xem nào?

Đây có thể chỉ là một bài tập vui nhưng cũng có ứng dụng nhiều đấy.

Chúc vui.

Mình dùng ngắt để xử lý có được không anh F!

pb1
23-03-2006, 11:17 PM
Các bác cho em hỏi một tí:tại sao người ta phải sử dụng đến 10bit phân giải
CCPR1L:CCP1CON<5:4> để làm gì, mà không dùng 8 bit CCPR1L thôi?

À, còn cái này nữa. Nếu như dùng 10bit như thế thì làm thế nào để thay đổi giá trị đặt vào chúng(mục đích của em là dùng cái thằng PWM module tạo ra xung thay đổi liên tục)
Bác nào có thể giúp em tí không?

thank các bác nhiều!

pb1
24-03-2006, 10:31 AM
// Period of square-wave (chu kì của một sóng vuông)
/*Variables for capture and interrupt*/
static volatile bit flag=0;
static volatile unsigned int t1=0,t2=0;

void capture_setup(void)
{
CCPR1L=0; CCPR1H=0; //Clear capture registers
TMR1H=0; TMR1L=0; //Clear timer1 registers
CCP1CON = 0b00000111; //Capture every 16th rising edge on CCP1(RC2)
T1CON = 0b00100101; //Configure Timer1 module in timer mode with 1:4 prescale and start Timer1
CCP1IE=1; //Enable CCP interrupts
TMR1IE=0; //Disable Timer1 interrupts
PEIE=1;
GIE=1; //Enable global interrupts
}

static void t1func(void)
{
t1=CCPR1L;
t1+=(CCPR1H << 8);
}

static void t2func(void)
{
t2=CCPR1L;
t2+=(CCPR1H << 8);
t2-=t1;
}

static void interrupt isr(void)
{
if (CCP1IF && CCP1IE) //Clock line every 16th rising edge on CCP1IF, RC2, pin 13 on micro
{
CCP1IF=0;

if(flag==1) //Save value to t1 on every even interrupt
{
t1func();
flag = 0;
}
else //Save value to t2 on every odd interrupt
{
t2func();
flag = 1;
}
}
}
Nhà mình có bác nào dảnh thì giải thích giúp em cái này cái: :D
static volatile bit flag=0;
static volatile unsigned int t1=0,t2=0;
Khai báo biến kiểu này là kiểu gì thế?

nhh
25-03-2006, 12:01 PM
To Pb1!
Bạn đang tìm hiểu về module PWM,đây là một module cùng với ADC,...được sử dụng rất nhiều.Rất hoanh nghênh bạn nhưng trong luồng này mọi người thảo luận bằng ASM.Pb1 nên mở hẳn một luồng bàn về vấn đề này nhưng phải ở mục các ngôn ngữ lập trình khác CCS C, HTPIC,..

Tớ sẽ ủng hộ cậu mở luồng mới!

nhh
25-03-2006, 12:02 PM
Ý tưởng viết chương trình cho cái này như sau:

Các chân a > g của led 7 đoạn nối chung dữ liệu và nối đến PortD ,các chân cathode nối đến PortB,...

> Khởi tạo các chân I/O,ngắt TMR0 1s
> Quét 6 LED,kiểm tra có bật Switch chỉnh thời gian?Nếu có thì tắt ngắt toàn cục,chỉnh xong set cờ GIE và quay lại quét LED,chờ ngắt
Khi có ngắt
> Tăng đếm LED1 lên 1,kiểm tra xem > 9 ?Chưa thì thoát ngắt,rồi thì xóa đếm LED1 về 0,tăng đếm LED2 thêm 1
> Kiểm tra đếm LED2 >6 ?Chưa thì thoát ngắt,rồi thì xóa đếm LED2 về 0,tăng đếm LED2 thêm 1
> Tiếp cho LED3,4,5
> Kiểm tra đếm LED6 = 2 & đếm LED5 > 4 ?Chưa thì thoát ngắt,rồi thì xóa đếm LED5,6 và thoát ngắt.

Viết như thế này thì hơi rắc rối và phức tạp,vừa dài,vừa dai lại vừa dở,quá nhiều nhược điểm luôn:
1.Do call,ngắt,...nếu không cẩn thận khi vào ngắt dễ bị tràn Stack thì đi tong ngay (Ban đầu mình mô phỏng Pro thì toàn hiện 0,coi lại code mờ mắt mà không phát hiện sai ở đâu cả,nhảy sang dùng PIC Sim thì bị báo tràn Stack ầm ầm luôn!Pó tay!)
2.Ngắt TMR0 bên trên chỉ rất rất gần 1s,có thể âm thầm dùng delay bù vào ở giây 60,nhưng do làm biếng tính,mình no bù!
3.Cẩn thận với ORG dành cho dữ liệu bảng,khi chương trình dài có thể chồng dữ liệu lên vùng này thì cũng đi tong luôn
4.Khi dùng bảng tra dài hơn 255,bảng đặt ở 2 page khác nhau,...cần thay đổi cách tra,cụ thể nên xem trong tutorial Kỹ thuật bảng.

He he...!Đồng hồ thời gian thực chẳng ma nào dại mà làm như thế này cả....Chỉ mỗi cái này mà loạn cả lên thì qua mấy cái module phức tạp khác,chắc ngủm khi viết bằng ASM quá!

Trên đây là những gì mình vot được, mod Chính ý kiến thế nào?Chia sẻ kinh nghiệm cho bà con tí !

nhh
25-03-2006, 12:08 PM
;========================================
;Author: NHH
;Date: 02/03/06
;Hardware: PIC16F877A ,Crystal 4MHz
;========================================
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF
;========================================
COUNT EQU 0x20
COUNT1 EQU 0x21
COUNT2 EQU 0x22
COUNT3 EQU 0x23
COUNT4 EQU 0x24
COUNT5 EQU 0x25
COUNT6 EQU 0x26
COUNT7 EQU 0x27

w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
pclath_temp EQU 0x73 ; variable used for context saving

;================================================= ============================
;CHUONG TRINH CHINH
;================================================= ============================
ORG 0x00
GOTO MAIN
ORG 0004h
GOTO INTERRUPT

;==============================INTERRUPT PROGRAM===========================
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into w register
movwf pclath_temp ; save off contents of PCLATH register
;************************************************* *****************************
DECFSZ COUNT,F
GOTO CHECK
MOVLW d'1'
MOVWF COUNT
INCF COUNT1,F
GOTO CHECK
BACK BCF INTCON,TMR0IF ;xoa co ngat TMR0
;************************************************* *****************************
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt

CHECK
CALL CHECK1
CALL CHECK2
CALL CHECK3
CALL CHECK4
CALL CHECK5
GOTO BACK
;============== CHUONG TRINH CHINH===============
MAIN
BCF STATUS,RP1
BSF STATUS,RP0 ; chon BANK 1
MOVLW b'11111111' ;PORTA=Input
MOVWF TRISA
MOVLW b'00000001' ;RB0=Input
MOVWF TRISB
CLRF TRISD
;------------------------------
;Khoi tao ngat Timer0
;------------------------------
BSF OPTION_REG,PS0 ;TMR0 rate 1: 64
BSF OPTION_REG,PS1
BCF OPTION_REG,PS2
BCF OPTION_REG,PSA ;Prescaler is assigned to the Timer0 module
BCF OPTION_REG,T0CS
BCF STATUS,RP0 ;select BANK 0

BSF INTCON,GIE
BSF INTCON,TMR0IE
BCF INTCON,TMR0IF

MOVLW d'246'
MOVWF COUNT
CLRF COUNT1
CLRF COUNT2
CLRF COUNT3
CLRF COUNT4
CLRF COUNT5
CLRF COUNT6
CLRF COUNT7
LOOP
CALL DISPLAY1
CALL DISPLAY2
CALL DISPLAY3
CALL DISPLAY4
CALL DISPLAY5
CALL DISPLAY6

BTFSC PORTB,0
GOTO LOOP
GOTO MODIFY
MODIFY
BCF INTCON,GIE

BTFSC PORTA,0
GOTO $+2
CALL LED34
BTFSC PORTA,1
GOTO $+2
CALL LED56
BTFSS PORTB,0
GOTO MODIFY
BSF INTCON,GIE
GOTO LOOP
LED34
INCF COUNT3,F
MOVLW d'10'
SUBWF COUNT3,W
BTFSS STATUS,0
RETURN
CLRF COUNT3
INCF COUNT4,F
MOVLW d'6'
SUBWF COUNT4,W
BTFSS STATUS,0
RETURN
CLRF COUNT4
RETURN
LED56
INCF COUNT5,F
MOVLW d'4'
SUBWF COUNT5,W
BTFSS STATUS,0
RETURN
MOVLW d'2'
SUBWF COUNT6,W
BTFSS STATUS,0
GOTO LED5
CLRF COUNT6
RETURN

LED5
MOVLW d'10'
SUBWF COUNT5,W
BTFSS STATUS,0
GOTO MODIFY
CLRF COUNT5
INCF COUNT6,F
GOTO MODIFY

;============CHUONG TRINH CON===
DISPLAY1
MOVLW b'11111101'
MOVWF PORTB
MOVF COUNT1,W
CALL TABLE
MOVWF PORTD
CALL DECREATE
CLRF PORTB
CLRF PORTD
RETURN
DISPLAY2
MOVLW b'11111011'
MOVWF PORTB
MOVF COUNT2,W
CALL TABLE
MOVWF PORTD
CALL DECREATE
CLRF PORTB
CLRF PORTD
RETURN
DISPLAY3
MOVLW b'11110111'
MOVWF PORTB
MOVF COUNT3,W
CALL TABLE
MOVWF PORTD
CALL DECREATE
CLRF PORTB
CLRF PORTD
RETURN
DISPLAY4
MOVLW b'11101111'
MOVWF PORTB
MOVF COUNT4,W
CALL TABLE
MOVWF PORTD
CALL DECREATE
CLRF PORTB
CLRF PORTD
RETURN
DISPLAY5
MOVLW b'11011111'
MOVWF PORTB
MOVF COUNT5,W
CALL TABLE
MOVWF PORTD
CALL DECREATE
CLRF PORTB
CLRF PORTD
RETURN
DISPLAY6
MOVLW b'10111111'
MOVWF PORTB
MOVF COUNT6,W
CALL TABLE
MOVWF PORTD
CALL DECREATE
CLRF PORTB
CLRF PORTD
RETURN

DECREATE
DECFSZ COUNT7
GOTO DECREATE
RETURN

;................................................. .......
CHECK1
MOVLW d'10'
SUBWF COUNT1,W
BTFSS STATUS,0
GOTO BACK
CLRF COUNT1
INCF COUNT2,F
RETURN
CHECK2
MOVLW d'6'
SUBWF COUNT2,W
BTFSS STATUS,0
GOTO BACK
CLRF COUNT2
INCF COUNT3,F
RETURN
CHECK3
MOVLW d'10'
SUBWF COUNT3,W
BTFSS STATUS,0
GOTO BACK
CLRF COUNT3
INCF COUNT4,F
RETURN
CHECK4
MOVLW d'6'
SUBWF COUNT4,W
BTFSS STATUS,0
GOTO BACK
CLRF COUNT4
INCF COUNT5,F
RETURN
CHECK5
MOVLW d'10'
SUBWF COUNT5,W
BTFSS STATUS,0
GOTO BACK
CLRF COUNT5
INCF COUNT6,F
RETURN
CHECK6
INCF COUNT5,F
MOVLW d'4'
SUBWF COUNT5,W
BTFSS STATUS,0
RETURN
MOVLW d'2'
SUBWF COUNT6,W
BTFSS STATUS,0
CALL LED_5
CLRF COUNT6
RETURN

LED_5
MOVLW d'10'
SUBWF COUNT5,W
BTFSS STATUS,0
RETURN
CLRF COUNT5
INCF COUNT6,F
RETURN
;----------------------------------------------------------

; Bang tra ve Digital tu 0 den 9 va OFF
; Chi so dau truy cap la 0
; Bang o PAGE 0

ORG 07F0h
TABLE
;----------------------------------------------------------
ADDWF PCL, F ; bat dau tai 0x90
RETLW b'00111111' ; 0
RETLW b'00000110' ; 1
RETLW b'01011011' ; 2
RETLW b'01001111' ; 3
RETLW b'01100110' ; 4
RETLW b'01101101' ; 5
RETLW b'01111101' ; 6
RETLW b'00000111' ; 7
RETLW b'01111111' ; 8
RETLW b'01101111' ; 9
RETLW b'00111111' ; 0

END

nhh
25-03-2006, 12:09 PM
:020000040000FA
:020000001E28B8
:080008000528F1000308F200D5
:100010000A08F300A00B18280130A000A10A182834
:100020000B1173088A0072088300F10E710E09002B
:10003000A320AA20B120B820BF20102803138316C4
:10004000FF30850001308600880101148114011100
:100050008111811283128B178B160B11F630A000C1
:10006000A101A201A301A401A501A601A7016A2083
:1000700073207C2085208E20972006183728402862
:100080008B13051844284B20851847285820061C38
:1000900040288B173728A30A0A302302031C0800C4
:1000A000A301A40A06302402031C0800A4010800CE
:1000B000A50A04302502031C080002302602031C96
:1000C0006328A60108000A302502031C4028A50168
:1000D000A60A4028FD3086002108F0278800A020CD
:1000E000860188010800FB3086002208F02788007E
:1000F000A020860188010800F73086002308F02739
:100100008800A020860188010800EF3086002408BE
:10011000F0278800A020860188010800DF308600D3
:100120002508F0278800A020860188010800BF303C
:1001300086002608F0278800A02086018801080094
:10014000A70BA02808000A302102031C1028A101D7
:10015000A20A080006302202031C1028A201A30AEA
:1001600008000A302302031C1028A301A40A080077
:1001700006302402031C1028A401A50A08000A3036
:100180002502031C1028A501A60A0800A50A0430B0
:100190002502031C080002302602031CD120A60100
:1001A00008000A302502031C0800A501A60A080061
:100FE00082073F3406345B344F3466346D347D34CD
:080FF00007347F346F343F34F5
:02400E00313F40
:00000001FF

http://www.freewebtown.com/nhhao/PIC/Digital%20clock.gif

falleaf
25-03-2006, 01:00 PM
nhh ơi, bạn gửi file .hex thì nên gửi bằng cách gửi kèm file, nhìn phía bên dưới khi bạn viết bài trả lời á, phần Chức Năng, có mục Tải file từ máy. Lúc đó bạn tải file .hex lên, hoặc tải file .zip lên, như vậy sẽ thuận tiện hơn cho người đọc.

Chúc vui.

ngohaibac
26-03-2006, 12:56 AM
Nhà mình có bác nào dảnh thì giải thích giúp em cái này cái: :D
static volatile bit flag=0;
static volatile unsigned int t1=0,t2=0;
Khai báo biến kiểu này là kiểu gì thế?
Theo tài liệu tại: \HT-PIC\manual\manual.pdf trang 153 . Bọn nó viết thế này: (tạm dịch)

Kiểu dữ liệu volatile được dùng để báo cho trình dịch biết rằng đối tượng được khai báo kiểu volatile có thể không cần lưu trữ lại giá trị giữa các lần truy cập liên tiếp. Điều đó làm cho chương trình có sự tối ưu hoá từ việc là những dư thừa rõ ràng đang được loại ra khi sử dụng một đối tượng có kiểu volatile bởi ví đối tượng đó có thể thay đổi tuỳ theo chương trình hoạt động như thế nào.

Tất cả các port I/O và tất cả các biến mà bị thay đổi giá trị trong trình phục vụ ngắt nên khai báo kiểu volatile.

Ví dụ: volatile static near unsigned char PORTA @ 0xF80;

Đối tượng volatile được truy nhập theo một cách khác so với một đối tượng không có khai báo volatile. Khi gán giá trị của một đối tượng không có khai báo volatile = 1 thì đối tượng này sẽ bị xoá và địa chỉ của đối tượng sẽ tăng lên. Nhưng với biến có khai báo violatile thì cách hoạt động như sau: đầu tiên là gán giá trị của thanh ghi W = 1 và sau đó là lưu giá trị đó vào địa chỉ của ban đầu của đối tượng đó.

Kết luận: như vậy là khai báo volatile được dùng với biến phải sử dụng liên tục. Khi khai báo như thế thì tiết kiệm được địa chỉ của RAM.

Khi các bạn mở các file include ra sẽ thấy được rằng bọn nó khai báo địa chỉ cho các port đều theo kiểu này :D

pb1
26-03-2006, 01:13 AM
hehe, làm ăn phải như thế chứ :D
cảm ơn bác Bắc nhé, em hiểu rùi

ntc
26-03-2006, 06:02 PM
Ahahaha. Đúng như mình dự đoán. Không trật đi chỗ nào cả. :D. Không dễ chút nào đúng không.

Bây giờ nhh tính khắc phục như thế nào.

Thử nêu vài giải pháp theo suy nghĩ của nhh coi.

Bạn có thể tin là code không có gì sai. Vấn đề ở đây là một cái gì đó rất khó chịu.

Nó là cái gi??

ntc
26-03-2006, 06:15 PM
Cái Timer thì thời gian chỉ cần tương đối thôi, không cần chính xác.

Về phần thiết kế phần cứng cũng ổn rồi. :D

Cái mình muốn đưa ra thảo luận trong ứng dụng này là cái chỗ bí mà nhh mắc phải.

Cái lệnh ORG, bạn có thể không cần sử dụng trước bảng tra, mà có thể để cho trình biên dịch tự sắp xếp, để tránh hiện tượng bị code đè lên. Mà trường hợp này khi biên dịch bằng MPASM thì nó có báo lỗi mà.

Stack! Bàn đầu mình cũng nghĩ vấn đề chương trình chạy không đúng là do stack. Nhưng hình như không phải. :D .

nhh
26-03-2006, 06:55 PM
Cái Timer thì thời gian chỉ cần tương đối thôi, không cần chính xác.

Về phần thiết kế phần cứng cũng ổn rồi. :D

Cái mình muốn đưa ra thảo luận trong ứng dụng này là cái chỗ bí mà nhh mắc phải.

Cái lệnh ORG, bạn có thể không cần sử dụng trước bảng tra, mà có thể để cho trình biên dịch tự sắp xếp, để tránh hiện tượng bị code đè lên. Mà trường hợp này khi biên dịch bằng MPASM thì nó có báo lỗi mà.

Stack! Bàn đầu mình cũng nghĩ vấn đề chương trình chạy không đúng là do stack. Nhưng hình như không phải. :D .

Kinh nghiệm của ntc vấn đề này là gì vậy? Cái bảng bị ghi đè này chăng !Chia se cho anh em với !

lamhoang
27-03-2006, 11:49 AM
:D Vậy dùng Timer khi khởi động thì cần lưu ý đến những chú ý gì vậy (cách thức khởi động timer).
Có gì khác nhau nhiều giữa Timer0 và các timer khác ko.
Bạn có đoạn code nào về Timer ko. Mình đang làm thử một ứng dụng đơn giản là: điều khiển led nháy với thời gian thay đổi phụ thuộc vào nút bấm nhưng mình đang gặp vấn đề về Timer (chưa cụ thể về cách điều khiển về nó). Mong bạn hướng dẫn.
Mình chỉ mới làm quen với Assembly nên các đoạn mã dùng C đọc ko hiểu mấy. Theo bạn thì mình có nên chuyển sang học C hay là thuần thục Assembly rồi mới chuyển.
Mình cũng đang mới bắt đầu với PIC nên cần học nhiều.Thank!

chuabietgi
27-03-2006, 01:35 PM
:D Vậy dùng Timer khi khởi động thì cần lưu ý đến những chú ý gì vậy (cách thức khởi động timer).
Có gì khác nhau nhiều giữa Timer0 và các timer khác ko.
Bạn có đoạn code nào về Timer ko. Mình đang làm thử một ứng dụng đơn giản là: điều khiển led nháy với thời gian thay đổi phụ thuộc vào nút bấm nhưng mình đang gặp vấn đề về Timer (chưa cụ thể về cách điều khiển về nó). Mong bạn hướng dẫn.
Mình chỉ mới làm quen với Assembly nên các đoạn mã dùng C đọc ko hiểu mấy. Theo bạn thì mình có nên chuyển sang học C hay là thuần thục Assembly rồi mới chuyển.
Mình cũng đang mới bắt đầu với PIC nên cần học nhiều.Thank!

Em xin có ý kiến thế này:
Mình có thể vừa dùng ngắt timer vừa dùng ngắt ngoài để điều chỉnh có được không á...

Bác nhh và mod ntc cho ý kiến đi !

nhh
27-03-2006, 03:58 PM
:D Vậy dùng Timer khi khởi động thì cần lưu ý đến những chú ý gì vậy (cách thức khởi động timer).
Có gì khác nhau nhiều giữa Timer0 và các timer khác ko.
Bạn có đoạn code nào về Timer ko. Mình đang làm thử một ứng dụng đơn giản là: điều khiển led nháy với thời gian thay đổi phụ thuộc vào nút bấm nhưng mình đang gặp vấn đề về Timer (chưa cụ thể về cách điều khiển về nó). Mong bạn hướng dẫn.
Mình chỉ mới làm quen với Assembly nên các đoạn mã dùng C đọc ko hiểu mấy. Theo bạn thì mình có nên chuyển sang học C hay là thuần thục Assembly rồi mới chuyển.
Mình cũng đang mới bắt đầu với PIC nên cần học nhiều.Thank!

Cách thức khởi động timer có khác nhau,timer0 bạn phải chỉ định Pre cho nó bằng lệnh:BCF OPTION_REG,PSA và điều chỉnh tốc độ bằng việc khởi tạo cho 3 bit PS0,PS1 và PS2 của thanh ghi OPTION_REG.
Timer0 và timer2 là timer 8bit,timer1 là timer 16bit,ngoài chức năng định thì thì timer còn nhiều ứng dụng khác.
Cụ thể bạn xem thêm trong datasheet mấy cái thanh ghi ở phần Timer!

Theo ý nhh để điều chỉnh thời gian như bạn nói bằng nút bấm (ko biết bạn dùng mấy nút?), mình làm như sau :
Với 3 nút bấm chẳng hạn và thời gian ấn nút 1 sẽ delay 1s;nút 2 delay 500ms; nút 3 delay 100ms ,viết mấy cái lệnh kiểm tra xem cái nút nào on thì nhảy đến cái nhãn đó, ấn nút 1 -> nhảy vào Button_1 thì 500+400+100=1000ms=1s,rồi quay ngược về,hai nhãn còn lại cũng tương tự,
Trong phần main mình sẽ đặt những cái nhãn :


....
Button_1
Call delay_500ms
Button_2
Call delay_400ms
Button_2
Call delay_100ms
.....


Mấy hàm delay này mình tin là bạn viết ok nếu không thì tham khảo tutorial 2 của Chính :
http://www.picvietnam.com/forum//showthread.php?t=238&page=2

Ý tưởng là vậy,bạn thử viết và post lên (cả sơ đồ nguyên lí nhé!) để anh em nhà pic cùng phá luôn !

nhh
27-03-2006, 04:08 PM
Về việc bắt đầu viết chương trình bằng ngôn ngữ gì ASM,CCS C,HT-PIC,...,theo mình tốt hơn vẫn nên học cơ bản bằng ASM trước sau đó đào sâu thì càng tốt không thì nhảy qua các ngôn ngữ khác cũng dễ chịu rồi !
Bạn nên đọc luồng này để tham khảo cách học của mọi người :
http://www.picvietnam.com/forum//showthread.php?t=91
Chúc bạn mau chóng tìm cho mình cách học hiệu quả nhất !

ntc
27-03-2006, 10:41 PM
Dùng bao nhiêu ngắt cũng được. Cái quan trọng là ban phải phát hiện ra ngắt nào xảy ra để xử lí.

Như vậy, khi bắt đầu chương trình ngắt, bạn phải có đoạn chương trình kiểm tra xem ngắt nào xảy ra bằng cách kiểm tra các cờ ngắt. Ngắt nào xảy ra thì cờ ngắt tương ứng với ngắt đó sẽ nhảy lên mức logic 1. Kiểm tra xong thì ra lệnh cho vi điều khiển nhảy đến đoạn chương trình xử lí tương ứng.

ntc
27-03-2006, 10:58 PM
PIC16F877A có tất cả 3 Timer. Mìhn không nhớ thật sự chi tiết, nhưng đại khái nó như vầy:

Timer 0 và Timer 2 là bộ đếm 8 bit.

Timer 0 có bộ chia tần số (prescaler) dùng chung với Watchdog Timer. Nghĩa là khi bộ chia tần số này được sử dụng bởi WDT, thì cái Timer 0 không được quyền xài nó và ngược lại.

Timer 2 có cả 2 bộ chia tần số phía trước và phía sau (prescaler và postscaler) cho phép ta ấn định tỉ số chia linh hoạt hơn để tạo ra khoảng thời gian thích hợp cho ứng dụng.

Timer 0 và Timer 2 tuy là bộ đếm 8 bit, nhưng tỉ số chia của các bộ chia lớn hơn Timer 1. Như vậy nó cũng cho phép tạo ra các khoảng thời gian delay với độ trễ thích hợp với các ứng dụng trong thực tế.

Timer 1 là bộ đếm 16 bit, được hỗ trợ bởi bộ chia tần số prescaler. Tuy nhiên tỉ số chia này nhỏ (1:1 đến 1:16).

Mỗi Timer có cấu tạo khác nhau, điều đó cũng có nghĩa mỗi Timer sẽ thích hợp hơn với một tình huống nào đó trong thực tế, và tùy theo cái tình huống mà lựa chọn Timer thích hợp.

Sơ lược như vậy, bạn tham khảo datasheet để biết thêm chi tiết, mình chỉ nhớ mang máng như vậy thôi, không biết có chỗ nào nhớ lộn không nữa.

Về việc tham khảo cách khởi tạo và sử dụng Timer, bạn tham khảo thêm các hướng dẫn trong tài liệu "mid-range PIC mcu reference manual" trong micro chip. Trong đó hướng dẫn rất chi tiết, bạn chỉ việc dựa trên cái sườn bài có sẵn trong cái tài liệu đó và thay đổi các thông số cài đặt cho thích hợp là ok.

:D

ntc
27-03-2006, 11:10 PM
Chắc bữa nào phải sửa lại cái Timer cho đàng hoàng rồi post lên cho anh em quá. Hic, dạo này bị bác F chơi, quăng việc liên tục, mệt gần chết, cũng hết thời gian rảnh luôn.

Về cái Timer của nhh. Bạn khắc phục như thế này thử xem: cái bảng dữ liệu, bạn chuyển lên đặt ở phía trên, sao cho các lệnh của phần table nó nằm trong vùng code 256 byte đầu của bộ nhớ chương trình, không đặt nó ở cuối chương trình nữa. Nhiều khi do chương trình phía trên bạn viết dài, nên cái table bị rơi ra khỏi vùng 256 word đầu tiên của bộ nhớ chương trình. Chắc ăn là chuyển hẳn nó lên phía trên chương trình start luôn, tức là viết table xong thì tới cái label start.

Có phải cái chương trình của bạn khi viết xong, bạn không thể kiểm soát được là nó sẽ chạy theo kiểu nào đúng không. :D .

nhh hiểu ý mình không. Sửa lại rồi thông báo tình hình cho anh em như thế nào nhé!

:D .

zero_OR_one
03-04-2006, 12:24 PM
em có 1 bài toán bên mục của bác Chính,nhờ mọi người chỉ cho:confused:

lamhoang
04-04-2006, 07:36 PM
Cách thức khởi động timer có khác nhau,timer0 bạn phải chỉ định Pre cho nó bằng lệnh:BCF OPTION_REG,PSA và điều chỉnh tốc độ bằng việc khởi tạo cho 3 bit PS0,PS1 và PS2 của thanh ghi OPTION_REG.
Timer0 và timer2 là timer 8bit,timer1 là timer 16bit,ngoài chức năng định thì thì timer còn nhiều ứng dụng khác.
Cụ thể bạn xem thêm trong datasheet mấy cái thanh ghi ở phần Timer!

Theo ý nhh để điều chỉnh thời gian như bạn nói bằng nút bấm (ko biết bạn dùng mấy nút?), mình làm như sau :
Với 3 nút bấm chẳng hạn và thời gian ấn nút 1 sẽ delay 1s;nút 2 delay 500ms; nút 3 delay 100ms ,viết mấy cái lệnh kiểm tra xem cái nút nào on thì nhảy đến cái nhãn đó, ấn nút 1 -> nhảy vào Button_1 thì 500+400+100=1000ms=1s,rồi quay ngược về,hai nhãn còn lại cũng tương tự,
Trong phần main mình sẽ đặt những cái nhãn :


....
Button_1
Call delay_500ms
Button_2
Call delay_400ms
Button_2
Call delay_100ms
.....


Mấy hàm delay này mình tin là bạn viết ok nếu không thì tham khảo tutorial 2 của Chính :
http://www.picvietnam.com/forum//showthread.php?t=238&page=2

Ý tưởng là vậy,bạn thử viết và post lên (cả sơ đồ nguyên lí nhé!) để anh em nhà pic cùng phá luôn !

OK! Thank! như vậy là thời điểm chính thức Timer khởi động là ngay sau lệnh
BCF option_reg,PSA
Mình cũng mới viết xong nhưng do không định được thời điểm Timer khởi động nên thời gian delay ko chính xác.
Hình như các bác ở SG và HN hết thì phải . không biết có cao thủ nào ở ĐN không nhỉ. Phải phát triển phong trào sử dụng PIC ở ĐN chứ các bác nhỉ?

namqn
04-04-2006, 07:54 PM
OK! Thank! như vậy là thời điểm chính thức Timer khởi động là ngay sau lệnh
BCF option_reg,PSA
Lệnh đó dùng để chỉ định prescaler được dùng cho timer 0, thay vì cho WDT (vì WDT và timer 0 dùng chung prescaler). Với các timer khác thì thường có một bit trong thanh ghi điều khiển dùng để bật/tắt timer, với timer 0 (trong 16F877A) thì không có chuyện bật/tắt timer. Do đó, bạn phải tự đảm bảo là khi bạn gán prescaler cho timer 0 thì nó cũng bắt đầu đếm từ 0, nếu bạn muốn có thời gian delay tương đối chính xác.

Thân,

ntc
05-04-2006, 11:51 AM
Timer 1 của PIC16F877A có chế độ cho phép bật tắt Timer.

:D

nhh
05-04-2006, 12:50 PM
Timer 1 của PIC16F877A có chế độ cho phép bật tắt Timer.

:D
Mình xin nói thêm cả timer1 và timer2 luôn, để bật timer1 và timer2 lần lượt dung lệnh:
BSF T1CON,TMR1ON ;bat Timer1
BSF T2CON,TMR2ON ;bat Timer2

picpicpic
16-04-2006, 12:57 PM
Cũng ko có gì mới cả...
Các bác mau mau post tiếp đi chứ !

Đợi các bác lâu quá mất cả hứng ...!

newuser
19-04-2006, 10:06 PM
Timer0 ở PIC6F877A vẫn là free counter, theo mình thì cấp điện vào là nó đã chạy tự do rồi, vấn đề là bạn dùng nó lúc nào thôi, về prescaler thì mình nghĩ cũng như 16F84A, nghĩa là khi đã dùng nó cho WDT thì timer0 sẽ dùng với tỉ lệ chia là 1:1

nhh
20-04-2006, 11:02 AM
Tại sao lại chỉ dùng với tỉ lệ chia 1:1
Còn những tỉ lệ khác không dùng được sao, bạn xem kĩ datasheet phần timer0, nó chia đến tận tỉ lệ 1:128 lận !

ngohaibac
20-04-2006, 01:38 PM
Tại sao lại chỉ dùng với tỉ lệ chia 1:1
Còn những tỉ lệ khác không dùng được sao, bạn xem kĩ datasheet phần timer0, nó chia đến tận tỉ lệ 1:128 lận !
Không phải, ý bạn đó nói là Timer0 dùng chung prescaler với Watchdog cơ mà. Bit chọn lựa bộ chia trước Prescaler cho Watdog hay timer0 là bit PSA (bit 3 trong thanh ghi OPTION).

Khi PSA = 1 thì nó dùng cho WDT
PSA = 0 thì prescaler dùng cho timer0.

Và dĩ nhiên khi PSA = 1 thì timer0 chỉ có tỉ lệ chia là 1:1 tức là sẽ k bị chia trước tần số.

Chúc các bạn thành công.

pb1
21-04-2006, 12:10 AM
các bác xem giúp em cái

hơ hơ.... sao không up file lên được nhỉ?

bác fall ơi, xem giúp em cái !.Em đã tải file lên rồi, tại sao không thấy file đâu?
em định tải file lên để nhờ các bác chỉ giáo tí.

ngulapphuong
19-06-2006, 12:37 PM
Nhờ các bác cho em hỏi về cách định địa chỉ gián tiếp, thanh ghi SFR, INDF và những vấn đề liên quan

falleaf
19-06-2006, 12:39 PM
bác fall ơi, xem giúp em cái !.Em đã tải file lên rồi, tại sao không thấy file đâu?
em định tải file lên để nhờ các bác chỉ giáo tí.

gửi email cho mình, mình tải lên lại cho, nhớ ghi rõ là gửi lên luồng nào nhé

Dang Khoa
15-07-2006, 06:45 PM
xin cho minh hoi: cac ban dung chuong trinh gi ma mo phong duoc cac mach dien dem len vay, hay dong ho do ma. cam on nhieu

friends
17-07-2006, 09:41 PM
cac anh oi , cho em noi la : lap trinh voi pic 16f877a cung giong het voi lap trinh cho con pic 16f876a phai khong? a`, phan mem asm de viet cho pic down o dau vay cac anh

namqn
17-07-2006, 10:33 PM
Câu hỏi 1: Đúng, ngoại trừ PIC16F877A có một số chân và thanh ghi tương ứng mà PIC16F876A không có.

Câu hỏi 2: vào link sau download MPLAB IDE, trong đó có trình hợp dịch, bộ mô phỏng, và một số thứ khác
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002

Thân,

dohoangnam
18-07-2006, 09:39 AM
tôi thấy tất cả các diễn đàn đều rất hay. Cả chuyện bác F muốn giúp các bạn học qua một công việc cụ thể nữa. Tất cả đều là ý tưởng tốt. Nhưng tôi có chút ý kiến. Học về 1 con 16f877a này cũng tốt. Nhưng chúng ta học bằng các dự án như bác F làm thì tốt hơn học "chay" thế này. Nhưng mới cái bắt đầu mà bác F đã yêu cầu nặng anh em quá. Anh em sv chủ yếu là ít tiền. Đấy là cái thứ nhất (kể cả vài trăm ngàn thôi cũng khó khăn), thứ 2 tôi thấy công việc ấy cũng hơi nặng so với sức chung của mọi người. Hy vọng các anh em admin quan tâm hơn nữa.
Thân.

newuser
03-08-2006, 09:10 AM
Nhờ các bác cho em hỏi về cách định địa chỉ gián tiếp, thanh ghi SFR, INDF và những vấn đề liên quan
FSR là nơi chứa địa chỉ (tương đương R0 và R1 nếu bạn học 8051)
INDF là nơi chứa kết quả hoặc giá trị mà FSR trỏ đến (tương tự @R0 hoặc @R1).

spirit
07-09-2006, 07:19 PM
Anh nhh chỉ giúp em cách vẽ bus nhiều tín hiệu cùng đi chung với nhau như dây màu xanh nước biển anh vẽ trong proteus với, em đang bí phần đó
Thanks

nhh
09-09-2006, 11:12 AM
Anh nhh chỉ giúp em cách vẽ bus nhiều tín hiệu cùng đi chung với nhau như dây màu xanh nước biển anh vẽ trong proteus với, em đang bí phần đó
Thanks

Ví dụ như bạn muốn nối bus chung từ VDK đến led 7 đoạn:
http://i82.photobucket.com/albums/j257/nhhao/Proteus1.jpg
Sau khi đưa 2 linh kiện ra, bạn nhấp vào biểu tượng bus.Click vào điểm 1, rồi double click vào điểm 2 để kết thúc.Nếu muốn vẽ điểm trung gian thì cứ click vào điểm đó là được.Sau đó nối dây bình thường.
http://i82.photobucket.com/albums/j257/nhhao/Proteus2.jpg
Để chương trình nhận ra chân nào của VDK nối đến chân nào của led 7 thanh, bạn cần đặt nhãn cho các cặp chân tương ứng trên 2 linh kiện này.

Vào biểu tượng wire label:
http://i82.photobucket.com/albums/j257/nhhao/Proteus3.jpg]
Click vào 1 dây bạn muốn đặt label:
http://i82.photobucket.com/albums/j257/nhhao/Proteus4.jpg]
Làm tương tự cho dây còn lại:
http://i82.photobucket.com/albums/j257/nhhao/Proteus5.jpg
Tiếp tục cho các cặp chân khác.

Chúc thành công !

spirit
09-09-2006, 05:44 PM
Cám ơn anh rất nhiều

falleaf
09-09-2006, 09:21 PM
tôi thấy tất cả các diễn đàn đều rất hay. Cả chuyện bác F muốn giúp các bạn học qua một công việc cụ thể nữa. Tất cả đều là ý tưởng tốt. Nhưng tôi có chút ý kiến. Học về 1 con 16f877a này cũng tốt. Nhưng chúng ta học bằng các dự án như bác F làm thì tốt hơn học "chay" thế này. Nhưng mới cái bắt đầu mà bác F đã yêu cầu nặng anh em quá. Anh em sv chủ yếu là ít tiền. Đấy là cái thứ nhất (kể cả vài trăm ngàn thôi cũng khó khăn), thứ 2 tôi thấy công việc ấy cũng hơi nặng so với sức chung của mọi người. Hy vọng các anh em admin quan tâm hơn nữa.
Thân.

Câu chuyện học PIC của F, chắc F cũng đã kể cả trăm lần rồi, trên chat và cả trên diễn đàn. Lúc trước F học PIC, hoàn toàn là học chay, không có con PIC trong tay, tự ngồi nghĩ tự viết chương trình, tự làm mô phỏng với MPLAB, tự nhìn các con số nhảy để mà hình dung.

Đó là chuyện hồi trước F học, bây giờ các bạn có nhiều công cụ để học, thoải mái hơn, thông tin nhiều hơn. Điều đó là tốt hơn rất nhiều. Như vậy học chay hay không chay, tùy thuộc vào mỗi người. Có người thì thông minh theo kiểu tưởng tượng (vd F cũng là kiểu đó, cho nên ngồi tưởng tượng tốt). Có người thông minh theo kiểu trực quan (vd như F nhìn vào cái máy mà nó dập bụp bụp bụp, F khó mà học hiểu cái đó, nhưng có nhiều người nhìn vào cái máy thôi, lại hiểu ngay và có thể chế cái máy tương tự).... Đó là cách người ta nói về trí thông minh của loài người, mỗi người có một khả năng thông minh khác nhau.

Do vậy, F không cho rằng cách học nào tốt hơn cách học nào, mà chỉ khuyên mọi người chọn cách học tốt nhất cho chính mình.

Về vấn đề tài chính để học. Sự thực là picvietnam đã hỗ trợ 120K (theo giá thị trường) cho một đề tài nghiên cứu của các bạn, mà đề tài đó theo kinh nghiệm thực hành của các bạn kể trên khi khoảng 200 - 300K.

Đúng là con số khá lớn đối với một số bạn sinh viên. Nhưng nếu các bạn không nhân những cơ hội này đầu tư vào để học, để thực hành, thì các bạn sẽ tốn nhiều cái 100K vào những việc vô bổ khác. Hãy can đảm nói với bạn gái của mình rằng, anh muốn dành một chút tiền để đầu tư vào việc học.

Nếu các bạn thực sự học và làm việc, khi các bạn kết thúc dự án, và có kết quả khả dĩ vì những tìm hiểu học tập của các bạn. F sẽ mua lại mô hình đó cho các bạn. (miễn sao đừng bán mắc cho F, vì F không có tiền nhiều đâu, chỉ là giúp đỡ các bạn thực sự khó khăn thôi, hihi..).

Nói để các bạn thấy việc này. Để làm cái mô hình của F ở bên Hàn, giáo sư đã phải bỏ 5000$ tới thời điểm này mà chưa ra cái hình thù gì cả. Trong khi đó, ở VN mà làm thì cái mô hình F đang làm về haptics 1 bậc tự do, thì thực ra chỉ là 2 cái động cơ, mấy miếng nhôm lớn. Cùng lắm chỉ 3 triệu động là căng. Tất nhiên động cơ và driver mua mới thì tốn kém, còn mua ở nhà mình chơi đồ cũ, nhưng có ảnh hưởng gì nhiều đâu.

Vậy nên việc nghiên cứu ở nước ngoài, còn khó khăn hơn ta nhiều, về nhiều khía cạnh, nhất là chi phí đầu tư thử nghiệm. Có những cái quá cao cấp, thì chúng ta không làm được, nhưng tốn 500K đi nữa, để học một bộ điều khiển mà 90% các bộ điều khiển công nghiệp phải sử dụng thì F không nghĩ nó là quá nhiều. Và nó rẻ ngang với việc theo một lớp học PIC. Trong khi học cái này thì có thể giữ được mô hình, lại có thêm 2 con PIC...

Các bạn tính toán thật kỹ vì cơ hội không có lần thứ hai đâu :). Đây là lần đầu tiên, F thực hiện việc này, chủ yếu để thử nghiệm mô hình dự án mở trên mạng, sau đó, tất nhiên, nếu có thể, F sẽ kêu gọi những nhà tài trợ cho các dự án kiểu như thế này. Lúc đó sẽ tốt hơn cho các bạn, nhưng bây giờ tiếng nói của F chưa đủ mạnh với những nhà tài trợ, vì ... các bạn chưa làm xong dự án :).

Chúc vui.

spirit
11-09-2006, 10:46 PM
Đây là chương trình đếm số lần switch on từ 1 đến 9 hiển thị lên LED 7 đoạn,dùng ngắt ngoài RB0 và kỹ thuật bảng.


;========================================
;Auhor: NHH
;Date: 02/03/06
;Hardware: PIC16F877A ,Crystal 10MHz
;========================================
TITLE "Count button on by Interrupt RB0"
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF
;========================================
COUNT EQU 0x20
w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
pclath_temp EQU 0x73 ; variable used for context saving

;================================================= ============================
;CHUONG TRINH CHINH
;================================================= ============================
ORG 0000h
GOTO MAIN
ORG 0004h
GOTO INTERRUPT

;==============================INTERRUPT PROGRAM===========================
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into w register
movwf pclath_temp ; save off contents of PCLATH register
;************************************************* *****************************
BCF INTCON,INTF ;xoa co int
INCF COUNT,F
MOVLW d'10'
SUBWF COUNT,W
BTFSS STATUS,0
GOTO $+2
GOTO NODISPLAY
MOVF COUNT,W
CALL TABLE
MOVWF PORTD
retfie ; return from interrupt
NODISPLAY ;khong hien thi neu vuot qua 9
MOVLW d'10'
CALL TABLE
MOVWF PORTD
RETFIE

;************************************************* *****************************
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;============== CHUONG TRINH CHINH===============
MAIN
BCF STATUS,RP1
BSF STATUS,RP0 ; chon BANK 1
MOVLW b'11111111' ;RB0=Input
MOVWF TRISB
CLRF TRISD
BCF OPTION_REG,INTEDG ;interrupt canh xuong
BCF STATUS,RP0 ; chon BANK 0
BSF INTCON,GIE ;cho phep interrupt toan cuc
BSF INTCON,INTE ;cho phep interrupt RB0

CLRF COUNT
MOVLW d'0'
CALL TABLE
MOVWF PORTD

GOTO $
;----------------------------------------------------------
; Bang tra ve Digital tu 0 den 9 va OFF
; Chi so dau truy cap la 0
; Bang o PAGE 0

ORG 0x80
TABLE
;----------------------------------------------------------
ADDWF PCL, F ; bat dau tai 0x80
RETLW b'00111111' ; 0
RETLW b'00000110' ; 1
RETLW b'01011011' ; 2
RETLW b'01001111' ; 3
RETLW b'01100110' ; 4
RETLW b'01101101' ; 5
RETLW b'01111101' ; 6
RETLW b'00000111' ; 7
RETLW b'01111111' ; 8
RETLW b'01101111' ; 9
RETLW b'00000000' ; OFF

END


Anh nhh cho em hỏi phát: theo em biết ngắt xảy ra ở chân RB0 khi có sự thay đổi mức logic trên nó, như vậy khi ta bấm phím thì RB0 sẽ bằng 0 ( lúc đầu RB0 bằng 1) sẽ tạo ngắt nhưng khi ta nhả phím ra thì lúc đó chân RB0 sẽ chuyển mức logic từ 0 lên 1 ngay ( chưa kể đến trường hợp rung phím nữa )
==> không lẽ lúc đó con Pic sẽ vào ngắt tiếp hả anh ?
À quên nữa,trong chương trình của em thấy anh viết thiếu lệnh nhảy tới đoạn pop các giá trị của thanh khi W,Status,Pclath trong ngắt nữa, theo em ta nên đặt nhãn đoạn này là Pop và thay thế các lệnh retfie ở trên bằng lệnh goto pop
@nhh : anh viết rất hay,tiếp tục viết nhiều bài như thế nữa đi anh

sonny
12-09-2006, 12:13 PM
Bác nào biết về A/D converter trong PIC16F877A xin chỉ dùm. Tui đã đọc rồi nhưng thấy khó hiểu quá, nhất là chế độ sleep của nó và cơ chế biến đổi từ tín hiệu analog thành 10 bit đầu ra.
Cám ơn các bác nhiều!

nhh
12-09-2006, 09:52 PM
Anh nhh cho em hỏi phát: theo em biết ngắt xảy ra ở chân RB0 khi có sự thay đổi mức logic trên nó, như vậy khi ta bấm phím thì RB0 sẽ bằng 0 ( lúc đầu RB0 bằng 1) sẽ tạo ngắt nhưng khi ta nhả phím ra thì lúc đó chân RB0 sẽ chuyển mức logic từ 0 lên 1 ngay ( chưa kể đến trường hợp rung phím nữa )
==> không lẽ lúc đó con Pic sẽ vào ngắt tiếp hả anh ?
À quên nữa,trong chương trình của em thấy anh viết thiếu lệnh nhảy tới đoạn pop các giá trị của thanh khi W,Status,Pclath trong ngắt nữa, theo em ta nên đặt nhãn đoạn này là Pop và thay thế các lệnh retfie ở trên bằng lệnh goto pop
@nhh : anh viết rất hay,tiếp tục viết nhiều bài như thế nữa đi anh

Ngắt ngoài có 2 kiểu, bằng thay đổi trạng thái chân:
+ Ngắt cạnh xuống: low to high
BCF OPTION_REG,INTEDG ;interrupt cạnh xuống

+ Ngắt cạnh lên: high to low
BSF OPTION_REG,INTEDG ;interrupt cạnh lên

Khi khai báo ngắt, ta phải khai báo cho pic biết sử dụng ngắt nào.

Vậy ở đây, khi thả button lên, tuy có thay đổi trạng thái chân RB0, vẫn không có ngắt xảy ra.

Mình không viết bằng MPASM nữa, nên bạn qua luồng "PIC16F877A từ dễ tới khó", đọc các tutorial của mod Chính.

Chúc thành công!

spirit
01-10-2006, 11:51 PM
;========================================
;Author: NHH
;Date: 02/03/06
;Hardware: PIC16F877A ,Crystal 4MHz
;========================================
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF
;========================================
COUNT EQU 0x20
COUNT1 EQU 0x21
COUNT2 EQU 0x22
COUNT3 EQU 0x23
COUNT4 EQU 0x24
COUNT5 EQU 0x25
COUNT6 EQU 0x26
COUNT7 EQU 0x27

w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
pclath_temp EQU 0x73 ; variable used for context saving

;================================================= ============================
;CHUONG TRINH CHINH
;================================================= ============================
ORG 0x00
GOTO MAIN
ORG 0004h
GOTO INTERRUPT

;==============================INTERRUPT PROGRAM===========================
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into w register
movwf pclath_temp ; save off contents of PCLATH register
;************************************************* *****************************
DECFSZ COUNT,F
GOTO CHECK
MOVLW d'1'
MOVWF COUNT
INCF COUNT1,F
GOTO CHECK
BACK BCF INTCON,TMR0IF ;xoa co ngat TMR0
;************************************************* *****************************
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt

CHECK
CALL CHECK1
CALL CHECK2
CALL CHECK3
CALL CHECK4
CALL CHECK5
GOTO BACK
;============== CHUONG TRINH CHINH===============
MAIN
BCF STATUS,RP1
BSF STATUS,RP0 ; chon BANK 1
MOVLW b'11111111' ;PORTA=Input
MOVWF TRISA
MOVLW b'00000001' ;RB0=Input
MOVWF TRISB
CLRF TRISD
;------------------------------
;Khoi tao ngat Timer0
;------------------------------
BSF OPTION_REG,PS0 ;TMR0 rate 1: 64
BSF OPTION_REG,PS1
BCF OPTION_REG,PS2
BCF OPTION_REG,PSA ;Prescaler is assigned to the Timer0 module
BCF OPTION_REG,T0CS
BCF STATUS,RP0 ;select BANK 0

BSF INTCON,GIE
BSF INTCON,TMR0IE
BCF INTCON,TMR0IF

MOVLW d'246'
MOVWF COUNT
CLRF COUNT1
CLRF COUNT2
CLRF COUNT3
CLRF COUNT4
CLRF COUNT5
CLRF COUNT6
CLRF COUNT7
LOOP
CALL DISPLAY1
CALL DISPLAY2
CALL DISPLAY3
CALL DISPLAY4
CALL DISPLAY5
CALL DISPLAY6

BTFSC PORTB,0
GOTO LOOP
GOTO MODIFY
MODIFY
BCF INTCON,GIE

BTFSC PORTA,0
GOTO $+2
CALL LED34
BTFSC PORTA,1
GOTO $+2
CALL LED56
BTFSS PORTB,0
GOTO MODIFY
BSF INTCON,GIE
GOTO LOOP
LED34
INCF COUNT3,F
MOVLW d'10'
SUBWF COUNT3,W
BTFSS STATUS,0
RETURN
CLRF COUNT3
INCF COUNT4,F
MOVLW d'6'
SUBWF COUNT4,W
BTFSS STATUS,0
RETURN
CLRF COUNT4
RETURN
LED56
INCF COUNT5,F
MOVLW d'4'
SUBWF COUNT5,W
BTFSS STATUS,0
RETURN
MOVLW d'2'
SUBWF COUNT6,W
BTFSS STATUS,0
GOTO LED5
CLRF COUNT6
RETURN

LED5
MOVLW d'10'
SUBWF COUNT5,W
BTFSS STATUS,0
GOTO MODIFY
CLRF COUNT5
INCF COUNT6,F
GOTO MODIFY

;============CHUONG TRINH CON===
DISPLAY1
MOVLW b'11111101'
MOVWF PORTB
MOVF COUNT1,W
CALL TABLE
MOVWF PORTD
CALL DECREATE
CLRF PORTB
CLRF PORTD
RETURN
DISPLAY2
MOVLW b'11111011'
MOVWF PORTB
MOVF COUNT2,W
CALL TABLE
MOVWF PORTD
CALL DECREATE
CLRF PORTB
CLRF PORTD
RETURN
DISPLAY3
MOVLW b'11110111'
MOVWF PORTB
MOVF COUNT3,W
CALL TABLE
MOVWF PORTD
CALL DECREATE
CLRF PORTB
CLRF PORTD
RETURN
DISPLAY4
MOVLW b'11101111'
MOVWF PORTB
MOVF COUNT4,W
CALL TABLE
MOVWF PORTD
CALL DECREATE
CLRF PORTB
CLRF PORTD
RETURN
DISPLAY5
MOVLW b'11011111'
MOVWF PORTB
MOVF COUNT5,W
CALL TABLE
MOVWF PORTD
CALL DECREATE
CLRF PORTB
CLRF PORTD
RETURN
DISPLAY6
MOVLW b'10111111'
MOVWF PORTB
MOVF COUNT6,W
CALL TABLE
MOVWF PORTD
CALL DECREATE
CLRF PORTB
CLRF PORTD
RETURN

DECREATE
DECFSZ COUNT7
GOTO DECREATE
RETURN

;................................................. .......
CHECK1
MOVLW d'10'
SUBWF COUNT1,W
BTFSS STATUS,0
GOTO BACK
CLRF COUNT1
INCF COUNT2,F
RETURN
CHECK2
MOVLW d'6'
SUBWF COUNT2,W
BTFSS STATUS,0
GOTO BACK
CLRF COUNT2
INCF COUNT3,F
RETURN
CHECK3
MOVLW d'10'
SUBWF COUNT3,W
BTFSS STATUS,0
GOTO BACK
CLRF COUNT3
INCF COUNT4,F
RETURN
CHECK4
MOVLW d'6'
SUBWF COUNT4,W
BTFSS STATUS,0
GOTO BACK
CLRF COUNT4
INCF COUNT5,F
RETURN
CHECK5
MOVLW d'10'
SUBWF COUNT5,W
BTFSS STATUS,0
GOTO BACK
CLRF COUNT5
INCF COUNT6,F
RETURN
CHECK6
INCF COUNT5,F
MOVLW d'4'
SUBWF COUNT5,W
BTFSS STATUS,0
RETURN
MOVLW d'2'
SUBWF COUNT6,W
BTFSS STATUS,0
CALL LED_5
CLRF COUNT6
RETURN

LED_5
MOVLW d'10'
SUBWF COUNT5,W
BTFSS STATUS,0
RETURN
CLRF COUNT5
INCF COUNT6,F
RETURN
;----------------------------------------------------------

; Bang tra ve Digital tu 0 den 9 va OFF
; Chi so dau truy cap la 0
; Bang o PAGE 0

ORG 07F0h
TABLE
;----------------------------------------------------------
ADDWF PCL, F ; bat dau tai 0x90
RETLW b'00111111' ; 0
RETLW b'00000110' ; 1
RETLW b'01011011' ; 2
RETLW b'01001111' ; 3
RETLW b'01100110' ; 4
RETLW b'01101101' ; 5
RETLW b'01111101' ; 6
RETLW b'00000111' ; 7
RETLW b'01111111' ; 8
RETLW b'01101111' ; 9
RETLW b'00111111' ; 0

END
Anh NHH xem lại chương trình nay đi,em mắc mạch như trong hình ( mô phỏng bằng Proteus )nhưng chương trình chạy không đúng.

newuser
03-10-2006, 09:21 AM
Ngắt ngoài có 2 kiểu, bằng thay đổi trạng thái chân:
+ Ngắt cạnh xuống: low to high

Code:
BCF OPTION_REG,INTEDG ;interrupt cạnh xuống+ Ngắt cạnh lên: high to low

Code:
BSF OPTION_REG,INTEDG ;interrupt cạnh lênKhi khai báo ngắt, ta phải khai báo cho pic biết sử dụng ngắt nào.

Vậy ở đây, khi thả button lên, tuy có thay đổi trạng thái chân RB0, vẫn không có ngắt xảy ra.

Nếu mình nhớ không nhầm thì bit INTEDG chỉ xác định sườn tác động cho ngắt ngoài thôi mà! Đâu có liên quan gì đến ngắt thay đổi đâu.
Theo đúng nghĩa của ngắt thay đổi, sườn lên hay sườn xuống đều phải gây ngắt và việc lựa chọn sườn tác động nào để gây ngắt là do người lập trình quyết định. Các bạn có thể tham khảo ở một appnote của Microchip vận dụng ngắt onchange để dùng như ngắt ngoài sẽ rõ.

picpicpic
07-10-2006, 07:43 PM
Sao không thấy bác nào viết về ADC, PWM vậy nhỉ !

spirit
15-10-2006, 01:12 PM
Ngắt ngoài có 2 kiểu, bằng thay đổi trạng thái chân:
+ Ngắt cạnh xuống: low to high
BCF OPTION_REG,INTEDG ;interrupt cạnh xuống

+ Ngắt cạnh lên: high to low
BSF OPTION_REG,INTEDG ;interrupt cạnh lên

Khi khai báo ngắt, ta phải khai báo cho pic biết sử dụng ngắt nào.

Vậy ở đây, khi thả button lên, tuy có thay đổi trạng thái chân RB0, vẫn không có ngắt xảy ra.

Mình không viết bằng MPASM nữa, nên bạn qua luồng "PIC16F877A từ dễ tới khó", đọc các tutorial của mod Chính.

Chúc thành công!
+Ra vậy,em hiểu rồi nhưng còn đối với các ngắt RB4..RB7 thì sao hả anh , em đọc trong datasheet không thấy Microchip nhắc đến ngắt cạnh lên hay xuống mà chỉ nói xảy ra ngắt khi có sự thay đổi mức LOGIC trên chân.
+Khi cấu hình là ngõ vào thì cần phải có lệnh BCF option_reg,not_RBPU để cho phép điện trở kéo lên bên trong phải không ạ? Nhưng em thấy bài quét phím 4x4 của anh em thấy không có lệnh này.
+Chương trình quét phím 4x4 của anh khi mô phỏng Proteus thì chính xác nhưng khi em đem ra mạch thật test thử thì không đúng nữa.(không biết anh đã test thử trên mạch thật chưa?) à,khi em đem ra mạch thật test thì ngõ xuất LED 7 đoạn là Port D chứ không phải Port C .
Mong anh giải đáp giúp em một số thăc mác trên,chờ tin anh
@NHH:Anh học BK Tphcm phải không ? Nếu anh học ở đó thì anh có thể cho em gặp riêng không ?
@picpicpic :Bạn qua dientuvietnam.net xem sao

spirit
17-10-2006, 05:38 PM
Hic,anh NHH đâu rồi trả lời giúp em đi

newuser
18-10-2006, 06:53 PM
Ra vậy,em hiểu rồi nhưng còn đối với các ngắt RB4..RB7 thì sao hả anh , em đọc trong datasheet không thấy Microchip nhắc đến ngắt cạnh lên hay xuống mà chỉ nói xảy ra ngắt khi có sự thay đổi mức LOGIC trên chân.

mình đã nói ở trên đây thôi, chẳng có bit nào xác định sườn tác động của ngắt onchange cả, sườn lên hay sườn xuống đều có thể gây ngắt, nếu có bit để mà chọn sườn tác động thì còn gì là ngắt do thay đổi trạng thái (onchange)? muốn ngắt xảy ra theo sườn nào thì bạn phải viết chương trình thôi

spirit
18-10-2006, 08:02 PM
mình đã nói ở trên đây thôi, chẳng có bit nào xác định sườn tác động của ngắt onchange cả, sườn lên hay sườn xuống đều có thể gây ngắt, nếu có bit để mà chọn sườn tác động thì còn gì là ngắt do thay đổi trạng thái (onchange)? muốn ngắt xảy ra theo sườn nào thì bạn phải viết chương trình thôi

Mình xem trong datasheet thì thấy như sau:
OPTION_REG REGISTER (ADDRESS 81h, 181h)

Bit6: INTEDG : Interrupt Edge Select bit
1 = Interrupt on rising edge of RB0/INT pin
0 = Interrupt on falling edge of RB0/INT pin

Vậy thì có bit INTEDG chọn cạnh ngắt lên hay xuống mà Newuser ?

Mình cũng đã xem apnote AN552:Implementing Wake-up on Key Stroke của Microchip rồi cũng thấy không nói về bit xác định sườn ngắt chân RB4...RB7

Chắc có lẽ như bạn nói là không có bit để chọn cạnh ngắt như RB0 mà mình phải xác định trong chương trình của mình.

Còn chương trình quét phím 4x4 của anh NHH trên mình đã test thử trên Proteus thì chạy tốt nhưng khi đem ra mạch thật thì không chạy được
Bạn test giùm minh nhé Newuser,mình cũng đã thử viết lại nhiều lần rồi nhưng vãn chưa được.
Mình có nhiều vấn đề vẫn chưa thông lắm bạn Newuser giúp mình nhé

newuser
18-10-2006, 10:58 PM
Mình xem trong datasheet thì thấy như sau:
OPTION_REG REGISTER (ADDRESS 81h, 181h)

Bit6: INTEDG : Interrupt Edge Select bit
1 = Interrupt on rising edge of RB0/INT pin
0 = Interrupt on falling edge of RB0/INT pin

Vậy thì có bit INTEDG chọn cạnh ngắt lên hay xuống mà Newuser ?

Mình cũng đã xem apnote AN552:Implementing Wake-up on Key Stroke của Microchip rồi cũng thấy không nói về bit xác định sườn ngắt chân RB4...RB7

Chắc có lẽ như bạn nói là không có bit để chọn cạnh ngắt như RB0 mà mình phải xác định trong chương trình của mình.

Còn chương trình quét phím 4x4 của anh NHH trên mình đã test thử trên Proteus thì chạy tốt nhưng khi đem ra mạch thật thì không chạy được
Bạn test giùm minh nhé Newuser,mình cũng đã thử viết lại nhiều lần rồi nhưng vãn chưa được.
Mình có nhiều vấn đề vẫn chưa thông lắm bạn Newuser giúp mình nhé

trời đất, có ai nói là không có bit chọn sườn tác động cho ngắt ngoài (RB0/INT) đâu? Ngắt onchange chỉ có ở các chân của PORTB<4:7> thôi, đúng không?
để đảm bảo là không có ngắt không mong muốn xảy ra mỗi khi nhả phím thì bạn phải viết thêm một đoạn code kiểm tra trạng thái chân gây ngắt onchange, chắc chắn rằng trạng thái chân này đã trở về mức logic ban đầu(trạng thái trước khi nhấn phím), nếu chưa về trạng thái ban đầu thì chưa xoá cờ báo ngắt. Tôi không biết đoạn chương trình của bạn nhh, nhưng theo tôi suy đoán,Proteus đã lý tưởng hoá việc nhấn phím -->không khử nảy phím nhấn.
bạn đọc appnote này xem

spirit
18-10-2006, 11:02 PM
Thanks newuser đúng là cái mình cần.

pisco
18-10-2006, 11:23 PM
em cung moi nghien cuu ve con pic6f877a , em cung thay mach nap cua may bac nhung sao ko thay co bo nguon cung cap cho no vay

spirit
19-10-2006, 06:59 PM
Đề nghị bạn post tiếng việt có dấu,nếu bạn ở tpHCM bạn có thể qua cửa hàng (của PICVIETNAM ) : STH ở đường Lạc Long Quân gần chỗ giao với Âu Cơ

anhquangngai
16-01-2007, 05:01 PM
Đấy là chương trình quét 16 phím bấm hiển thị lên LED 7 đoạn các số từ 0 đến 9 và các chữ A,b,C,d,E,F.
Xem hình ở file đính kèm!

;========================================
;Auhor: NHH
;Date: 02/03/06
;Hardware: PIC16F877A connect PORTB by R220
;========================================
TITLE "Giai ma ban phim dung interrupt RB4...RB7"
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF
;========================================
COUNT EQU 0x20
w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
pclath_temp EQU 0x73 ; variable used for context saving

;================================================= ============================
;CHUONG TRINH CHINH
;================================================= ============================
ORG 0000h
GOTO MAIN
ORG 0004h
GOTO INTERRUPT

;==============================INTERRUPT PROGRAM===========================
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into w register
movwf pclath_temp ; save off contents of PCLATH register
;************************************************* *****************************
BCF INTCON,RBIF

MOVLW b'00000001'
MOVWF PORTB
BTFSS PORTB,4
GOTO DIS_1
MOVLW d'0' ;0
CALL TABLE
MOVWF PORTC
retfie
DIS_1
BTFSS PORTB,5
GOTO DIS_2
MOVLW d'1' ;1
CALL TABLE
MOVWF PORTC
retfie
DIS_2
BTFSS PORTB,6
GOTO DIS_3
MOVLW d'2' ;2
CALL TABLE
MOVWF PORTC
retfie
DIS_3
BTFSS PORTB,7
GOTO DIS_4
MOVLW d'3' ;3
CALL TABLE
MOVWF PORTC
retfie
DIS_4
MOVLW b'00000010'
MOVWF PORTB
BTFSS PORTB,4
GOTO DIS_5
MOVLW d'4' ;4
CALL TABLE
MOVWF PORTC
retfie
DIS_5
BTFSS PORTB,5
GOTO DIS_6
MOVLW d'5' ;5
CALL TABLE
MOVWF PORTC
retfie

DIS_6
BTFSS PORTB,6
GOTO DIS_7
MOVLW d'6' ;6
CALL TABLE
MOVWF PORTC
retfie
DIS_7
BTFSS PORTB,7
GOTO DIS_8
MOVLW d'7' ;7
CALL TABLE
MOVWF PORTC
retfie
DIS_8
MOVLW b'00000100'
MOVWF PORTB
BTFSS PORTB,4
GOTO DIS_9
MOVLW d'8' ;8
CALL TABLE
MOVWF PORTC
retfie
DIS_9
BTFSS PORTB,5
GOTO DIS_A
MOVLW d'9' ;9
CALL TABLE
MOVWF PORTC
retfie
DIS_A
BTFSS PORTB,6
GOTO DIS_b
MOVLW d'11' ;A
CALL TABLE
MOVWF PORTC
retfie
DIS_b
BTFSS PORTB,7
GOTO DIS_C
MOVLW d'12' ;b
CALL TABLE
MOVWF PORTC
retfie
DIS_C
MOVLW b'00001000'
MOVWF PORTB
BTFSS PORTB,4
GOTO DIS_d
MOVLW d'13' ;C
CALL TABLE
MOVWF PORTC
retfie
DIS_d
BTFSS PORTB,5
GOTO DIS_E
MOVLW d'14' ;d
CALL TABLE
MOVWF PORTC
retfie
DIS_E
BTFSS PORTB,6
GOTO DIS_F
MOVLW d'15' ;E
CALL TABLE
MOVWF PORTC
retfie
DIS_F
BTFSS PORTB,7
GOTO $+4
MOVLW d'16' ;F
CALL TABLE
MOVWF PORTC
retfie




;************************************************* *****************************
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;============== CHUONG TRINH CHINH===============
MAIN
BCF STATUS,RP1
BSF STATUS,RP0 ; chon BANK 1
MOVLW b'11110000' ;RB0=Input
MOVWF TRISB
CLRF TRISC

BCF STATUS,RP0 ; chon BANK 0
BSF INTCON,GIE
BSF INTCON,RBIE ;cho phep ngat RB4...RB7

MOVLW d'10'
CALL TABLE
MOVWF PORTC
LOOP
MOVLW b'00001111'
MOVWF PORTB
GOTO LOOP
;----------------------------------------------------------
; Bang tra ve Digital tu 0 den 9 va A....F
; Chi so dau truy cap la 0
; Bang o PAGE 0

ORG 0x90
TABLE
;----------------------------------------------------------
ADDWF PCL, F ; bat dau tai 0x80
RETLW b'00111111' ; 0
RETLW b'00000110' ; 1
RETLW b'01011011' ; 2
RETLW b'01001111' ; 3
RETLW b'01100110' ; 4
RETLW b'01101101' ; 5
RETLW b'01111101' ; 6
RETLW b'00000111' ; 7
RETLW b'01111111' ; 8
RETLW b'01101111' ; 9
RETLW b'00000000' ; NODISPLAY
RETLW b'01110111' ; A
RETLW b'01111100' ; B
RETLW b'00111001' ; C
RETLW b'01011110' ; d
RETLW b'01111001' ; E
RETLW b'01110001' ; F

END

Ko go dc TV thong cam!

co bac nao chay thu chuong trinh nay tren phan cung chua?
Em da chay thu tren phan cung voi Thach Anh 20MHz nhung no ko chay
anh em nao da co chuong trinh chay tot tren phan cung giai ma ban phim thi post len cho em xin dc ko?
chuong trinh bac NHH viet thi chay rat tot khi mo phong bang Proteus nhung khi chay tren phan cung thi ko dc?
Mong bac nao giup em voi??

anhquangngai
20-01-2007, 05:53 PM
sao khong co ai tra loi giup vay ?
bun wa!

nhh
23-01-2007, 12:04 PM
sao khong co ai tra loi giup vay ?
bun wa!

Ở đây, code C, không chơi MPLAP, code chưa được tối ưu lắm!
http://www.picvietnam.com/forum/showthread.php?p=7001&posted=1#post7001

111985
19-03-2007, 01:18 PM
anh có thể nói rỏ hơn về sơ đồ hoạt động của mạch ko

omlun
19-03-2007, 10:13 PM
chủ đề này khá hấp dẫn!! thanks may anh

tranvanthuong
22-03-2007, 08:38 AM
Em có 1 yêu cầu đặt ra nhờ anh giúp đở. em có 1 cái tivi 1 bảng quang báo được điều khiển bằng máy tính.khi nội dung hình ảnh và âm thanh hiện lên tivi thì quang báo bằt đầu chạy chữ về nội dung hình ảnh và âm thanh đó anh chỉ em cách làm đi! EM RẤT MONG ĐưỢC SỰ GIÚP Đở CỦA ANH-THÂN CHÀO ANH

kysikodau
02-04-2007, 04:25 AM
Đây là chương trình đếm số lần switch on từ 1 đến 9 hiển thị lên LED 7 đoạn,dùng ngắt ngoài RB0 và kỹ thuật bảng.


;========================================
;Auhor: NHH
;Date: 02/03/06
;Hardware: PIC16F877A ,Crystal 10MHz
;========================================
TITLE "Count button on by Interrupt RB0"
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF
;========================================
COUNT EQU 0x20
w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
pclath_temp EQU 0x73 ; variable used for context saving

;================================================= ============================
;CHUONG TRINH CHINH
;================================================= ============================
ORG 0000h
GOTO MAIN
ORG 0004h
GOTO INTERRUPT

;==============================INTERRUPT PROGRAM===========================
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into w register
movwf pclath_temp ; save off contents of PCLATH register
;************************************************* *****************************
BCF INTCON,INTF ;xoa co int
INCF COUNT,F
MOVLW d'10'
SUBWF COUNT,W
BTFSS STATUS,0
GOTO $+2
GOTO NODISPLAY
MOVF COUNT,W
CALL TABLE
MOVWF PORTD
retfie ; return from interrupt
NODISPLAY ;khong hien thi neu vuot qua 9
MOVLW d'10'
CALL TABLE
MOVWF PORTD
RETFIE

;************************************************* *****************************
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;============== CHUONG TRINH CHINH===============
MAIN
BCF STATUS,RP1
BSF STATUS,RP0 ; chon BANK 1
MOVLW b'11111111' ;RB0=Input
MOVWF TRISB
CLRF TRISD
BCF OPTION_REG,INTEDG ;interrupt canh xuong
BCF STATUS,RP0 ; chon BANK 0
BSF INTCON,GIE ;cho phep interrupt toan cuc
BSF INTCON,INTE ;cho phep interrupt RB0

CLRF COUNT
MOVLW d'0'
CALL TABLE
MOVWF PORTD

GOTO $
;----------------------------------------------------------
; Bang tra ve Digital tu 0 den 9 va OFF
; Chi so dau truy cap la 0
; Bang o PAGE 0

ORG 0x80
TABLE
;----------------------------------------------------------
ADDWF PCL, F ; bat dau tai 0x80
RETLW b'00111111' ; 0
RETLW b'00000110' ; 1
RETLW b'01011011' ; 2
RETLW b'01001111' ; 3
RETLW b'01100110' ; 4
RETLW b'01101101' ; 5
RETLW b'01111101' ; 6
RETLW b'00000111' ; 7
RETLW b'01111111' ; 8
RETLW b'01101111' ; 9
RETLW b'00000000' ; OFF

END


Ở bài này em muốn sau khi đếm đến 9 thì lặp lại từ đầu, ko biết phải lảm thế nào

tranvanthuong
09-04-2007, 09:15 AM
buồn quá không ai giúp đỡ hết,
Mấy anh ơi em đang làm đề tài nghiên cứu 16f877a, em gặp đề tài mừng quá đăng kí ngay vào diễn đàn liền! em làm cái đề tài là quang báo gồm 1 ma trận 8x160 tức gồm 20 matrận led 8x8, bảng quang báo này chạy chử ngược xuôi,từ trung tâm ra,chử rớt từ bên trái qua phải-phải qua trái. các anh giúp em giải thuật với,con 2 tháng nửa là nộp rồi -em đợi tin các anh
thân chào!

loveall
01-06-2007, 02:36 AM
xin anhh post tiếp bài cho anh em nhờ!!hôm nay ghé qua room này!thấy bài bác anhh viết hay quá!nên down Protues về tét thử ,thấy mạch chạy ok ,tự nhiên thấy yêu Pic vô cùng!!Xin anhh post thêm ít bài nữa cho anh em có cơ hội học hỏi thêm!!

LeDuc
17-06-2007, 07:00 AM
Trong hàm init chọn như sau: dùng pre cho timer0 với tỉ lệ 1:2
void init(void){
// khoi tao cho các port
// Khoi tao cho cac thanh ghi
OPTION = 0x00; // dung prescaler cho timer0 voi ti le la 1:2

// Khoi tao cho ngat Timer0
GIE = 1; // cho phep ngat toan cuc
T0IE = 1; // cho phep ngat timer0
T0IF = 0; // xoa co ngat timer0
TMR0 = 6; // khoi tao
}[/QUOTE]

Bác Ngô ơi giúp em với,trong CCS cờ ngắt timer0 là gì vậy? em đọc trong trong thư viện 16f877a.h kô thấy no định nghĩa chỗ này.Em liều lam đại thì nó ko chịu--->em pó tay.Và cái cho phép ngắt toàn cục ko thấy ai nói đến vậy?Và cách tính khoản giá trị nạp ban đầu cho timer?
VD : em muốn tạo ra một xung với tần số là 10Khz o portD.7 .
f=100Khz =>T=1/10=0.1ms=100micro giây. |
chu ky may dai 1 micro s,
==> cần có 50 micro s tương đương với 50 lần đếm lên của timer
==> giá trị cần nạp cho timer la :
256 - 50=206=0xCE
Nếu là 8051 thi ta nạp vào thanh TH0=0xCE ;
Vậy đối với Pic 16f877A cái giá trị đó giờ phải viết vào đâu vậy bác Ngô ?giúp em với.
Các bác có thể chỉ rõ hơn về vấn đề timer này khi dùng CCS ko vậy?
Thanks các bác .

falleaf
17-06-2007, 10:37 AM
buồn quá không ai giúp đỡ hết,
Mấy anh ơi em đang làm đề tài nghiên cứu 16f877a, em gặp đề tài mừng quá đăng kí ngay vào diễn đàn liền! em làm cái đề tài là quang báo gồm 1 ma trận 8x160 tức gồm 20 matrận led 8x8, bảng quang báo này chạy chử ngược xuôi,từ trung tâm ra,chử rớt từ bên trái qua phải-phải qua trái. các anh giúp em giải thuật với,con 2 tháng nửa là nộp rồi -em đợi tin các anh
thân chào!

Bạn cần làm những việc đó, bạn cần đưa ra thiết kế mạch, rồi hỏi xem mạch có vần đề gì chưa. Sau đó lại tiếp tục đưa source code, và hỏi tiếp. Bạn phải tự làm, và tự trình bày, thì người khác mới kiểm tra giúp được. Chẳng lẽ người ta đưa cho bạn mạch in và chương trình luôn?

Chúc vui

david
18-07-2007, 12:02 PM
Bác nào có thể giảng giúp em về phần khởi tạo cho Pic ko? Đằng sau __CONFIG viết nhưng cái gì?em ko hiểu được,mong các bác chỉ giáo

namqn
18-07-2007, 06:48 PM
Bác nào có thể giảng giúp em về phần khởi tạo cho Pic ko? Đằng sau __CONFIG viết nhưng cái gì?em ko hiểu được,mong các bác chỉ giáo
Đằng sau __CONFIG viết những cái gì còn tùy thuộc vào chip bạn đang sử dụng là chip nào. Và viết như thế nào cũng có thể còn tùy thuộc vào ngôn ngữ bạn đang sử dụng là ngôn ngữ nào.

Thân,

david
18-07-2007, 08:59 PM
em đang tìm hiểu về pic16f877a,viết bằng MPASM,nhưng em ko hiểu đàng sau _CONFIG phải khai báo những gì,căn cứ vào đầu? Mong bác chỉ giáo dùm

namqn
18-07-2007, 11:59 PM
em đang tìm hiểu về pic16f877a,viết bằng MPASM,nhưng em ko hiểu đàng sau _CONFIG phải khai báo những gì,căn cứ vào đầu? Mong bác chỉ giáo dùm
Bạn vào thư mục con 'MPASM Suite' của thư mục cài đặt MPLAB, mở tập tin 'P16F877A.INC' và đến cuối tập tin đó, bạn sẽ thấy các tổ hợp đã được định nghĩa cho từ cấu hình. Bạn chỉ dùng 1 trong những khả năng của một nhóm cấu hình, ví dụ chỉ dùng 1 trong các giá trị _CP_ALL và _CP_OFF (cho Code Protection). Tương tự cho các nhóm cấu hình khác. Bạn sẽ AND các giá trị này với nhau, ví dụ:

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


Thân,

david
19-07-2007, 10:17 AM
Cảm ơn bác đã Reply,nhưng em muốn biết tác dụng của từng cấu hình,ví dụ như _BODEN_ON, _PWRTE_ON,_DEBUG_OFF ... có ảnh hương như thế nào khi mình lập trình?Bác co thế chỉ giúp em tác dụng của từng cái ko?Mới học nên nhiều cái chưa biết lắm ---->Mong bác nhiệt tình giúp đỡ

bien_van_khat
19-07-2007, 11:03 AM
Mình khuyên bạn nên hỏi "coi mấy cái này ở đâu?"

Bạn mở datasheet của con 877 mục 14.1 "Configuration bits".

david
29-07-2007, 11:32 AM
Em mới bắt đầu với Pic,và đây là chường trình đếm xung vào ở chân RA0,hiện thị led7segment nối vào PortB,dùng kỹ thuật bảng.Em dùng MPLAP dịch thì không có lỗi,nhưng khi mô phỏng bằng Proteus thì nó không chạy,mong các bác chỉ cho chỗ sai.


;================================================= =======
TITLE "Dem xung"
PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF & _LVP_OFF

;================================================= =========
;Khai bao bien :
DEM EQU 0x20

;================================================= ===========
;Chuong trinh chinh:
;================================================= ===========

ORG 0x0000
GOTO MAIN
ORG 0x0005
MAIN
BANKSEL TRISA
MOVLW b'00111111'
MOVWF TRISA
CLRF TRISB
BANKSEL PORTA
MOVLW b'00111111'
MOVWF PORTB
CLRF DEM
LOOP
BTFSC PORTA,0
GOTO $-1
BTFSS PORTA,0
GOTO $-1
INCF DEM,1
MOVF DEM,0
XORWF d'10'
BTFSC STATUS,Z
GOTO MAIN
MOVF DEM,0
CALL TABLE
MOVWF PORTB
GOTO LOOP


ORG 0x800

TABLE
ADDWF PCL,1
RETLW b'00111111'
RETLW b'00000110'
RETLW b'01011011'
RETLW b'01001111'
RETLW b'01100110'
RETLW b'01101101'
RETLW b'01111101'
RETLW b'00000111'
RETLW b'01111111'
RETLW b'01101111'

END

david
29-07-2007, 11:36 AM
Các bác có gắng đọc nhe,em chỉnh cho nó gần lại mộ chút,không ngờ post lên nó lại sát nhau như thê.

namqn: bạn vào edit lại post trên, sẽ thấy tôi thêm các tag [code] và [ /code] để định dạng code của bạn.

namqn
29-07-2007, 07:27 PM
Em mới bắt đầu với Pic,và đây là chường trình đếm xung vào ở chân RA0,hiện thị led7segment nối vào PortB,dùng kỹ thuật bảng.Em dùng MPLAP dịch thì không có lỗi,nhưng khi mô phỏng bằng Proteus thì nó không chạy,mong các bác chỉ cho chỗ sai.
...

Bảng của bạn đặt ở 0x0800 mà trong chương trình của bạn lại không xử lý thanh ghi PCLATH.

Thân,

david
30-07-2007, 12:00 AM
Gửi bác namqn:
Em bắt đâu bảng ở địa chỉ 0x80 thì không phải xử lí PCLATH đúng không ạ,nhưng khi bắt đầu mô phỏng thì thì led7seg hiện 0(cai này thì đúng)nhưng khi em bấm BUTTON thì nó cứ trơ ra,hic
Bác chỉ dùm em chỗ sai cái,nó làm em mất hứng mấy ngày nay

namqn
30-07-2007, 01:10 AM
Gửi bác namqn:
Em bắt đâu bảng ở địa chỉ 0x80 thì không phải xử lí PCLATH đúng không ạ,nhưng khi bắt đầu mô phỏng thì thì led7seg hiện 0(cai này thì đúng)nhưng khi em bấm BUTTON thì nó cứ trơ ra,hic
Bác chỉ dùm em chỗ sai cái,nó làm em mất hứng mấy ngày nay
Khi mô phỏng các ví dụ liên quan đến hiển thị thì bạn nên giảm thời gian delay và chỉnh lại tần số của chip trong tầm vài trăm kHz. Lý do là có khả năng không mô phỏng các quá trình trong chip theo thời gian thực được.

Với những bài toán loại này tôi luôn chạy mạch thật.

Thân,

uydanh
10-11-2007, 11:20 AM
Các bạn, cho mình hỏi một câu ngớ ngẩn, nhưng thật sự không hiểu chổ này thì không làm ăn gì được hết : một port nào đó (như PORTB của pic6f877a chẳng hạn), việc cho phép nó kéo lên hay không kéo lên Vdd có ý nghĩa như thế nào? Mình thật sự không hiểu chổ này. Cảm ơn các bạn rất nhiều.

caodangvtc
13-12-2007, 05:39 PM
cảm ơn các anh nhiều

Dolphin
13-12-2007, 06:41 PM
Điện trở kéo lên thiết lập mức lôgíc lối vào của khối mạch khi không có thiết bị ngoài nối với lối vào. Ví dụ khi set điện trở kéo lên thì có thể mắc button trực tiếp vào port mà không cần điện trở kéo lên bên ngoài.

damhaicnn
17-12-2007, 10:40 AM
có bác nào hiểu rõ cụm từ 16 bit trong 16 bit - computer thì nói hộ em với.em tìm kiếm trên mạng mà chỉ toàn tiếng anh. hơi khó hiểu.
cảm ơn rất nhiều

vandungevn
19-12-2007, 12:14 AM
16 bits đó nói về hệ thống sử lí 16 bít. trong Computer thì là hệ thống máy tính 16 bits, như bây giờ Pen TUM là 64 bits đó

bien_van_khat
20-12-2007, 08:38 PM
có bác nào hiểu rõ cụm từ 16 bit trong 16 bit - computer thì nói hộ em với.em tìm kiếm trên mạng mà chỉ toàn tiếng anh. hơi khó hiểu.
cảm ơn rất nhiều

Ở đây 4bit, 8bit, 16bit, 32bit hay 64bit chỉ độ rộng của bus dữ liệu, là số bit của thanh ghi chứa. Nói một cách hình ảnh thì đây là số bit mà CPU có thể xử lý đồng thời.

VD: với máy tính 8bit, bộ nhớ dữ liệu được tổ chức theo đơn vị BYTE, các thanh ghi cũng có độ lớn 1 BYTE, các phép toán số học, logic, di chuyển dữ liệu cũng xử lý trên dữ liệu có độ rộng 8 bit.

ducchotdai
21-12-2007, 12:22 AM
em tìm kiếm bản dịch con Pic 16F877A mấy hôm nay rồi mà ko tìm được,bác nào có gửi giùm vào mail cho em được ko???cảm ơn nhiêu nhiều nhiều nhiều.....có bản trong diễn đàn kêu Download được nhưng khi dow thử thì yêu cầu mật khẩu nên không dow được.gửi vô mail giùm nha trananhduc2004@yahoo.com

le.nhatcuong
21-12-2007, 11:50 PM
xin các bác chỉ giup mình lập trình C ngắt ngoài "External interrupt" cua 16F877A
minh dang lam luan van tot nghiep, dung PIC de tinh CosY (cốt phi) cua mang dien ha the bang cách đo độ rộng xung vuông
Xin chân thành cảm ơn

le.nhatcuong
22-12-2007, 12:07 AM
xin các bác chỉ giup mình lập trình C ngắt ngoài "External interrupt" cua 16F877A
minh dang lam luan van tot nghiep, dung PIC de tinh CosY (cốt phi) cua mang dien ha the bang cách đo độ rộng xung vuông
Xin chân thành cảm ơn

help me!!!

nhh
22-12-2007, 10:31 AM
xin các bác chỉ giup mình lập trình C ngắt ngoài "External interrupt" cua 16F877A
minh dang lam luan van tot nghiep, dung PIC de tinh CosY (cốt phi) cua mang dien ha the bang cách đo độ rộng xung vuông
Xin chân thành cảm ơn

Nếu bạn dùng CCS C: http://www.picvietnam.com/forum//showthread.php?t=357&page=2

dovanhiep
22-12-2007, 07:32 PM
Mình đang làm luận văn!
Thầy giáo yêu cầu tìm hiểu về cách làm việc của họ vi điều khiển PIC6F8.
Mọi người biết tài liệu nào về Pic thì giúp mình với nha!.
Thanksss!

namqn
22-12-2007, 11:25 PM
Mình đang làm luận văn!
Thầy giáo yêu cầu tìm hiểu về cách làm việc của họ vi điều khiển PIC6F8.
Mọi người biết tài liệu nào về Pic thì giúp mình với nha!.
Thanksss!
Theo tôi được biết thì không có họ vi điều khiển nào là PIC6F8 cả. Nếu bạn muốn tìm hiểu về một vi điều khiển nào đó của Microchip thì có thể vào website của Microchip (www.microchip.com), gõ vào hộp tìm kiếm của họ tên của vi điều khiển đó, bạn sẽ có một danh sách các tài liệu liên quan đến nó.

Thân,

dovanhiep
26-12-2007, 05:01 PM
Theo tôi được biết thì không có họ vi điều khiển nào là PIC6F8 cả. Nếu bạn muốn tìm hiểu về một vi điều khiển nào đó của Microchip thì có thể vào website của Microchip (www.microchip.com), gõ vào hộp tìm kiếm của họ tên của vi điều khiển đó, bạn sẽ có một danh sách các tài liệu liên quan đến nó.

Thân,

Em hom do viet nham! Em muon noi la ho vi dieu khien Pic16F877a.
Neu anh co tai lieu nao lien quan thi gui cho em nha!.
Hi vong se duoc anh giup do sau nay!

tity
26-12-2007, 07:44 PM
Em chào cả gia đình PIC!!!
các bác cho em hỏi một ý về cách hay là thuật toán để nạp vào một bộ nhớ (loại nào đó mà khi mất nguồn dữ liệu không bị mất)!!! Em cũng đã tìm hiểu khá kỹ về con 8051 và bây giờ muốn khám xét con PIC mà cụ thể là 16F877A chẳng hạn. Em có một ý thế này mong được các bác góp ý cũng như chỉ dạy:" Có thể dùng vi điều khiển để điều khiển nạp cho bộ nhớ như trên được không? dữ liệu nạp vào bộ nhớ sẽ được lấy từ con vi điều khiển chứ không phải là trên máy tính nữa". Vấn đề cơ bản ở đây là phải biết cách để nạp cho bộ nhớ cơ!!!
Mong nhận được sự chỉ giáo tận tình từ các bác!!!
Em chân thành cảm ơn!

minoan
21-02-2008, 10:25 AM
Cho hỏi 1 chút nhé:
1. Trong PIC 16f877a chỉ có vector ngat 0x004. Vậy nếu ta muốn sử dụng nhiều ngắt trong chương trình thì chẳng lẽ lại là:
; Sử dụng MPLAB
;....
org 0x00
goto main
org 0x04
goto ISR
org 0X05
goto main
...
ISR:
bsf ngat_Timer0 ;kiem tra co bao ngat T0
goto Timer0
bsf ngat_I2C ;kiem tra co bao ngat I2C
goto I2C
bsf ngat_USART
goto USART
retfie

Timer0
return

I2C
return

USART
return

main

end
2. Trên hình vẽ
http://i84.photobucket.com/albums/k34/minoan_1983/untitled22222222.jpg
http://i84.photobucket.com/albums/k34/minoan_1983/untitled11111.jpg
Bộ nhớ chương trình là 368byte, tại sao có tận 4bank, nếu tính thế thì phải là 512byte chứ?

falleaf
21-02-2008, 10:41 AM
http://www.picvietnam.com/forum//showthread.php?t=5

Bạn đọc kỹ bài viết này, có 2 bài về ngắt, bài #9 và #10.


Như lần trước đã giới thiệu, vectơ ngắt của PIC nằm ở vị trí 0x0004 các bạn xem lại hình sau:

Khác với khi bạn bị té ruộng, bạn té xuống ngay tại chỗ bạn bị húc, đối với vi điều khiển, khi xảy ra interrupt, nó sẽ nhảy về một địa chỉ cố định, và thực hiện công việc tại đó. Sau khi thực hiện xong, nó sẽ quay trở về vị trí mà từ đó nó đã thoát ra. Vị trí cố định mà nó sẽ nhảy về khi xảy ra ngắt là vị trí 0x0004.

Mọi ngắt đều quay về một vị trí (đối với PIC), khi muốn xử lý nhiều ngắt thì tại vị trí 0x0004 phải có đoạn vào ngắt, sau đó kiểm tra xem ngắt nào xảy ra. Rồi xử lý ngắt đó. Sau khi xử lý xong thì thoát khỏi ngắt.

Chúc vui

minoan
21-02-2008, 02:17 PM
Cám ơn anh falleaf. Nhưng còn 1 câu hỏi nữa là data memory 368byte. Tại sao trong hình lại có tới 4 bank. Nếu như trong hình thì data memory phải là 4x128=512byte chứ?

Jerry
21-02-2008, 03:29 PM
Trong 4 bank (mỗi bank 128 byte) đó có những byte sử dụng làm thanh ghi chức năng đặc biệt, không thể dùng giống như RAM (ví dụ thanh ghi STATUS, INTCON...). Chỉ còn có 368 byte là có thể sử dụng làm RAM thôi. Các byte RAM này có địa chỉ là

Bank 0: 20h đến 7Fh
Bank1: A0h đến FFh
Bank2: 110h đến 17Fh
Bank3: 190 đến 1FFh

PICKGOOD
01-07-2008, 03:33 PM
MikroPascal là một phần mềm của hãng mikroElektronika sử dụng ngôn ngữ Pascal để viết chương trình cho PIC.
Địa chỉ: http://www.mikroe.com/en/compilers/mikropascal/pic/

Hướng dẫn sử dụng (Tiếng Anh):
http://www.elektroda.net/download/0905/mikropascal_manual.pdf

Tải phần mềm MikroPascal phiên bản V3.0.0.4 (có patch) tại địa chỉ:
http://www.picvietnam.com/forum//showthread.php?t=403

tallht
20-08-2008, 02:31 PM
Mình vừa làm xong adc bằng mplab,pót lên cho bà con xem
khi rảnh mình sẽ có 1 bài viết rõ hơn về vấn đề này! Mong bà con ủng hộ!

picpen
20-08-2008, 04:18 PM
Mình dùng 5 chân cổng chuyển đổi ADC của cổng Ra cho 5 tín hiệu cảm biến khác nhau.Nhưng trong thực tế thì khi một trong 5 tín hiệu đó có đầu vào biến đổi thì 4 đầu vào còn lại cũng bị ảnh hưởng theo ít nhiều. nói tóm lại là các tín hiệu ở các chân có ảnh hưởng lẫn nhau .Mình ko rõ nguyên nhân vì sao ? có thể là do nguồn vào ko ổn định chăng ? nếu mình lắp vào mỗi chân tín hiệu 1 tụ lá 102,103.... thì có giảm ảnh hưởng giữa các chân ín hiệu ko?
Làm thế nào để có một nguồn chuẩn và ổn định cho các tín hiệu ADC .vì các chân chuyển đổi ADC rất nhạy với sự thay đổi điện áp .......

*********** Thank *************

lam_ntd
09-10-2008, 04:58 PM
chào các bác em mới nghiên cưc pic 16f877a em thay luông lep trinh led 7 thanh hay quá. Bac nao co chương trinh lap trinh cho nhieu led 7 thnh dung nut bam không co thể cho em xin 1 bản.
Em xin cam on cac bac.
Đia chi email cua em:hai_kcd@yahoo.com

trungduc
06-11-2008, 02:30 PM
Chào qui vi,
Toi mới học PIC mấy ngày có 1 đọan chương trình giải không ra. Xin các bậc tiền bối chỉ giáo cho tại sao bấm nút mà không có tác dụng gì hết.
TITLE "TEST SWITCH PORTB"
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF

;--------------------------------------------------------------------------
; Program Code
;--------------------------------------------------------------------------

ORG 0x000 ;reset vector
goto MAIN
MAIN
Start call Init ;Initialise hardware

Loop btfss PORTB,0 ;Is "ON" button pressed?
bsf PORTA,0 ; Yes - LED on
btfss PORTB,1 ;Is "OFF" button pressed?
bcf PORTA,0 ; Yes - LED off
goto Loop ;



;--------------------------------------------------------------------------
; Subroutines
;--------------------------------------------------------------------------

;*****Init - set up all ports, make unused ports outputs

Init clrf PORTA ;all of porta low
clrf PORTB ;all of portb low

bsf STATUS, RP0 ;change to bank1
movlw b'00000000' ;all outputs except
movwf TRISA ;
; movlw b'11111111' ;all inputs
; movwf TRISB ;
bcf STATUS, RP0 ;back to bank0

return

END ;Stop assembling here

namqn
06-11-2008, 05:55 PM
Chào qui vi,
Toi mới học PIC mấy ngày có 1 đọan chương trình giải không ra. Xin các bậc tiền bối chỉ giáo cho tại sao bấm nút mà không có tác dụng gì hết.
TITLE "TEST SWITCH PORTB"
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF

;--------------------------------------------------------------------------
; Program Code
;--------------------------------------------------------------------------

ORG 0x000 ;reset vector
goto MAIN
MAIN
Start call Init ;Initialise hardware

Loop btfss PORTB,0 ;Is "ON" button pressed?
bsf PORTA,0 ; Yes - LED on
btfss PORTB,1 ;Is "OFF" button pressed?
bcf PORTA,0 ; Yes - LED off
goto Loop ;



;--------------------------------------------------------------------------
; Subroutines
;--------------------------------------------------------------------------

;*****Init - set up all ports, make unused ports outputs

Init clrf PORTA ;all of porta low
clrf PORTB ;all of portb low

bsf STATUS, RP0 ;change to bank1
movlw b'00000000' ;all outputs except
movwf TRISA ;
; movlw b'11111111' ;all inputs
; movwf TRISB ;
bcf STATUS, RP0 ;back to bank0

return

END ;Stop assembling here
Một chương trình cụ thể được viết cho một thiết kế phần cứng cụ thể. Phần cứng của bạn ra sao? Bạn thử nghiệm chương trình như thế nào mà kết luận rằng bấm nút không có tác dụng?

Thân,

trungduc
03-12-2008, 11:03 AM
Thanks namqn, lâu quá mới quay lại chổ này. Vì vài ngày sau đó mình nhận ra là nút bấm thiếu chống rung. Đúng như dự đoán của bạn.
Nhân tiện hôm nay mình bị vướng ở chổ tra bảng, bảng dài quá và nằm ở 1 DC xa khi dùng lệnh: addwf PCL,1 để tra bảng thì nó nhảy đi chổ khác ( không phải bảng ), theo mình biết thì phải sử dụng thanh ghi PCLATH nhưng mình chưa biết cách này.
Rất mong được giúp đở.
Thanks !

namqn
05-12-2008, 04:46 PM
Thanks namqn, lâu quá mới quay lại chổ này. Vì vài ngày sau đó mình nhận ra là nút bấm thiếu chống rung. Đúng như dự đoán của bạn.
Nhân tiện hôm nay mình bị vướng ở chổ tra bảng, bảng dài quá và nằm ở 1 DC xa khi dùng lệnh: addwf PCL,1 để tra bảng thì nó nhảy đi chổ khác ( không phải bảng ), theo mình biết thì phải sử dụng thanh ghi PCLATH nhưng mình chưa biết cách này.
Rất mong được giúp đở.
Thanks !
Bạn tham khảo code ở đây:
http://www.piclist.com/techref/microchip/bigtable.htm

Thân,

trieutuduong
06-12-2008, 01:15 AM
có bác nào có code c++ điều khiển động cơ không vậy cho em xin nhe ! cám ơn các bác trước à!

namqn
06-12-2008, 02:02 AM
có bác nào có code c++ điều khiển động cơ không vậy cho em xin nhe ! cám ơn các bác trước à!
Trước hết bạn xác định trình dịch của bạn đã. Bạn có biết cần dùng trình dịch nào để dịch code C++ cho PIC hay không?

Thân,

trieutuduong
07-12-2008, 09:32 PM
có bác nào có code về điều khiển động cơ dc bằng c++ cho tớ xin nhé , cần lắm . cám ơn các bác trước

phandinh
11-02-2009, 05:21 PM
cho em hỏi trong bài đếm ngắt ngoài chân RB0 của bác nhh có lệnh:
INCF COUNT,F
Vậy lệnh này có giống như lệnh : INCF COUNT,0 hay không
(có khi nào F---->False---->0)

namqn
11-02-2009, 05:57 PM
cho em hỏi trong bài đếm ngắt ngoài chân RB0 của bác nhh có lệnh:
INCF COUNT,F
Vậy lệnh này có giống như lệnh : INCF COUNT,0 hay không
(có khi nào F---->False---->0)
Không giống đâu bạn, với các lệnh thao tác trên thanh ghi, F (= 1) ở phần destination có nghĩa là đích đến của kết quả là thanh ghi toán hạng đó, còn W (= 0) ở phần destination có nghĩa là đích đến của kết quả là W.

Với lệnh INCF COUNT, F (tương đương với INCF COUNT, 1), kết quả của lệnh tăng giá trị trong thanh ghi COUNT sẽ được lưu trở lại thanh ghi COUNT.

Thân,

phandinh
11-02-2009, 11:06 PM
Thanks bác nhiều nha. Em hiểu rồi.
À nếu bác rảnh thì xem dùm bài bên luồng " pic từ dễ tới khó " hộ em

ITfire
12-02-2009, 12:53 PM
các bro giúp mình tính cái PWM Period=[(PR2+1)]*4*Tosc *TMR2 prescale. Và tương tự với cái PWM duty cycle=... luôn ngen (mình đang làm PÍC6F877A với CCS v 4.065).Thanks

electronic
14-03-2009, 04:05 AM
Em mới học Pic16F877A. Các anh trên diễn chỉ em với. Hiện em đang tìm hiểu về led ma trận viết bằng CCS. Em làm mạch dùng 1 led ma trận 8x8, 2 con 74125 kết nối với cột và 2 con 74126 kết nối với hàng. Mạch em đính kèm như sau.
http://www.mediafire.com/file/lfeajenymjn/LEDMATRAN1.DBK

Nhưng khi test thử code xem cả con có nhấp nháy không thì lại chẳng thấy gì.
------------------------------------------
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device *=16, ADC=8 // viet them ADC sau
#use delay(clock=12000000)

void main()
{ set_tris_B(255);
set_tris_C(255);
while(1)
{output_C(255);
output_B(0);
delay_ms(250);
output_C(0);
output_B(255);
delay_ms(250);
}
}
-------------------------------
Mong các anh chỉ giúp. Em còn gà lắm. Các anh có thể cho em 1 bài mẫu tham khảo về cách hiển thị trên led ma trận này được không? Rất cám ơn các anh.

namqn
14-03-2009, 04:44 AM
Bạn nên chụp màn hình và lưu lại thành dạng tập tin ảnh .jpg hay .gif. Không phải ai cũng dùng cùng phần mềm vẽ mạch với bạn đâu. Hơn nữa, phải vào một host lưu trữ nào đó để download sơ đồ mạch của bạn cũng khiến người khác cảm thấy ngại.

Thân,

electronic
14-03-2009, 11:47 AM
Đây là sơ đồ mạch kết nối. Các anh xem lại dùm em với, em còn gà lắm. Các anh có thể cho em 1 bài mẫu tham khảo về cách hiển thị trên led ma trận này viết bằng CCS được không ạ? Cảm ơn các anh rất nhiều.

zero07a
05-11-2009, 01:22 PM
mấy anh ơi cho em hỏi là khi e down xong mấy đoạn code CCS về. xong khi em mở ra rồi chạy chương trình thì cứ thấy báo lỗi chỗ mấy dòng #include. hic em đang hoc ASM mà tài liệu trên mạng toàn là CCS. em định xem mã ASM từ code đấy mà chuyển đổi ko thành công. vậy lý do là vì sao ạ. anh nào giúp em với nhen.cảm ơn nhiều.

lexuantien
06-11-2009, 02:05 PM
Bạn coi lại là phải khai báo con VDK chưa ,mình từng gặp trường hợp như bạn đó . Sau đó khai báo loại con chíp mình dùng là good ah.

dan_dieukhien2
14-12-2009, 09:55 PM
chào các anh em trong diễn đàn. Em là mới bắt đầu làm quen với vi điều khiển xong lại rất thích nó. Tuy vậy cũng chưa biết phải tìm hiểu thế nào.Muốn đi sâu vào xong lại không biết bắt đầu từ đâu. Có anh nào ra tay cứu giúp em với.
Đệ xin chân thành cảm ơn.

dan_dieukhien2
14-12-2009, 09:59 PM
em mới bắt đầu làm quen với phần mềm Keil uVision, xong vào đấy chẳng hiểu gì cả. Có bác nào có tài liệu về phần mềm này thì giới thiệu với em với. Thank you very much!

tran ngoc dung
06-01-2010, 10:52 AM
khong co ai dung CCS de viet cho pic6f877 a?

tran ngoc dung
06-01-2010, 10:55 AM
dan_dieukhien2 oi dung Keil lam gj ?viet vua dai vua phuc tap.dung CCS ay vua don gian vua ngan gon

Mr.Bi
06-01-2010, 01:49 PM
mấy anh ơi cho em hỏi là khi e down xong mấy đoạn code CCS về. xong khi em mở ra rồi chạy chương trình thì cứ thấy báo lỗi chỗ mấy dòng #include. hic em đang hoc ASM mà tài liệu trên mạng toàn là CCS. em định xem mã ASM từ code đấy mà chuyển đổi ko thành công. vậy lý do là vì sao ạ. anh nào giúp em với nhen.cảm ơn nhiều.

post dòng thông báo lỗi lên , ae sẽ chữa giúp cho

Mr.Bi
06-01-2010, 01:50 PM
khong co ai dung CCS de viet cho pic6f877 a?

sao , có chỗ nào trong CCS cần chỉ giáo j ah !

kimlikimli
30-03-2010, 01:12 AM
thanks các pác !!!
hy vọng sẽ có nhiều pài viết hơn nữa !! ^^

huuducel
30-03-2010, 02:34 PM
Mình cũng mới tham gia tìm hiểu về con này. Rất mong các bác giúp đỡ nhiều.

BABYLOVE
04-04-2010, 11:40 AM
Mình đang làm đồ án dùng Pic giao tiếp với đầu thu GPS VP-200T đọc lên led vị trí tọa độ.Với tốc độ baug 4800.minh không hiểu cách để lập trinh để đọc tín hiệu ra với tốc độ baug đó.Mong các cao thu chỉ giáo dùm . Thank u so much !!!!!!

vuonglam
08-04-2010, 12:22 AM
đệ là người mới tham gia tìm hiểu về pic16f877, hiện chưa biết gì về nó. Kính mong các huynh giúp đỡ. thanks!

haruoi
11-04-2010, 12:26 PM
PROCESSOR PIC16f887 ; khai báo vi dieu khien
#INCLUDE <P16f887.inc> ; header file dinh kem
__CONFIG _CP_OFF & _WDT_OFF & BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF &_LVP_OFF & _CPD_OFF
; khai bao các configuration bits

ORG 0x000 ; dia chi bat dau chuong trinh
GOTO START ; chuong trinh chinh bat dau tai day

START
BCF STATUS,RP1
BSF STATUS,RP0 ; chon bank0

CLRF PORTB ; xoa porbB
BSF STATUS,RP0 ; chon bank1

MOVLW 0X00
MOVWF TRISB ; porbB-> output

BCF STATUS,RP0 ; chon bank0
MOVLW 0X8F ; gia tri can dua ra portB
MOVWF PORTB ; portB-> 8Fh

LOOP GOTO LOOP ; vong lap vo han

END ; ket thuc chuong trinh




Em viết chương trình như trên vào MPLAP , khi built lên thì nó báo lỗi. Em không hiểu sai ở chỗ nào mong các bác chỉ giáo.Cảm ơn các bác rất nhiều!
Đây là link download file : http://www.mediafire.com/?jjtzqetckfz

matranlogic
11-04-2010, 06:23 PM
Như các bác đều biết con 16F877A này phổ biến nhất dòng 16F.PIC việt nam chuyên thảo luận về PIC,ra đời khá lâu....(:confused: )nhưng số lượng về những bài viết từ cơ bản đến nâng cao cho con pic này nói chung và những con khác nói riêng về phần lập trình hầu như rất ít nếu không nói là cả tháng (:D ) không thấy bài nào nói về module mới.
Trái ngược với picvietnam, dientuvietnam là forum chung về điện tử nhưng nói về pic cực nhiều,một phần vì nó lớn tuổi hơn picvietnam.NHH không có ý so sánh gì ở đây cả, NHH chỉ nghĩ là làm sao kêu gọi mọi người đóng góp nhiều bài viết xây dựng cho picvietnam đủ mạnh để khi tịt ngòi thì có thể tìm được cách gỡ rối ngay trong chính diễn đàn của mình!
Lý do là vậy cho sự ra đời của thread này.Mong rằng sẽ có nhiều hơn những bài viết về con 16F877A này để chúng ta có thể làm chủ nó trong một thời gian sớm nhất.
Xin các bác xem xét và cho ý kiến về thread này!
Nào các bác, ta bắt đầu thôi!

cho em tham gia với các bác ơi. đã bắt đầu lâu chưa?bây giờ em tham gia có kịp k ạ?

chiduc80
17-04-2010, 01:43 PM
Mình cũng mới nghiên cứu về PIC, ae trong 4rum cho mình hỏi vài điều nha :
1. Hiện nay phần mềm giả lập PIC nào tốt ?
2. Để lập trình PIC thì dùng phân mềm nào hỗ trợ tốt nhất ?
3. Giải pháp để xử lý xuất, nhập một chuỗi ký tự, ví dụ : PIC giao tiếp với bàn phím (cổng COM), nhận một chuỗi ký tự, so sánh với bảng có sẵn trong bộ nhớ rồi đưa ra hành động tương ứng.
Rất mong ae trong 4rum giúp đỡ !!!

nhockhochoai
24-04-2010, 01:23 AM
Em đang mô phổng lịch âm dương với PIC6f877a va DS12c887 nhưng không hiểu sao LCD không thể hiển thị.chỉ sáng xanh mà thôi.các bác giúp em phát hiên lỗi với.thank nhiều nhiều...mới học về PIC nên em không hiểu chắc lắm.mong mọi ngưới giúp đỡ
protues_hex:http://www.mediafire.com/?ixdwoylnyya
title "DONG HO SO"
;processor P16f877a
;#include <P16F77a.inc>
LIST P=16F877A
#INCLUDE P16F877A.INC

__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC&_LVP_OFF
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++
; CAC BIEN
CBLOCK 020H
COUNT1
COUNT2
COUNT3
CHUC_P
DV_P
CHUC_G
DV_G
C_P
DVP
C_G
G
MAPHIM
MAQUET
R4
R7
R6
BIENTAM
ENDC
;----------------------------------------------------------------------------------------
CT ORG 0x000
CLRF STATUS
MOVLW 00H
MOVWF PCLATH
GOTO START
;-----------------------------------------------------------------------------------------
; KHAI BAO PORT
START
ORG 0x005
BCF STATUS,RP1
BSF STATUS,RP0
errorlevel -302
CLRF TRISB
errorlevel -302
CLRF TRISC
errorlevel -302
CLRF TRISD
errorlevel -302
BCF STATUS,RP0

; CHUONG TRINH CHINH
MOVLW 0X05
MOVWF C_P
MOVLW 0X07
MOVWF DVP
MOVLW 0X06
MOVWF C_G
MOVLW 0X07
MOVWF G
MOVLW 0XFE
MOVWF MAQUET

LB CALL BCD_7DOAN
CALL DELAYHIENTHI

;GIAM DVI GIAY
DECF G,1
MOVF G,0
XORLW 0XFF
BTFSS STATUS,2
GOTO LB
DECF C_G,1
MOVLW D'9'
MOVWF G

;GIAM CHUC GIAY
MOVF C_G,0
XORLW 0XFF
BTFSS STATUS,Z
GOTO LB
DECF DVP,1
MOVLW 05H
MOVWF C_G

; GIAM DVI PHUT
MOVF DVP,0
XORLW 0FFH
BTFSS STATUS,Z
GOTO LB
DECF C_P,1
MOVLW 09H
MOVWF DVP

;GIAM CHUC PHUT
MOVF C_P,0
XORLW 0FFH
BTFSS STATUS,Z
GOTO LB
BCF PORTC,4
GOTO CT

BCD_7DOAN
MOVF G,0
CALL TABLE
MOVWF DV_G

MOVF C_G,0
CALL TABLE
MOVWF CHUC_G

MOVF DVP,0
CALL TABLE
MOVWF DV_P

MOVF C_P,0
CALL TABLE
MOVWF CHUC_P

RETURN
DELAYHIENTHI
MOVLW 0x004
MOVWF COUNT1
DEL1
MOVWF 0x100
MOVWF COUNT2
DEL2
CALL HIENTHI
DECFSZ COUNT2,1
GOTO DEL2
DECFSZ COUNT1,1
GOTO DEL1
RETURN
;quetphim
KEYPRES
MOVLW D'10'
MOVWF R4
KEYPRES1
CALL KEY
BTFSS STATUS,0
GOTO PN1
RETURN
PN1
DECFSZ R4,1
GOTO KEYPRES1
MOVWF BIENTAM
KEYPRES2
MOVLW D'10'
MOVWF R4
KEYPRES3
CALL KEY
BTFSS STATUS,0
GOTO KEYPRES2
DECFSZ R4,0
GOTO KEYPRES3
MOVF BIENTAM,0
RETURN
KEY MOVF MAQUET,0
MOVWF R7
MOVLW D'4'
MOVWF R6
MOVLW 0X00
MOVWF MAPHIM
KEY1
MOVF R7,1
MOVWF PORTD
MOVF PORTD,0
ANDLW 0XF0
XORLW 0XF0
BTFSS STATUS,Z
GOTO KEY2

RLF R7,1
MOVF MAPHIM,0
ADDLW 4
MOVWF MAPHIM
DECFSZ R6,1
GOTO KEY1
CLRF STATUS
MOVLW 0XFF
RETURN
KEY2
MOVWF BIENTAM
SWAPF BIENTAM,1
KEY4
RRF BIENTAM,0
BTFSS STATUS,0 ;THIEU BIT KIEM TRA CHO LA BIT THU 0
GOTO KEY3
INCF MAPHIM,1
GOTO KEY4

KEY3
MOVF MAPHIM,0
BSF STATUS,0 ;THIEU BIT KIEM TRA CHO LA BIT THU 0
RETURN
;+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++
HIENTHI
MOVF DV_G,0
MOVWF PORTB
MOVLW 0xFE
MOVWF PORTC

CALL DELAY

MOVF CHUC_G,0
MOVWF PORTB
MOVLW 0xFD
MOVWF PORTC

CALL DELAY

MOVF DV_P,0
MOVWF PORTB
MOVLW 0xFB
MOVWF PORTC

CALL DELAY

MOVF CHUC_P,0
MOVWF PORTB
MOVLW 0xF7
MOVWF PORTC
CALL DELAY

RETURN
;+++++++++++++++++++++++++++++
DELAY
MOVLW 0xFF
MOVWF COUNT3
DELA1
DECFSZ COUNT3,1
GOTO DELA1
RETURN

TABLE
ADDWF PCL,1
DT 0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90
END

nhockhochoai
25-04-2010, 03:05 PM
Em đang mô phổng lịch âm dương với PIC6f877a va DS12c887 nhưng không hiểu sao LCD không thể hiển thị.chỉ sáng xanh mà thôi.các bác giúp em phát hiên lỗi với.thank nhiều nhiều...mới học về PIC nên em không hiểu chắc lắm.mong mọi ngưới giúp đỡ
protues_hex:http://www.mediafire.com/?ixdwoylnyya
title "DONG HO SO"
;processor P16f877a
;#include <P16F77a.inc>
LIST P=16F877A
#INCLUDE P16F877A.INC

__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC&_LVP_OFF
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++
; CAC BIEN
CBLOCK 020H
COUNT1
COUNT2
COUNT3
CHUC_P
DV_P
CHUC_G
DV_G
C_P
DVP
C_G
G
MAPHIM
MAQUET
R4
R7
R6
BIENTAM
ENDC
;----------------------------------------------------------------------------------------
CT ORG 0x000
CLRF STATUS
MOVLW 00H
MOVWF PCLATH
GOTO START
;-----------------------------------------------------------------------------------------
; KHAI BAO PORT
START
ORG 0x005
BCF STATUS,RP1
BSF STATUS,RP0
errorlevel -302
CLRF TRISB
errorlevel -302
CLRF TRISC
errorlevel -302
CLRF TRISD
errorlevel -302
BCF STATUS,RP0

; CHUONG TRINH CHINH
MOVLW 0X05
MOVWF C_P
MOVLW 0X07
MOVWF DVP
MOVLW 0X06
MOVWF C_G
MOVLW 0X07
MOVWF G
MOVLW 0XFE
MOVWF MAQUET

LB CALL BCD_7DOAN
CALL DELAYHIENTHI

;GIAM DVI GIAY
DECF G,1
MOVF G,0
XORLW 0XFF
BTFSS STATUS,2
GOTO LB
DECF C_G,1
MOVLW D'9'
MOVWF G

;GIAM CHUC GIAY
MOVF C_G,0
XORLW 0XFF
BTFSS STATUS,Z
GOTO LB
DECF DVP,1
MOVLW 05H
MOVWF C_G

; GIAM DVI PHUT
MOVF DVP,0
XORLW 0FFH
BTFSS STATUS,Z
GOTO LB
DECF C_P,1
MOVLW 09H
MOVWF DVP

;GIAM CHUC PHUT
MOVF C_P,0
XORLW 0FFH
BTFSS STATUS,Z
GOTO LB
BCF PORTC,4
GOTO CT

BCD_7DOAN
MOVF G,0
CALL TABLE
MOVWF DV_G

MOVF C_G,0
CALL TABLE
MOVWF CHUC_G

MOVF DVP,0
CALL TABLE
MOVWF DV_P

MOVF C_P,0
CALL TABLE
MOVWF CHUC_P

RETURN
DELAYHIENTHI
MOVLW 0x004
MOVWF COUNT1
DEL1
MOVWF 0x100
MOVWF COUNT2
DEL2
CALL HIENTHI
DECFSZ COUNT2,1
GOTO DEL2
DECFSZ COUNT1,1
GOTO DEL1
RETURN
;quetphim
KEYPRES
MOVLW D'10'
MOVWF R4
KEYPRES1
CALL KEY
BTFSS STATUS,0
GOTO PN1
RETURN
PN1
DECFSZ R4,1
GOTO KEYPRES1
MOVWF BIENTAM
KEYPRES2
MOVLW D'10'
MOVWF R4
KEYPRES3
CALL KEY
BTFSS STATUS,0
GOTO KEYPRES2
DECFSZ R4,0
GOTO KEYPRES3
MOVF BIENTAM,0
RETURN
KEY MOVF MAQUET,0
MOVWF R7
MOVLW D'4'
MOVWF R6
MOVLW 0X00
MOVWF MAPHIM
KEY1
MOVF R7,1
MOVWF PORTD
MOVF PORTD,0
ANDLW 0XF0
XORLW 0XF0
BTFSS STATUS,Z
GOTO KEY2

RLF R7,1
MOVF MAPHIM,0
ADDLW 4
MOVWF MAPHIM
DECFSZ R6,1
GOTO KEY1
CLRF STATUS
MOVLW 0XFF
RETURN
KEY2
MOVWF BIENTAM
SWAPF BIENTAM,1
KEY4
RRF BIENTAM,0
BTFSS STATUS,0 ;THIEU BIT KIEM TRA CHO LA BIT THU 0
GOTO KEY3
INCF MAPHIM,1
GOTO KEY4

KEY3
MOVF MAPHIM,0
BSF STATUS,0 ;THIEU BIT KIEM TRA CHO LA BIT THU 0
RETURN
;+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++
HIENTHI
MOVF DV_G,0
MOVWF PORTB
MOVLW 0xFE
MOVWF PORTC

CALL DELAY

MOVF CHUC_G,0
MOVWF PORTB
MOVLW 0xFD
MOVWF PORTC

CALL DELAY

MOVF DV_P,0
MOVWF PORTB
MOVLW 0xFB
MOVWF PORTC

CALL DELAY

MOVF CHUC_P,0
MOVWF PORTB
MOVLW 0xF7
MOVWF PORTC
CALL DELAY

RETURN
;+++++++++++++++++++++++++++++
DELAY
MOVLW 0xFF
MOVWF COUNT3
DELA1
DECFSZ COUNT3,1
GOTO DELA1
RETURN

TABLE
ADDWF PCL,1
DT 0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90
END

không ai giúp em với sao...hix

nhockhochoai
26-04-2010, 02:21 PM
sao em test bằng MPLAP thì không có lỗi gì..tạo được file HEX.mà chạy mô phỏng không được nhỉ.mọi người giúp em phát hiện lỗi với...em đang cần gấp lắm...thank trước nhiều nhiều

xuantran
04-05-2010, 04:35 PM
cac bac oi em nap chuong trinh cho pic mo phong trong protues khong dc.bien dich ra duoi .hex không được chán quá.giúp em với.giờ em mới học pic đó

tiensai
06-05-2010, 03:34 AM
bạn phải đưa ra dòng báo lỗi,hoặc các bước thực hiện thì mọi người mới giúp dc chứ!
mà bạn dùng trình biên dịch nào thế?

dinhquoctan
07-05-2010, 10:05 PM
cho e hỏi về cách tải và cài chương trình protues7.2. mong sự giúp đỡ của các anh chị. em chan thành biết ơn.

matranlogic
15-05-2010, 10:19 PM
gửi anh F và các bác trên diễn đàn! em đang nghiên cứu con PIC16F877A, bây giờ em muốn test mạch để thử nghiệm, nhưng do kinh phí k có nhiều nên em k thể mua dc mạch nạp,nên em muốn tự làm 1 cái mạch nạp cho nó,nhưng cũng k có kinh nghiệm nên nhờ anh F và các bác trên diễn đàn hướng dẫn giúp em làm một cái mạch nạp cho con PIC 16F877A dc k ạ?
em cảm ơn anh F và các bác nhiều!

gadientu_179
21-05-2010, 02:11 PM
hj! tat ca?.
cac bac hoc ve pic 16f877a ui cho minh may cai vi du de lam tieu luan dj , o thay bat lam bai ung dung cua con pic nay nhung minh chua hoc j ve pic nên chang biet j .may bac co the giup minh dc ko. o bat cho cahy tren protes ung dung cua no luon xin nho may bac.
rang giup minh nha :(

tranthao111982
02-08-2010, 05:23 PM
xin chào các bác! em mới đang tập lập trình pic6f877a. em có đoạn code ghép nối led ma trận sử dụng con 74hc595. khi viết xong không biết sai chỗ nào mà không dich sang mã hex được. mong các bác tìm lỗi sai giúp em với.
xin cảm ơn nhiều!
#include "mo rong cong.h"

#define SHCP(x) output_bit(PIN_C1,x)
#define STCP(x) output_bit(PIN_C2,x)
#define DS(x) output_bit(PIN_C0,x)

void Xuat1byte(int8 dat){
int8 k;
for(k=0;k<8;k++){
DS(shift_left(&Dat,1,0));
SHCP(0);SHCP(1);
}
STCP(0);STCP(1);
}
void main()
{
set_tris_c(0);
Xuat1byte(0x55);
Xuat1byte(0xF0);

while(1);
}

shitham
03-08-2010, 08:25 PM
sao không thấy #include<p16f877a.h> nhỉ

haomaster3000
28-08-2010, 01:18 PM
QUOTE=haoromance;286954]chào các bác. em đang làm bài báo cáo về đèn giao thông về pic 16f877a mô phỏng trên protues .do mới làm quen với pic lên em gặp chút vấn đề ve quet led7 doan .mong các bác giúp em dùm
file prouest va chuong trinh
http://www.mediafire.com/myfiles.php[/QUOTE]

ronin
30-08-2010, 01:06 AM
QUOTE=haoromance;286954]chào các bác. em đang làm bài báo cáo về đèn giao thông về pic 16f877a mô phỏng trên protues .do mới làm quen với pic lên em gặp chút vấn đề ve quet led7 doan .mong các bác giúp em dùm
file prouest va chuong trinh
http://www.mediafire.com/myfiles.php[/QUOTE]

http://www.picvietnam.com/forum/showthread.php?t=6911
ở đây nè bạn ơi.Có cả một số ví dụ nữa đó.

ronin
31-08-2010, 01:01 PM
gửi anh F và các bác trên diễn đàn! em đang nghiên cứu con PIC16F877A, bây giờ em muốn test mạch để thử nghiệm, nhưng do kinh phí k có nhiều nên em k thể mua dc mạch nạp,nên em muốn tự làm 1 cái mạch nạp cho nó,nhưng cũng k có kinh nghiệm nên nhờ anh F và các bác trên diễn đàn hướng dẫn giúp em làm một cái mạch nạp cho con PIC 16F877A dc k ạ?
em cảm ơn anh F và các bác nhiều!

Ơ đây có sẵn mạch nè bạn
http://www.picvietnam.com/forum/showthread.php?t=6911 . mạch được vẽ trên altium design 2009.
bạn đown về. Nếu bạn chưa rành về làm mạch có thể tìm trên diễn đàn cũng có nhiều người hướng dẫn làm rồi đó. Nếu k có thể liên lạc với mình qua mail xuancuongmta@gmail.com mình sẽ hướng dẫn cụ thể.

ronin
31-08-2010, 01:05 PM
cho e hỏi về cách tải và cài chương trình protues7.2. mong sự giúp đỡ của các anh chị. em chan thành biết ơn.

Dùng bản này di bạn. Dễ cài quá trời luôn.
http://www.mediafire.com/file/y90vq3xeu85vgxb/Proteus_7.4_Sp3_setup.rar

maxsu_dcmty
20-09-2010, 04:38 AM
ai bit chi minh voi?
minh bien dich ma bi loi nay tim hieu hoai hong bit tai sao mong cac ban chi voi
Clean: Deleting intermediary and output files.
Clean Warning: File "C:\Documents and Settings\Admin\Desktop\New Folder\hai.lst" doesn't exist.
Clean: Done.
Build C:\Documents and Settings\Admin\Desktop\New Folder\hai for device 16F877A
Using driver C:\Program Files\HI-TECH Software\PICC-Lite\9.50\bin\picl.exe

Executing: "C:\Program Files\HI-TECH Software\PICC-Lite\9.50\bin\picl.exe" -C "C:\Documents and Settings\Admin\Desktop\New Folder\hai.c" -q --chip=16F877A -P --runtime=default --opt=default -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Error [141] C:\Documents and Settings\Admin\Desktop\New Folder\hai.c; 1.20 can't open include file "16f877a.h": No such file or directory

********** Build failed! **********

maxsu_dcmty
20-09-2010, 03:30 PM
minh bien dich trong mplab no bi loi nay cac ban bit loi nao hong vay minh tim hoai hong ra mong cac ban chi giup

Clean: Deleting intermediary and output files.
Clean Warning: File "C:\Documents and Settings\Admin\Desktop\New Folder\h.p1" doesn't exist.
Clean: Done.
Build C:\Documents and Settings\Admin\Desktop\New Folder\jh for device 16F877A
Using driver C:\Program Files\HI-TECH Software\PICC\9.80\bin\picc.exe

Executing: "C:\Program Files\HI-TECH Software\PICC\9.80\bin\picc.exe" --pass1 "C:\Documents and Settings\Admin\Desktop\New Folder\h.c" -q --chip=16F877A -P --runtime=default --opt=default -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Error [141] C:\Documents and Settings\Admin\Desktop\New Folder\h.c; 1.22 can't open include file "16f877a.inc": No such file or directory

********** Build failed! **********

kidmaster08
21-09-2010, 11:12 AM
các bác cho em hỏi tý
em muốn tao ra một chương trình trễ dài 2 phút để điều khiển mở cho rơ le, tuy nhiên em viết chương trình của em như sau:


processor 16f877a
include <p16f877a.INC>
TG1 EQU 0X20
TG2 EQU 0X21
TG3 EQU 0X22
org 0x000
bsf STATUS,RP0
bcf STATUS,RP1
MOVLW 0X00
MOVWF TRISB
BCF STATUS,RP0
MOVLW 0X01
MOVWF PORTB gửi ra chan rb0 bit 1
CALL DELAY gọi trễ

MOVLW 0X00
MOVWF PORTB
LOOP GOTO LOOP ;treo chương trình ket thuc chuong trinh tai day

DELAY
MOVLW x ;x y z la cac gia tri tong quat
MOVWF TG1
MOVLW y
MOVWF TG2
MOVLW z
MOVWF TG3
LABLE1
DECFSZ TG1
GOTO LABLE2
GOTO EXIT
LABLE2
DECFSZ TG2
GOTO LABLE3
MOVLW y
MOVWF TG2
GOTO LABLE1
LABLE3
DECFSZ TG3
GOTO LABLE3
MOVLW z
MOVWF TG3
GOTO LABLE2
EXIT
RETURN

END

theo em tinh toán thi mỗi lệnh goto cho 2 chu kỳ lệnh, như thế khi cho số x y z cho trước em tính được thời gian trễ delay sẽ là
{3(x-1){(3y-1)[3(z-1)+4]+4} + 10 }*4/4Mhz (vơi bộ dao động 4 Mhz)
vậy khi cho x,y z =255 thì phải được thời gian trễ rất lớn 1 phút
tuy nhiên khi em mô phỏng trên protelus chưa đên 1 phút chân RB0 đã chuyển trạng thái từ 0 sang 1 rồi. em thử nghĩ ra 3 vòng lap long nhau nhu thoi hoc pascal ay ma
mấy bác kiểm tra thuật toán dùm em được không, vì mới học pic nên em hơi bỡ ngơ,hic

zztaolaozz
22-09-2010, 04:27 PM
ai có thể giải thick các chân của con lm18200 đc ko

thangdq88
23-09-2010, 10:40 PM
Bác nào có mạch thu phát đơn giản của module Rf HM-TR/RS232 với pic16f877a ko ạ (có cả code ví dụ nữa ạ) ? Có thể gửi cho em được không ạ vì em đang làm đồ án tốt nghiệp về RF nên em đang rất cần. Em xin vô cùng cảm ơn ạ :)

mail: Thangdq88@gmail.com

tronghuuvn
01-11-2010, 10:10 AM
em mới học về con PIC này nê có vấn đề này muốn hõi các bác
em có đoạn code như thế này, các bác chỉ em tính đoạn chương trình này thực hiện trong bao nhiêu chu kì với .hihihihihihi

FOR(G=0;G<=100;G++)
{
output_e(0B100);
OUTPUT_c(SO[B-1]);
OUTPUT_D(SO[B-1]);
DELAY_ms(2);
OUTPUT_B(255);
OUTPUT_D(255);
OUTPUT_E(0B010);
OUTPUT_C(SO[A]);
OUTPUT_D(SO[e]);
DELAY_mS(2);
}
Em xử dung Thạch anh 4MHz.
Cám ơn các bác nhe.hiii

lexuanhoa
02-11-2010, 11:38 PM
mình là lê xuân hòa, sinh viên trường cao đẳng kỹ thuật cao thắng tp.hcm cho mình tham gia nhóm pic16f877a với!!!

phamvanthuanpro
03-11-2010, 09:57 PM
sao cac ban ko thu lap trinh c,toi thay de hon

subasaht
08-11-2010, 08:42 AM
có pro nào biết về việc viết về code AES trên pic 16F8xx ko giúp em phát !

hoangvinhlong
09-11-2010, 08:58 AM
có bác nào trên diễn đàn co mạch điều khiển tốc độ nhanh cham và thuận nghich cua động cơ DC không cho em xin để tham khảo với, em đang rât cần nó.
nếu có xin gửi qua địa chỉ email: [email]nguyenbatrung2688@gmail.com
xin chân thành cám ơn!!!

hoangvinhlong
09-11-2010, 09:00 AM
có bác nào trên diễn đàn co mạch điều khiển tốc độ nhanh cham và thuận nghich cua động cơ DC không cho em xin để tham khảo với, em đang rât cần nó.
nếu có xin gửi qua địa chỉ email: [email]nguyenbatrung2688@gmail.com
xin chân thành cám ơn!!!

ichitea606
27-11-2010, 01:33 PM
bac NNH có biết viết về CCS không cho mình chỉ giáo với. mình cần viết 1 trương trình do nhiệt dộ hiển thị trên LCD có nút nhấn để hẹn tới nhiệt độ thì báo cháy. nhưng không biết viết như thế nào để tăng giá trị gán lên dc vậy bác giúp mình

chungpr0
04-12-2010, 07:17 PM
em đang bắt đầu học về con này.các pro nên post các bài cơ bản viết băng C cho em học hỏi với

haitaccr113
12-12-2010, 09:21 PM
Như các bác đều biết con 16F877A này phổ biến nhất dòng 16F.PIC việt nam chuyên thảo luận về PIC,ra đời khá lâu....(:confused: )nhưng số lượng về những bài viết từ cơ bản đến nâng cao cho con pic này nói chung và những con khác nói riêng về phần lập trình hầu như rất ít nếu không nói là cả tháng (:D ) không thấy bài nào nói về module mới.
Trái ngược với picvietnam, dientuvietnam là forum chung về điện tử nhưng nói về pic cực nhiều,một phần vì nó lớn tuổi hơn picvietnam.NHH không có ý so sánh gì ở đây cả, NHH chỉ nghĩ là làm sao kêu gọi mọi người đóng góp nhiều bài viết xây dựng cho picvietnam đủ mạnh để khi tịt ngòi thì có thể tìm được cách gỡ rối ngay trong chính diễn đàn của mình!
Lý do là vậy cho sự ra đời của thread này.Mong rằng sẽ có nhiều hơn những bài viết về con 16F877A này để chúng ta có thể làm chủ nó trong một thời gian sớm nhất.
Xin các bác xem xét và cho ý kiến về thread này!
Nào các bác, ta bắt đầu thôi!
Chào anh! E là thành viên mới nên cong bỡ ngỡ, tuy e đã là sv năm 3 rồi nhưng cảm thấy vẫn chưa học được gì cả. E rất thích chương trình lập trình pic này... Em mới khởi đầu mong anh chỉ giáo ạ. Thank a trước nha... Và cho e hỏi ban đầu nhập môn phải làm gì trước tiên ạ.?

quangvanvo
01-01-2011, 09:12 PM
có ai có cách nào học lập tình pic nhanh chút hem? chỉ cho mình cách thiết lập các thông số cho các thanh ghi để viết chương trình cho chính xác được không za? mình là người đang rất rất muốn học con pic!!!!!
ai có thì giử cho minh "phieudu_cunggio951@yahoo.com.vn" cám ơn nhiều nhiều lám

nguyenchontu
02-01-2011, 09:22 AM
cac pac co gang phat huy nhe. hy vong se hoc hoi dc nhiu dieu tu cac pac. hihi

monkey.D.luffy
10-01-2011, 09:27 PM
chào cả nhà,mọi người giúp mình bài này nhé,mình mới học PIC nên nhiều thứ còn chưa rõ.
Mình sử dụng PIC 16F877A để điều khiển duty PWM ổn định điện áp ra cho mạch BOOST DC-DC,đầu điện áp phản hồi là chân AN0, sử dụng CCP1 để phát xung,mình muốn chọn chu kỳ PWM = 10us mà không biết cách làm,mình từng sử dụng câu lệnh "setup_timer2(T2_DIV_BY_1,255,1)" với clock = 20MHz nhưng Ts ra vẫn ko thấy đúng,mọi người chỉ giúp mình với.
Còn đoạn chương trình sau của mình thì lại cho ra chu kỳ PWM=0,25ms mà mình cũng không hiểu.

#include<16F877A.h>
#device *=16
#use delay(clock=20000000)
void main()
{
float adc; int16 i=400;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
set_tris_c(0x00);
setup_ccp1(CCP_PWM);
set_pwm1_duty(i);
delay_ms(100);
while(1)
{
adc=(float)read_adc();
if (adc>4)
i--;
else
i++;
}
}

mọi người xem và chỉ cho mình code đúng cái

monkey.D.luffy
11-01-2011, 09:49 AM
mọi người trả lời giúp mình cái, cho mình hỏi luôn :mình muốn hiển thị giá trị điện áp phản hồi về chân adc(AN0) lên LCD thì khả năng hiện thị được có phụ thuộc vào tần số thay đổi điện áp ko vậy

quangvanvo
11-01-2011, 09:57 AM
các bác ơi em viết code ma nó cứ báo lỗi là waring là gì mà thật sự em không biêês la lỗi gì các bác giúp em giùm cái em cám ơn nhiều

monkey.D.luffy
11-01-2011, 03:09 PM
cả nhà đâu hết rồi,sao ko thấy ai trả lời cho mình thế

ham hoc
14-01-2011, 05:09 PM
chào các bác!em mới bắt đầu làm quen với con PIC 16F877 này. em có bài tập: thiết kế mạch 16 đầu vào và 16 đầu ra số sử dụng con PIC này, mà em chưa biết phải làm thế nào cả. Bác nào biết thì hướng dẫn giúp mình với.cảm ơn rất nhiều !

ham hoc
14-01-2011, 05:17 PM
sao không thấy ai hồi âm hết vậy? em đang rất cần sự hướng dẫn của các bác về bài tập này. có ai biết thì giúp em với nhé. các bác hướng dẫn giúp em qua gmail : lemung.07@gmail.com được thì tốt quá !
cảm ơn rất nhiều ạ !

manhlong
15-01-2011, 11:06 PM
sao không thấy ai hồi âm hết vậy? em đang rất cần sự hướng dẫn của các bác về bài tập này. có ai biết thì giúp em với nhé. các bác hướng dẫn giúp em qua gmail : lemung.07@gmail.com được thì tốt quá !
cảm ơn rất nhiều ạ !

đầu tiên em cần đọc datasheet con pic?
đọc help trong phần mềm lập trình cho pic thế là ok

duc.thao
16-01-2011, 09:53 PM
mình đang phải làm robot dò đường dùng encoder sử dụng pic 16f877a nhưng khó quá .có cao thủ nào từng làm qua có thể chỉ giúp mình được ko .

daoanhquan
23-02-2011, 05:30 PM
các bác cho em hỏi pic6f877a có dùng được tụ thạnh anh 12mhz không?

daoanhquan
23-02-2011, 05:32 PM
các bác cho em hỏi pic16f877a có dùng được tụ thạch anh 12mhz không?

davidquan73
26-02-2011, 11:40 AM
sao khi minh lap trinh cho con PIC16f877a
khi su dung nhu vay thi dc a[i] | 0x07 thi Ok
con khi lam nha vay a[i] | b[i] thi lai ko dc
Buils success nhung ko chay dc
tat ca deu khai bao day du het

stupid11
03-03-2011, 08:36 PM
#include<16f877a.h>
#fuses nowdt,noprotect,nolvp,xt,put
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(d)
#byte portd=0x8
#byte portb=0x6
#byte porta=0x5
#bit a0=porta.0
#bit a1=porta.1
void main()
{signed int x,y,i,chuc,dv;
int a[10]={192,249,164,176,153,146,130,248,128,144};
set_tris_a(0b00);
set_tris_b(0);
set_tris_d(0b000);
denxanh:
x=5;
portd=0b110;
goto loop;
denvang:
x=3;
portd=0b101;
goto loop;
dendo:
x=6;
portd=0b011;
goto loop;
loop:
while(1)
{chuc=x/10;
dv=x%10;
for(i=0;i<50;i++)
{portb=a[chuc];
a0=0;
a1=1;
delay_ms(10);
portb=a[dv];
a1=0;
a0=1;
delay_ms(10);
}x--;
if(x>=0)
goto loop;
else
y=portd;
switch(y)
{case 6:
{goto denvang;
break;}
case 5:
{goto dendo;
break;}
case 3:
{goto denxanh;
break;}}}}

stupid11
04-03-2011, 10:10 PM
Tai lieu hay PIC-C

hoangnhanpro
05-03-2011, 05:18 PM
chao cac anh, chi.
Em dang muon lam mot Robo do vach su dung VDK, anh chi nao co tai lieu huong dan lam va lap trinh thi cho em xin voi. em cam on.

ductai125
10-03-2011, 10:57 PM
mình đang phải làm robot dò đường dùng encoder sử dụng pic 16f877a nhưng khó quá .có cao thủ nào từng làm qua có thể chỉ giúp mình được ko .

em cũng đang làm cái đề tài về encoder, nhưng là thiết kế mạch đọc encoder dùng PIC16F877A. Mong các a/c giúp đỡ em tài liệu tham khảo hoàn thành đồ án này, SV năm 3 rồi mà em vẫn chưa biết gì hết.

ductai125
10-03-2011, 10:58 PM
mình đang phải làm robot dò đường dùng encoder sử dụng pic 16f877a nhưng khó quá .có cao thủ nào từng làm qua có thể chỉ giúp mình được ko .

em cũng đang làm cái đề tài về encoder, nhưng là thiết kế mạch đọc encoder dùng PIC16F877A. Mong các a/c giúp đỡ em tài liệu tham khảo để hoàn thành đồ án này, SV năm 3 rồi mà em vẫn chưa biết gì hết.

hoanggaara
15-04-2011, 08:54 AM
Mình có đoạn code sau tìm mãi mà không biết sai ở đâu,các bác giúp mình xíu hi

#include p16f877a.inc
__config _hs_osc&_wdt_off&_lvp_off
cblock 0x21
vong1,vong2,vong3
endc
variable giatricong=0x25
org 0x000
goto main
org 0x005
banksel trisb
clrf trisb
banksel portb
start
bsf portb,0
call delay
bcf portb,0
call delay
goto start
delay
nop
nop
movlw d'187
movwf vong1
movlw d'4
movwf vong2
movlw d'2
movwl vong3
decfsz vong1,f
goto $-1
decfsz vong2,f
goto$-3
decfsz vong3,f
goto $-5
return
end

levuphuong
22-07-2011, 06:50 PM
cho mình hỏi hỏi con 16f877 khác con 16f877a chỗ nào vậy.trên diền đàn toàn thấy hướng dẫn về 16f877a ko ah :(
code nó dùng chụng được ko em minh nó về đã học cề pic thế chạy code thực tế xem thế nào chứ mô phỏng hoài chán quá.
Mọi người hướng dẫn em cách cắm dây đơn giản làm sao đề nói pic với 1 lcd 2x8
Em mới đi mới linh kiện về mà chưa biết lắp sao (gắn nguồn thế nào)
Xin cám ơn mọi người.

lmtan91
02-10-2011, 12:26 AM
cho em hỏi
Đoạn code này dịch led nhưng nó chỉ dịch được 1 lần
processor 16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF&_WDT_OFF&_BODEN_ON&_PWRTE_ON&_XT_OSC&_WRT_OFF&_LVP_ON&_CPD_OFF
count1 EQU 0x20
counta EQU 0x21
countb EQU 0x22
temp EQU 0x23
ORG 0x00
GOTO start
start
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISB
BCF STATUS,RP0 ;BANK0
MOVLW b'00000001'
MOVWF temp
LOOP
MOVWF PORTB
CALL delay_100
ADDLW d'1'
;CALL delay_100
GOTO LOOP
delay_100
MOVLW d'100'
MOVWF count1
d1
MOVLW d'199'
MOVWF counta
MOVLW d'1'
MOVWF countb
delay
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay
DECFSZ count1,1
GOTO d1
RETURN
END

tdm
02-10-2011, 03:32 PM
cho em hỏi
Đoạn code này dịch led nhưng nó chỉ dịch được 1 lần
processor 16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF&_WDT_OFF&_BODEN_ON&_PWRTE_ON&_XT_OSC&_WRT_OFF&_LVP_ON&_CPD_OFF
count1 EQU 0x20
counta EQU 0x21
countb EQU 0x22
temp EQU 0x23
ORG 0x00
GOTO start
start
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISB
BCF STATUS,RP0 ;BANK0
MOVLW b'00000001'
MOVWF temp
LOOP
MOVWF PORTB
CALL delay_100
ADDLW d'1'
;CALL delay_100
GOTO LOOP
delay_100
MOVLW d'100'
MOVWF count1
d1
MOVLW d'199'
MOVWF counta
MOVLW d'1'
MOVWF countb
delay
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay
DECFSZ count1,1
GOTO d1
RETURN
END
bạn cộng 1 vào W khi gọi ct con delay thì giá trị trong W đã bị thay đổi.
thử lại:
cộng 1 vào temp từ temp xuất ra port

bodi21312
04-10-2011, 11:26 PM
Em mới học Pic thôi! mong mọi người giúp em phần Ngắt. em viết code dùng ngắt để chạy Led, mặt khác thì chương trình dùng để chạy led 7 đoạn. Nhưng chẳng hiểu sao chỉ có led7 hoạt động còn ngắt chẳng thấy đâu. Help gấp, help gấp....
code:
/////////////////khai bao ngat///////////////////
#INT_TIMER0
void chayled()
{
int8 i,a,x,t;
i=8;
SET_TRIS_B( 0x00);
lap:
a=0x01;
x=a;
for(i=1;i<=8;i++)
{
OUTPUT_b(x);
delay_ms(500);
rotate_left( &a, 1);
x=x+a;
}
a=0x00;
t=2;
for(t=0;t<=2;t++)
{
x=0xff;
OUTPUT_b(x);
delay_ms(500);
x=0x00;
OUTPUT_b(x);
delay_ms(500);
}
/////////////////////////////////////////////
a=0x80;
x=a;
for(i=1;i<=8;i++)
{
OUTPUT_b(x);
delay_ms(500);
rotate_right( &a, 1);
x=x+a;
}
a=0x00;
t=2;
for(t=0;t<=2;t++)
{
x=0xff;
OUTPUT_b(x);
delay_ms(500);
x=0x00;
OUTPUT_b(x);
delay_ms(500);
}
goto lap;
}

void main()
{

ENABLE_INTERRUPTS(INT_RB);//ngat tiner 0
ENABLE_INTERRUPTS(GLOBAL);//cho phep ngat toan cuc
re: SET_TRIS_D(0Xff);
SET_TRIS_C(0xff);
for(a=0;a<20;a++)
{
chuyenma();
delay_ms(10);
hienthi();
delay_ms(500);
}
a=0;
goto re;

}

bankjmun
05-10-2011, 10:27 AM
Hiện nay mình đang sở hữu 1 module SIM300cz còn mới 100% chưa qua sử dụng (gồm SIM300Cz, RF Cable, Connector, Sim carholder, Anten GSM ). Mình mua bộ đó tổng cộng là 714.000vnđ (mình vẫn còn giữ hóa đơn) vừa rồi ra trường có làm đồ án về hệ thống điều khiển từ xa nên đã mua module đó để làm nhưng lại ko sử dụng. Ai cần module để thực hành hoặc thực nghiệm thì liên lạc với mình qua các thông tin sau nhé (mình ở Hà Nội.ok). Mình sẽ nhượng lại với giá 450.000vnđ (đã bao gồm nước nôi trà đá trong khi giao dịch.hehe)
Name : Nguyễn Ban
Mobile : 0976 767 141
Mail : nguyenban68@gmail.com

phong172
23-10-2011, 12:07 PM
giới thiệu giup mình một bộ mạch nạp pic chạy dược trên win7 nha
ai biết chỉ giúp mình nha.giá khoảng 200k thôi

thanga7a
24-10-2011, 12:59 PM
sao ko viết bằng c hả bạn

viết bằng c cho dễ hiểu

viết bằng asm dài mà rối wa

nguyenbaotrung
25-10-2011, 12:32 AM
bác nào biết làm mạch đếm sản phẩm ko?,đếm 2 ngõ vào hiển thị lên 1 LCD luôn,dùng pic 16f877a,giúp mình với ,sắp nộp rồi !!!

huydungsh
27-10-2011, 12:20 AM
bạn ơi cho mình hỏi mấy dòng lệnh này nha:
"#include <16F84.h>
#use delay(clock=20000000)
#use fast_io(A)
#use fast_io(B)
int bin2BCD(int bin)
{ /* CT đổi từ 1 số nhị phân ra số BCD 2
ký số, chỉ đúng cho số nhị phân này có trị
<= 99 */
int BCD;
BCD = ((bin/10) << 4) + bin % 10;
return BCD;
}
void main()
{
int counter=0,counter_BCD=0;
set_tris_a(0x01); /* Pin A0 is Input port
pin */
set_tris_b(0x00); /* Output Port B
configuration*/
while (1)
{
output_b(counter_BCD);
while(!input(PIN_A0)); // đợi cho
đến khi A0 = 1
while(input(PIN_A0)); // đợi cho đến
khi A0 = 0  phát hiện cạnh xuống
counter++;
if (counter == 100) counter = 0;
counter_BCD=bin2BCD(counter);"
Trong chương trình trên mình muốn hỏi về
" int bin2BCD(int bin)
{ /* CT đổi từ 1 số nhị phân ra số BCD 2
ký số, chỉ đúng cho số nhị phân này có trị
<= 99 */
int BCD;
BCD = ((bin/10) << 4) + bin % 10;
return BCD;"
Nghĩa là gì vậy mình mới học lập trình nên gà lắm mong bạn giải thích cho mình cảm ơn nhiều nha.

trungle_nt89
11-11-2011, 10:22 AM
mình mới mua mạch nạp GTP_USB nhưng đề tài mình yêu cầu dùng dspic30f4011,nên không dùng được, nếu bạn nào có nhu cầu mua lại thì mình bán lại với giá 180k, nếu có ý định mua thì liên hệ với mình qua mail nktrungle@gmail.com. SDT 01228629293 or 01696975748

lenphat123
16-11-2011, 11:13 PM
mh dang can code viet bang ccs giao tiep giua pic16f877a voi the mmc/sd theo chuan spi.Moi nguoi aj bt hay giup do minh voi

cuongero2012
20-12-2011, 09:54 PM
cho em hỏi: em dùng con 16F877A điều khiển led đơn dùng 2 cổng ra B,C. các anh giúp em code điều khiển led đơn 8 con post B chạy sáng dần , đồng thời 8 con led post C cũng chạy cùng một lúc. post B và post C chạy riêng biệt. (cách làm led chạy thì em bit rùi, còn làm đồng thời 2 post cùng chạy nhưng riêng biệt thì em chưa biết, mong các anh giúp...)

vanthanhbk06d6
03-01-2012, 07:37 PM
chào các anh chị.nhân tiện đây cho em hỏi.khi mình bắt đầu lập trình pic.thì trước tiên mình những cần phần mềm gì.... và cách tiến hành từng tự để tạo ra một mạch hoàn thiện.cảm ơn các anh chị nhiều

son_bg
18-02-2012, 11:51 PM
sao không thấy ai trả lời các bạn hỏi vậy :-s

duongvietin
19-02-2012, 04:16 PM
minh k hieu ve nguyen ly chay chu tren led ma tran mong giup minh

nguyenthach.tdh
26-02-2012, 02:08 AM
bác nào biết code công 2 số 16 bit cho pic16f84a hay p16f877a?

thanhbinh_bf
27-02-2012, 06:12 PM
Em đang làm quang báo led matrix 8x8 dùng 16f877A lập trình bằng CCS, em viết một bảng font riêng gồm các chữ cái từ A-Z, các số 0-9 và các kí tự đặc biệt nhưng khi em goi bảng font vào chương trình (#include font.h) thì chương trình dịch báo là không đủ Ram cho bảng font trên. Vậy các anh cho em hỏi có thể dùng lênh nào để lưu bảng font vào bộ nhớ Flash của 16F877A được không ạ ????

TRANTHEHIEU
20-03-2012, 03:58 PM
có ai làm về brusshless DC chưa?có thể hướng dẫn mình đc không?
chúng ta cùng nhau thảo luận

hoangclick
23-03-2012, 02:37 AM
Chào các bác, em mới tham gia vào diễn đàn và cũng là lần đầu tiếp xúc với pic nên rất gà, các bro cho em hỏi là:
1. Khi mình mua con PIC 16f877a về rồi nhưng không biết chân số 1 nằm ở đầu nào ?
2. Và trên cái Board GL No.12 thì mình nối đất như thế nào? và làm sao biết được đầu nào là cực dương hay âm?

JackSanji
24-03-2012, 06:32 PM
Chào các bác, em mới tham gia vào diễn đàn và cũng là lần đầu tiếp xúc với pic nên rất gà, các bro cho em hỏi là:
1. Khi mình mua con PIC 16f877a về rồi nhưng không biết chân số 1 nằm ở đầu nào ?
2. Và trên cái Board GL No.12 thì mình nối đất như thế nào? và làm sao biết được đầu nào là cực dương hay âm?

chào bạn, mình cũng mới học về PIC, có thể trả lời bạn như sau:
1. chân 1 là chân có chấm ở trên, nếu bạn cầm thuận con PIC thì thấy nó ở phía dưới và ở bên trái.
2. bo mạch đó không quy định cực nào là cực dương hay âm, cái này là tùy bạn đấu vào thôi,

duybeo1512
24-03-2012, 10:58 PM
em chào các bác.
em cũng mới gia nhập cả nhà mình nhưng em cũng mù tịt lắm, chưa biết gì cả. em nhờ các bác viết giúp em một chương trình đèn giao thông theo thời gian thực từ 22h đến 5h thì chỉ nháy đèn vàng thôi.
các bác giúp em với

duybeo1512
24-03-2012, 11:03 PM
em chào các bác.
em cũng mới gia nhập cả nhà mình nhưng em cũng mù tịt lắm, chưa biết gì cả. em nhờ các bác viết giúp em một chương trình đèn giao thông theo thời gian thực từ 22h đến 5h thì chỉ nháy đèn vàng thôi.
các bác giúp em với

cuongqs87
26-03-2012, 04:30 PM
can mua cam bien sieu am gia re

QuangVuAuto
10-04-2012, 11:11 PM
Em chỉ vừa làm quen với pic 16f877a nên có rất nhìu thắc mắc nhưng vẫn chưa tìm được nguồn giải quyết. Nay mong các anh và bạn giúp đỡ thêm. Sau đây là các câu hỏi của e.

1. Các đặc tính cơ bản của pic 16f877a. 16f877a có các bộ nhớ nào. Bộ nhớ chương trình 16f877a chứa được tối đa bao nhiu lệnh.
2. Tại sao thanh ghi PC chỉ cần 13bit
3. Bộ nhớ dữ liệu có bao nhiu byte, chia làm mấy bank va các thanh ghi nào
4. Nhiệm vụ của thanh ghi SFR va GPS
5. Có thể phân loại theo nhiem5 vụ của SFR thành bao nhiêu loại
6. Các kí hiệu mã số cho biết thông tin về vi điều khiển pic
7. Vùng nho71Stack dùng để làm gì và hoạt động ra sao? có thể cho ví dụ minh họa
8. Muốn chân nào đó của 16f877a là chân xuất thì phải cài đặt trong thanh ghi nào
9. Ngoài chức năng I/O thì các port A B C D E còn có chức năng nào
Ai trả lời được câu nào thì giúp e với... Xin cám ơn rất nhiều!!!!

huynhquanghuy9x
26-04-2012, 12:10 AM
Các bác pro có thể giúp em với cái bài tập lớn này với:
Lập trình PIC 16F877A với 4 Led Matrix, viet bằng ASM Quét hiển thị chữ chạy 4 chữ VT0A
nếu đc cho xin luôn file protues & orcad