Merhaba arkadaslar. Bir devre yaptim, 4 led var 1 tuș var. 6 çeşit frekans degeri belirledim, ama istedigim frekanslari net elde edemiyorum. Dahili kristal kullandim. Ornegin 700hz elde etmek istiyorum, en yakin 695 ve 702 hz falan oluyor. Timerla denedim bunu. Farkli bir yontem var mi acaba?
Dahili kristal 4Mhz dir. Harici 20 MHz ile belki istediğine yakın sonuç elde edebilirsin. ( bu yazdıklarım programın hakkında herhengi bir bilgiye sahip olamama durumum için geçerlidir.)
700hz 5000hz 7000hz 8950hz 10000hz 11950hz kod bu:
;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings
Device = 16F628A
Config FOSC_INTOSCCLK, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, BOREN_OFF, LVP_OFF, CPD_ON, CP_ON
;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------
Xtal 4
Declare All_Digital TRUE
TRISB=%00000000
PORTB=0
TRISA=%00000010
PORTA=0
CMCON=7
T1CON =%00000001
PIE1.0 =1
Symbol GIE = INTCON.7 ' Global Interrupt Enable
Symbol PEIE =INTCON.6
PEIE =1
GIE =0
On_Hardware_Interrupt GoTo Z_KeSMe
Symbol buT =PORTA.1
Symbol LED_A =PORTB.7
Symbol LED_B =PORTB.6
Symbol LED_C =PORTB.5
Symbol LED_D =PORTB.4
Input buT
Output LED_A
Output LED_B
Output LED_C
Output LED_D
Low LED_A
Low LED_B
Low LED_C
Low LED_D
OPTION_REG =%10000000
Dim fR As Byte
Dim FrEq As Word
fR =ERead 10 :DelayMS 50
If fR =255 Then fR =1
If fR =1 Then FrEq =64839
If fR =2 Then FrEq =65451
If fR =3 Then FrEq =65479
If fR =4 Then FrEq =65495
If fR =5 Then FrEq =65500
If fR =6 Then FrEq =65508
DelayMS 100
GIE =1
MaIn:
If buT =0 Then
While buT =0 :Wend
Inc fR
If fR >6 Then fR =1
If fR =1 Then FrEq =64839
If fR =2 Then FrEq =65451
If fR =3 Then FrEq =65479
If fR =4 Then FrEq =65495
If fR =5 Then FrEq =65500
If fR =6 Then FrEq =65508
EndIf
If fR =1 Then
LED_D =0
LED_C =0
LED_B =0
LED_A =1
DelayMS 200
LED_A =0
DelayMS 200
ElseIf fR =2 Then
LED_D =0
LED_C =0
LED_A =0
LED_B =1
DelayMS 200
LED_B =0
DelayMS 200
ElseIf fR =3 Then
LED_A =0
LED_B =0
LED_D =0
LED_C =1
DelayMS 200
LED_C =0
DelayMS 200
ElseIf fR =4 Then
LED_A =0
LED_B =0
LED_C =0
LED_D =1
DelayMS 200
LED_D =0
DelayMS 200
ElseIf fR =5 Then
LED_A =1
LED_B =1
LED_C =0
LED_D =0
DelayMS 200
LED_A =0
LED_B =0
DelayMS 200
ElseIf fR =6 Then
LED_A =0
LED_B =0
LED_C =1
LED_D =1
DelayMS 200
LED_C =0
LED_D =0
DelayMS 200
EndIf
GoTo MaIn
Z_KeSMe:
Context Save
PIR1.0 =0
TMR1L =FrEq.LowByte
TMR1H =FrEq.HighByte
Toggle PORTB.3
Context Restore
End
Not: Kod eklerken "KOD" butonunu
kullanınız.
Programınızı inceledim. Hesaplamanızda kesme süresince yürütülen gecikmelerinde dikkate alındığı görülüyor. TIMER1 şimdiki durumda 1 MHz lik osilator ile çalışıyor. TIMER1 i harici osilator (Datasheets te bu değeri bulamadım ama, 50 Mhz e kadar ölçüm yapan frekansmetre yapımında kullanılıyor, buna göre harici 50 MHz lik osilatör) ile çalıştırabilirsiniz. Bu durumda istediğiniz değerlere daha fazla yaklaşabiliriniz.
TMR1 harici kristal sürücüsü 32.768 kHz'lik saat kristallerine göre tasarlanmıştır. 50 MHz bir kristalle çalışması mümkün değil. Bu durum datasheet'te belirtilmiş. 148. sayfadaki FT1 parametresine ve ilgili dipnota bakın.
TMR1 asenkron çalışırken harici olarak yaklaşık 16 MHz clock girişi alabilir. (TT1P parametresi, aynı sayfada)
harici kristal değil, harici osilator....
kodu oynamadan 20mhz kristal mi takayım ?
kod ile oynamadan olmaz,f fR =1 Then FrEq =64839
If fR =2 Then FrEq =65451
If fR =3 Then FrEq =65479
If fR =4 Then FrEq =65495
If fR =5 Then FrEq =65500
If fR =6 Then FrEq =65508
değerlerini ve
Config FOSC_INTOSCCLK,
Xtal 4
düzeltmelisiniz.
Ad9833 kullansanız daha mantıklı degilmi ?