PİC16F1513 Port Sorunu

Başlatan xtahirx, 07 Şubat 2022, 18:01:36

xtahirx

Merhaba 16f1513 ile SHIFTOUT komutunu kullanmak istiyorum lakin bit'leri set reset bile yapamıyorum.Latc komutu ile set yaptığımda çıkış veriyor.Acaba bu pic ile derleyicide sorunmu var.kod aşağıda.
Teşekkürler.
;----[16F1513 Hardware Configuration]-------------------------------------------
#IF __PROCESSOR__ = "16F1513"
  #DEFINE MCU_FOUND 1
#CONFIG
cfg1 = _FOSC_INTOSC           ; INTOSC oscillator: I/O function on CLKIN pin
cfg1&= _WDTE_OFF               ; WDT enabled
cfg1&= _PWRTE_OFF             ; PWRT disabled
cfg1&= _MCLRE_OFF              ; MCLR/VPP pin function is MCLR
cfg1&= _CP_ON                ; Program memory code protection is disabled
cfg1&= _BOREN_ON              ; Brown-out Reset enabled
cfg1&= _CLKOUTEN_OFF          ; CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin
cfg1&= _IESO_OFF               ; Internal/External Switchover mode is enabled
cfg1&= _FCMEN_OFF             ; Fail-Safe Clock Monitor is enabled
  __CONFIG _CONFIG1, cfg1

cfg2 = _WRT_OFF               ; Write protection off
cfg2&= _VCAPEN_OFF            ; VCAP pin function disabled
cfg2&= _STVREN_ON             ; Stack Overflow or Underflow will cause a Reset
cfg2&= _BORV_LO               ; Brown-out Reset Voltage (Vbor), low trip point selected.
cfg2&= _LPBOR_OFF             ; Low-Power BOR is disabled
cfg2&= _LVP_OFF               ; High-voltage on MCLR/VPP must be used for programming
  __CONFIG _CONFIG2, cfg2

#ENDCONFIG

#ENDIF

;----[Verify Configs have been specified for Selected Processor]----------------
;       Note: Only include this routine once, after all #CONFIG blocks
#IFNDEF MCU_FOUND
  #ERROR "No CONFIGs found for [" + __PROCESSOR__ +"]"
#ENDIF

DEFINE OSC 8 
DEFINE	ADC_BITS	10 



OSCCON.4=1
OSCCON.5=1
OSCCON.6=1
OPTION_REG=%10000111

TRISA=%00111111
TRISB=%11011111	
TRISC=%10000010	
TRISE=%11111111


WPUB=%00000000
WPUE=%00000000

ADCON1=%10100000
INTCON=%10100000
CCP1CON=%00001100
CCP2CON=%00000000
SSPCON1=%00000101
AADCON0=0
FVRCON.7=0
RCSTA=0
PIE1=0
PIE2=0

ANSELA=%00001111
ANSELB=%00000001
ANSELC=%00000000



A VAR BYTE
B VAR BYTE
C VAR BYTE


SYMBOL DT=PORTC.6
SYMBOL CL=PORTC.4
SYMBOL AKT=PORTC.5
clear
PORTC=0

PAUSE 1000


DN:
HIGH AKT
HIGH DT
HIGH CL
PAUSE 1000
LOW AKT
LOW DT
LOW CL
PAUSE 1000

GOTO DN

END

ete

Tanımadığım bir işlemci ancak data sheet'e bakılırsa LATx registerleri mevcut.
Bir işlemcide LAT registeri var ise PORT Pinlerinden çıkış yapmak için PORTx registeri yerine LATx registeri kullanılır.
Giriş işlemlerinde ise PORTx registeri eskisi gibi kullanılmaktadır.
Bu durumda gerek data ve gerekse CLK pinlerini aşağıdaki şekilde tanımla;
SYMBOL DT=LATC.6
SYMBOL CL=LATC.4
SYMBOL AKT=LATC.5
Bazı durumlarda data registeri LAT üzerinden çalışmayabiliyor. Şayet bir olumsuzluk görürsen yanlızca DT pinini PORTC.6 olarak tanımlayabilirsin.

Ete

xtahirx

Teşekkür ederim hocam lakin pek birşey fark etmedi.

ete

#3
Ben yapıyorum oluyorda sen yapınca neden olmuyor acaba?
Aslında programda bazı kusurlar var.

Kusur-1:Programda ADC tanımlaması yapılmış (ANSEL ve ADCON1 registeri ile) ancak ADC define tanımlaması yarım yapılmış.

Kusur-2: Intcon.7 set edilmiş ancak programda kesme alt programı yazılmamış bu nedenle hata veriyor. INTCON.7=0 yapınca sorun giderilmiş oldu. Kesme eklendikten sonra INTCON.7=1 yapılabilir.

BU kusurları düzeltince ve devreye 74HC595 shift register ekleyince sorunsuz çalıştığını görebiliyorum.
Bu arada simulasyonda 16F1513 olmadığı için 16F1516 kullandım. Aynı aileye mensup oldukları için sorun olmadan kullanılabilir.

Ete

xtahirx

Hocam ben fiziksel olarak deniyorum ilk dediklerinizi yaptım sonradan fark ettimki
30 saniye hiç bir şey yapmıyor sonrasında proğram koşmaya başlıyor.Rica etsem sizin denediğiniz programı burada paylaşsanız denesem.

ete

Program aşağıdadır.
Ete

