PIC24F-RTC

PIC24F-RTC PIC24F – RTC Modülü Kullanımı :PIC24F serisinin bir çok modülünün kullanımını buraya ekliyeceğim, birazda farklı sırada olabilecek yani RTC’den sonra port kullanımı veya adc vs. gibi. Program içinde modülün kullanımını bilmeyenler öğrenebilecektir.

/*
====================== Aykut ULUSAN         ====================
====================== Elektronik Mühendisi ==================== 
====================== IZMIR                ====================
====================== www.uicroarm.com     ==================== 
 
Board: EX16L-A (PIC24/dsPIC33 development board) 
 
www.expkits.com 'dan temin edebilirsiniz
Board ayarları : 
SWDIP6 'da 32768 ve Xtal uçları ON diğerleri OFF 
 
*/


#include <p24Fxxxx.h>

_CONFIG1(0x3F20)  	// JTAG, WDF, flash memory'ye yazma kullanılmayacak
_CONFIG2(0x7BAE)	// 10mhz xtal (HS), HSPLL enable, 


#define	LCD_RS		LATBbits.LATB8		// lcd için register select pin
//#define	LCD_RS		LATBbits.LATB8		// lcd için register select pin
#define	LCD_E		LATBbits.LATB5		// lcd enable pin	
#define	LCD_PORT		LATB
#define	LCD_TRIS		TRISB
#define	d			1				// lcd'ye data/karakter yazılacak
#define	c			0				// lcd'ye komut yazılacak
#define	D			d				// lcd'ye data/karakter yazılacak
#define	C			c				// lcd'ye komut yazılacak

typedef unsigned char 	u8;


#define NOP() 		{__asm__ volatile ("nop");}
#define CLRWDT() 	{__asm__ volatile ("clrwdt");}
#define SLEEP() 	        {__asm__ volatile ("pwrsav #0");}
#define IDLE() 		{__asm__ volatile ("pwrsav #1");}

#define	LINE_1	0x80
#define	LINE_2	0xC0
#define	LINE_3	0x94
#define	LINE_4	0xD4			
/*
LCD			PIC24
D4			PORTBbits.RB0
D5			PORTBbits.RB1
D6			PORTBbits.RB2
D7			PORTBbits.RB3
*/

// hex olarak yazılır
// haftanın günleri pazartesi 1, salı 2 ....... pazar 7
// 18.08.2009 , salı , 23:13:00
//  yıl     ay.gün   hgün.saat	  dak_san	

union zaman_uni {
  volatile unsigned int  time16bit[4];
  volatile unsigned char time8bit[8];
} RTCregs;

//volatile unsigned int zaman[]={0x2009,  0x0717,  0x0223, 0x1300};

#define yil_sbt			0x2009
#define ay_ve_gun_sbt		0x0717
#define hgunu_ve_saat		0x0223
#define dak_ve_san_sbt	0x1300	

volatile unsigned char sonuc[]={4,7,6,2,3,0};

void DLY_10US(unsigned int us);
void DLY_MS(unsigned int ms);
void LCD_ENABLE(void);
void LCD_WRITE(unsigned char da_ta, unsigned char D_C);
void LCD_SETUP(void);
void LCD_STRING(/*const*/ char *str);
void LCD_GOTO(unsigned char satir,unsigned char adres);


volatile unsigned char g; 

