![]() |
Pic 18f452
Cho em hỏi về sự khác biệt giữa dòng 18Fxxx voi dong 16Fxxx. Hiện tại em đang làm project với con 18F452 nhưng chưa biết nên bắt đầu từ đâu.
|
Dòng PIC18F mạnh hơn so với dòng PIC16F, nhờ độ dài từ lệnh lớn hơn (16-bit so với 14-bit), một số khối ngoại vi cũng tốt hơn. Cấu trúc của chip thì không khác gì nhau. Bạn nên bắt đầu bằng việc lấy datasheet của PIC18F452 về nghiền ngẫm.
Thân, |
Cho em hỏi là trong con 18F452 thì TRISA, TRISB, TRISC nằm ở BANK nào? Vì trong datasheet của 18F452 không có ghi rõ những register này nằm ở đâu. Trong khi trong những con khác thuộc dòng 16F thì được ghi rõ ràng.
|
Tất cả các thanh ghi đặc biệt (SFR) của dòng PIC18 đều nằm ở bank 15, được chọn bằng cách đặt các bit BSR<3:0> của thanh ghi BSR là '1111' (giá trị nhị phân). Tuy nhiên, dòng PIC18 có thể truy xuất các thanh ghi đặc biệt thông qua Access Bank (với bit a = 0, bạn xem thêm trong tập lệnh), khi đó không cần quan tâm tới bank vì thanh ghi chọn bank BSR sẽ không được xét.
Thân, |
Em đang tập viết mộ chương trình đơn giản cho PIC 18f452 là làm sáng LED. Đoạn code như sau:
" list p=18f452 #include p18f452.inc ORG 0x000 GOTO start start CLRF PORTB CLRF TRISB MOVLW B'00011111' ;bật sáng LED ở vị trí từ RB0 đến RB4 MOVWF TRISB loop GOTO loop END " Em không biết có gì sai nhưng LED không sáng. Có ai chỉ dum em với. |
Trích:
MOVLW B'00011111' ;bật sáng LED ở vị trí từ RB0 đến RB4 MOVWF TRISB Hai lệnh này sẽ chuyển RB0 đến RB4 thành ngõ vào! TRISB nên sửa thành LATB hay PORTB. Cũng cần kiểm tra xem các bit cấu hình của bạn có được đặt đúng không, vì trong chương trình này bạn không đặt các bit cấu hình tường minh, theo mặc định thì chip sẽ chạy với bộ dao động RC bên ngoài! Thân, |
Vậy theo anh có thể viết như thế nào để con 18f này chạy? Cấu hình con PIC của em như sau: dùng xung 8Mhz, 2 tu 22pF nối vào crystal. Em dùng ICD2 và MPLAB để program cho con PIC này.
Em kiếm tài liệu nói về con nay mà tìm mãi không được. Em đã đọc hướng dẫn của con 16F877A nhiều lần và cũng đã làm thử tương tự nhưng kô được. Trong con 18F452 hình như không cần phải configure nó đúng không anh? Em có đọc 1 đoạn code mẫu cho con 18F452, và kô cần phải configure như 16f. Đây là đoạn code mẫu ;************************************************* ********* ;* TUT452.ASM ;************************************************* ********* ;* Microchip Technology Incorporated ;* 17 March 2003 ;* Assembled with MPASM V3.20 and MPLINK v3.20 ;************************************************* ********* ;* This program configures the A/D Module to convert on ;* A/D channel 0 (the potentiometer) and display the ;* results on the LEDS on PORTB. ;************************************************* ********* list p=18f452 ; Include file, change directory if needed include "p18f452.inc" ; Start at the reset vector Reset_Vector code 0x000 goto Start ; Start application beyond vector area code 0x002A Start clrf PORTB ;Clear PORTB clrf TRISB ;PORTB all outputs, display 4 MSB's ;of A/D result on LEDs movlw B'01000001' ;Fosc/8, A/D enabled movwf ADCON0 movlw B'00001110' ;Left justify,1 analog channel movwf ADCON1 ;VDD and VSS references movlw B'11000111' ;TMR0 prescaler, 1:256 movwf T0CON Main btfss INTCON,TMR0IF ;Wait for Timer0 to timeout goto Main bcf INTCON,TMR0IF bsf ADCON0,GO ;Start A/D conversion Wait btfss PIR1,ADIF ;Wait for conversion to complete goto Wait swapf ADRESH,W ;Swap A/D result nibbles andlw 0x0f ;Mask off lower 4 bits movwf PORTB ;Write A/D result to PORTB clrf PORTB WaitPush ;Pause while switch is pressed btfss PORTA,4 goto WaitPush movwf PORTB goto Main ;Do it again end Anh có thể viết một chương trình mẫu đơn giản (làm sáng LED) cho con PIC này dùm em được không? Hay là viết luôn 1 tutor về con nay luôn đi :D .Cám ơn anh nhiều |
hờ hờ....em làm cho nó work rồi !!! :D. Nhưng có một điều là em phải unplug cái ICD2 ra thì nó mới work. Sau đó nó sáng cỡ một vài giây thì nó lai tắt. Nhưng khi đụng tay vào pin MCRL (pin số 1) của PIC thì nó lại sáng lại. Em kô hiểu hiện tượng này lắm. Nó chạy có vẻ kô ổn định. Chẳng biết tại sao nữa.
|
thực sự tôi không hiểu tại sao người ta lại dùng PIC nhiều đến thế? Thế nhưng ở miền Bắc mình có vẻ yên ả hơn. Vì tôi thấy PIC khả năng sử dụng lại code rất kém so với các con khác. Gần như mỗi con lại phải chỉnh sửa code rất vất vả. Hai nữa chíp PIC một số loại cùng tính năng lại đắt hơn Motorola. Nhưng dù sao phải công nhận rằng chíp PIC có rất nhiều loại và phục vụ được rất nhiều các ứng dụng quan trọng trong cuộc sống, và đó chính là lý do vì sao mà PIC được đứng hàng thứ 2 thế giới sau Motorola. Tôi đang làm việc với con PIC 18f2320 và 18f4320 (loại chân dán). Thực sự nó có rất nhiều tính năng hay mỗi tội đắt. Bạn nào làm về con này, hay có hướng phát triển thì chúng ta cùng cộng tác và nghiên cứu!
|
Trích:
Bạn hãy nối một điện trở khoảng 10k đến 33k từ Vdd đến chân MCLR. Thân, |
Trích:
Ở trường em người ta dạy con 68hc12 nhưng khi làm senior project thì em lại chọn con PIC. hic hic hic vì sao? Vì nhiều người trong khoa em biết PIC nhiều hơn ->có thể hỏi. Cái thứ 2 em co thể xin sample cho project FREE -> trên cả tuyệt vời. Trong lab em con có ICD2 programmer có sẵn cho PIC nữa. Nói chung là tất cả những thứ gì dính đến PIC là sẵn sàng. Trong khi motorola là phải mua. |
Đề tài thảo luận về PIC và các họ vi điều khiển, vi xử lý khác, chúng ta đã nhắc đi nhắc lại rồi. Tôi cho rằng chúng ta không nên mất thời gian vào việc này nữa.
Hàng loạt "trận chiến" đã nổ ra, bắt đầu là trận chiến http://www.diendandientu.com/diendan...ead?thread=264 Đây là trận chiến đầu tiên [17:12:57 07-07-2004] do chính anh Hùng khai mào. Trận chiến này đánh dấu sự khởi đầu cho PIC, và gần như đây là bước đầu tiên xây dựng picvietnam. Cho đến nay, nó là luồng được nhiều người viết nhất của diendandientu. Có thể cho đến nay, còn rất nhiều những vấn đề khác nữa đẻ ra, nhưng tại thời điểm đó, rất ít người biết về PIC, và cách mà ngừoi ta nói về PIC còn rất mơ hồ. Những trận chiến khác lại tiếp diễn. Nhưng đây, đây là lần đầu tiên F có ý định chuẩn bị cho một tutorial về PIC http://www.diendandientu.com/diendan...ead?thread=154 Trước đó, có thể nói PIC được đưa lên mạng để thảo luận theo cách này đây http://www.diendandientu.com/diendan...read?thread=59 Trận chiến tiếp theo khi phong trào đã sôi nổi, có lẽ từ đây bắt đầu nhiều cái hay và lý thú, đó là động lực mạnh để F xây dựng picvietnam... http://www.diendandientu.com/diendan...ad?thread=1374 Các bạn chú ý rằng, những luồng này là những luồng nằm trong số những luồng được nhiều người quan tâm nhất. Đến bây giờ, còn quan tâm không? Còn, quan tâm lớn. http://dientuvietnam.net/forums/showthread.php?t=177 Đây có thể coi là trận chiến mới nhất giữa PIC và AVR... Sau 2 năm trời, người ta vẫn tiếp tục thảo luận vấn đề này. Thảo luận để làm gì nữa? Tất cả những gì cần nói đã nói hết rồi, những con người đã và đang làm việc đã nói hết rồi. Điều tôi nghĩ rằng chúng ta nên đồng ý với nhau, đó là các bạn đã vào picvietnam, các bạn mong muốn khám phá con PIC, vậy thì chúng ta hãy làm đi thôi, học đi thôi, trao đổi đi thôi. Những thứ khác không cần quan tâm. Chúng tôi sẽ mở một luồng "Vì sao nên bắt đầu với PIC", để hướng dẫn các bạn đến với vi điều khiển, đặc biệt là PIC. Trong đó, chúng tôi sẽ không trả lời về việc vì sao không bắt đầu với các vi điều khiển khác, mà chỉ nói lý do vì sao nên bắt đầu với PIC. Hy vọng rằng các bạn thành viên có thể đóng góp để cho lý luận này ngày một vững chắc, thúc đẩy cộng đồng người dùng PIC, và phát triển các công cụ làm việc với PIC tại Việt Nam. Như vậy là đủ rồi. Chúc vui. |
Em xin lỗi đã làm lạc chủ đề của luồng này....để tạ lỗi, em xin post cho mọi người xem 1 ct đơn giản: "làm nháy LED" mà em viết cho PIC8F452
LIST P=18F452 ;directive to define processor #include <P18F452.INC> ;processor specific variable definitions counta equ 0x20 countb equ 0x21 countc equ 0x22 org 0x0000 goto start start clrf PORTB clrf TRISB loop movlw b'11111111' movwf PORTB call delay movlw b'11110101' movwf PORTB call delay goto loop ;delay service ; T=Countc*Countb*Counta *0.5us ; T=0.5, countc=100 countb=100 counta=100 ;1 cycle = 1/4 osc, exp: 8MHZ osc -> 1cycle = 2MHZ (=0.5us) ;--------------------------------- delay movlw d'100' movwf countc ;Countc*(Countb*(Counta*(2+2)+4)+4) = Countc*Countb*Counta *0.5us delay_2 movlw d'100' movwf countb ; Countb*(Counta*(2cycles + 2cycles)+ 4cycles) delay_1 movlw d'100' movwf counta ; Counta*(2cycles + 2cycles) delay_0 decfsz counta,1 ;2 cycles goto delay_0 ;2 cycles decfsz countb,1 ;2 cycles goto delay_1 ;2 cycles decfsz countc,1 ;2 cycles goto delay_2 ;2 cycles return end Em cám ơn anh namqn nhé. Con PIC đã hoạt động ổn định khi có một con trở nối từ MCRL đến nguồn. Khi kô có con trở này thì nó chỉ chạy được khoảng 2 phút thôi. Còn khi có con trở này thì nó chạy cho đến thời điểm em viết bài này là được 10 phút rồi :D. Cám ơn mọi người nhiều nhé. |
Có ai hướng dẫn dùm em lập trình PWM với....Em muốn dùng PWM để điều chỉnh độ sáng của đèn.
|
Trích:
Thân, |
Hì hì..
Trong 2 tuần qua em cũng đã tìm được cách chạy PWM rồi. Đây là đoạn code cho PWM PWM_norm ;set PWM period=1000Hz=0.001s at 50%duty cycle ;Fosc=8Mhz and TMR2 prescale value=16 ;1. Set period for PWM=1000Hz ;PR2 = (PWM period)/(4*Tosc*TMR2 prescale value) - 1 ;PR2 = 0.001/[4 * (1/8)e-6 * 16) - 1 => PR2 = 124 movlw d'124' ;set period for PWM=1000Hz movwf PR2 ;2. Set duty cycle by writting CCPR1L register and CCPR1CON<5:4> bits ;PWM Duty Cycle = (CCPR1L:CCP1CON<5:4>)*Tosc*TMR2 Prescale Value ;CCPR1L:CCP1Con<5:4> = PWM Duty Cycle / (Tosc * TMR2 Prescale) ;PWM Duty Cycle = 50% of Period ;PWM Duty Cycle = 50% of 0.001 = 0.0005 ;CCPR1L:CCP1Con<5:4> = 0.0005 / [(1/8)e-6 * 16] = 250 ;=> CCPR1L:CCP1Con<5:4> = 0011111010 bcf CCP1CON, DC1B0 ;set bit 0 = 1 bsf CCP1CON, DC1B1 ;set bit 1 = 1 movlw b'00111110' ;set duty cycle and enable PWM movwf CCPR1L ;3. Make the CCP1 pin an output by clearing the TRISC<2> bit movlw b'11111011' ;set PORTC as an CCP1 andwf TRISC ;4. Set The TMR2 prescale value and enable TMR2 by writing to T2CON movlw b'00000111' ;set prescale = 1:16 and enable TIMER2 movwf T2CON return Vì hiện tại em đang làm project về con "line-following robot" nên mới dùng đến PWM để điều khiển tốc độ của con robot, do thấy lâu quá kô ai trả lời nên em tự đọc luôn. Hiện nay con robot của em đã chạy (mừng quá) cám ơn mọi người (đặc biệt là anh namqn) đã giúp em nhiều từ 1 người chẳng biết gì về PIC sau 1 tuần đã có thể lập trình PIC ở mức cản bản. Cám ơn mọi người nhiều lắm lắm :) |
Chúc mừng em nhé!
Em có thấy thắc mắc là tại sao chỉ dùng duty cycle là 50% mà giá trị đặt vào CCPR1L:CCP1Con<5:4> lại khoảng gấp đôi giá trị đặt vào PR2 không? Thân, |
Trích:
Đó là do giá trị của prescale em đặt là 16, nếu em đặt là 32 thì nó sẽ bằng (với cùng loại crystal 8Mhz) |
Em đang viết code cho một con line-following robot. Con robot của em dùng IR sensor để nhận biết đường đen và đi theo đường đen đó. 3 senor được đặc thẳng hàng và đưa tín hiệu thông wa Smchitt Trigger rồi vào PIC8F452. Tín hiệu digital như sau:
0: in black line 1: in white surface. L: PORT A0 C: PORT A1 R: PORT A2 Về căn bản thì con robot này chạy được rồi, thỏa mãn mọi điều kiện về line following. Nhưng có một điều là con robot này kô thể quẹo góc nhọn được. Tất cả các góc khác đều quẹo được kể cả góc 90. Em kèm theo là đoạn code so sánh. Em nghĩ là có thể khắc phục khó khăn khi quẹo góc nhọn bằng cách viết code chứ không cần phải mắc thêm sensor. Em điều khiển bằng cách thay đổi PWM (em kô kèm theo đoạn code về PWM ). Mong mọi người giúp em Note: Đoạn code em kèm ở dưới. |
Trích:
Trong cả hai công thức tính PR2 và PWM Duty Cycle thì đều có mặt TMR2 prescale value, em đổi TMR2 prescale value thì vẫn có tỷ lệ giữa giá trị đặt vào CCPR1L:CCP1Con<5:4> và giá trị đặt vào PR2 như vậy. Suy nghĩ lại xem. Thân, À, đối với những đoạn code em post lên thì nên đưa nó vào trong khung định dạng cho code (khi em dán code vào thì chọn đoạn code đó, rồi nhấn vào cái nút có hình # ở thanh công cụ đó). |
hê hê, xin lỗi mọi người nghe... Đoạn code của em
Code:
org 0x0000 |
anh Nam,
Mấy bữa bận quá nên chẳng lên mạng gì cà. Sau đây em xin trình bày tại sao lại như thế Em sẽ viết tắt CCPR1:CCP1CON<5:4> thành CCPR1 PR2 = PWM period/ (4*Tosc*TMR2-1) (CCPR1) = PWM duty cycle / (Tosc*TMR2) PR2/(CCPR1) = (PWM period / 4*Tosc*TMR2) * (Tosc*TMR2 / PWM duty cycle) 50% duty cycle = 1/2 PWM period và em có thể bỏ -1 trong biểu thức tính PR2 => PR2/(CCPR1) = (2*PWM duty cycle / 4*Tosc*TMR2) * (Tosc*TMR2 / PWM duty cycle) <=> PR2/(CCPR1) = 2/4 = 1/2 => CCPR1 = 2*PR2 Em hy vọng là đúng phải kô anh??? Có ai chỉ dùm em đoạn code với....hic con robot của em ko quẹo được góc nhọn.....mà làm lại sensor bây giờ thì lâu lắm á |
Như vậy là đúng rồi. Từ công thức tính PR2 và CCPR1:CCP1CON<5:4> thì có thể thấy ngay tỷ lệ giữa chúng. Nhưng điều chúng ta cần hiểu rõ ở đây không phải là công thức tính đó, mà là ưu điểm của việc thiết kế phần cứng của chip như vậy.
Microchip đã có thiết kế rất hay đối với module PWM. Với nhận định rằng chúng ta không cần độ phân giải cao cho tần số chuyển mạch, Microchip đã dùng tần số lệnh (4 lần tần số xung clock) để tạo tần số cho ngõ ra PWM. Tuy nhiên, chu kỳ nhiệm vụ (duty cycle) cần có độ phân giải cao hơn (để chúng ta điều chỉnh độ rộng xung được nhuyễn hơn), do đó Microchip dùng chính tần số xung clock làm đơn vị cho duty cycle. Đó là lý do trong công thức của PR2 có chia cho 4, còn của CCPR1:CCP1CON<5:4> thì không có. Lấy ví dụ bằng số cụ thể, nếu chúng ta dùng một số 8-bit để đặt tần số cho tín hiệu PWM, với 4 đơn vị đặt duty cycle mới bằng một đơn vị đặt tần số cho PWM, như vậy duty cycle của chúng ta đang được biểu diễn bằng một số 10-bit. Nói cách khác, duty cycle có độ phân giải cao hơn 4 lần so với tần số PWM. Đây là đặc điểm mà chúng ta cần nắm được, nếu không chúng ta có thể đánh giá thấp module PWM của PIC. Bạn nào đang tìm hiểu dsPIC sẽ thấy module PWM của dsPIC chỉ có độ phân giải của duty cycle cao hơn của tần số PWM 2 lần (1-bit cao hơn). Lý do của điều này, theo tôi, là do tần số clock (và do đó tần số lệnh) của dsPIC là khá cao, do đó độ phân giải của tần số PWM đã cao hơn so với của các PIC 8-bit, như vậy độ phân giải của duty cycle so với của tần số PWM không cần thiết phải cao hơn đến 4 lần như trong PIC. Thân, |
Anh nam có thể giải thích về prescale và resolution cho em biết được kô? Em chưa có khái niệm rõ lắm về 2 dịnh nghĩa này.
|
ừm....Em nghĩ ra một cách để khắc phục việc quẹo góc nhọn là như sau: em sẽ tạo ra 2 function định nghĩa về góc nhọn cho robot. 1 function định nghĩa về góc nhọn quẹo trái: 101 -> 100 -> 000 -> 001 -> 011 (giữa line -> đèn bên trái nằm trong line -> cả 3 đèn cùng trên line -> đèn bên trái ra khỏi line trước -> đèn trái và đèn giữa ra khỏi line). Robot đang đi giữa line sẽ check điều kiện đặc biệt này, nếu như kô đúng thì sẽ nhảy về những trường hợp bình thường. (Đèn trái là bit 0, đèn giữa là bit 1 và đèn phải là bit 2).
Tuy nhiên lúc em đặt đoạn code trên như sau: Code:
loop STL: Sharp Turn Left (góc nhọn bên trái) STR: Sharp Turn Right (góc nhọn bên phải) Em nghĩ là phải cần có interupt để can thiệp vào nhưng kô biết phải làm sao cả. Mong mọi người giúp em. Hay em nghĩ là 3 sensor đặt ngang hàng thì kô thể nào quẹo góc nhọn được....em cũng chẳng biết nữa....em bó tay rồi. hic. Em đọc tài liệu trên mạng thì thấy sensor toàn đặt theo kiểu mũi tên chứ kô đặt thẳng hàng.... |
Trích:
Prescale thông thường là một mạch đếm theo lũy thừa của 2, dùng để hạ thấp tần số đưa vào các ngoại vi. Chẳng hạn, em muốn tính thời gian trôi qua bằng cách đếm số chu kỳ lệnh đã được thực hiện. Nhưng nếu đếm trực tiếp thì số lệnh cần đếm cho một số ứng dụng lại quá lớn (như làm trễ một vài phần mười giây thì cần đến hàng triệu chu kỳ lệnh), vì các timer thông thường trong các vi xử lý 8-bit cũng chỉ có thể đếm đến 16-bit (tức là tối đa là 65536 chu kỳ lệnh). Khi chúng ta dùng prescaler với hệ số Về độ phân giải (resolution), có thể giải thích qua ví dụ như sau. Lấy ví dụ chúng ta cần điều chỉnh độ rộng xung (PWM) của một bộ biến đổi điện áp DC sang DC. Bộ biến đổi này có điện áp ra trung bình phụ thuộc vào điện áp vào cho bởi: với D là chu kỳ nhiệm vụ (duty cycle) của tín hiệu PWM, thay đổi từ 0 đến 1. Bây giờ giả sử chúng ta dùng 2 bit để biểu diễn D của tín hiệu PWM. Như vậy '00' sẽ cho D=0, '01' sẽ cho D=0.25, '10' sẽ cho D=0.5, và '11' sẽ cho D=0.75. Như vậy không tốt lắm phải không? Tất nhiên, vì chúng ta chỉ dùng 2 bit để biểu diễn D, do đó mỗi đơn vị sẽ tương ứng với Còn cái vụ robot thì anh mù tịt, hy vọng các bạn khác có thể giúp em. Thân, |
2 Attachment(s)
Anh Nam,
Đây là con robot của em :) (làm lần đầu cho nên dùng băng keo kô). À tiện thể hỏi anh luôn là anh biết anh Hùng và anh Thông ở khoa điện tử DHBK TPHCM kô? |
Em làm lần đầu mà được như vậy là quá tốt rồi.
Bên BM Điện tử của ĐHBK Tp. HCM có anh Hoàng Phi Hùng (chắc bây giờ đang ở Arkansas), anh Võ Tấn Thông, và anh Lê Chí Thông (nghe nói đang học ở Úc). Những người đó anh đều biết rõ, vì làm việc với nhau thường xuyên. Thân, |
Cám ơn trưởng lão, quả không hỗ danh. Ông anh quả siêu phàm, ngay từ những ngày đầu khi làm về PWM em cũng đã tự đặt ra câu hỏi tại sao chỉ dùng 8 bit cho tần số PWM mà lại có độ phân giải 1/1024. Vấn đề này em cũng đã tranh luận cùng với Bác BA bên DTVN, xin cám ơn trưởng lão, như vậy là đàn em cũng đã không sai.
|
Ahchu!
Mình cũng đang làm về 18f452.bạn có thể cho mình nịck để tiện liên lạc không. Nick của mình là bk_mammam@yahoo.com |
Múi giờ GMT. Hiện tại là 02:03 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam