assemblerda timer0 ve timer1 li iki adet kesme

Başlatan mikroserdar, 15 Mart 2008, 19:10:48

mikroserdar

arakdaşlar merhaba. ben foruma yazmıştım fakat çok net bir cevap alamadım.

acaba assemblerda timer0 ve timer1 kullanılarak iki adet kesme kullanılarak 10ms ve 1ms'lik iki kesme nasıl üretilir

timer0 ile yapıyorum fakat aynı anda timer0 ve timer1 kesmesi üretemiyorum

acaba bana böyle bir kod örneği gönderebilirmisiniz.

kendi kodum aşağıda bu timer0 interruptı ile çalışıyo.

aynı anda butonada basmak istiyorm bunuda timer1 interruptı ile yapmak istiyorum


   list p=16f84a
   #include <P16f84a.INC>
__CONFIG     _PWRTE_ON & _WDT_OFF & _XT_OSC



w_copy   Equ   0x20      ; Backup für Akkuregister
s_copy   Equ   0x21      ; Backup für Statusregister
Ziffer1   Equ   0x22      ; Wert des LSD
Ziffer2   Equ   0x23      ; Wert der zweitkleinsten Stelle
Ziffer3   Equ   0x24      ; Wert der zweitgrößten Stelle
Ziffer4   Equ   0x25      ; Wert des MSD
Digit   Equ   0x26      ; Ziffernzähler
ar      Equ   0x27
gr_e   Equ   0x28      ; empfangene gruppe
cycl_1   Equ   0x29      ; zähler
cycl_2   Equ   0x2A      ; zähler
cycl_3   Equ   0x2B      ; zähler füe empfangsbitschleife
data_1   Equ   0x2C      ; datenpuffer low-teil
data_2   Equ   0x2D      ; datenpuffer high-teil
co_e   Equ   0x2E      ; empfangenes commando
sayac1  Equ   0x2F
sayac2  Equ   0x30
sayac3  Equ   0x31
sayac4  Equ   0x32
sayacx  Equ   0x33
sayact  Equ   0x34

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

   org    0
   goto   Init   

;**************************************************************


   org    4
   
intvec
   
   bcf      INTCON, GIE   ; disable Interupt
   movwf   w_copy      ; w retten
   swapf   STATUS, w    ; STATUS retten
   movwf   s_copy      ;

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

 

; Intrupt servic routine
Int_serv


   movlw   h'01'
   subwf   sayacx,w
   btfss   STATUS,Z     ;1 tuşuna basılıyor. 1 nolu röle çekili kalır.
   goto    git1
   bsf     PORTB,0
   bsf     sayac1,0
   bsf     sayac2,0
   bsf     sayac3,0
   bsf     sayac4,0
   btfss   PORTB,1      ;Eğer 1. röle çekiliyse 2. röleyi kontrol et.
   goto    git1
   bcf     PORTB,1      ;1. röle çekili ve 2. röle çekili olduğu için 2. röleyi bırak
   bcf     sayac1,1
   bcf     sayac2,1
   bcf     sayac3,1
   bcf     sayac4,1
git1  
   movlw   h'02'
   subwf   sayacx,w
   btfss   STATUS,Z     ;2 tuşuna basılıyor. 2 nolu röle çekili kalır.
   goto    git2
   bsf     PORTB,1
   bsf     sayac1,1
   bsf     sayac2,1
   bsf     sayac3,1
   bsf     sayac4,1
   btfss   PORTB,0      ;Eğer 2. röle çekiliyse 1. röleyi kontrol et.
   goto    git2
   bcf     PORTB,0      ;2. röle çekili ve 1. röle çekili olduğu için 1. röleyi bırak
   bcf     sayac1,0
   bcf     sayac2,0
   bcf     sayac3,0
   bcf     sayac4,0
 
git2
   movlw   h'03'
   subwf   sayacx,w
   btfss   STATUS,Z
   goto    git3
   bsf     PORTB,2
   bsf     sayac1,2
   bsf     sayac2,2
   bsf     sayac3,2
   bsf     sayac4,2
   btfss   PORTB,3    
   goto    git3
   bcf     PORTB,3  
   bcf     sayac1,3
   bcf     sayac2,3
   bcf     sayac3,3
   bcf     sayac4,3
 
git3
   movlw   h'04'
   subwf   sayacx,w
   btfss   STATUS,Z
   goto    git4
   bsf     PORTB,3
   bsf     sayac1,3
   bsf     sayac2,3
   bsf     sayac3,3
   bsf     sayac4,3
   btfss   PORTB,2    
   goto    git4
   bcf     PORTB,2  
   bcf     sayac1,2
   bcf     sayac2,2
   bcf     sayac3,2
   bcf     sayac4,2

git4
   
   movlw   h'05'
   subwf   sayacx,w
   btfss   STATUS,Z
   goto    git5
   bsf     PORTB,4
   bsf     sayac1,4
   bsf     sayac2,4
   bsf     sayac3,4
   bsf     sayac4,4
   btfss   PORTB,5    
   goto    git5
   bcf     PORTB,5
   bcf     sayac1,5
   bcf     sayac2,5
   bcf     sayac3,5
   bcf     sayac4,5

git5  
   movlw   h'06'
   subwf   sayacx,w
   btfss   STATUS,Z
   goto    git6
   bsf     PORTB,5
   bsf     sayac1,5
   bsf     sayac2,5
   bsf     sayac3,5
   bsf     sayac4,5
   btfss   PORTB,4    
   goto    git6
   bcf     PORTB,4  
   bcf     sayac1,4
   bcf     sayac2,4
   bcf     sayac3,4
   bcf     sayac4,4

git6
   movlw   h'07'
   subwf   sayacx,w
   btfss   STATUS,Z
   goto    git7
   bsf     PORTB,6
   bsf     sayac1,6
   bsf     sayac2,6
   bsf     sayac3,6
   bsf     sayac4,6
   btfss   PORTB,7    
   goto    git7
   bcf     PORTB,7  
   bcf     sayac1,7
   bcf     sayac2,7
   bcf     sayac3,7
   bcf     sayac4,7
git7
   movlw   h'08'
   subwf   sayacx,w
   btfss   STATUS,Z
   goto    git8
   bsf     PORTB,7
   bsf     sayac1,7
   bsf     sayac2,7
   bsf     sayac3,7
   bsf     sayac4,7
   btfss   PORTB,6    
   goto    git8
   bcf     PORTB,6  
   bcf     sayac1,6
   bcf     sayac2,6
   bcf     sayac3,6
   bcf     sayac4,6
git8

   movlw   h'0C'
   subwf   sayacx,w
   btfss   STATUS,Z
   goto    git12
   movlw   h'00'
   subwf   sayac1,w
   btfss   STATUS,Z
   goto    git9
   clrf    PORTB
   goto    git12

git9
   movf   sayac1,w
   movwf  sayac2
   movf   sayac3,w
   movwf  sayac4
   movf   sayac4,w
   andwf  sayac2,w
   movwf  sayac2
   movwf  sayac4
   clrf   sayac1
   clrf   sayac3
   clrf   PORTB
   

git12
   movlw   h'20'
   subwf   sayacx,w
   btfss   STATUS,Z
   goto    Int_end
   movlw   h'00'
   subwf   sayac1,w
   btfss   STATUS,Z
   goto    git13
   movf    sayac4,w
   movwf   PORTB
   movwf   sayac1
   movwf   sayac3
   goto    Int_end
git13
   movf   sayac4,w
   andwf  sayac1,w
   movwf  PORTB
   movwf  sayac1
   movwf  sayac3
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






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
   clrf    sayacx
   clrf    sayac1
   clrf    sayac2
   clrf    sayac3
   clrf    sayac4
   clrf    sayact
; 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
   movlw   D'131'      ; 256-125=131 ((1MHz : 32 ): 125 = 250 Hz)
   bcf     STATUS, RP0   ; auf Bank 0 zurückschalten
   movwf   TMR0
   bsf       INTCON, T0IE   ; Timer0 interupt erlauben
   bsf       INTCON, GIE   ; Interupt erlauben


pollen
   call   empfangen   ;IR empfangen
   
   

   
 


   call   pause   ;2ms warten
   goto   pollen


;**********************************************************
;
; einen RC-5-code mit polling empfangen
;
; gruppencode: gr_e
; commando   : co_e
;
;**********************************************************
; vor dem aufruf wenigstens 1 ms low pegel abwarten !!
empfangen
   btfss   PORTA, 4
   goto   empfangen   ; warten auf high

empfangenL
   btfsc   PORTA, 4
   goto   empfangenL   ; warten auf low, 1/2-Bit vorbei

   bcf   INTCON,GIE   ; interupts sperren

   call   viertelbit   ; 1/4 nach bitmitte

   btfsc   PORTA, 4
   goto   Fehler      ; war nur spike

   clrf   data_1      ; datenpuffer löschen
   clrf   data_2
   movlw   D'13'      ; 13 bits bei syncronisation
   movwf   cycl_3


   call   halbbit      ; 1/4 des 2. Bits

nextbit
   rlf   data_1,f
   rlf   data_2,f
   bcf   data_1, 0   ; angenommen leitung ist low (0)
   btfsc   PORTA, 4   ; leitung abfragen
   bsf   data_1, 0   ; leitung ist high (1), in datenpuffer

