Ynt: hi-tech timer0 sorunu

Başlatan madiac, 17 Eylül 2013, 18:20:22

madiac

Merhaba,

PIC 16F877A ile basit bir proje yapmak istedim, başlangıç olarak da timer 0 kullanarak led yakıp söndürmek istedim. Ama PORTB'ye bağladığım led yanıp sönmüyor, dahası sadece 5v vermesini istediğim pin pwm gibi output veriyor. Sorun nerede anlayamadım, yardım ederseniz çok sevinirim. Kullandığım kod aşağıda:

#include "htc.h"
 
/* Configuration word settings */
__CONFIG( HS & WDTDIS & PWRTDIS & BORDIS & LVPDIS & DEBUGDIS & UNPROTECT );

double timer0Counter = 0;

bit leftSignal = 0;
bit rightSignal = 0;

void main() {
        /* portb setup */
	TRISB = 0x00;
	PORTB = 0x00;
	/************/
	T0CS = 0;
	PSA = 0;
	
        /* timer 0 setup */
	GIE = 1;
	PEIE = 1;
	TMR0IE = 1;
	
	PS0 = 1;
	PS1 = 0;
	PS2 = 0;
	/**************/
	
	leftSignal = 1;
	
	RB1 = 1;
}

static void interrupt inter() {
	if( TMR0IF ){
		if( ++timer0Counter >= 2440 ) { // 2440 means about 500ms is passed
			if( leftSignal ){
				RB4 = !RB4;
			}
			if( rightSignal ){
				RB5 = !RB5;
			}
			
			timer0Counter = 0;
		}
		TMR0IF = 0;
	}
}


mesaj birleştirme:: 17 Eylül 2013, 18:22:38

Bu arada simulasyonda da gerçek devrede de aynı sorun var. Aynı işi yapan programı ccs c ile yazdım ve çalıştı. Yani ne simulasyonda ne de devrede sorun var.

Kolay gelsin.

Gökhan BEKEN

1-Kaç saniyede bir yanmasını istiyorsunuz?
2-Frekansınız kaç?

http://mikrodunya.wordpress.com/2012/06/16/not-15-timer0-kesmesi/
bu linkte anlatılan formülü uygulayın:


25mhz için hesaplarsak:
(1 * (256-TMR0) * prescaler) / (osilator_frekansi/4)
(256*256)/6250000=0,01048576sn
bu demek oluyorki her 0,01048576 saniyede bir kesme üretiyor

kesmeye her girdiğinde i değişkeninizi bir artırın ve i'nin değerini kontrol edin, tabi istediğiniz süre için i ' nin kaç olması gerektiğinide ufak bir formülle hesaplayacaksınız.

1sn = 0,01048576sn * i
i = 1 / 0,01048576
i = 95,367431640625
i = 95
Çok hassas olarak 1 saniye olmaz ama 1 saniyeye yakın bir sonuç alırsınız.
Özel mesaj okumuyorum, lütfen göndermeyin.

madiac

Aslında sıkıntı o aşamada değil. O hesaplamayı biliyorum ve 20 MHZ kullanıyorum, ona göre ayraladım timer'ı. Ama sadece RB0 = 1 gibi basit bir çıkışı da dengesiz veriyor, bozuk pwm gibi, timer ile alakası olmamasına rağmen

XX_CİHAN_XX

timer0Counter neden double olarak tanımlı?
Ve neden while(1){ .. } gibi bir ana program döngünüz yok?
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.