int 
main(void){
        while(OSCCONbits.COSC!=3);
        while(!OSCCONbits.LOCK);		// PLL kitleninceye kadar bekle
	AD1PCFG=0xFFFF;			// portlar dijital
	PMCON=0;
	LATB=0;
	PORTB=0;					// latch'leri temizle
	TRISB=0; asm("NOP");		        // B portu çıkış

	LCD_SETUP();
	
	LCD_GOTO(LINE_1,0);
	LCD_STRING("SAAT:");
	LCD_GOTO(LINE_2,0);
	LCD_STRING("TARIH:");
	
	RTCregs.time16bit[0]=yil_sbt;			// zamanı yükle
	RTCregs.time16bit[1]=ay_ve_gun_sbt;
	RTCregs.time16bit[2]=hgunu_ve_saat;
	RTCregs.time16bit[3]=dak_ve_san_sbt;
	__builtin_write_OSCCONL(0x02);		// RTC osc enable
// RTCWREN 'e yazma unlock
        asm("MOV #0x55,W0");				// flash'a yazmak için unlock yapılmalı
	asm("MOV W0,NVMKEY");                      // flash key'i yükle
	asm("MOV #0xAA,W1");
	asm("MOV W1,NVMKEY");			// 
	RCFGCALbits.RTCWREN=1;			// RTC'ye yazma enbale
	RCFGCALbits.RTCEN=0;				// RTC disable
        PADCFG1bits.RTSECSEL=1;			// saniye çıkışı
        RCFGCALbits.RTCOE=1;				// RB15 üzerinde saniye pulsi alacağız

    RCFGCALbits.RTCPTR = 3;				// yıldan itibaren zamanı yükle

	for(g=0;g<4;g++) 					// zamanı yükle
		RTCVAL=RTCregs.time16bit[g];								
	
	RCFGCALbits.CAL=0;					// kalibrasyon yapılmayacak
	RCFGCALbits.RTCEN=1;				// rtc enable								
	RCFGCALbits.RTCWREN=0;				// RTC yazmayı kilitle

	while(1) {
		while(RCFGCALbits.RTCSYNC);      // RTCSYNC=1 iken bekle
		RCFGCALbits.RTCPTR=3;
		for(g=0;g<4;g++) 
			RTCregs.time16bit[g]=RTCVAL;

		LCD_GOTO(LINE_1,5);
		for(g=0;g<3;g++) {
			LCD_WRITE((RTCregs.time8bit[sonuc[g]]>>4)+0x30,d);
			LCD_WRITE((RTCregs.time8bit[sonuc[g]]&0xF)+0x30,d);
			if(g!=2) LCD_STRING(":");
		}
		LCD_GOTO(LINE_2,6);
		for(g=3;g<6;g++) {
			LCD_WRITE((RTCregs.time8bit[sonuc[g]]>>4)+0x30,d);
			LCD_WRITE((RTCregs.time8bit[sonuc[g]]&0xF)+0x30,d);
			if(g!=5) LCD_STRING(".");
		}
        DLY_MS(250);
	}

}


// X*10US
void
DLY_10US(unsigned int us){
	while(us--) {
		__asm__ volatile ("repeat #165");
		__asm__ volatile ("nop");
	}
}


// 65536ms'ye kadar 
void
DLY_MS(unsigned int ms){
	while(ms--){
		DLY_10US(100);
	}
}

void 
LCD_ENABLE(void){	
	LCD_E=1;asm("nop");asm("nop");asm("nop");asm("nop");LCD_E=0;
}

void
LCD_WRITE(unsigned char da_ta, unsigned char D_C){
	if(D_C) LCD_RS=1;					// data modu
	else	LCD_RS=0;					// komut modu
	LCD_PORT&=0x3F0;
	LCD_PORT|=da_ta>>4;					// lcd'ye gönder, RS ve E bozulmamalı
	LCD_ENABLE();						// enable
	LCD_PORT&=0x3F0;
	LCD_PORT|=da_ta&0x0F;				// lcd'ye gönder
	LCD_ENABLE();						// enable
	DLY_10US(50);						// 50us delay
	LCD_RS=0;
}

void
LCD_SETUP(void){
	DLY_MS(100);			// lcd'nin kendini hazırlaması için 100ms
	LCD_PORT=0x3;
	LCD_ENABLE();
	DLY_MS(10);
	LCD_ENABLE(); 
	DLY_MS(10);
	LCD_ENABLE();  
	DLY_MS(10);
	LCD_PORT=0x2;
	LCD_ENABLE();
	DLY_MS(10);
	LCD_WRITE(0x28,c);		// disp on, cursor off
	LCD_WRITE(0x0c,c);		// 
        LCD_WRITE(0x06,c);		// 
	LCD_WRITE(0x01,c);		// clear display 
	LCD_WRITE(0x02,c);		//
	DLY_MS(2);		
	
}

void
LCD_STRING(char *str){
	while(*str)
		LCD_WRITE(*str++,d);
} 

void
LCD_GOTO(unsigned char satir,unsigned char adres){
	LCD_WRITE(satir+adres,c); 
}


lcd_1000kart1000card800

Etiketler:, , ,
11 Yorum

Yorum ekle

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir