PDA

View Full Version : Pic 18f452


ahchu
17-03-2006, 02:27 AM
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.

namqn
17-03-2006, 06:43 PM
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,

ahchu
18-03-2006, 11:14 PM
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.

namqn
19-03-2006, 12:27 AM
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,

ahchu
20-03-2006, 02:52 AM
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.

namqn
20-03-2006, 11:56 PM
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.
Với chương trình này, LED không sáng có vài nguyên nhân, nhưng khả năng gây lỗi nhiều nhất là ở các lệnh sau
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,

ahchu
21-03-2006, 06:08 AM
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

ahchu
21-03-2006, 12:38 PM
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.

dohoangnam
21-03-2006, 03:35 PM
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!

namqn
21-03-2006, 07:11 PM
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.
Đây là hiện tượng chân MCLR của bạn được cấu hình có chức năng reset, nhưng phần cứng của bạn lại không đặt trạng thái cho nó một cách ổn định.
Bạn hãy nối một điện trở khoảng 10k đến 33k từ Vdd đến chân MCLR.

Thân,

ahchu
21-03-2006, 11:44 PM
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!

Theo em nghĩ là do PIC rẻ và có những chức năng chuyên dụng hay hơn motorola. Còn motorola mạnh thì mạnh thật nhưng những chức năng chuyên dụng thì theo như mọi người nói thì không mạnh bằng PIC (cái này em chỉ hỏi về con 68hc12 thôi).
Ở 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.

falleaf
22-03-2006, 12:47 AM
Đề 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/diendandientu/mvnforum/viewthread?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/diendandientu/mvnforum/viewthread?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/diendandientu/mvnforum/viewthread?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/diendandientu/mvnforum/viewthread?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.

ahchu
22-03-2006, 02:04 AM
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é.

ahchu
27-03-2006, 10:12 AM
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.

namqn
11-04-2006, 08:06 PM
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.
Vậy là chúng tôi bỏ sót yêu cầu này của bạn trong 2 tuần qua. Bạn đọc phần 14.5.3 trong datasheet của 18F452 trước đi, trong đó có hướng dẫn từng bước cách thiết lập chế độ PWM của module CCP. Sau đó bạn có thể post câu hỏi nếu bạn có thắc mắc.

Thân,

ahchu
15-04-2006, 09:33 PM
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 :)

namqn
16-04-2006, 08:02 PM
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,

ahchu
19-04-2006, 11:41 PM
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,

Thưa anh,
Đó 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)

ahchu
20-04-2006, 12:08 AM
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.

namqn
20-04-2006, 12:15 AM
Thưa anh,
Đó 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)
Không đúng á!
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ụ đó).

ahchu
20-04-2006, 03:43 AM
hê hê, xin lỗi mọi người nghe... Đoạn code của em

org 0x0000
goto start

; case1 equ 0x20 ;PORTA value = 000 -> the robot is in the air
; case2 equ 0x21 ;PORTA value = 001 -> left hand side
; case3 equ 0x22 ;PORTA value = 011 -> completely in left hand side
; case4 equ 0x23 ;PORTA value = 100 -> right hand side
; case5 equ 0x24 ;PORTA value = 101 -> center the line
; case6 equ 0x25 ;PORTA value = 110 -> completely in right hand side
; case7 equ 0x26 ;PORTA value = 111 ->

start
movlw d'124' ;set period for PWM=1000Hz
movwf PR2
movlw b'00000111' ;set prescale = 1:16 and enable TIMER2
movwf T2CON

bcf TRISC, CCP1
bcf TRISB, CCP2

clrf PORTB ;initialize PORTB, PORTA
clrf TRISB
clrf PORTA
clrf PORTD
clrf TRISD

;R_led off <=> PORTB = 11111110
;C_led off <=> PORTB = 11111101
;L_led off <=> PORTB = 11111011

;configure PORTA
movlw b'00000110' ;set all PORTAs as digital input
movwf ADCON1

movlw 0xff
movwf TRISA ;set portA as input

movf PORTA,0 ;read from PORTA and store it to W_reg
movwf PORTB

loop
movf PORTA,0
movwf PORTB
goto case2

s1 ;special case of robot when it turning right and get out of the line
movlw b'00000000'
cpfseq PORTA ;if equal skip
goto loop ;if equal goto case1

call RIGHT_WHEEL_FAST
call LEFT_WHEEL_SLOW
goto loop

s2 ;special case of robot when it turning left and get out of the line
movlw b'00000000'
cpfseq PORTA ;if equal skip
goto loop ;if equal goto case1

call LEFT_WHEEL_FAST
call RIGHT_WHEEL_SLOW
goto loop

;s3 ;robot will stop while it follow the center and suddenly did not sence anything
; movlw b'00000111'
; cpfseq PORTA ;if equal skip
; goto loop ;if equal goto case1

; call LEFT_WHEEL_STOP
; call RIGHT_WHEEL_STOP


case2 ;in left hand side
movlw b'00000001'
cpfseq PORTA ;if equal skip
goto case3

call LEFT_WHEEL_FAST
call RIGHT_WHEEL_NORM
goto loop

case3 ;completely in left hand side
movlw b'00000011'
cpfseq PORTA
goto case4

call LEFT_WHEEL_FAST
call RIGHT_WHEEL_SLOW

goto s2

case4 ;right hand side
movlw b'00000100'
cpfseq PORTA
goto case5

call RIGHT_WHEEL_FAST
call LEFT_WHEEL_NORM
goto loop

case5 ;center
movlw b'00000101'
cpfseq PORTA
goto case6

call RIGHT_WHEEL_NORM
call LEFT_WHEEL_NORM
goto loop

case6 ;completely in right hand side
movlw b'00000110'
cpfseq PORTA
goto loop

call RIGHT_WHEEL_FAST
call LEFT_WHEEL_SLOW
goto s1

ahchu
23-04-2006, 10:11 AM
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 á

namqn
23-04-2006, 10:57 PM
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,

ahchu
24-04-2006, 01:19 AM
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.

ahchu
29-04-2006, 10:35 PM
ừ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:

loop
movf PORTA,0
movwf PORTB
goto case1

STL
movlw b'00000100'
cpfseq PORTA
return
movlw b'00000000'
cpfseq PORTA
return
movlw b'00000001'
cpfseq PORTA
return
movlw b'00000011'
cpfseq PORTA
return
s1
call RIGHT_WHEEL_FAST
call LEFT_WHEEL_SLOW

movlw b'00000101'
cpfseq PORTA
return
goto s1

STR
movlw b'00000001'
cpfseq PORTA
return
movlw b'00000000'
cpfseq PORTA
return
movlw b'00000100'
cpfseq PORTA
return
movlw b'00000110'
cpfseq PORTA
return
s2
call RIGHT_WHEEL_SLOW
call LEFT_WHEEL_FAST

movlw b'00000101'
cpfseq PORTA
return
goto s2

special
call STL
call STR
goto case2

case1 ;center
movlw b'00000101'
cpfseq PORTA ;if equal skip
goto special

call LEFT_WHEEL_NORM
call RIGHT_WHEEL_NORM

goto loop

case2 ;on left hand side
movlw b'00000001'
cpfseq PORTA
goto case3

call LEFT_WHEEL_FAST
call RIGHT_WHEEL_NORM
goto loop

.... như đoạn code ở bài trên

thì dường như là nó kô check được điều kiện đăc biệt

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....

namqn
30-04-2006, 07:22 PM
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.
Tình cờ xem lại mới phát hiện ra em hỏi câu này cách đây 1 tuần rồi, có lẽ hôm đó có nhiều bài mới quá nên cái post này của em đã đi khỏi danh sách bài mới trước khi anh vào lại forum.

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ố 1:{2^n} thì chúng ta chỉ đếm thêm một đơn vị mỗi khi có {2^n} chu kỳ lệnh đã trôi qua. Tuy nhiên với các ứng dụng cần tốc độ cao thì chúng ta sẽ cần đếm nhanh hơn, với prescaler có hệ số gần với 1:1. Việc dùng prescaler cho phép chúng ta dùng cùng một phần cứng cho nhiều mục đích khác nhau một cách linh hoạt.

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_{out}=V_{in}{\times}D
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 1/2^{2} của toàn bộ phạm vi thay đổi của D. Với cách thực hiện này, chúng ta sẽ gặp khó khăn khi cần có D=0.6. Để có thể biểu diễn phạm vi thay đổi của D một cách tương đối liên tục hơn, chúng ta sẽ cần dùng nhiều bit. Hy vọng đến đây em có thể nắm được khái niệm này. Em có thể tự tính ra xem mức độ liên tục của các giá trị D được biểu diễn bằng 8-bit, và 10-bit.

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,

ahchu
07-05-2006, 10:16 AM
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ô?

namqn
07-05-2006, 06:31 PM
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,

minhpic
08-05-2006, 04:09 PM
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.

ayuh
13-01-2008, 10:10 PM
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