RC0 TIMER1 Pini Kullanımı Yardım!!

addeemm36

Üye
Katılım
23 May 2006
Mesajlar
9
Puanları
1
Yaş
40
Merhaba Üstatlar,

Ben CCS C işine yeni başladım yardımlarınızı bekliyorum bende hazır bir devre var bunun yazılımını değiştirmek istiyorum devre RCO pininden gelen pals sayıyor, araştırmalarım TIMER1 kullanılması gerektiği yönünde ben örnek uygulamaları aldım denedim olmadı değiştirdim olmadı en son değişmiş hali aşağıdadır. Devredeki 5MHZ osilatör kullanılmış. Hazır program üzerinden gideyim olmadı T1CON değerini ayarlayayım dedim yine olmadı. Ben programdan RC0 pininden gelen palsi saymasını istiyeceğim (yani butona her basışı) daha sonra sayılan pals değerlerine göre alt programlara yönlendireceğim.

#include "PIC16C73B.h"

// Denetleyici konfigürasyon ayarları
//#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=5000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
#byte T1CON=0X10
int i=0; // Tamsayı tipinde değişken tanımlanıyor

//****************** Timer0 Kesmesi *****************************
#int_timer1 // Timer1 kesmesi
void timer1_kesme () // Kesme fonksiyonu ismi
{
set_timer1(63036); // TMR1 değeri belirleniyor

i++; // i değeri 1 arttırılıyor

if (i==50) // i değeri 50'ye eşit olursa RB0 lojik-1 olsun
output_high(pin_b0);
if (i==100) // i değeri 100'e eşit olursa RB0 lojik-0 ve i=0 olsun
{
output_low(pin_b0);
i=0;
}
}

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
setup_psp(PSP_DISABLED); // PSP birimi devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF); // ADC birimi devre dışı
setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı


set_tris_b(0x00); // B portu komple çıkış

output_b(0x00); // B portu çıkışı ilk anda sıfırlanıyor

//setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // Timer1 ayarları yapılıyor
T1CON=00000011; // DEĞİŞİK VARYASYONLAR DENEDİM OLMADI:)::
set_timer1(63036); // TMR1 değeri belirleniyor


// enable_interrupts(INT_timer1); // int_timer0 kesmesini aktif yapar
enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

while(1); // Sonsuz döngü

}
 
- 5 MHz için #fuse ayarlarında XT yerine HS kullanmalısın yoksa tüm zamanlamalar aksar

- output_high() - output_low() gibi fonksiyonlar kullanacaksan #use fast_io(b) satırını kaldır.

- T1CON'un ilk iki bitini set edeceksen T1CON=00000011 yazarsan derleyici bunu büyük olasılıkla desimal algılar ve 0 ve 1. bitler ile birlikte 3. biti de set eder(desimal 11 = binary 00001011) Doğrusu T1CON=0b00000011 olmalıydı.

- Fakat zaten T1CON 1. biti set ederek harici clock kullanacaksan, timer1 kurma fonksiyonunda neden internal seçiyorsun? Şöyle yazman yeterli: setup_timer_1(T1_EXTERNAL|T1_DIV_BY_8);

- Bu düzeltmeleri yaptığında, TMR1'E 63036 sayısı yüklendiği için taşma yapması ve kesmeye girmesi c0 portuna 2500 pulse gelmesi lazım.
Her taşmada kesme fonksiyonunda "i"nin değeri 1 artacak, yani 2500*50 pulse gelince b0 high 2500*100 pulse gelince b0 çıkışı 0 olacak.
 
