Atmega644P Timer Kullanımı

Başlatan vitruvius, 02 Mayıs 2014, 15:08:32

vitruvius

Merhaba,

Atm644P'nin A0, A1 pinlerine iki buton, D7 pinine de bir led bağladım. Yapmak istediğim butonların birine bastığımda led 1sn aralıkla, diğerine bastığımda 100ms aralıkla yanıp sönsün. Devreyi simulasyonda deniyorum, tek tek butonlara bastığımda istediğim sonucu alıyorum ama 1sn süreyi ayarlayan butona bastıktan sonra 100ms'lik butona tekrar basarsam led son halinde donuyor. Bunun sebebi nedir acaba?

Teşekkürler.

Kod:
#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 4000000UL

int main(void)
{	
	
	DDRD = 0xFF; // PORTD is output.	
	DDRA = 0x00; // PORTA is input.
	
	PORTD = 0x00;
	PORTA = 0x00;
	
	TCCR1B = (1 << WGM12);
	TIMSK1 = (1 << OCIE1A);
	
	sei();

    while(1)
    {
		if (bit_is_clear(PINA,0))	//	100ms
		{
			while(bit_is_clear(PINA,0));
			{
				TCCR1B |= (1 << CS10) | (1<< CS12);
				OCR1A = 390;				
			}
		}
		
		if (bit_is_clear(PINA,1))	//	1sec
		{
			while(bit_is_clear(PINA,1));
			{
				TCCR1B |= (1 << CS10) | (1<< CS12);
				OCR1A = 3906;
			}
		}		
    }
}

ISR(TIMER1_COMPA_vect)
{
	PORTD ^= (1 << PORTD7);
	PORTD ^= (1 << PORTD6);
}

AST

#1
Başlangıçta PORTA=0xFF yükleyip dener misin.

vitruvius

Alıntı yapılan: AST - 02 Mayıs 2014, 15:24:57
Başlangıçta PORTA=0xFF yükleyip dener misin.

Denedim hocam sonuç aynı.

Kabil ATICI

#3
Harici pull-up kullanıyor musun?

Timer1 OCR1A değiştirilirken
-timer1 veya genel kesmesinin iptal edilmesi
-timer1 sayıcı registerlerinin sıfırlanması
-OCR1A değiştirilmesi
-ve  timer1 veya genel kesmesinin devreye alınması...
şeklinde çalışılması gerekir.

sei() --> genel kesme izni
cli() -->genel kesme izni iptal olabilir...(düzeltme)

Senin olayda şimdi 1sn sayarken sen OCR1A değerini değiştirirsen ve timer1 sayıcısı OCR1A aşmışsa ne olur? İŞte senin olayın bunun cevabı.
ambar7

vitruvius

Alıntı yapılan: ambar7 - 02 Mayıs 2014, 15:54:09
Harici pull-up kullanıyor musun?

Timer1 OCR1A değiştirilirken
-timer1 veya genel kesmesinin iptal edilmesi
-timer1 sayıcı registerlerinin sıfırlanması
-OCR1A değiştirilmesi
-ve  timer1 veya genel kesmesinin devreye alınması...
şeklinde çalışılması gerekir.

sei() --> genel kesme izni
cli() -->genel kesme izni olabilir...

Senin olayda şimdi 1sn sayarken sen OCR1A değerini değiştirirsen ve timer1 sayıcısı OCR1A aşmışsa ne olur? İŞte senin olayın bunun cevabı.

Anladım hocam. Harici pull-up kullanıyorum evet. Aynen sorun sorduğunuz sorudaymış. If koşulları altında counter register'ı sıfırlayınca düzeldi. Teşekkür ederim.