the_maniac
Üye
- Katılım
- 25 Nis 2009
- Mesajlar
- 48
- Puanları
- 1
Arkadaşlar ben 16F877A'yı kullanıyorum. Yazılımımı microc'de yapıyorum. Timer1'i kendi kodumda kullanmak istiyorum. Ayarlarını yapmak için az sayıda register var biliyorum ama tüm datasheeti okuyup dikkatle kodu yazmama rağmen kodumdaki problem olarak timer'ın saymadığını düşünüyorum. Acaba timer1'i kullanmak için yapmam gereken ayarların bir sırası var mıdır? Ben daha önce başka bir picte sıralama sorunu yaşadım. Sıralamayı düzelttiğimde problem çözülmüştü. Aşağıda ayarların bulunduğu kod parçası var. Koddaki amacım; bir ledi, doluluk oranını butonla arttırıp azaltarak pulselar halinde sürmeye çalışmak. Burada timerı high olmadan önce başlatacağım, timerın sayması bitince highdan lowa çekeceğim ledi ve low için olan sayma işlemi gerçekleşecek ve bu sürekli devam edecek.
Yardımlarınız için şimdiden teşekkürler
Microc'nin bu pic ve timer1 için olan örnek kodu da aşağıdaki gibi :
Yardımlarınız için şimdiden teşekkürler
Kod:
void main()
{
//*************************TIMER AYARLARI**************************//
TRISA=0x00;
TRISB=0xFF;
TRISC=0xFF;
TRISC=0xF0;
TRISD=0x00;
TRISE=0x00;
PORTA=0x00;
PORTB=0x00;
PORTC=0x00;
PORTD=0x00;
PORTE=0x00;
T1CON.TMR1CS=0; //TMR1CS: Timer1 Clock Source Select bit,0 = Internal clock (FOSC/4)
// T1CON.F2=0; //This bit is ignored. Timer1 uses the internal clock
T1CON.T1CKPS1=1; //Prescale bits 1:8 olarak ayarlandı
T1CON.T1CKPS0=1; //Prescale bits
T1CON.T1OSCEN=0;//Timer1 Oscillator Enable Control bit
//1 = Oscillator is enabled
//0 = Oscillator is shut-off (the oscillator inverter is turned off to eliminate power drain)
PIR1.TMR1IF=0; //TMR1IF: Timer1 Overflow Interrupt Flag bit,0 = Timer1 has not overflowed
TMR1H=0x00;
TMR1L=0x00;
PIE1.TMR1IE=1; //TMR1IE: Timer1 Overflow Interrupt Enable bit,1 = Enables the Timer1 overflow interrupt
INTCON.GIE=1; //GIE: Global Interrupt Enable bit, Enables all unmasked interrupts
INTCON.PEIE=1; //Peripheral Interrupt Enable bit, 1 = Enables all unmasked peripheral interrupts
CCP1CON.CCP1M3=0; //Capture/Compare/PWM off
CCP1CON.CCP1M2=0;
CCP1CON.CCP1M1=0;
CCP1CON.CCP1M0=0;
//****************************************************************//
Microc'nin bu pic ve timer1 için olan örnek kodu da aşağıdaki gibi :
Kod:
unsigned short cnt;
void interrupt() {
cnt++ ;
PIR1.TMR1IF = 0; // clear TMR1IF
TMR1H = 0x80;
TMR1L = 0x00;
}
void main() {
PORTB = 0xF0; // Initialize PORTB
TRISB = 0; // PORTB is output
T1CON = 1; // Timer1 settings
PIR1.TMR1IF = 0; // clear TMR1IF
TMR1H = 0x80; // Initialize Timer1 register
TMR1L = 0x00;
PIE1.TMR1IE = 1; // enable Timer1 interrupt
cnt = 0; // initialize cnt
INTCON = 0xC0; // Set GIE, PEIE
do {
if (cnt == 76) { // if cnt is 76
PORTB = ~PORTB; // then toggle PORTB leds and
cnt = 0; // reset cnt
}
} while (1);
}