PİC16F877 Hakkında ufak bir sorun

Parametre almayan fonksiyonlarda parantezler içine "void" komutu yazmak gereksizdir.
Büyük ihtimalle bu sebeple hata veriyor. Void komutunu değişken olarak algılıyor.
Şu şekilde yazın:
Kod:
void interrupt kesme()

Ben kitaptaki örneğe bakarak yazdım ama hata verdi. Kitapta benim yazdığım gibi yazıyordu. Ama sizin dediğiniz gibi de yazdım. Yine aynı hatayı veriyor.
 
Denediğiniz kodun devre şemasını paylaşabilir misiniz?

Nasıl bir hata veriyor? Hata iletisini görmeden bir çözüm getirmek kolay değil.

Yukarıdaki devreyi ve örnek kodu başka bir yerden almıştım. Şimdi kendim 16F877A için yazdığım kodu 16F84A'ya uyarladım.

C:
#include <xc.h>

#pragma config FOSC = XT
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config CP = OFF  

#define _XTAL_FREQ 4000000

void interrupt kesme()
{
    INTCONbits.GIE = 0;

    if( INTCONbits.INTF)   // kesme oluştu mu?
    {
        PORTAbits.RA0 = ~ PORTAbits.RA0; //  RA0'ı ters çevir

        INTCONbits.INTF = 0; //  kesme bayrağını tekrar temizle
    }
   INTCONbits.GIE = 1;
}
void main()
{
    TRISBbits.TRISB0 = 1; // RB0 giriş
    TRISAbits.TRISA0 = 0; // RA0 ucu çıkış
    PORTAbits.RA0 = 0; // RA0'ı düşük yap

    INTCONbits.GIE = 1;
    INTCONbits.INTE = 1;
    OPTION_REGbits.INTEDG = 1;

    while(1)
    {
    }
}

Yukarıda paylaştığım devreyi kurmanız gerekiyor.

Kod derleniyor. Kodu şu şekilde derleyebiliyorum.

$ picc --chip=16F84A dene.c --OPT=none -Odene.hex

Devre üzerinde test etmek de size kalmış.

Bu arada meraklılar için paylaşayım.

Arkadaşın daha önce sormuş olduğu ışıkların yarısını yakıp, yarısını söndüren uygulama µ denetleyicinin kendisinden kaynaklanan bir hata ("bug") yüzünden çalışmıyormuş.

Örneğin PORTB ^= değişken şeklinde bir kullanım oku-değiştir-yaz şeklinde bir komut olduğu için eski 16F serisi µ denetleyicilerde yazılım hatalarına ("bug") neden olabiliyor.

Yeni PIC'lerde Microchip bu sorunu aşmak için LAT yazmacını eklemiş.
 
Son düzenleme:
Denediğiniz kodun devre şemasını paylaşabilir misiniz?

Nasıl bir hata veriyor? Hata iletisini görmeden bir çözüm getirmek kolay değil.

Yukarıdaki devreyi ve örnek kodu başka bir yerden almıştım. Şimdi kendim 16F877A için yazdığım kodu 16F84A'ya uyarladım.

C:
#include <xc.h>

#pragma config FOSC = XT
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config CP = OFF 

#define _XTAL_FREQ 4000000

void interrupt kesme()
{
    INTCONbits.GIE = 0;

    if( INTCONbits.INTF)   // kesme oluştu mu?
    {
        PORTAbits.RA0 = ~ PORTAbits.RA0; //  RA0'ı ters çevir

        INTCONbits.INTF = 0; //  kesme bayrağını tekrar temizle
    }
   INTCONbits.GIE = 1;
}
void main()
{
    TRISBbits.TRISB0 = 1; // RB0 giriş
    TRISAbits.TRISA0 = 0; // RA0 ucu çıkış
    PORTAbits.RA0 = 0; // RA0'ı düşük yap

    INTCONbits.GIE = 1;
    INTCONbits.INTE = 1;
    OPTION_REGbits.INTEDG = 1;

    while(1)
    {
    }
}

Yukarıda paylaştığım devreyi kurmanız gerekiyor.

Kod derleniyor. Kodu şu şekilde derleyebiliyorum.

$ picc --chip=16F84A dene.c --OPT=none -Odene.hex

