4 konumlu DDS sinyal üreteçi

Başlatan onurinci, 09 Ekim 2022, 21:45:28

onurinci

hocam yine ben ,12F675 kullanarak 4 konumlu bir anahtar yardımıyla 3 adet Frekans seçmek istiyorum. anahtar bir pozisyonda işlevsiz bırak ,yani hiçbir şey yapma gibi,diğer üç tanımlı frekans anahtardan seçilince ilgili registere yollayıp duracak takii ben anahtarı çevirince..o zamanda yine bilgiyi yollayıp duracak.ben kendimce bütün yöntemleri denedim.durmadan veri yolluyor,fırsat bulupta bakarsanız sevinirim.

Mask'ta bir hata buldum DURUM=GPIO & %110000    ; Masking Input Pin's GPIO 3 & 4 yinede işe yaramadı
@ Device PIC12F675,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT
DEFINE OSC 4
DEFINE OSCCAL_1K 1

TRISIO= %00110000 : GPIO= 0
CMCON=7 : ANSEL=0 : VRCON.7=0
OPTION_REG.7= 0 : WPU= %00110000

IOC= %00110000                 ' Enable interrupt on GPIO.5 & 4
INTCON= %10001000             ' Enable GIE and GPIO interrupt

DEFINE SHIFT_PAUSEUS 2      ' DATA Speed

SYMBOL DA= GPIO.0           ; D7 Serial Data           ' DATA pin
SYMBOL CK= GPIO.1           ; W CLK                    ' CLOCK pin
SYMBOL EN= GPIO.2           ; FQ UD                    ' ENABLE pin
                              
LOW EN                      ; Enable Pin Low
PAUSE 200                   ; Discipline Mcu Delay
DURUM VAR BYTE
TEMP  VAR BYTE              ; Interrupt
ON INTERRUPT GoTo KESME     ; Interrupt ' kesme oluşursa KESME adlı etikete git.

'---------------------- Reset Procedure ----------------------------------------

Pause 200
'High GPIO.5 : Pauseus 30 : Low GPIO.5

'---------------------- DDS Chip Ready -----------------------------------------

Start:

DURUM=GPIO & %011000    ; Masking Input Pin's GPIO 3 & 4


;-- Frequency Selector Channel 1 -----------------------------------------------

 IF DURUM = %00000000 THEN                      ; Ch01

; Word Register          W4   W3  W2  W1  W0
      SHIFTOUT DA,CK,4,[$00,$00,$00,$00,$00]    ; 00.000.000 Hz , PLL on
      LOW CK
      PULSOUT EN,3                              ; Sending Enable
 ENDIF
 
;-- Frequency Selector Channel 2 -----------------------------------------------

 IF DURUM = %00010000 THEN                      ; Ch02
                                           
; Word Register          W4   W3  W2  W1  W0 
      SHIFTOUT DA,CK,4,[$49,$C0,$37,$0F,$01]    ; 10.700.000 Hz , PLL on
      LOW CK
      PULSOUT EN,3                              ; Sending Enable
 ENDIF
 
;-- Frequency Selector Channel 3 -----------------------------------------------
                                         
 IF DURUM = %00100000 THEN                      ; Ch03

; Word Register          W4   W3  W2  W1  W0
      SHIFTOUT DA,CK,4,[$18,$4C,$38,$0F,$01]    ; 10.701.500 Hz , PLL on
      LOW CK
      PULSOUT EN,3                              ; Sending Enable
 ENDIF
 
;-- Frequency Selector Channel 4 -----------------------------------------------   
 
  IF DURUM = %00110000 THEN                     ; Ch04
 
; Word Register          W4   W3  W2  W1  W0  
      SHIFTOUT DA,CK,4,[$79,$34,$37,$0F,$01]    ; 10.698.500 Hz , PLL on
      LOW CK
      PULSOUT EN,3                              ; Sending Enable
 ENDIF
;------------- Interrupt -------------------------------------------------------
    goto Start                  
    disable
                         
KESME:                          
    INTCON.0=0                  
    TEMP=GPIO & %00011000       
    Resume                      
    Enable
    

ete

