assembler timero ve timer1 kesmesini aynı anda kullanmak

Başlatan mikroserdar, 11 Mart 2008, 21:30:57

mikroserdar

arkadaşlar yapacağım bi devre için timer0 ve timer1 kesmesini aynı anda kullanmam gerek. yazdığı kod aşağıda timer1 kesme kısmını çıkarınca devre güzel çalışıyo. sorun timer1 kesmesini ekledikten sonra ortaya çıkıyo. acaba aynı anda iki kesme nasıl yaparım. timer0 kesmesinde kumanda sinyallerinden gelen veriyi işliyo. timer1 kesmesinde de butona basıldığı zaman sistemi kapatıyo ve açıyo. kod aşağıda


;**************************************************************
; los gehts mit dem Programm

   org    0
   goto   Init   

;**************************************************************
; die Interuptserviceroutine

   org    4

timer1_interrupt
 
   bcf      PIR1, 0       ; disable Interupt
   movwf   w_copy      ; w retten
   swapf   STATUS, w    ; STATUS retten
   movwf   s_copy      ;

   movlw   h'00'
   movwf   TMR1H
   movlw   h'00'
   movwf   TMR1L
   
   btfsc   PORTA,2
   goto    git
   clrf    PORTB
git btfsc   PORTA,3
   goto    git2
   movf    sayac,w
   movwf   PORTB
   goto    git2
   
intvec
     bcf      INTCON, GIE   ; disable Interupt
   movwf   w_copy      ; w retten
   swapf   STATUS, w    ; STATUS retten
   movwf   s_copy      ;

   movlw   D'212'      ; 256-125=131 ((1MHz : 32 ): 125 = 250 Hz)
   movwf   TMR0

; Intrupt servic routine
Int_serv
   
   movlw h'01'
   subwf co_e,w
   btfss STATUS,Z     ;1 tuşuna basılıyor. 1 nolu röle çekili kalır.
   goto  x
   bsf   PORTB,0
   bsf   sayac,0
   btfss PORTB,1      ;Eğer 1. röle çekiliyse 2. röleyi kontrol et.
   goto  x
   bcf   PORTB,1      ;1. röle çekili ve 2. röle çekili olduğu için 2. röleyi bırak
   bcf   sayac,1
x   movlw h'02'
   subwf co_e,w
   btfss STATUS,Z     ;2 tuşuna basılıyor. 2 nolu röle çekili kalır.
   goto  y
   bsf   PORTB,1
   bsf   sayac,1
   btfss PORTB,0      ;Eğer 2. röle çekiliyse 1. röleyi kontrol et.
   goto  y
   bcf   PORTB,0      ;2. röle çekili ve 1. röle çekili olduğu için 1. röleyi bırak
   bcf   sayac,0
y   movlw h'03'
   subwf co_e,w
   btfss STATUS,Z
   goto  z
   bsf   PORTB,2
   bsf   sayac,2
   btfss PORTB,3    
   goto  z
   bcf   PORTB,3  
   bcf   sayac,3    
z   movlw h'04'
   subwf co_e,w
   btfss STATUS,Z
   goto  t
   bsf   PORTB,3
   bsf   sayac,3
   btfss PORTB,2    
   goto  t
   bcf   PORTB,2  
   bcf   sayac,2
t   movlw h'05'
   subwf co_e,w
   btfss STATUS,Z
   goto  s
   bsf   PORTB,4
   bsf   sayac,4
   btfss PORTB,5    
   goto  s
   bcf   PORTB,5
   bcf   sayac,5
s   movlw h'06'
   subwf co_e,w
   btfss STATUS,Z
   goto  m
   bsf   PORTB,5
   bsf   sayac,5
   btfss PORTB,4    
   goto  m
   bcf   PORTB,4  
   bcf   sayac,4
m   movlw h'07'
   subwf co_e,w
   btfss STATUS,Z
   goto  n
   bsf   PORTB,6
   bsf   sayac,6
   btfss PORTB,7    
   goto  n
   bcf   PORTB,7  
   bcf   sayac,7