#IF __PROCESSOR__ = "16F1516"
  #DEFINE MCU_FOUND 1
#CONFIG
  __config _CONFIG1,_FOSC_INTOSC &  _WDTE_OFF & _MCLRE_OFF & _PWRTE_OFF & _CP_ON & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF 
  __config _CONFIG2, _WRT_OFF & _VCAPEN_OFF & _STVREN_ON & _BORV_LO & _LVP_OFF  
#ENDCONFIG

#ENDIF

;----[Verify Configs have been specified for Selected Processor]----------------
;       Note: Only include this routine once, after all #CONFIG blocks
#IFNDEF MCU_FOUND
  #ERROR "No CONFIGs found for [" + __PROCESSOR__ +"]"
#ENDIF

DEFINE OSC 8 

DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 5     ' ADC clock source  (Fosc/16)
DEFINE ADC_SAMPLEUS 11 ' ADC sampling time (uSec)



OSCCON.4=1
OSCCON.5=1
OSCCON.6=1
OPTION_REG=%10000111

TRISA=%00111111
TRISB=%11011111	
TRISC=%10000010	
TRISE=%11111111


WPUB=%00000000
;WPUE=%00000000

ADCON1=%11010000
'INTCON=%10100000
CCP1CON=%00001100
CCP2CON=%00000000
SSPCON1=%00000101
ADCON0=0
FVRCON.7=0
RCSTA=0
PIE1=0
PIE2=0

ANSELA=%00001111
ANSELB=%00000001
ANSELC=%00000000

A VAR BYTE
B VAR BYTE
C VAR BYTE

SYMBOL DTA=LATC.6
SYMBOL CLK=LATC.4
SYMBOL AKT=LATC.5
clear
PORTC=0
PAUSE 300


DN:
HIGH AKT
HIGH DTa
HIGH CLk
PAUSE 1000
LOW AKT
LOW DTa
LOW CLk
PAUSE 1000

GOTO DN

END

xtahirx

Hocam paylaştığınız program çok güzel çalıştı.
Şimdi problem aşağıdaki kod çalışmıyor.
Teşekkür ederim.
Alıntı Yap#IF __PROCESSOR__ = "16F1513"
  #DEFINE MCU_FOUND 1
#CONFIG
  __config _CONFIG1,_FOSC_INTOSC &  _WDTE_OFF & _MCLRE_OFF & _PWRTE_OFF & _CP_ON & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
  __config _CONFIG2, _WRT_OFF & _VCAPEN_OFF & _STVREN_ON & _BORV_LO & _LVP_OFF 
#ENDCONFIG

#ENDIF

;----[Verify Configs have been specified for Selected Processor]----------------
;       Note: Only include this routine once, after all #CONFIG blocks
#IFNDEF MCU_FOUND
  #ERROR "No CONFIGs found for [" + __PROCESSOR__ +"]"
#ENDIF

DEFINE OSC 8

DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 5     ' ADC clock source  (Fosc/16)
DEFINE ADC_SAMPLEUS 11 ' ADC sampling time (uSec)



OSCCON.4=1
OSCCON.5=1
OSCCON.6=1
OPTION_REG=%10000111

TRISA=%00111111
TRISB=%11011111   
TRISC=%10000010   
TRISE=%11111111


WPUB=%00000000
;WPUE=%00000000

ADCON1=%11010000
'INTCON=%10100000
CCP1CON=%00001100
CCP2CON=%00000000
SSPCON1=%00000101
ADCON0=0
FVRCON.7=0
RCSTA=0
PIE1=0
PIE2=0

ANSELA=%00001111
ANSELB=%00000001
ANSELC=%00000000

A VAR BYTE
B VAR BYTE
C VAR BYTE

SYMBOL DTA=LATC.6
SYMBOL CLK=LATC.4
SYMBOL AKT=LATC.5
clear
PORTC=0
PAUSE 300

A=121:B=57:C=63
DN:
SHIFTOUT DTA,CLK,1,[A,B,C] 
HIGH AKT:PAUSEUS 5:LOW AKT

PAUSE 1000

GOTO DN

END

ete

#7
Kod da bir hata göremedim.Çalışması gerekir. Muhtemelen devrende sorun vardır.
Bu şekilde boşa kürek çekiyoruz.
Devre şemasını da buraya koyarsan bir anlamı olur yoksa cevabım bu kod çalışır. Tabiiki devren doğru ise.
Shiftout komutunun çalışıp çalışmadığını anlayabilmen için bir birine seri bağlı 3 adet 74HC595 olması gerek ve birinden giriş yapıp bu konutu vermen lazım. Komut çalıştıktan sonra;
- A rakamı en sondaki 595 de, B rakamı ortada ve C rakamıda ilk (data girişinin yapıldığı 595 de) görülür.

Ete

not: programı belirttiğim şekilde kurulmuş devrede denedim çalışıyor.

xtahirx

#8
Teşekkürler hocam devre üzerinde çalışmıyor besleme veriyorum bredbord da led bağlı ve lojik analizör ile izliyorum ilgili pinlerden biri sürekli çıkış veriyor digerleri low da bekliyor.
Önceki kodu atınca set reset oluyor shiftout komutu çalışmıyor.

xtahirx

Yardımınız için çok teşekkür ederim.
Sorunu çözdüm frekansı düşürdüm ve -DEFINE SHIFT_PAUSEUS 500- komutu ile düzeldi.

Powered by EzPortal