![]() |
|
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 |
![]() |
#46 |
Đệ tử 9 túi
|
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 ![]() ![]() chúc mọi người thành công. |
![]() |
![]() |
![]() |
#47 | |
Đệ tử 9 túi
|
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. ![]() ngohaibac cứ mắc mạch như ntc: Trích:
Chào!
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 thay đổi nội dung bởi: nhh, 20-03-2006 lúc 06:26 PM. |
|
![]() |
![]() |
![]() |
#48 | |
Đệ tử 9 túi
|
Trích:
Hy vọng sớm hoàn thành! ![]() Chào!
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#49 |
Đệ tử 9 túi
|
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/show...6&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. |
![]() |
![]() |
![]() |
#50 |
Đệ tử 9 túi
|
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/e...tes/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: ![]() 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? thay đổi nội dung bởi: ngohaibac, 21-03-2006 lúc 12:18 AM. |
![]() |
![]() |
![]() |
#51 | |
Đệ tử 9 túi
|
Trích:
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#52 |
Đệ tử 2 túi
Tham gia ngày: Feb 2006
Bài gửi: 31
: |
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! |
![]() |
![]() |
![]() |
#53 |
Đệ tử 2 túi
Tham gia ngày: Feb 2006
Bài gửi: 31
: |
em có đoạn chương trình này!
// 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: ![]() 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ế? |
![]() |
![]() |
![]() |
#54 |
Đệ tử 9 túi
|
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!
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
![]() |
![]() |
![]() |
#55 |
Đệ tử 9 túi
|
Digital clock
Ý 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í !
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
![]() |
![]() |
![]() |
#56 |
Đệ tử 9 túi
|
Code:
;======================================== ;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
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
![]() |
![]() |
![]() |
#57 |
Đệ tử 9 túi
|
Code:
: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 ![]()
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
![]() |
![]() |
![]() |
#58 |
PIC Bang chủ
|
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.
__________________
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? |
![]() |
![]() |
![]() |
#59 | |
Đệ tử 9 túi
|
Trí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ụ: Code:
volatile static near unsigned char PORTA @ 0xF80; 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 ![]() |
|
![]() |
![]() |
![]() |
#60 |
Đệ tử 2 túi
Tham gia ngày: Feb 2006
Bài gửi: 31
: |
hehe, làm ăn phải như thế chứ
![]() cảm ơn bác Bắc nhé, em hiểu rùi thay đổi nội dung bởi: pb1, 26-03-2006 lúc 01:22 AM. |
![]() |
![]() |
![]() |
|
|
![]() |
||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
TUT về USART trong PIC16F877A | mafd_47a | MPASM | 16 | 19-02-2025 05:32 AM |
TUT ve I2C ( pic16f877a ) | mafd_47a | MPASM | 28 | 28-01-2025 10:45 PM |
Bộ so sánh và PWM cho PIC16F877A | anhquangngai | Cơ bản về vi điều khiển và PIC | 24 | 08-09-2012 09:00 AM |
Pic16f877a TỪ DỄ TỚi KhÓ | ntc | Cơ bản về vi điều khiển và PIC | 373 | 23-05-2009 10:24 PM |
CCS C for PIC16F877A | nhh | Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) | 405 | 24-04-2008 12:00 PM |