Giriş Pinlerin GP4 ve GP5 olmasına rağmen kimi yerde GP3-GP4 gibi kod kullanmışsın. Birisi DURUM=GPIO & %011000  satırında bu DURUM=GPIO & %00110000 şeklinde yazılmalı;
Diğeride Kesme içinde  TEMP=GPIO & %00011000 satırında buda TEMP=GPIO & %00110000 şeklinde yazılmalı.
Aslında durum tespiti için DURUM=(GPIO & %00110000)>>4 şeklinde bir komut kullanırsan  Durum değişkeni 0-1-2-3 değerleriden birini alacaktır. Böylece select case komutunu kullanarak shiftout komutlarını if kullanmadan verebilirsin. Hatta shiftout ile verilen bilgileri değişkenlere atayıp select case içinde yanlızca değişkenleri belirleyip tek bir shiftout komutu ile ne verilecek ise onu verebilirsin.
Programda Kesme ne işe yarıyor bilmiyorum. Başka bir işi yok ise kesmeyi iptal et bence. Şu hali ile bir iş yapmıyor.

Ete

enes



@ Device PIC12F675,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT
DEFINE OSC 4
DEFINE OSCCAL_1K 1
 
TRISIO= %00110000 : GPIO= 0
CMCON=7 : ANSEL=0 : VRCON.7=0
OPTION_REG.7= 0 : WPU= %00110000
 
'IOC= %00110000 				' Enable interrupt on GPIO.5 & 4
'INTCON= %10001000 			' Enable GIE and GPIO interrupt
 
DEFINE SHIFT_PAUSEUS 2      ' DATA Speed
 
SYMBOL DA= GPIO.0           ; D7 Serial Data           ' DATA pin
SYMBOL CK= GPIO.1           ; W CLK                    ' CLOCK pin
SYMBOL EN= GPIO.2           ; FQ UD                    ' ENABLE pin
                              
LOW EN                      ; Enable Pin Low
PAUSE 200                   ; Discipline Mcu Delay
DURUM VAR BYTE
TEMP  VAR BYTE              ; Interrupt
'ON INTERRUPT GoTo KESME     ; Interrupt ' kesme oluşursa KESME adlı etikete git.

C VAR BIT
C=0
 
'---------------------- Reset Procedure ----------------------------------------
 
Pause 200
'High GPIO.5 : Pauseus 30 : Low GPIO.5
 
'---------------------- DDS Chip Ready -----------------------------------------

DURUM=GPIO 
 
Start:
 
'DURUM=GPIO & %011000    ; Masking Input Pin's GPIO 3 & 4

GOSUB KONTROL

IF DURUM = %00000000 AND C=1 THEN GOSUB Channel_1
IF DURUM = %00010000 AND C=1 THEN GOSUB Channel_2
IF DURUM = %00100000 AND C=1 THEN GOSUB Channel_3
IF DURUM = %00110000 AND C=1 THEN GOSUB Channel_4

GOTO START
'--  -----------------------------------------------

KONTROL:

IF GPIO<> DURUM THEN C=1

RETURN
 
 
;-- Frequency Selector Channel 1 -----------------------------------------------
 
 'IF DURUM = %00000000 THEN                      ; Ch01

Channel_1:
 
; Word Register          W4   W3  W2  W1  W0
      SHIFTOUT DA,CK,4,[$00,$00,$00,$00,$00]    ; 00.000.000 Hz , PLL on
      LOW CK
      PULSOUT EN,3                              ; Sending Enable
 'ENDIF

DURUM=GPIO:C=0

return
 
;-- Frequency Selector Channel 2 -----------------------------------------------
 
 'IF DURUM = %00010000 THEN                      ; Ch02

Channel_2:
                                           
; Word Register          W4   W3  W2  W1  W0 
      SHIFTOUT DA,CK,4,[$49,$C0,$37,$0F,$01]    ; 10.700.000 Hz , PLL on
      LOW CK
      PULSOUT EN,3                              ; Sending Enable
' ENDIF

DURUM=GPIO:C=0
return
 
;-- Frequency Selector Channel 3 -----------------------------------------------
                                         
' IF DURUM = %00100000 THEN                      ; Ch03

Channel_3:
 
; Word Register          W4   W3  W2  W1  W0
      SHIFTOUT DA,CK,4,[$18,$4C,$38,$0F,$01]    ; 10.701.500 Hz , PLL on
      LOW CK
      PULSOUT EN,3                              ; Sending Enable
 'ENDIF
DURUM=GPIO:C=0
return
 
;-- Frequency Selector Channel 4 -----------------------------------------------   
 
 ' IF DURUM = %00110000 THEN                     ; Ch04

Channel_4:
 
; Word Register          W4   W3  W2  W1  W0  
      SHIFTOUT DA,CK,4,[$79,$34,$37,$0F,$01]    ; 10.698.500 Hz , PLL on
      LOW CK
      PULSOUT EN,3                              ; Sending Enable
 'ENDIF
