pic timer kullanımı

Başlatan rasimmm, 03 Haziran 2018, 06:02:40

rasimmm

Arkadaşlar merhaba,
Daha önce hiç pic programlamadım ama şuan picde yazılmış bir kodun timer kısmını yorumlayıp ne yaptığını anlamaya ihtiyacım var. Aşağıdaki dört satırın  arduino versiyonunu yazacam ama yanlış yorumlamak istemiyorum. Şimdiden teşekkürler
kullanılan pic:PIC 18F452 mikrodenetleyicisi
kullanılan kristal:10 Mhz XT

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_bit);
//25us .5ms
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);

Z80

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_bit);
Timer 0 ayarları: timer'ın sinyal kaynağı internal yani dahili (TOSC/4) 1/(10 MHz/4) = 400 ns
prescalar 64 (1-256 arasıdır)
Tİmer 0 18F serisinde 8 veya 16 bit uzunluğunda olabilir, 8 bit seçilmiş.


setup_timer_1(T1_DISABLED);
Timer 1 iptal edilmiş.


setup_timer_2(T2_DIV_BY_1,0,1);
Timer 2 herzaman dahili sinyal kaynağı kullanır, prescalar 1 (sinyal bölünmüyor),
PR2 değeri = 0 (TMR2 8 bit'dir, PR2 ve TMR2 eşit olduğunda sinyal çıkışı verir)
Postscalar 1.


setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
Timer 3 iptal edilmiş.

Daha ayrıntılı bilgi datasheet'inde.

mg1980

Arduino Timer Ayarları ile ilgili notlarımdan:

//KESME DENEME(TIMER0)...
//TIMER  ayarları ile ilgili esaslar...


#include <MsTimer2.h>

int sayac;

void TIM2_Ayar() {
  MsTimer2::set(1000, zaman);  //Timer2 için .Zaman takipine lazım.
  MsTimer2::start()
}

void zaman()  //Timer2 kesmesiyle zamanın takibi için.//*********************************************
{
 sayac++;
 if(sayac==3600)  //3600
 {
  saat++;
  sayac=0;
  if(saat==24) saat=0;
  lcd_Yaz();
 }
}


void TIM1_Ayar() {

  cli();      //Tüm interruptları kapat....
  TCNT1  = 0;
  TCCR1A = 0;
  TCCR1B = 0;
  OCR1A = 500;//15624;  // 1 saniye=15624, 40 ms=600 yaklaşık çalışması için gerekli zaman kesmesi frekansı
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12) | (1 << CS10);
  TIMSK1 |= (1 << OCIE1A);
  sei();   //Tüm interruptları çalıştır.
  
}

ISR(TIMER1_COMPA_vect) {     //Her kesmeye girildiğinde otomatik çalıştırılacak fonksiyon.
 
  digitalWrite(LEDX, !digitalRead(LEDX));
   if(sinyal.decode(&veri))
    {
     sinyal.resume();
     cli();      //Tüm interruptları kapat....
     islem();
     }
    
 }
 


void TIM0_Ayar() {  //Timer0 Ayarları...
  cli();                                    //stop interrupts                                          
                                             //set timer0 interrupt at 2kHz
  TCCR0A = 0;                                // set entire TCCR0A register to 0
  TCCR0B = 0;                                // same for TCCR0B
  TCNT0  = 0;                                //initialize counter value to 0
                                            // set compare match register for 2khz increments
  OCR0A = 125;                              // = (16*10^6) / (2000*64) - 1 (must be <256)........124 idi.
                                            // turn on CTC mode
  TCCR0A |= (1 << WGM01);
                                            // Set CS01 and CS00 bits for 64 prescaler
  TCCR0B |= (1 << CS01) | (1 << CS00);   
                                            // enable timer compare interrupt
  TIMSK0 |= (1 << OCIE0A);
  sei();                                   //allow interrupts 

}




void setup() {
   
   TIM0_Ayar();
   
   pinMode(2,OUTPUT);
   
  

}

ISR(TIMER0_COMPA_vect) {                    //timer0 interrupt 2kHz toggles pin 8
  
                                          
   sayac++;
                                          //generates pulse wave of frequency 2kHz/2 = 1kHz (takes two cycles for full wave- toggle high then toggle low)
  if (sayac==50) {
  digitalWrite(2, !digitalRead(2));
  sayac=0;
  }
  
  
}

void loop() {
  delay(100);
}