pic16f628a hakkında kolay ama benim anlamadığım bir konu

hlyahkan

Paylaşımcı üye
Katılım
2 Nis 2012
Mesajlar
721
Puanları
131
arkadaşlar yardımınızı bekliyorum. istediğim program şu rb0 çıkışından sonsuz döngü şeklinde 1 saniye 1, 1 saniye 0 çıkış verecek.. rb1 çıkışından ise 120 dakika 1, 120 dakika 0 çıkış verecek program yazmak istiyorum ama yapamıyorum. yardımlarınız bekliyorum, hayırlı ramazanlar...
 
Eğer sapma istemiyorsan ve birden fazla işlem yaptıracaksan çok da kolay değil.. Bi miktar sapma sorun değil diyorsan da; kristal bilgileri, kullanacağın pic in modeli ve hangi dilde yardım istediğin lazım..
 
sadece bu işlem yaptırılacak 5 10 dk lık sapmalar bile fazla önemli değil. yazılacak dil farketmez asm olsa daha iyi olur az da olsa anlıyorum asm. çok teşekkürler hayırlı ramazanlar
 
O zaman kolay olması açısından 32768 kristale göre düşünelim.. Ve 16Flerden 16F628 kullandığınızı varsayalım..

16Flerde GOTO komutundaki $ işareti bulunduğu adresi gösterir.. GOTO $-h'05' demişsem hemen üstündeki 5 komut tekrar edilecek demektir.. Hemen üstündeki 5. komuta atlama yapar yani.. MPLAB simülatörde bi dene istersen.. Saatler sürecek denemesi sanırım.. :) TRIS ayarları ve konfigurasyonunu yaparsın sanırım.. Register tanımlamalarını da halledip altına bu kodu yapıştır tamamdır.. %100 çalışacak demiyorum, gözümden kaçan bişey olabilir ama,, bu şekilde yapabilirsin.. İstersen şu goto lara da sayılar yerine etiket ver.. Karışmasın diye böyle yaptım..


MOVLW d'120'
MOVWF DAKIKA

MOVLW d'30'
MOVWF SANIYE

MOVLW d'64' ;1 saniye bekler..
MOVWF SAYAC1
CLRF SAYAC0
NOP
DECFSZ SAYAC0, F
GOTO $-h'02'
BSF PORTB, 0 ;RB0=1 yapar..

MOVLW d'64' ;1 saniye bekler..
MOVWF SAYAC1
CLRF SAYAC0
NOP
DECFSZ SAYAC0, F
GOTO $-h'02'
BCF PORTB, 0 ;RB0=0 yapar..

DECFSZ SANIYE, F ;Eğer 30 defa buraya gelmemişse 1dk geçmemiş demektir..
GOTO $-h'0F'

DECFSZ DAKIKA, F ;1dk zaman geçti.. Her dk başı 120 den geriye say..
GOTO $-h'13'
MOVLW b'00000010' ;120dk bitince RB1 i invert eder..
XORWF PORTB, F
GOTO $-h'18'
 
Son düzenleme:
ayarları yapamadım kusura bakmayın :(
 
programlarken ne kullanıyorsunuz ki? MPLAB da bunu ekleseniz başına yeterli.. Önemli olan kristal 32768 Hz olacağı için LP osc u seçmeniz..

__CONFIG _BODEN_ON &_CP_ALL &_DATA_CP_OFF &_PWRTE_ON &_WDT_OFF &_LVP_OFF &_MCLRE_OFF &_LP_OSC

ORG h'00'
MOVLW h'07'
MOVWF CMCON

BSF STATUS, RP0
MOVLW b'11111100'
MOVWF TRISB
BCF STATUS, RP0


........yukarıdaki komutlar.....
 
Programı simüle etmeden yazdığımdan döngülerden birini unutmuşum,, çeşitli hatalar yapmışım vs.. Kusura bakmayın.. Düzeltmeleri yapıp yükleyeceğim tekrar..
 
Son düzenleme:
Alttaki kod çalışır halidir. Saniyelik döngülerini simüle ettim,, genellikle 1 saykıl sapma olmadan saniyelik pals veriyor.. 32768Hz LP osilatör ile çalıştırılmalıdır.. 120dk lık döngüyü deneyemedim,, uzun geldi.. :) Herhangi hata varsa düzeltirseniz sevinirim..

Kod:
;ERRORLEVEL    -205, -202, -230
LIST    P=16F628A;,F=INHX16
include    "P16F628A.inc"
PROCESSOR    "PIC16F628A"

__CONFIG _BODEN_ON &_CP_ON &_PWRTE_ON &_WDT_OFF &_LVP_OFF &_MCLRE_OFF &_LP_OSC

CBLOCK    h'20'
    SAYAC0
    SAYAC1
    SANIYE
    DAKIKA
ENDC

    ORG    h'00'
PORT_KUR    MOVLW    h'07'
    MOVWF    CMCON
    
    BSF    STATUS,    RP0
    MOVLW    b'11111100'
    MOVWF    TRISB
    BCF    STATUS,    RP0
    
    
BASLA
    MOVLW    d'120'
    MOVWF    DAKIKA
    
SNY_YENILE    MOVLW    d'30'
    MOVWF    SANIYE
    
SNYLK_PLS    MOVLW    d'8'        ;1 saniye bekler..
    MOVWF    SAYAC1
    MOVLW    d'250'
    MOVWF    SAYAC0
    NOP
    DECFSZ    SAYAC0,    F
    GOTO    $-h'02'
    DECFSZ    SAYAC1,    F
    GOTO    $-h'04'
    BSF    PORTB,    0    ;RB0=1 yapar..
    
    MOVLW    d'8'        ;1 saniye bekler..
    MOVWF    SAYAC1
    MOVLW    d'251'
    MOVWF    SAYAC0
    NOP
    DECFSZ    SAYAC0,    F
    GOTO    $-h'02'
    DECFSZ    SAYAC1,    F
    GOTO    $-h'04'
    BCF    PORTB,    0    ;RB0=0 yapar..
    
    NOP
    DECFSZ    SANIYE,    F    ;Eğer 30 defa buraya gelmemişse 1dk geçmemiş demektir..
    GOTO    SNYLK_PLS
    
    DECFSZ    DAKIKA,    F    ;1dk zaman geçti.. Her dk başı 120 den geriye say..
    GOTO    SNY_YENILE
    MOVLW    b'00000010'        ;120dk bitince RB1 i invert eder..
    XORWF    PORTB,    F
    GOTO    BASLA
    
END

Hex e çevilemezse diye.. Bu da hex kodu.. hex uxantılı bi dosya oluşturup içine attığınızda yüklenebilir hale gelir..

Kod:
:020000040000FA
:1000000007309F008316FC30860083127830A300EF
:100010001E30A2000830A100FA30A0000000A00BA2
:100020000E28A10B0E2806140830A100FB30A000FA
:100030000000A00B1828A10B182806100000A20B26
:0C0040000A28A30B0828023086060628B8
:02400E00401F51
:00000001FF
 

Forum istatistikleri

Konular
130,027
Mesajlar
932,282
Kullanıcılar
452,985
Son üye
erhantamer

Yeni konular

Çevrimiçi üyeler

Geri
Üst