DURUM=GPIO:C=0
return
;------------- Interrupt -------------------------------------------------------
'    goto Start                  
'    disable
                         
'KESME:                          
'    INTCON.0=0                  
'    TEMP=GPIO & %00011000       
'    Resume                      
'    Enable




Evet ete hocam burda kesme kullanmanın bi mantıgı yok.
sız biraz daha kısa kodla olacak yolu tarıf etmıssınız.
ben de bıraz uzattım kodları ama kardesın ıstedıgı gıbı tek sefer yollama yapacak sekılde duzenledım
bı deneyebilirmısın onurıncı:

ete

#3
Anahtar konumu sürekli olarak okunduğu için program her seferinde bir gönderme yapıyor. Buna karşı bir önlem alınacak ise bilgi yollandıktan sonra okunan durum değişkeni eski isimli bir başka değişkene eşitlenir. Eski ile Durum eşit olduğu müddetçe program yeniden yollama yapmaz.

;@ Device PIC12F675,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT
#config
 __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF
#endconfig
DEFINE OSC 4
DEFINE OSCCAL_1K 1

TRISIO= %00110000 : GPIO= 0
CMCON=7 : ANSEL=0 : VRCON.7=0
OPTION_REG.7= 0 : WPU= %00110000

DEFINE SHIFT_PAUSEUS 2      ' DATA Speed

SYMBOL DA= GPIO.0           ; D7 Serial Data           ' DATA pin
SYMBOL CK= GPIO.1           ; W CLK                    ' CLOCK pin
SYMBOL EN= GPIO.2           ; FQ UD                    ' ENABLE pin
                              
LOW EN                      ; Enable Pin Low
PAUSE 200                   ; Discipline Mcu Delay
DURUM VAR BYTE 56
TEMP  VAR BYTE 
W0 VAR BYTE      
W1 var byte
W2 VAR BYTE
W3 VAR BYTE
W4 VAR BYTE
ESKI VAR BYTE  
'---------------------- Reset Procedure ----------------------------------------

Pause 200
'High GPIO.5 : Pauseus 30 : Low GPIO.5

'---------------------- DDS Chip Ready -----------------------------------------
ESKI=5
Start:

DURUM=(GPIO & %00110000)>>4    ; Masking Input Pin's GPIO 3 & 4


;-- Frequency Selector Channel 1 -----------------------------------------------
 SELECT CASE DURUM
 CASE 0
   W1=0:W2=0:W3=0:W4=0
   
 CASE 1
    W4=$49:W3=$C0:W2=$37:W1=$0F:W0=$01
    
 CASE 2
    W4=$18:W3=$4C:W2=$38:W1=$0F:W0=$01
 
 CASE 3
    W4=$79:W3=$34:W2=$37:W1=$0F:W0=$01 
 END SELECT
 
    IF DURUM<>ESKI THEN
      SHIFTOUT DA,CK,4,[W4,W3,W2,W1,W0]    ; 00.000.000 Hz , PLL on
      LOW CK
      PULSOUT EN,3
      ESKI=DURUM    
    ENDIF
    goto Start 

Ayrıca şemadaki rotary Switch'i 4 konumlu ile değiştir 4cü konuma bi rşey bağlama böylece Bu konuma geldiğinde Durum=3 olacaktır. Bunu dahili pullup dirençleri sağlayacak.
 
Ete

onurinci

hocam çok teşekkürler, hemde kısalmış harika çalışıyor..
mini bir sorum olacak bu programda bu saır bir işe yarıyormu ? niçin değer olarak 2 verilmiş.

DEFINE SHIFT_PAUSEUS 2      ' DATA Speed

onurinci

@enes   çok teşekkür ederim senin yazdıklarında çalışıyor sadece 4 frekans bilgisi yok onun yerine 'de sıfır bilgisi geliyor
anahtar durumu  IF DURUM = %00110000 AND C=1 THEN GOSUB Channel_4 bu şarta iken [$79,$34,$37,$0F,$01] gelmeliydi oysa 4'ncü konumda [$00,$00,$00,$00,$00]  geliyor

onurinci

hocam kendi programımda Temp satırındaki yazılım hatasını bana gösterdiğiniz an kafamda şimşek çaktı.
Kesmeyi şu sebepten dolayı kurmuştum değişiklik kesmesi bir uyarı görünce işlem yap sonrada dos modunda
@ SLEEP ile uyut senaryosu çalışmalıydı.düzgün kesme alamayınca @ SLEEP 'i kaldırmıştım,hem maskt'ta hem temp'te hata yapmışım,şu anda sanki çalışıyor gibi ,hafta arası deneyeceğim,

