timer 0 kesmesi hakkında yardım eder misiniz

Başlatan veli dayı, 16 Mart 2015, 15:48:34

veli dayı

Arkadaşlar timer0 kesmesi kullanara aşağıdaki kodları yazdım fakat bir türlü istediğim gibi çalışmıyor.Şöyle ki sırayla ledin butonlarına basıyorum yanıyor sonra basma sırama göre sönmesi gerekirken hepsi birden sönüyor.Halbuki sırayla sönmeleri gerekiyordu.Acaba ben nerede hata yapıyorum.16f 887a entegresi kullandım.(acaba datasheete uygun yapamadım mı timer0 kesmesi ayarlarını



DEFINE OSC 4
ADCON1 = 7
TRISA=%00000
TRISB=%11011111
TRISC=%11111111
TRISD= %00000000
TRISE=%11111

PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

SURE VAR WORD
I VAR WORD
ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%00000101 'Pull  up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000 'Kesmeler  aktif ve TMR0 kesmesi aktif
TMR0=0


SAYAC VAR BYTE
SN VAR BYTE
DAK VAR BYTE

TRANSISTOR var  PORTB.5
SURE=0


   
   'SAYAC DEĞİŞKENLERİ


SAYAC1 VAR WORD
SAYAC2 VAR WORD
SAYAC3 VAR WORD
SAYAC4 VAR WORD
SAYAC5 VAR WORD
SAYAC6 VAR WORD
SAYAC7 VAR WORD
SAYAC8 VAR WORD
SAYAC9 VAR WORD
  SAYAC10 VAR WORD
  SAYAC11 VAR WORD
SAYAC12 VAR WORD
POZ1 VAR word
POZ2 VAR word
POZ3 VAR word
POZ4 VAR word
POZ5 VAR word

POZ6 VAR word
POZ7 VAR word
POZ8 VAR word
POZ9 VAR word
POZ10 VAR word
POZ11 VAR word
  POZ12 VAR word

'****SAYACLAR******
SAYAC1=100
SAYAC2=100
SAYAC3=100
SAYAC4=100
SAYAC5=100
SAYAC6=100
SAYAC7=100
SAYAC8=100
SAYAC9=100
SAYAC10=100
  SAYAC11=100
SAYAC12=100


POZ1=0
POZ2=0
POZ3=0
POZ4=0
POZ5=0
POZ6=0
POZ7=0
POZ8=0
POZ9=0
POZ10=0
POZ11=0
POZ12=0


  PAUSE 500

LABEL:
IF PORTB.4=1  THEN'PARA ATILDI
HIGH  PORTB.5 'TRANSİSTÖR İLETİMDE

 
ENDIF
'SÜRE AYARLAMALARI YAPILIYOR
IF PORTE.1=0 AND PORTE.2=0 THEN

SURE=10'BURALARA DAKİKA CİNSİNDEN DEĞER GİRİLECEK

ENDIF
IF PORTE.1=1 AND PORTE.2=0 THEN

SURE=35'BURALARA DAKİKA CİNSİNDEN DEĞER GİRİLECEK

ENDIF
IF PORTE.1=0 AND PORTE.2=1 THEN

SURE=45 'BURALARA DAKİKA CİNSİNDEN DEĞER GİRİLECEK

ENDIF
IF PORTE.1=1 AND PORTE.2=1 THEN

SURE=55'BURALARA DAKİKA CİNSİNDEN DEĞER GİRİLECEK

ENDIF

IF PORTB.2=1 AND POZ1=0 THEN '1İNCİ KANAL

low  PORTB.5
  OUTPUT PORTB.2
  HIGH PORTB.2
  SAYAC1=0
  POZ1=1
 
    ENDIF
   
   


  IF  SAYAC1=SURE THEN
   LOW PORTB.2
  INPUT PORTB.2
  POZ1=0
 

   ENDIF
   '********KANAL SONU*********
   
   'KANAL2
    IF PORTB.3=1 AND POZ2=0 THEN '2İNCİ KANAL
    low  PORTB.5
 
  OUTPUT PORTB.3
  HIGH PORTB.3
   SAYAC2=0
   POZ2=1
   

  ENDIF


  IF SAYAC2=SURE THEN
   LOW PORTB.3
  INPUT PORTB.3
  POZ2=0
 
   
 
ENDIF
'********KANAL SONU*********
   
 
   
      IF PORTB.0=1 AND POZ3=0   THEN '3İNCİ KANAL
     low  PORTB.5
 
  OUTPUT PORTB.0
  HIGH PORTB.0
   SAYAC3=0
   POZ3=1

  ENDIF
   

  IF SAYAC3=SURE THEN
   LOW PORTB.0
  INPUT PORTB.0
   POZ3=0

   ENDIF
   '********KANAL SONU*********
   
   
    IF PORTB.1=1 AND POZ4=0 THEN '4İNCİ KANAL
      low  PORTB.5
 
  OUTPUT PORTB.1
  HIGH PORTB.1
   
   SAYAC4=0
   POZ4=1

  ENDIF


  IF SAYAC4=SURE THEN
   LOW PORTB.1
  INPUT PORTB.1
   POZ4=0
   
 
ENDIF
   
'********KANAL SONU*********
  IF PORTB.6=1  AND POZ5=0THEN '5İNCİ KANAL
    low  PORTB.5
 
  OUTPUT PORTB.6
  HIGH PORTB.6
   SAYAC5=0
   POZ5=1

  ENDIF

  IF SAYAC5=SURE THEN
   LOW PORTB.6
  INPUT PORTB.6
   POZ5=0
   
 
ENDIF
   
'********KANAL SONU*********

  IF PORTB.7=1 AND POZ6=0 THEN '6İNCİ KANAL
   low  PORTB.5
 
  OUTPUT PORTB.7
  HIGH PORTB.7
   SAYAC6=0
   POZ6=1
    ENDIF


 
 



  IF SAYAC6=SURE THEN
   LOW PORTB.7
  INPUT PORTB.7
  POZ6=0
  ENDIF
   
'********KANAL SONU*********

IF PORTC.0=1 AND POZ7=0 THEN '7İNCİ KANAL
   low  PORTB.5
 
  OUTPUT PORTC.0
  HIGH PORTC.0
  SAYAC7=0
  POZ7=1
  ENDIF
     
   


  IF SAYAC7=SURE THEN
   LOW PORTC.0
  INPUT PORTC.0
  POZ7=0
 

   ENDIF
   '********KANAL SONU*********
   IF PORTC.1=1 AND POZ8=0 THEN '8İNCİ KANAL
   low  PORTB.5
 
  OUTPUT PORTC.1
  HIGH PORTC.1
 
   SAYAC8=0
   POZ8=1
   

  ENDIF
   


  IF SAYAC8=SURE THEN
   LOW PORTC.1
  INPUT PORTC.1
  POZ8=0
  ENDIF
   '********KANAL SONU*********
    IF PORTC.2=1 AND POZ9=0 THEN '9İNCİ KANAL
     low  PORTB.5
 
  OUTPUT PORTC.2
  HIGH PORTC.2
   SAYAC9=0
   POZ9=1
ENDIF
   
   IF SAYAC9=SURE THEN
   LOW PORTC.2
  INPUT PORTC.2
  POZ9=0

   ENDIF
 
   '********KANAL SONU*********
    IF PORTC.3=1 AND  POZ10=0 THEN '10İNCİ KANAL
   low  PORTB.5
 
  OUTPUT PORTC.3
  HIGH PORTC.3
   SAYAC10=0
    POZ10=1
ENDIF
   
   


  IF SAYAC10=SURE THEN
   LOW PORTC.3
  INPUT PORTC.3
    POZ10=0

   ENDIF
   '********KANAL SONU*********
    IF PORTC.4=1 AND POZ11=0 THEN '11İNCİ KANAL
   low  PORTB.5
 
  OUTPUT PORTC.4
  HIGH PORTC.4
   SAYAC11=0
   POZ11=1
 
   ENDIF
   


  IF SAYAC11=SURE THEN
   LOW PORTC.4
  INPUT PORTC.4
   POZ11=0
   ENDIF
   '********KANAL SONU*********
    IF PORTC.5=1 AND POZ12=0 THEN '12İNCİ KANAL
  low  PORTB.5
 
  OUTPUT PORTC.5
  HIGH PORTC.5
   SAYAC12=0
   POZ12=1
ENDIF
   
  IF SAYAC12=SURE THEN
   LOW PORTC.5
  INPUT PORTC.5
  POZ12=0
 
   ENDIF
     
GOTO LABEL

DISABLE
KESME:
SAYAC=SAYAC+1 'kesme sayacı 1 sn= 61(sayac) x 256 (Tmr0) x 64  (bölme)
IF SAYAC=55 then '61 adet  kesme olunca 1 sn. süre geçiyor.(999424 us)
SAYAC=0 'sayaç sıfırlanıyor
SN=SN+1 'saniye degeri bir  artırılıyor
ENDIF
IF SN=60 THEN 'saniye 60  olmus ise 1 dakika süre geçti o halde
SN=0 ' saniye sıfırlanıyor

IF POZ1=1 THEN
SAYAC1=SAYAC1+1
ENDIF
IF POZ2=1 THEN
SAYAC2=SAYAC2+1
ENDIF
  IF POZ3=1 THEN
SAYAC3=SAYAC3+1
  ENDIF
   IF POZ4=1 THEN
SAYAC4=SAYAC4+1
ENDIF
  IF POZ5=1 THEN
SAYAC5=SAYAC5+1
ENDIF
  IF POZ6=1 THEN
SAYAC6=SAYAC6+1
ENDIF
  IF POZ7=1 THEN
SAYAC7=SAYAC7+1
ENDIF
  IF POZ8=1 THEN
SAYAC8=SAYAC8+1
ENDIF
  IF POZ9=1 THEN
SAYAC9=SAYAC9+1
ENDIF
  IF POZ10=1 THEN
SAYAC10=SAYAC10+1
ENDIF
  IF POZ11=1 THEN
  SAYAC11=SAYAC11+1
  ENDIF
   IF POZ12=1 THEN
SAYAC12=SAYAC12+1' dakika degeri  bir artırılıyor
ENDIF

ENDIF

INTCON.2=0 'TMR0 Kesme bayragı sıfırlanıyor
RESUME
ENABLE

END

ete

Kod verirken KOD TAG kullanın . Bunu sürekli tekrarlıyorum ama sürekli olarak kullanmamakta ısrar ediyorsunuz.

Bu artık bir gelenek bir usul. Diğer türlü bir kaç sayfa kod veriyorsun konunun birinci sayfası bitiyor.

Kod yazarken bir tertip bir düzen içinde yazmaya çalışmalısın. Aksi taktirde kod içinde kendini kaybedersin ki kaybetmişsin zaten. Şimdi diyeceksin neresi düzensiz benim kodun. Söyleyeyim.
1. Satırlar arasına birden fazla boşluk verme
genelde aynı etiket altındaki kodlar soldan aynı hizaya getirilirki etikete bağlı kod takibi kolay olsun. Sol tarafın başlangıcıda genelde etiket isminden sonra koyulan ":" işareti olur.

2. IF THEN ENDIF satırları arasında hiç boşluk olmamalıdır. IF satırından sonra gelen satırlar en az 2 karekter içeriden yazılırki o if Then döngüsü içinde neler var kolaylıkla görülebilsin. Aksi taktirde kodlar çorbaya döner.

3. Register atamaları daima 8 bit üzerinden verilmelidir. Aksi halde yanlış değer atamaları olur.Mesela 3 bit olan PORTE registerine bak ne vermişsin TRISE=%11111 aynı şeyi PORTA içinde yapmışsın. Bunları 5 bit yada eksik bitli değil daima 8 bit olarak verin.

Gelelim Hataya,
Tuşa basma olayında ;
 IF PORTB.2=1 AND POZ1=0 THEN '1İNCİ KANAL  
   low  PORTB.5
   OUTPUT PORTB.2
   HIGH PORTB.2
   SAYAC1=0
   POZ1=1
ENDIF

şeklinde bir kod yazmışsın. Burada tuşa basılırken o tuşa daha önce basılmadığını garantiye almak için ...AND POZ1=0 ise demişsin. Bu doğru bir tanımlama. Ama aynı doğruluğu yananledleri söndürürken yapmamışsın.
  IF SAYAC1=SURE THEN
    LOW PORTB.2
    INPUT PORTB.2
    POZ1=0
  ENDIF

Bu kodda IF SAYAC1=SURE and POZ=1 THEN şeklinde bir igfade kullansa idin program bu if satırını yalnızca POZ1=1 iise değerlendirir idi. halbuki POZ1 işin içine girmediği için her SAYAC1=SURE olduğunda aynı şeyler tekrarlanıyor.

Diğer bir kusur da Bit bazında kullandığın POZx değerlerini WORD olarak tanımlamışsın neden?
Onları Poz1 VAR BIT şekilnde tanımlasan programın çok hızlanır.

Ete



veli dayı

Hocam Kod tag konusunda özür dilerim.Bu konudaki hassasiyeteinizi bir topiğinizde okumuştum.Fakat kod tag yerini bulamadım metin yazılan yerden.tekrar özür dilerim.Yardımlarınız için çok teşekkür ediyorum.

Powered by EzPortal