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); }
11 Yorum
Sağolun hocam yine güzel bir çalışmaya imza atmışssınız 16/32 bit dentleyici konusunda güzel uygulamalarınız mevcut uzun süredir sitede bir hareket göremeyince bıraktınız sandım. Neyseki tekrar başladınız. Bu arada kullandığınız pic24,dspic v.s dentleyicileri İstanbul civarında elden alışveriş ile temin edebilieceğimiz bir yer varmı bildiğiniz
Merhaba Erhan,
İnternetten online’da dsPIC alabilirsin. Karaköyde araştırırsan kolaylıkla bulursun.Aşağıdaki adreste dsPIC var.
http://www.direnc.net/main/products.asp?cat_ID=288
Sağolun hocam o siteyi biliyorum o siteninin satış politakası biraz yanlış siede 3-4 çeşit dspic vardı. Almak için gittim fakat ellerinde sadece bir çeşit dspic kalmış onunda fiyatı iki katına yükselmiş bu durum hakkında posta attım ürün bulunmuyo v.s gibi cevaplar verdiler O gün bu gündür hala tek pic var ellerinde olmadı karköyde araştıracağım sağolun tekrardan
Don’t have a lot of money to buy a building? You not have to worry, because it is possible to receive the business loans to solve all the problems. Hence take a small business loan to buy all you need.
Are you willing to get buy resume, which conform the range of research you wish?. You can trust our resume writers, as you count on yourself. Thanks because it is the useful knowledge
Merhaba hocam yukardaki asmde yaptığımız kodun aynısını Mplab C30 nasıl yapabilirim. Amacım TEMP5 registerin bitlerini tek tek kontroletmek istiyorum.
TEMP5 EQU 0X20 ;KANAL VE GENEL KONTROL REGISTERI
;TEMP5,0 1.KANAL KONTROL REGISTERI
;TEMP5,1 2.KANAL KONTROL REGISTERI
;TEMP5,2 3.KANAL KONTROL REGISTERI
;TEMP5,3 4.KANAL KONTROL REGISTERI
;TEMP5,4 5.KANAL KONTROL REGISTERI
;TEMP5,5 6.KANAL KONTROL REGISTERI
;TEMP5,6 7.KANAL KONTROL REGISTERI
;TEMP5,7
Merhaba hocam yukardaki asmde yaptığımız kodun aynısını Mplab C30 nasıl yapabilirim. Amacım TEMP5 registerin bitlerini tek tek kontroletmek istiyorum.
Merhaba Mert,
Aşağıdaki gibi yapabilirisin.
Tekrar Merhaba Aykut,
Aşağıdaki verdiğiniz kod yazdım ve gayet güzel çalıştı fakat bu registere herhangi bir değer yüklemek istediğim zaman ( örnek: TEMP5=0; veya TEMP5=mert_data; )hata mesajını alıyorum (68: error: incompatible types in assignment)
Tekrar Merhaba Aykut,
Aşağıdaki verdiğiniz kod yazdım ve gayet güzel çalıştı fakat bu registere herhangi bir değer yüklemek istediğim zaman ( örnek: TEMP5=0; veya TEMP5=mert_data; )hata mesajını alıyorum (68: error: incompatible types in assignment)
Merhaba Mert,
Aşağıdaki gibi yapabilirisin. Soruların C dili ile ilgili sorular, bu yönünü geliştirmelisin.