Devre üzerinde test etmek de size kalmış.

Bu arada meraklılar için paylaşayım.

Arkadaşın daha önce sormuş olduğu ışıkların yarısını yakıp, yarısını söndüren uygulama µ denetleyicinin kendisinden kaynaklanan bir hata ("bug") yüzünden çalışmıyormuş.

Örneğin PORTB ^= değişken şeklinde bir kullanım oku-değiştir-yaz şeklinde bir komut olduğu için eski 16F serisi µ denetleyicilerde yazılım hatalarına ("bug") neden olabiliyor.

Yeni PIC'lerde Microchip bu sorunu aşmak için LAT yazmacını eklemiş.
Örnek resimdeki gibi. RB1 deki led 1 sn aralıklarla yanıp söner. Kesme aktif olunca RA0 daki led 2 Sn boyunca yanar. Devrenin çalışma şekli bu.
 

Ekli dosyalar

  • IMG-6689.JPG
    IMG-6689.JPG
    417.7 KB · Görüntüleme: 5
İlk önce daha önce paylaştığım 16F84A için devreyi kurup, son paylaştığım kodu denemenizi tavsiye ederim.

RB0 düğmesine basılınca harici kesme tetiklenmiş oluyor.

Sonuçta önemli olan kesme kullanımını öğrenmek.
 
İlk önce daha önce paylaştığım 16F84A için devreyi kurup, son paylaştığım kodu denemenizi tavsiye ederim.

RB0 düğmesine basılınca harici kesme tetiklenmiş oluyor.

Sonuçta önemli olan kesme kullanımını öğrenmek.
Ama sıkıntı şu derleyici hata veriyor onu da denedim aynı hatayı alıyorum. Derleyici derlese proteus ta deneyeceğim ama hata veriyor.
 
Proteus benzetim programını hiç kullandığımı hatırlamıyorum.

Size de tavsiyem bir tane PIC programlayıcısı alarak gerçek devre üzerinde denemenizdir.

Çünkü kağıt üzerinde çalışıyor gözüken devreler, gerçekte çalışmayabilir.

Buna bir örnek düğmeye basılınca gerçekte anahtar sıçraması diye bir durum var.

Bouncy_Switch.png



Ya da bu örnekteki gibi hakiki derleyici ile derlenen uygulamalar, benzetim programı ile derlenmeyebilir.

Ben MPLAB XC8 C derleyicisi sürüm V1.36 kullanıyorum. Derleyiciyi bu adresten ücretsiz indirilebilirsiniz.
 
Arkadaşlar Güneş panelindeki voltajı (12V) Lcd de nasıl görüntüleyebilirim? Devre resimdeki gibi.
 

Ekli dosyalar

  • Ekran Alıntısı.PNG
    Ekran Alıntısı.PNG
    113.4 KB · Görüntüleme: 11
Arkadaşlar; PİC16F877A ile adc kullanarak 12V batarya gerilimini Lcd ekranda görüntülemek istiyorum. Fakat bir türlü beceremedim. Ekranda sürekli 0 V görünüyor. Sorun nedir tam olarak yardımcı olursanız sevinirim. CCS C kodları aşağıdaki gibidir;
Kod:
#define LCD_ENABLE_PIN PIN_B2
#define LCD_RS_PIN PIN_B0
#define LCD_RW_PIN PIN_B1
#define LCD_DATA4 PIN_C4
#define LCD_DATA5 PIN_C5
#define LCD_DATA6 PIN_C6
#define LCD_DATA7 PIN_C7

#include <lcd.c>

void main()
{
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   int adc_giris=0;
   float voltaj=0;
   lcd_init();

   while(TRUE)
   {
      set_adc_channel(0);
      delay_us(20);
      adc_giris=read_adc();
      voltaj=adc_giris*12.0/1023.0;
      printf(lcd_putc, "\f voltaj= %f V",voltaj);
      delay_ms(100);
   }

}
 

Ekli dosyalar

  • Problem.PNG
    Problem.PNG
    110.1 KB · Görüntüleme: 11

Forum istatistikleri

Konular
129,838
Mesajlar
930,674
Kullanıcılar
452,675
Son üye
xzscorpionn

Yeni konular

Geri
Üst