![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#76 |
PIC Bang chủ
|
Thử xem lại việc quản lý các cờ ngắt.
Chúc vui
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
![]() |
![]() |
![]() |
#77 |
Đệ tử 2 túi
Tham gia ngày: Mar 2007
Bài gửi: 45
: |
HIC HIC, anh nào giup em di
__________________
Cổng trường Đại học cao vời vợi Đồng ruộng mênh mong đón em về! |
![]() |
![]() |
![]() |
#78 |
Đệ tử 2 túi
Tham gia ngày: Mar 2007
Bài gửi: 45
: |
a anh ơi~! em viết chạy ổn rồi ne!
Code:
#include "E:\ccs c\chuong_trinh_ccsc\banh_kem_duc_thanh\chuong_trinh.h" #int_RB RB_isr() { int8 y; disable_interrupts(INT_RB); disable_interrupts(GLOBAL); if ( input(PIN_B6) ) //tang gia tri trong o nho { y = read_eeprom(0x00); if(y<244) { y = y + 10; write_eeprom (0x00,y); } } if ( input(PIN_B7) ) //giam gia tri trong o nho { y = read_eeprom(0x00); if(y>10) { y = y - 10; write_eeprom (0x00,y); } } delay_ms(50); enable_interrupts(GLOBAL); enable_interrupts(INT_RB); } //===========CAC CHUONG TRINH CON============== void tao_tre(int8 x); //============================================ void main() { output_B(0x00); output_A(0x00); enable_interrupts(INT_RB); enable_interrupts(GLOBAL); while(1) { output_high(pin_B0); tao_tre(1); output_low(pin_B0); tao_tre(1); output_high(pin_B1); tao_tre(1); output_low(pin_B1); tao_tre(1); output_high(pin_B2); tao_tre(1); output_low(pin_B2); tao_tre(1); output_high(pin_B3); tao_tre(1); output_low(pin_B3); tao_tre(1); output_low(pin_B0); output_low(pin_B1); output_low(pin_B2); output_low(pin_B3); tao_tre(1); output_high(pin_B0); output_high(pin_B1); output_high(pin_B2); output_high(pin_B3); tao_tre(1); output_low(pin_B0); output_low(pin_B1); output_low(pin_B2); output_low(pin_B3); tao_tre(1); } } //============================================ void tao_tre(int8 x) { int8 z,i; z = x + read_eeprom (0x00); delay_ms(100); for(i=0;i<z;++i) delay_ms(2); } //===========================================
__________________
Cổng trường Đại học cao vời vợi Đồng ruộng mênh mong đón em về! thay đổi nội dung bởi: falleaf, 28-05-2007 lúc 10:09 AM. |
![]() |
![]() |
![]() |
#79 |
Đệ tử 2 túi
Tham gia ngày: Mar 2007
Bài gửi: 43
: |
+ Cho em hỏi về phần nút bấm với điện trở kéo lên. Khi bấm thì chân ở mức thấp (ok); khi ko bấm thì lam sao biết được trạng thái của chân? (do chân mắc với nguồn qua điện trở nên điện áp ở chân ko biết xác định thế nào, vẫn có thể là H hoặc L).
+ Đặt chân là input với điện áp là 0. Nếu nối chân đó với nguồn 5V thì nó sẽ chuyển từ 0-->5V và dòng điện sẽ chạy từ nguồn vào chân Pic? Còn nếu là output thì sao dòng điện sẽ chạy đi đâu? Mấy cái này em vẫn chưa thông lắm... |
![]() |
![]() |
![]() |
#80 | |
Trưởng lão PIC bang
|
Trích:
2. Câu này bạn hỏi không rõ ràng: 'Còn nếu là output thì sao dòng điện sẽ chạy đi đâu?'. Nếu bạn muốn biết khi bạn xuất mức cao hay thấp thì dòng điện sẽ chạy ra sao thì câu trả lời thế này: khi bạn xuất mức cao, MOSFET phía cao của cặp transistor ngõ ra sẽ dẫn, do đó ngõ ra là gần bằng 5V và PIC cấp dòng cho tải, nếu có tải thì tùy theo dòng tải mà điện áp ở ngõ ra sẽ bị giảm nhiều hay ít do áp rơi trên MOSFET phía cao. Khi bạn xuất mức thấp, MOSFET phía thấp của cặp transistor ngõ ra sẽ dẫn, do đó ngõ ra là gần bằng 0V và PIC rút dòng từ tải xuống Vss, nếu có tải thì tùy theo dòng tải mà điện áp ở ngõ ra sẽ cao hơn Vss nhiều hay ít do áp rơi trên MOSFET phía thấp. Bạn xem thêm mục I/O Ports trong các datasheet của chip sẽ thấy họ vẽ cấu trúc của ngõ ra. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#81 |
Nhập môn đệ tử
Tham gia ngày: Oct 2006
Bài gửi: 8
: |
- Bác nào rảnh giải thích giúp em cái hàm Delay này cái:
Code:
Delay Movlw d’250’ Movwf count1 D1 Movlw 0xc7 Movwf counta Movlw 0x01 Movwf countb Delay_0 Decfsz counta, f Goto $+2 Decfsz countb, f Goto Delay_0 Decfsz count1, f Goto D1 Return - và lệnh "Goto Delay_0" với "Goto D1" thì có gì khác nhau? em thấy trong một số hàm Delay người ta chỉ dùng có lệnh "Goto Delay_0" Em xin cảm ơn rất nhiều. thay đổi nội dung bởi: namqn, 30-03-2008 lúc 07:52 PM. |
![]() |
![]() |
![]() |
#82 |
Trưởng lão PIC bang
|
$ là địa chỉ lệnh hiện hành, $ + 2 là ô nhớ lệnh cách vị trí hiện hành 2 đơn vị.
Với ví dụ trên của bạn (giả sử viết cho PIC16), lệnh GOTO $ + 2 dùng để chuyển điều khiển đến lệnh GOTO Delay_0 nếu sau khi giảm biến counta kết quả vẫn khác 0 (tức là nếu sau khi giảm counta mà counta vẫn khác 0 thì bỏ qua lệnh giảm countb). Đoạn chương trình trên dùng 3 biến đếm, do đó nếu cập nhật counta, rồi countb, thì sẽ đến lượt count1 được cập nhật. Do đó cần dùng các nhãn Delay_0 hay D1 cho các lệnh GOTO một cách thích hợp. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
![]() |
![]() |
![]() |
#83 |
Nhập môn đệ tử
Tham gia ngày: Oct 2006
Bài gửi: 8
: |
- Cảm ơn anh Nam đã giúp đỡ:
em viết hàm delay như này được không? và hai cái này khác nhau ở chỗ nào? Code:
Delay Movlw d’250’ Movwf count1 Movlw 0xc7 Movwf counta Movlw 0x01 Movwf countb Delay_0 Decfsz counta Goto Delay_0 Decfsz countb Goto Delay_0 Decfsz count1 Goto Delay_0 Return |
![]() |
![]() |
![]() |
#84 |
Nhập môn đệ tử
Tham gia ngày: Apr 2008
Bài gửi: 5
: |
Chài khó hiểu quá mấy bác ơi
|
![]() |
![]() |
![]() |
#85 |
Nhập môn đệ tử
Tham gia ngày: Mar 2008
Bài gửi: 6
: |
PIC16 thì em không biết nhưng với PIC18F4580 thì không cần lưu lại giá trị của PCLATH :
1>Bình thường nếu không có tác động trực tiếp thì thanh ghi PCLATH sẽ không thay đổi giá trị, kể cả khi PC thay đổi từ địa chỉ 0xFF đến 0x100. Lúc đó PCL=00 và PCLATH=00. ( Kết quả có được nhờ giả lập MPLAB SIM) 2>Sau lenh RETIF hoặc RET thì chương trình đọc PC từ Stack (TOSL, TOSH, TOSU). Lúc này PC sẽ được phục hồi như ngay tại thời điểm gặp ngắt, hoặc lệnh CALL. Nhưng PCLATH vẫn không bị thay đổi nếu không có lệnh tác động trực tiếp (chẳng hạn MOVWF PCLATH) 3>Thanh ghi PCLATH chỉ có tác dụng khi ta tác động ghi lên thanh ghi PCL, chẳng hạn: + với PCLATH=1 thì lệnh MOVWF PCL sẽ làm cho PC=0x100 ( với WREG=0) Nói túm lại bình thường PC không tham khảo đến thanh ghi PCLATH, chỉ khi có tác động ghi trực tiếp lên thanh ghi PCL thì PC mới tham khảo đến nó. Theo em thấy thì khi sử dụng bảng mới thực sự cần đến thanh ghi PCLATH Em là Newbie, có sai sót gì thì nhẹ nhàng chỉ bảo em ^^ thay đổi nội dung bởi: thaile, 13-04-2008 lúc 09:51 PM. |
![]() |
![]() |
![]() |
#86 |
Nhập môn đệ tử
Tham gia ngày: Apr 2008
Bài gửi: 3
: |
co thể chạy chương trinh MPLAB ngay trong CCS C không
co thể vừa viết MPLAB và CCS C cung trong CCS C không |
![]() |
![]() |
![]() |
#87 | |
Trưởng lão PIC bang
|
Trích:
Bản thân CCS cũng có IDE. Tuy nhiên, IDE của CCS không hỗ trợ các trình biên dịch của Microchip (MPLAB C18, MPLAB C30, MPLAB C32). Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#88 |
Nhập môn đệ tử
Tham gia ngày: Oct 2006
Bài gửi: 8
: |
Code:
;============================================================================================== ;KHOI TAO VI DIEU KHIEN TITLE "TUTORIAL_1" PROCESSOR P16F628A INCLUDE <P16F628A.INC> __CONFIG _CP_OFF&_PWRTE_OFF&_WDT_ON&_HS_OSC ;============================================================================================== ;PHAN DAT BIEN ORG 0x20 COUNT1 RES 1 COUNTA RES 1 COUNTB RES 1 ;============================================================================================== ORG 0x0000 GOTO MAIN ORG 0x0005 MAIN ; MOVLW 0x07 ;CHUYEN 0000 0111 VAO THANH GHI W ; MOVWF CMCON ;TAT THANH GHI SO SANH BANKSEL TRISB CLRF TRISB BANKSEL PORTB CLRF PORTB LOOP MOVLW B'11111111' ;W = 1111 1111 MOVWF PORTB ;SANG CAC LED CALL DELAY ;GOI HAM TAO TRE MOVLW B'00000000' ;W = 0000 0000 MOVWF PORTB ; TAT LED CALL DELAY ;GOI HAM TAO TRE MOVLW B'11111111' ;W = 1111 1111 MOVWF PORTB ; CALL DELAY ;GOI HAM TAO TRE MOVLW B'00000000' ;W = 0000 0000 MOVWF PORTB CALL DELAY ;GOI HAM TAO TRE MOVLW B'11111111' ;W = 1111 1111 MOVWF PORTB ; CALL DELAY ;GOI HAM TAO TRE MOVLW B'00000000' ;W = 0000 0000 MOVWF PORTB CALL DELAY ;GOI HAM TAO TRE MOVLW B'11111111' ;W = 1111 1111 MOVWF PORTB ; CALL DELAY ;GOI HAM TAO TRE MOVLW B'10000000' MOVWF PORTB LOOP_1 CALL DELAY BCF STATUS, C RRF PORTB BTFSS STATUS, C GOTO LOOP_1 MOVLW B'00000001' MOVWF PORTB LOOP_2 CALL DELAY BCF STATUS,C RLF PORTB BTFSS STATUS,C GOTO LOOP_2 MOVLW B'11000000' MOVWF PORTB CALL DELAY MOVLW B'11100000' MOVWF PORTB CALL DELAY MOVLW B'11110000' MOVWF PORTB CALL DELAY MOVLW B'11111000' MOVWF PORTB CALL DELAY MOVLW B'11111100' MOVWF PORTB CALL DELAY MOVLW B'11111110' MOVWF PORTB CALL DELAY MOVLW B'11111111' MOVWF PORTB CALL DELAY GOTO LOOP ;GO BACK AND DO IT AGAIN ;============================================================================================== ;CHUONG TRINH CON ;---------------------------------------------------------------------------------------------- DELAY MOVLW D'255' ; MOVWF COUNT1 ;COUNT1 = 255 MOVLW d'255' ; MOVWF COUNTA ; MOVLW d'51' ; MOVWF COUNTB DELAY_1 DECFSZ COUNT1 ;COUNT1 = COUNT1 - 1 GOTO DELAY_1 ;QUAY TRO LAI NHAN DELAY ; DECFSZ COUNTA ;COUNTA = COUNTA - 1 ; GOTO DELAY_1 DECFSZ COUNTB GOTO DELAY_1 RETURN GOTO $ END - Anh nào biết nó sai ở chỗ nào chỉ giúp em với. Mạch em dùng thạch anh 10Mhz, tụ gốm 33p. Cảm ơn các anh nhiếu thay đổi nội dung bởi: vodka1505, 20-04-2008 lúc 08:50 AM. |
![]() |
![]() |
![]() |
#89 |
Nhập môn đệ tử
Tham gia ngày: Oct 2006
Bài gửi: 8
: |
không có ai giúp mình sao? đang cần quá.
|
![]() |
![]() |
![]() |
#90 |
Trưởng lão PIC bang
|
Bạn đã khẳng định là chương trình chạy tốt rồi, chỉ có thay đổi thiết lập cấu hình từ bộ dao động nội sang thạch anh ngoài thôi. Như vậy có nhiều khả năng là thạch anh không dao động (đã có bạn gặp trường hợp là chân OSC2 bị hỏng, do đó chỉ dùng được cấu hình clock ngoài, không dùng được cấu hình thạch anh ngoài). Bạn cũng chú ý là bạn đang bật WDT, và trong code không hề có lệnh xóa WDT. Có khả năng là bạn tắt WDT khi chạy bằng bộ dao động nội, và bật WDT khi cấu hình lại để dùng thạch anh ngoài hay không?
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
![]() |
![]() |
![]() |
|
|