ayrıca sizin yazılımınızı pek beğendim,Case yöntemi çok kullanışlı.

kendi programımda gerekli düzeltmeler ile son hali..
@ Device PIC12F675,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT
DEFINE OSC 4
DEFINE OSCCAL_1K 1

TRISIO= %00110000 : GPIO= 0
CMCON=7 : ANSEL=0 : VRCON.7=0
OPTION_REG.7= 0 : WPU= %00110000

IOC= %00110000 				' Enable interrupt on GPIO.5 & 4
INTCON= %10001000 			' Enable GIE and GPIO interrupt

DEFINE SHIFT_PAUSEUS 2      ' DATA Speed

SYMBOL DA= GPIO.0           ; D7 Serial Data           ' DATA pin
SYMBOL CK= GPIO.1           ; W CLK                    ' CLOCK pin
SYMBOL EN= GPIO.2           ; FQ UD                    ' ENABLE pin
                              
LOW EN                      ; Enable Pin Low
PAUSE 200                   ; Discipline Mcu Delay
DURUM VAR BYTE
TEMP  VAR BYTE              ; Interrupt
ON INTERRUPT GoTo KESME     ; Interrupt ' kesme oluşursa KESME adlı etikete git.

'---------------------- Reset Procedure ----------------------------------------

Pause 200


'---------------------- DDS Chip Ready -----------------------------------------

Start:
 
DURUM=GPIO & %00110000    ; Masking Input Pin's GPIO 4 & 5


;-- Frequency Selector Channel 1 -----------------------------------------------

 IF DURUM = %00000000 THEN                      ; Ch01

; Word Register          W4   W3  W2  W1  W0
      SHIFTOUT DA,CK,4,[$00,$00,$00,$00,$00]    ; 00.000.000 Hz , PLL on
      LOW CK
      PULSOUT EN,3                              ; Sending Enable
 
 ENDIF

;-- Frequency Selector Channel 2 -----------------------------------------------

 IF DURUM = %00010000 THEN                      ; Ch02
                                           
; Word Register          W4   W3  W2  W1  W0 
      SHIFTOUT DA,CK,4,[$49,$C0,$37,$0F,$01]    ; 10.700.000 Hz , PLL on
      LOW CK
      PULSOUT EN,3
@ SLEEP                               ; Sending Enable
 ENDIF
  
;-- Frequency Selector Channel 3 -----------------------------------------------
                                         
 IF DURUM = %00100000 THEN                      ; Ch03

; Word Register          W4   W3  W2  W1  W0
      SHIFTOUT DA,CK,4,[$18,$4C,$38,$0F,$01]    ; 10.701.500 Hz , PLL on
      LOW CK
      PULSOUT EN,3
@ SLEEP                              ; Sending Enable
 ENDIF
  
;-- Frequency Selector Channel 4 -----------------------------------------------   
 
  IF DURUM = %00110000 THEN                     ; Ch04
 
; Word Register          W4   W3  W2  W1  W0  
      SHIFTOUT DA,CK,4,[$79,$34,$37,$0F,$01]    ; 10.698.500 Hz , PLL on
      LOW CK
      PULSOUT EN,3
@ SLEEP                              ; Sending Enable
 ENDIF

;------------- Interrupt -------------------------------------------------------
    goto Start                  
    disable
                         
KESME:
                          
    INTCON.0=0                  
    TEMP=GPIO & %00110000       
    Resume                      
    Enable
   
    

ete

Alıntı yapılan: onurinci - 09 Ekim 2022, 23:17:54hocam çok teşekkürler, hemde kısalmış harika çalışıyor..
mini bir sorum olacak bu programda bu saır bir işe yarıyormu ? niçin değer olarak 2 verilmiş.

DEFINE SHIFT_PAUSEUS 2      ' DATA Speed
Açıklaması şöyle;
DEFINE SHIFT_PAUSEUS 50 'Slow down the Shiftin and Shiftout clock
Amaç Shift komutundaki clk sinyalini biraz yavaşlatmak. Sen 2us vermişsin ama bence gereksiz çok bir şey farketmeyecek . Daha büyük yani 10us ve üzeri yavaşlatmalar fark ettirirler. İşlemci çok hızlı OSC frekansına sahip ise bu komut komutun sağlıklı çalışması için bir garanti oluyor. Sende gerekli olduğunu sanmıyorum. Bence kaldır o komutu. En azından dene onsuzda çalışıyor ise kaldır gitsin.

Ete

onurinci


Powered by EzPortal