; warten auf pegeländerung
   call   anders      ; Bitmitte

   call   viertelbit   ; 3/4 Bit
   call   halbbit      ; 1/4 nach bitanfang
   decfsz   cycl_3,f   ; alle 13 bit + startbit empfangen?
   goto   nextbit

   movfw   data_1
   movwf   co_e
   bcf   co_e, 6
   bcf   co_e, 7      ; auf 6 bit begrenzen

   rlf   data_1,f
   rlf   data_2,f   
   rlf   data_1,f
   rlf   data_2,f   ; gruppe nach data_2
   movfw   data_2
   movwf   gr_e
   bcf   gr_e, 7
   bcf   gr_e, 6
   bcf   gr_e, 5      ; auf 5 bit begrenzen
   
; 2. stoppbit zum 7 commandobit machen
   btfss   data_2, 6
   bsf   co_e, 6      ;2. Stoppbit invers  -> 7.commandobit

   movfw   co_e
   movwf   sayacx
Fehler
   bsf   INTCON,GIE   ; interrupts wieder erlauben

   return

anders
;   movlw   D'22'      ; 22 x (10 MHz)
   movlw   D'9'      ; 9 x  ( 4 MHz)
   movwf   cycl_1
a_1
   movlw   D'32'      ; 100 takte
   movwf   cycl_2
a_2
   decfsz   cycl_2,f   
   goto   a_2

   btfsc   PORTA, 4   ; portpegel abfragen
   goto   a_high
a_low            ; portpegel ist 0
   btfsc   data_1, 0   ; ist sollwert=0 ?
   return         ; high-low flanke
   goto   a_weiter
a_high            ; portpegel ist 1
   btfss   data_1, 0   ; ist sollwert=1 ?
   return         ; low-high flanke
a_weiter
   decfsz   cycl_1,f   
   goto   a_1   
   return         ; keine flanke gefunden


pause            ;2ms für 45
   movlw   D'30'
   goto   l_0
pause_l            ;ca 12ms für 255
   movlw   D'255'
   goto   l_0
viertelbit
;   movlw   D'11'      ; 11 x (10 MHz)
   movlw   D'9'      ; 9 x  ( 4 MHz)
   goto   l_0
halbbit
;   movlw   D'22'      ; 22 x (10 MHz)
   movlw   D'18'      ; 18 x ( 4 MHz)
l_0
   movwf   cycl_1
l_1

;   movlw   D'32'      ; 100 takte (10 MHz)
   movlw   D'15'      ; 49 takte  ( 4 MHz)
   movwf   cycl_2
l_2
   
   decfsz   cycl_2,f   
   goto   l_2

   decfsz   cycl_1,f   
   goto   l_1   
   return



   end

Küçük bir kod örneği gönderebilirmisiniz.
mikrodentleyici yaşam biçimidir.

harun_11

arkadasım asmbly de bunu yazmak gercekten ugrastırır.eger pic c biliosan sana program yollayım onun uzerinde caliş...
3 4 satırla halledebilirsin timer olayını.
bu konuda altaş yayınevinini pic c kitabı var sana oldukça yardımcı olur.
iyi çalışmalar

mikroserdar

bu gönderdiğim programı C'ye nasıl çeviricem.

programı gönderirsen sevinirim
mikrodentleyici yaşam biçimidir.

harun_11

mplabda nasil oluyor bilmiyorum.pic c kurman gerekli..
dosyalari mailine attim
kolay gelsin

mucitotomaston

demisin kine  timer 0 la timer 1  aynı anda kullanamıyom diye zaten kullanamazssın pic komutları tek tek kullnanır si timer 0 icinde iken timer 1 kesmesi geldiginde timer 1 kesmesinin  icinde mi gitmesini istiyorsunuz .  eger ole bişey istiyorsanız zaman ları cok kiritik hsaplamalısınız yani ornekle timer 0 kesmesini programı kodladıktan sonra hemen ardında timer 1 kesmesinin gelmesi gerekir değilse pic inde yapabilecegi şeyler sınırlıdır . ama tabi kodun gereki yerlerini asm yazarsan byrakları okutarak bu isi cözersin

harun_11

aynı anda timer0 ve timer 1 soyle calisir.timer0 kesmesi gelip sayma basladigi zaman,bu kesmenin içinde enable_interrupts timer1 diyerek timer1 i çalıştırırsın.buton olayını ise int_ext dış kesme b0 kesmesi ile yapabilirsin.butona basıldıgı anda timer1 in çalışmasını istiyorsan timer1 kesmesini o zmaana kadar pasif tut,buton kesmesiyle aktif hale getirebilirsin.