Pic 16F877A İle Timer1 Kullanımı

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 :)

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);
}
 
Bahsettiğin algoritma pwm e benziyor. PWM kullanacaksan timer2 ile ilgilenmen gerekir.

MicroC yi bilmiyorum ama CCS de bunları ayarlamak için hazır fonksiyonlar var. Örnekleri de var. Kolayca adapte edebilirsin kendi programına.

MicroC örnekleri yok mu?

Bir de programı C ile yazıyorsun ama assembly den farkı kalmamış. Bütün registerlere tek tek müdahele ediyorsun. Hata yapma ihtimali çok yüksek. Hazır fonksiyonlarına bak.
 
Microc kullanmalıyım ccs ile pek alakam olmadı ve 1-2 gun içinde bu sorunu çözmeliyim.

Kendi kodumun altında microcnin örneğini de verdim. O kodda da assembly tarzında yaptığına göre sanırım hazır fonksiyonu yok.

Bir de pwm hiç kullanmadım. Daha önce timer1i kullanarak 14 pinli bir picte yazdım bu kodu ve çalıştırdım. Şimdi aynı kodu gerekli yerleri değiştirerek 16F877A için yazmaya çalışıyorum. Fakat bi yerlerde ufak bir sıralama hatam ya da gözumden kaçan bir şey var. Bulmama yardımcı olabilirseniz sevinirim. Teşekkur ederim :)
 
TMR1H=0x00;
TMR1L=0x00;
Satrından sonra
T1CON.TRMR1ON=1;
satırını eklersen sorunsuz çalışır.
 
pardon yanlış oldu
TCON.TMR1ON=1;
 
TMR1H=0x00;
TMR1L=0x00;
Satrından sonra
T1CON.TRMR1ON=1;
satırını eklersen sorunsuz çalışır.

Teşekkür ederim yardımın için. Kodun hemen devamında zaten timerı başlatıyorum.Yukardaki halinin devamı şöyle :

...
a=1;b=9;x=a;
table(x);
HL='H';
flag=0;
T1CON.TMR1ON=1;//TMR1ON: Timer1 On bit, 1 = enables the timer ....
 
Assembly bilen arkadaşlar yardımcı olabilirseniz gerçekten sevinirim. Microc'de de zaten assembly gibi yazıyorum. Elinde 16F877A için assembly'de ya da microc'de yazılmış, timer1 kullanılan bir kod örneği varsa ve paylaşabilirse çok sevinirim. Ayarların nasıl yapıldığına dair yardıma ihtiyacım var. Şimdiden çok teşekkürler :)
 
Timer1 çalışıyordur da sorun başka yerdedir.

Proteus üzerinde debug yaparsan görürsün sorunu. Derleyicin debug dosyası üretsin (.cof veya .cod). Proteus ISIS üzerinde çizimi yap ve adım adım (c kaynak kodu seviyesinde) debug yap. Timer1 registerlerinin içeiriğini takip et.
 
.dbg uzantısı dışında debug uzantısı göremiyorum. Sorun yaratır mı ?
 
isis te mcu yu yerleştirdikten sonra mcu üzerine 2 kere tıklarsan sana yazılım soran kısımda üç seçenek sunuyor. Ya .hex, ya .cof veya .elf . üçüncüsü Arm lar içindir. Diğerleri diğer mcular için. .cof veya .cod standarttır. .dbg dosyasını tanıtamazsınız.

MicroC nin kendi offline simulasyonu var ise oradan da debug işlemi yapabilirsiniz.
 

Forum istatistikleri

Konular
129,846
Mesajlar
930,722
Kullanıcılar
452,701
Son üye
Kerem1453

Yeni konular

Geri
Üst