Teşekkürler ..... Yardımınız İçin hocam.Size bir kaç sorum daha olacak . Bendeki devre anons devresi PIC adres bilgilerini göndererek oradan kayıtlı sesin okunmasını sağlıyor. Ben yazılımda şöyle birşey yapmam gerekiyor; örneğin ses dosyası harici epromun F7A0 ile 11960 (hex) adresinde ben F7A0 Adresinden başlayarak 11960 adresine kadar saydıracağım bu esnada adres bilgilerini tek tek pic çıkışından eproma göndereceğim bunu birtürlü yapamadım. Çıkışın sürekli değişmesi gerekirken değişmiyor:((

void SES1_ALTPRO()
{
X=F7A0;
do {
++X;
output_bit(PIN_B0,A0);
output_bit(PIN_B1,A1);
output_bit(PIN_B2,A2);
output_bit(PIN_B3,A3);
output_bit(PIN_B4,A4);
output_bit(PIN_B5,A5);
output_bit(PIN_B6,A6);
output_bit(PIN_B7,A7);
output_bit(PIN_A0,A8);
output_bit(PIN_A1,A9);
output_bit(PIN_A2,A10);
output_bit(PIN_A3,A11);
output_bit(PIN_A4,A12);
output_bit(PIN_A5,A13);
output_bit(PIN_C2,A14);
output_bit(PIN_C3,A15);
output_bit(PIN_C4,A16);
output_bit(PIN_C5,A17);
output_bit(PIN_C6,A18);
output_bit(PIN_C7,A19);
delay_us(125);
}while(X!= 11960);
}

TANIMLAMALAR
int32 X=0;
#bit A0 = X.0
#bit A1 = X.1
#bit A2 = X.2
#bit A3 = X.3
#bit A4 = X.4
#bit A5 = X.5
#bit A6 = X.6
#bit A7 = X.7
#bit A8 = X.8
#bit A9 = X.9
#bit A10 = X.10
#bit A11 = X.11
#bit A12 = X.12
#bit A13 = X.13
#bit A14 = X.14
#bit A15 = X.15
#bit A16 = X.16
#bit A17 = X.17
#bit A18 = X.18
#bit A19 = X.19
 
Son düzenleme:
Diğer iki sorunu halletim en kısa sürede yazdıklarımla ilgili paylaşımda bulunacağım. Aşağıda yazılı program çalışıyor ama ses çok yavaş anlaşılmıyor:) Bu yazılımı nasıl kısaltarak bu döngüyü hızlandırabilirim acaba. Diziyle yaparak hızlandırayım dedim hata verdi dizide değişken tanımlanamaz diye bir hata. Mantığa göre yazdım:) Bana yardımcı olursanız çok sevineceğim. Devre 5Mhz Kristalle yapılmış ve daha önce çalışan bir devre.

HATA VERDEN PROGRAM
int Dizi1[20]={A20,A19,A18,A17,..........,A0};
int Dizi2[20]={PIN_C7,PIN_C6,......,PIN_B0};

void SES1_ALTPRO() //BU FONKSİYONU DAHA YAZMADAN PROGRAM DİZİ TANIMLAMADA HATA VERDİ
{
X=448; // EMİNİM BUNLARA DA HATA VERECEKTİ
do {
++X;
Dizi1[]=Dizi2[];
}while(X!= 11960);
}


YAVAŞ ÇALIŞAN PROGRAM
void SES1_ALTPRO()
{
X=448;
do {
++X;
output_bit(PIN_B0,A0);
output_bit(PIN_B1,A1);
output_bit(PIN_B2,A2);
output_bit(PIN_B3,A3);
output_bit(PIN_B4,A4);
output_bit(PIN_B5,A5);
output_bit(PIN_B6,A6);
output_bit(PIN_B7,A7);
output_bit(PIN_A0,A8);
output_bit(PIN_A1,A9);
output_bit(PIN_A2,A10);
output_bit(PIN_A3,A11);
output_bit(PIN_A4,A12);
output_bit(PIN_A5,A13);
output_bit(PIN_C2,A14);
output_bit(PIN_C3,A15);
output_bit(PIN_C4,A16);
output_bit(PIN_C5,A17);
output_bit(PIN_C6,A18);
output_bit(PIN_C7,A19);
}while(X!= 11960);
}
 
Son düzenleme:
32 bit adresin İlk sekiz bitini b portuna 9,10,11,12,13 bitleri a portuna 14,15,16,17,18,19 bitlerini c portunun 2....7 (6 pine) gönderilecek geri kalan bitler kullanılmayacak çünkü harici eprom adresi 20 bitlik.
Bana daha hızlı nasıl gönderirim yardım edecek ustalar yok mu şimdi.
 

Forum istatistikleri

Konular
129,796
Mesajlar
930,187
Kullanıcılar
452,591
Son üye
Ercan Akkaya

Yeni konular

Geri
Üst