ccs de direkt registera ulaşma ve interrupt

Başlatan anafor, 27 Nisan 2004, 21:55:26

anafor

ccs de acaba bir registerin bir bitine mesela portb nin ilk bitine nasıl direkt erişe bilirim böyle bir imkanım varmı?
ek olarak interrupt olayını yapmaya çalıştım bende microchipin picdem2 plus demo bordu var bunda denedim fakat debuggerda intf flagi set oluyor fakat program external interrupt a dallanmıyor. elinizde örnek kod varsa yollarsanız sevinirim.
mail adresim;
anafor2004@yahoo.com
teşekkürler

ahmetu

aslında şu yazdığım ccs kodlarını bir download edip incelesen iki dakika da olayı çözeceksin ben oldum olası biti lojik 1 yada 0 yapmak için CCS'nin bu tip komutlarını kullanmadım, output_low(PIN_B1); deyimi yerine önceden tanımladığım ki bununla ilgili örnekleri benim programların main.h dosyaları içinden bakarak bulabilirsin

#bit  nok_res  = 6.1

tanımını yapıp daha sonra da bunu nok_res = 1 yada nok_res = 0 gibi kullanıyorum.

Üst satırdaki #bit nok_res = 6.1 deyiminde nok_res' in ilgili pic'in 6 ncı registerinin 1 nci biti olduğunu programa izah ediyoruz. Bu 6 rakamı PIC16F877'de PORTB' ye karşılık gelir, diğer picler, port registerleri, tris registerleri yada interrupt registerlerinin adreslerini öğrenmek için kullandığın pic'in datasheet' ine bakmalısın mesela PIC16F877 datasheet' inde sayfa 15'de REGISTER FILE MAP var.

Yine PIC16F877 ve interrupt için örnek vermek gerekirse;

#byte  INT_CONT = 0x0B
#bit   GIE      = INT_CONT.7
#bit   PEIE     = INT_CONT.6
#bit   T0IE     = INT_CONT.5
#bit   INTE     = INT_CONT.4
#bit   RBIE     = INT_CONT.3
#bit   T0IF     = INT_CONT.2
#bit   INTF     = INT_CONT.1
#bit   RBIF     = INT_CONT.0

gibi tanımları yaptıktan sonra eğer RB0/INT external interrupt'ını çalıştıracaksan, INTCON registerinin INTF bitini aktif hale getirip daha sonrada global interrupt'ı çalıştıracaksın yani şöyle;

INTF = 1;
GIE  = 1;

yazmalısın burada INTF = 1; ile external interrupt'ı, GIE = 1; ile de global interrupt'ı çalıştırıyoruz.

CCS'yi yazanlar bu iki satırı fonksiyon haline getirmişler,
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);

Bu arada external intterupt için bir de interrupt'ın lojik 1 den 0 a geçerken mi yoksa 0 dan 1 e geçerken mi başlayacağını belirtmelisin CCS deki ext_int_edge(L_TO_H); komutu bu işi görüyor yada tersi (H_TO_L)

aynı işi register kullanarak yapsaydık;

#byte  OPTION_REG = 0x81
#bit   INTEDG  = OPTION_REG.6

INTEDG = 1;                  ---> ext_int_edge(L_TO_H);
INTEDG = 0;                  ---> ext_int_edge(H_TO_L);

şeklinde olmalıydı.

ahmetu

biraz önce CCS'nin forumunda bir yazı ilgimi çekti (27.04.04 - 23:15) http://www.ccsinfo.com/forum/viewtopic.php?t=19130&highlight= vatandaşın biri bu konuyla ilgili bir soru sormuş PCM programmer'da sağlam bir cevap vermiş kısa lafın özü output_high(PIN_B1) komutu LATB register'ine benim yukarıdaki örnekteki ise PORTB registerine yazıyor, PORTB'ye direkt yazmak probleme neden oluyormuş anladığım kadarıyla LATB registerinde başka bir değer PORTB registerinde bambaşka bir değer oluşabiliyormuş 18 serisi piclerde bu sorun giderilmiş PORTB registerine yazınca pic bunu LATB registerine de yazıyormuş galiba bundan sonra bende 18 serisi dışında kalanlarda output_high(PIN_B1) gibi komut kullanacağım ama şunu da belirteyim daha bu sorunla karşılaşmadım.