Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Timer1 ile saat yapımı

Başlatan halinzlimurat, 26 Mayıs 2007, 11:30:05

halinzlimurat

merhaba arkadaşlar,
pic 16f628 in b.6 ve b.7 portlarına 32.768 khz kristal bağlayarak ve timer1 i kullanarak hassas saat yapılabildiğini biliyorum. araştırdım da epeyce buldum bişiler fekat isis te uygulayınca olmuyor muhtemelen isis in azizliğindendir.

demem odur ki elinizde pic basic pro ile yapılmış çalıştığı kesin kod varsa yollar mısınız?

Saygılar....
@<-.HKM.->@

Chan86

Merhaba arkadaşım 16f628in dahili osilatörü var.sorun ondan kaynaklanıyo olmasın bide isiste osilatör bağlamana gerek yok.Bide isisin sorunlu çalışması var elbette aynı dert bendede var çünkü ordan biliyorum.

Macera

Alıntı yapılan: "halinzlimurat"merhaba arkadaşlar,
pic 16f628 in b.6 ve b.7 portlarına 32.768 khz kristal bağlayarak ve timer1 i kullanarak hassas saat yapılabildiğini biliyorum. araştırdım da epeyce buldum bişiler fekat isis te uygulayınca olmuyor muhtemelen isis in azizliğindendir.

demem odur ki elinizde pic basic pro ile yapılmış çalıştığı kesin kod varsa yollar mısınız?

Saygılar....
C altında 12F675 de denenmiş kod var
En azından bir fikir verebilir.
Program her saniyede bir kesme yaratıyor.
Diğer zamanlarda uykuya dalıyor.

#include "12F675.h"
#pragma bit strobe @ GPIO2
#pragma config |= 0x3194          
#include "int16CXX.H"
#pragma origin 4
/* 
    20,4,2007 denendi
    2 ve 3 pine 32.768khz kristal bağlanacak
    5 pine led
*/
interrupt int_server( void)
{
    int_save_registers    // W, STATUS (and PCLATH)
 //   swPCLATH = PCLATH;
    if ( TMR1IF )  
    {
        strobe  = !strobe;
        TMR1H   = 0x80;
        TMR1IF = 0;  /* reset flag */
     }
    int_restore_registers // W, STATUS (and PCLATH)
  //  PCLATH = swPCLATH;
}
void RealTimeinit(void)
{
    uns8 y,z;
    GIE     = 0;
    TMR1H   = 0x80;
    TMR1L   = 0x00;
    T1CON   = 0x0F;//Asynchronous operation , external oscillator , 
       for(y = 0 ; y < 255 ; y++)
        for(z = 0 ; z < 255 ; z++);
    GIE     = 1;
    PEIE    = 1;
    TMR1IE  = 1; //Zaman kesmesi etkin

}

void main(void)
{
    uns8 k,l;
    CMCON   = 0;
    ANSEL   = 0;
    GPIO    = 0;
    TRISIO  = 0;
    #asm
    BSF STATUS,RP0
    DW 0x2000+0x03FF
    MOVWF   OSCCAL
    BCF     STATUS,RP0
    #endasm
    RealTimeinit();
    while(1)
    {   
    sleep();
   }
}
"Art without engineering is dreaming; engineering without art is calculating." -- Steven K. Roberts

POWER

Kesme kullanılarak yapılmış saat proğramı,proğramı inceleyerek kendine göre değiştirebilirsin.

http://rapidshare.com/files/33539319/SAAT.rar.html
TB6BKG

akof

32768 Hzlik kristal 1 saniyede 32768 kere sinyal verir. timer1  0x8000 den yani 32768 den başlarsa 65536 ya kadar sayması 1 sn sürer ve kesme üretir

pbp da bir komutun işlemesi bitmeden kesme gelse dahi işlenen komuttan çıkılmaz. tabi bu pbp kodlarıyla yapılan kesmeler için geçerli

define inthand ile asm deki gibi gerçek zamanlı bir kesme yapılabilir.

asm bpb karışık bir kod yazdım denedim çalışıyor ama 1 günde birkaç dk ileri veya geri kalabilir. bu tamamen kullandığın kristallerle ilgili. hatta ben 4MHz lik kristal kullanmadım onu yerine intrc ile denedim.

değişken ayarlamaları kod eklemen lazım umarım yararlı olur.

@ DEVICE pic16F628  
@ DEVICE PIC16F628, MCLR_OFF                                                    
@ DEVICE pic16F628, WDT_OFF              
@ DEVICE pic16F628, PWRT_OFF            
@ DEVICE pic16F628, PROTECT_OFF
@ device pic16F628, INTRC_OSC_NOCLKOUT
@ device pic16F628, BOD_OFF

	wsave  var	byte $20 system
	ssave  var	byte bank0 system
	psave  var	byte bank0 system
	
	sn      var byte
	dk     VAR BYTE
	saat   var byte
    sayac   var byte
    i       var word  
	
Goto BASLA
    	
	define INTHAND KESME
	asm
KESME
    bcf     INTCON,7	
    movwf	wsave
    swapf	STATUS, W
    clrf	STATUS
    movwf	ssave
    movf	PCLATH, W
    movwf	psave

    ENDASM
TMR1L = $00 '
TMR1H = $80 '
            'tmr1 değerleri tekrar yüklendi BURDA BASLADI ÇÜNKÜ İÇERİK DEĞİŞTİ
PIR1.0 = 0 'tekrar kesme olması için kurduk
SN = SN + 1
IF SN = 60  THEN
SN = 0
    DK = DK + 1
        if dk = 60 then
        dk = 0
        saat = saat +1
            if saat = 24 then  
            saat = 0
            endif
        endif
    endif         

    ASM	
    movf	psave, W
    movwf	PCLATH
    swapf	ssave, W
    movwf	STATUS
    swapf	wsave, F
    swapf	wsave, W
    bsf     INTCON,7
    retfie
	endasm


BASLA :    
sn = 0
dk = 0
saat = 0
sayac = 0
TMR1L = $00 ' timer1e ilk değer plarak 32768 
TMR1H = $80 ' yükledik hex 80000
CMCON = 7'porta I/O
INTCON = %11000000 'kesme , çevresel kesmeler açık
PIE1.0 = 1' timer1 kesmesine izin ver 
T1CON = %00001011
    
goster :
PAUSE 100
lcdout 254,1 
LCDOUT $FE,$84,DEC2 SAAT,":",DEC2 DK,":",dec2 sn
lcdout $FE,$C0,"  PIC PROJE"
goto goster
END