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);
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.
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);
}