16f628A ile 0-20khz arasi kare dalga üretmek?

Başlatan mc_307, 25 Aralık 2018, 10:33:45

mc_307

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?

ferit06

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

mc_307

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

ferit06

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.

Tagli

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)

Gökçe Tağlıoğlu

ferit06


mc_307


ferit06

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.

mustafa_cmbz