n   movlw h'08'
   subwf co_e,w
   btfss STATUS,Z
   goto  k
   bsf   PORTB,7
   bsf   sayac,7
   btfss PORTB,6    
   goto  k
   bcf   PORTB,6
   bcf   sayac,6
k   movlw h'0C'
   subwf co_e,w
   btfss STATUS,Z
   goto  l
   clrf  PORTB
l   movlw h'20'
   subwf co_e,w
   btfss STATUS,Z
   goto  Int_end
   movf  sayac,w
   movwf PORTB


Int_end   
   
   swapf   s_copy, w   ; STATUS zurück
   movwf   STATUS
   swapf   w_copy, f   ; w zurück mit flags
   swapf   w_copy, w

   bcf   INTCON, T0IF   ; Interupt-Flag löschen
   bsf   INTCON, GIE   ; enable Interupt

   retfie



git2 retfie

Init
   movlw   B'00000000'
   movwf   PORTA
   movwf   PORTB      ; Anzeige dunkel
   bsf     STATUS, RP0   ; auf Bank 1 umschalten
   movlw   B'00011111'   ; PortA RA0-RA3 output
   movwf   TRISA
   movlw   B'00000000'   ; PortB alle output
   movwf   TRISB
   bcf     STATUS, RP0   ; auf Bank 0 zurückschalten

   clrf   gr_e
   clrf   co_e


; 250 Hz-Timer-Interupt einstellen
   bsf     STATUS, RP0   ; auf Bank 1 umschalten
   movlw   B'10000100'   ; internen Takt zählen, Vorteiler zum Timer0, 32:1
   movwf   OPTION_REG
   bsf     PIE1,0
   bcf     STATUS, RP0   ; auf Bank 0 zurückschalten
   movlw   h'00'
   movwf   TMR1H
   movlw   h'00'
   movwf   TMR1L
   movlw   D'212'      ; 256-125=131 ((1MHz : 32 ): 125 = 250 Hz)
   movwf   TMR0
   bsf   INTCON, T0IE   ; Timer0 interupt erlauben
   bsf   INTCON, GIE   ; Interupt erlauben
   bsf   INTCON, 6
   bcf   T1CON , 1
   bsf   T1CON , 0
   bsf   T1CON , 4
   bsf   T1CON , 5


aynı anda kesme nasıl yapabilirim. veya şöyle diyim. timer0 ve timer1 kesmesi kullanılarak her ikisindede 10ms gecikme yapmak istiyorum. bunu assemblerde verebilecek arkadaş varmı
mikrodentleyici yaşam biçimidir.

F493

selam;


     Anladıgım kadarıyla siz yukarıdaki kodu kopyalamışsınız bir yerden.

        Şimdi sordugunuz sorunun cevabını olayın özünü açıklayarak yanıtlamaya çalışacagım..

Öncelikle PIC  ,iki  işlemi aynı  anda yapamaz..

  Şöyleki ;




     kesme:

       TMR0 kesmesi :     ;kesme önceligi TMR0 ın.





      TMR1 kesmesi:


kesme sonu




    Burada şöyle olur ,program kesmeye girdiginde ilk sırada yani ,en yukarıda sorgulanan kesme türü en yüksek önceliklidir..

yukarıda kesme önceligi TMR0 'ın tabiki bu iki kesme türünün aynı anda oluşması ile ilgili

        Siz TMR0 ve TMR1 8 bitte kurarsınız ve prescaler degerlerinide aynı verirsiniz. ve ikisndende kesme alırsınız.

        Burada kesme önceligi kesmeye girdiginde program en üstte tanımlanan kesme türüdür..(yukarıda TMR0)

         Siz TMR0 kesmesini alırsınız aynı anda TMR1 kesmesi de gelirse şöyle olur;

        Program kesmeye girer TMR0 işler çıkarsınız ve TMR1 den dolayı tekrar girer ,işte sizin için en hızlısı bu olur ,aynı anda kesme alma anlamında..


iyi çalışmalar

 esen kalın.

Ziya

kesme rutininde flaglari kontrol et. tmr0 kesmesi gelmiş ise onunla ilgili kısma goto ile atla. tmr1 kesmesi gelmiş ise tmr1 ile ilgili yere atla.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey