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ş.