Merhaba arkadaşlar, armda I2C yi kullanayım dedim. interruptları çalıştıramadım. Bu startup koduyla ilgili bi sorun var heralde. I2C ile interrupt üretiyorum. ancak interrupt a dallanma olmuyor. I mean, interrupt function doesnt start. Please help.
Startup kodunda aşağıdaki kod alanına bişeyler yazmam gerekiyor. ama bi türlü yazamadım.nerdeyse 3 gün olacak. bayram bile geldi.
Vectors
LDR PC, Undef_Addr
LDR PC, SWI_Addr
LDR PC, PAbt_Addr
LDR PC, DAbt_Addr
NOP ; Reserved Vector
LDR PC, IRQ_Addr
LDR PC, [PC, #-0x0FF0] ; Vector from VicVectAddr
LDR PC, FIQ_Addr
Reset_Addr DCD Reset_Handler
Undef_Addr DCD Undef_Handler
SWI_Addr DCD SWI_Handler
PAbt_Addr DCD PAbt_Handler
DAbt_Addr DCD DAbt_Handler
DCD 0 ; Reserved Address
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
Undef_Handler B Undef_Handler
SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B FIQ_Handler
main{
/* Initialize VIC for I2C use */ VICVectCntl1= 0x29; /* highest priority and enabled */
VICVectAddr1=(unsigned)I2CISR; VICIntEnable= 0x200; /* enabling I2C */
PINSEL0=0X50;//pinleri i2c olarak ayarla
PINSEL1=0X00;
IODIR0 = 0xFFFFFF50;
/////////////////////////////////////////////////////////////////////////////////////
I2CONCLR=0x6c; /* clearing all flags */
I2CONSET=0x40; /* enabling I2C */
I2SCLH=25;
I2SCLL=25;
MemAddress=0;
I2CAdres = 0xA0;
I2CONCLR=0XFF;
I2CONSET=0x40;
I2CONSET=0x20;
while(1) ;
// bu alttaki yere dallanmıyor. halbuki I2C interrupt isareti SI enable oluyor. ama ne iş, bi türlü anlayamadım altta ISR ye dallanmıyor.
void I2CISR(void) __irq
{
IOSET0=IOSET0|0XF0000000;// buda interrupta geçmiş mi diye bakıyorum.
// burda ilgili case ler falan var.
}
Selam ve saygılar.
abi biri bi cevap yazsın bi zahmet, bayram öncesi sevaptır.
devreyi gorebilirmiyim...
devre yok, keil de debug yardımıyla çıktılara bakıyorum. interrupt fonksiyonun içine "IOSET0=IOSET0|0XF0000000;" yazdım. debugda çalıştırdığımda ilgili portlar çıkış vermiyor. keil de debug yapıyorum.
Proje olarak ekleyebilirmisin animasyon dosyasınıda ekle bakalım.
arkadsim peki I2C pininde nasil kesme olusturuyosun ki...devre olmadan
I2C pininde interrupt oluşmaz. external interrupt değil bu. I2C de start verildiği anda I2C nin status registeri içeriği değişir.Bun değişim sonrası I2C has olan SI biti set olur. Bunun sonucunda da ilgili fonksiyona(benim kodumda I2CISR dir) dallanır.
VICVectCntl1= 0x29; /* highest priority and enabled */
VICVectAddr1=(unsigned)I2CISR;
VICIntEnable= 0x200; /* enabling I2C */
Ahmet in dediği animasyondan bişey anlamadım. ben keil da programı debug yardımıyla koşturuyorum
http://www.resimupload.com/ds961640058_asr.html
buraya naptığımı gösteren resim koydum.
keil in ayarlarını yapmak lazımmış. ayarlardaki linker sekmesinde ufak bi tik atınca oluyor.
Şu ufak tik kısmınıda bir resimle perçinlesen çok açıklayıcı olurdu.
Nasıl yapıldığını bilmek isteriz.
alt f7 ye tıkla deyince resimdeki pencere çıkıyor.
ordan linker sekmesini tıklıyoruz.
ordan da en üstte bulunan "use memory layout..." u tıklıyoruz
resim e aşağıdaki linkten ulaşabilirsiniz.
http://www.resimupload.com/ds918895691_aysquaresi.html
Selamlar.