Rotary Pot'ta sadece yön bilgisini okuma

Başlatan blueboard, 28 Eylül 2022, 14:58:55

ete

Yeni işlemcin port tanımlamalarında farklı özelliklere sahip.
Eskisi olan 16F628A da Porttan çıkış yapmak için örneğin PORTA.2 den HIGH çıkarmak için PORTA.2=1 yazman yeterli iken yenisi olan 16F1827 bu işi LATA registeri yapmaktadır. Bu durumda LATA.2=1 yazman gerekir.

Eskisinde Port değişiklik kesmesi INTCON.3 biti set edilerek açılır yenisinde de aynı şekilde açılır. Ancak yenisinde değişikliğin yükselen kenarda mı yoksa düşen kenardamı olduğunu da seçmek gerekiyor. Eskisinde bu özeellik yok idi. Yenisinde bu işi IOCBP (Interrup On Change PORTB Positive) yani yükselen kenarda kesme oluşturma registeri ayarlıyor. Benzer şekilde IOCBN buda düşen kenarda kesme oluşturma registeridir. Senin kesmeler,in yükselen kenarda olacak o halde IOCBP ye değer vermen gerekir.

Programın yanında şema vermemişsin. Programa bakınca giriş ayarlaması olarak TRISB=%00110000 görüyorum. Bu bana PORTB.4 ve PORTB.5 pinlerinin giriş diğerlerinin çıkış olacağını gösterir.
Ancak programa bakınca ;
-if portb.2=0
-if portb.3=0
komut satırlarını görüyorum bu satırlar PORTB.2 ve PORTB.3 pinlerinde giriş kontrolü yapıyor ama tanımlama kısmında bu pinleri giriş yapmamışsın. Şemanı görsem hiç sormaz bunları düzenlerdim. Ama bu durumda kendin karar vermen gerekecek. Şayet bu pinlerde birer giriş pini ise;
TRISB=%00111100 şeklinde giriş ayarlaması yapman gerekir.

Kesme kullanılan programlarda pause kullanılması çok sakıncalıdır. Kullanılmaması gerekir. İlla bir gecikme yaratılacak ise döngüsel gecikme (senin programında DELAY alt programı gibi) yaratılmalıdır. Böylece gecikme dilimlere bölünmüş Pause yada Pauseus ler ile halledilerek programın kesme oluştuğunda anında kesme etiketine gitmesi sağlanır. AKsi halde oraya koyduğun PAUSE 1000 komutu işlenip bitinceye kadar program kesmeye gidemez. Buda sana algılamada 1 sn lik bir gecikme yaratırki sistemin doğru çalışmadığını hemen hissedersin.

Programı olması gereken şekle soktum aşağıdadır.

Ete

'device 16F1827

#CONFIG
  __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
  __config _CONFIG2, _WRT_ALL & _PLLEN_OFF & _STVREN_ON & _LVP_OFF & _BORV_19 
#ENDCONFIg

define OSC 4
OSCCON      =%01101000      '%0xxxx000 ,1111=16mHZ, 1110=8mHZ, 1101=4mHZ. 16MHz internal osilatör frekansı seçildi
OSCSTAT     =%00000000      'Timer1 Osilatör kullanıma hazır,4xPLL KAPALI
OSCTUNE     =0 

ANSELA=0:TRISA=%00100000:LATA=0:PORTA=0:WPUA=%00100000 'MCLR PİNİ DAİMA GİRİŞ OLARAK AYARLANMALI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ANSELB=0:TRISB=%00111100:LATB=0:PORTB=0:WPUB=%00110000
   
CM1CON0.7=0
CM2CON0.7=0
DACCON0=0
CPSCON0=0
FVRCON=0
SSP1CON1.5=0 
   
CCP1CON = %00000000
CCP2CON = %00000000
CCP3CON = %00000000
CCP4CON = %00000000
CCPTMRS  =0
APFCON0=0
APFCON1=0

OPTION_REG.7 = 0
OPTION_REG.6 = 1

'--------------------------------------------------------------------------
ONAY VAR BYTE                                                                     
TEMP VAR BYTE
ESKI var byte
YENI var byte
W    VAR WORD
YON  var BYTE
ONCEKI VAR BYTE
 
ALDI var bit   

 
INTCON=%10001000  'KESME DERSİNİZDE INTCON registerinden hem global kesmeler hemde PORTB.0 kesmesi bitleri aktif edilir.
                    'Bit7=Global kesme biti , Bit4=PortB.0 Kesme bitidir.
                     'INTCON=%10010000    yazmıştınız ancak burada daha önce  " INTCON=%10001000   "  yazdınız.	                        
IOCBP=%00110000                     
ON INTERRUPT GOTO KESME'KESME OLUŞUNCA TEKRAR ADLI ETİKETE  GİDİLECEK
PAUSE 200
YON=0:ALDI=0
ESKI=PORTB & %00110000 
BASLA:
 
      if PORTB.4=0  then
        LATA.2=1
        WHILE PORTB.4=0:WEND
        GOSUB DELAY
      ENDIF 
 
      if portb.2=0 then          
        LATA.1= 1
        WHILE portB.2=0:WEND
        LATA.1 = 0
        GOSUB DELAY
      ENDIF 
 
      if portb.3=0 then          
        LATA.0 = 1
        WHILE portB.3=0:WEND
        LATA.0 = 0
        GOSUB DELAY
      ENDIF 
 
      IF YON=1 AND ALDI=1 THEN 
         LATA.2=1
         pause 1000
         LATA.2=0
         GOSUB DELAY
      ENDIF
 
      IF YON=0 AND ALDI=1 THEN      
         LATA.3=1
         GOSUB DELAY
         GOSUB DELAY
         LATA.3=0
         GOSUB DELAY
      ENDIF
      LATA=0  
  
      goto basla
 
DELAY:
      FOR W=0 TO 15000
      PAUSEUS 5
      NEXT
      ONAY=0
      ALDI=0
      RETURN 
 
DISABLE  ' DEĞİŞİKLİK KESMESİ İÇİN GEREKLİ
KESME:
       YENI=PORTB & %00110000 
       IF YENI=ESKI THEN CIK  'POT DÖNMÜYORSA ÇIKIŞA GİT BİR ŞEY YAPMA
       YON=ESKI.5 ^ YENI.4  ' YÖNÜ BELİRLE 
       ALDI=1   'BU SADECE BİR TEDBİR BİTİ LEDLER POT DÖNMEDEN YANMASIN DİYE
       ESKI=YENI 'BU ESKİ OKUMA OLACAK
CIK:
    INTCON.0=0 'KESME BAYRAĞINI SIFIRLADIK
    IOCBF=0  'Kesme bayrağı sıfırlanıyor yeniden kesme oluşabilmesi için
    RESUME
    ENABLE    
   
END

blueboard

Alıntı yapılan: ete - 29 Eylül 2024, 08:40:22Yeni işlemcin port tanımlamalarında farklı özelliklere sahip.
Eskisi olan 16F628A da Porttan çıkış yapmak için örneğin PORTA.2 den HIGH çıkarmak için PORTA.2=1 yazman yeterli iken yenisi olan 16F1827 bu işi LATA registeri yapmaktadır. Bu durumda LATA.2=1 yazman gerekir.

Eskisinde Port değişiklik kesmesi INTCON.3 biti set edilerek açılır yenisinde de aynı şekilde açılır. Ancak yenisinde değişikliğin yükselen kenarda mı yoksa düşen kenardamı olduğunu da seçmek gerekiyor. Eskisinde bu özeellik yok idi. Yenisinde bu işi IOCBP (Interrup On Change PORTB Positive) yani yükselen kenarda kesme oluşturma registeri ayarlıyor. Benzer şekilde IOCBN buda düşen kenarda kesme oluşturma registeridir. Senin kesmeler,in yükselen kenarda olacak o halde IOCBP ye değer vermen gerekir.

Programın yanında şema vermemişsin. Programa bakınca giriş ayarlaması olarak TRISB=%00110000 görüyorum. Bu bana PORTB.4 ve PORTB.5 pinlerinin giriş diğerlerinin çıkış olacağını gösterir.
Ancak programa bakınca ;
-if portb.2=0
-if portb.3=0
komut satırlarını görüyorum bu satırlar PORTB.2 ve PORTB.3 pinlerinde giriş kontrolü yapıyor ama tanımlama kısmında bu pinleri giriş yapmamışsın. Şemanı görsem hiç sormaz bunları düzenlerdim. Ama bu durumda kendin karar vermen gerekecek. Şayet bu pinlerde birer giriş pini ise;
TRISB=%00111100 şeklinde giriş ayarlaması yapman gerekir.

Kesme kullanılan programlarda pause kullanılması çok sakıncalıdır. Kullanılmaması gerekir. İlla bir gecikme yaratılacak ise döngüsel gecikme (senin programında DELAY alt programı gibi) yaratılmalıdır. Böylece gecikme dilimlere bölünmüş Pause yada Pauseus ler ile halledilerek programın kesme oluştuğunda anında kesme etiketine gitmesi sağlanır. AKsi halde oraya koyduğun PAUSE 1000 komutu işlenip bitinceye kadar program kesmeye gidemez. Buda sana algılamada 1 sn lik bir gecikme yaratırki sistemin doğru çalışmadığını hemen hissedersin.

Programı olması gereken şekle soktum aşağıdadır.

Ete

'device 16F1827

#CONFIG
  __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
  __config _CONFIG2, _WRT_ALL & _PLLEN_OFF & _STVREN_ON & _LVP_OFF & _BORV_19 
#ENDCONFIg

define OSC 4
OSCCON      =%01101000      '%0xxxx000 ,1111=16mHZ, 1110=8mHZ, 1101=4mHZ. 16MHz internal osilatör frekansı seçildi
OSCSTAT     =%00000000      'Timer1 Osilatör kullanıma hazır,4xPLL KAPALI
OSCTUNE     =0 

ANSELA=0:TRISA=%00100000:LATA=0:PORTA=0:WPUA=%00100000 'MCLR PİNİ DAİMA GİRİŞ OLARAK AYARLANMALI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ANSELB=0:TRISB=%00111100:LATB=0:PORTB=0:WPUB=%00110000
   
CM1CON0.7=0
CM2CON0.7=0
DACCON0=0
CPSCON0=0
FVRCON=0
SSP1CON1.5=0 
   
CCP1CON = %00000000
CCP2CON = %00000000
CCP3CON = %00000000
CCP4CON = %00000000
CCPTMRS  =0
APFCON0=0
APFCON1=0

OPTION_REG.7 = 0
OPTION_REG.6 = 1

'--------------------------------------------------------------------------
ONAY VAR BYTE                                                                     
TEMP VAR BYTE
ESKI var byte
YENI var byte
W    VAR WORD
YON  var BYTE
ONCEKI VAR BYTE
 
ALDI var bit   

 
INTCON=%10001000  'KESME DERSİNİZDE INTCON registerinden hem global kesmeler hemde PORTB.0 kesmesi bitleri aktif edilir.
                    'Bit7=Global kesme biti , Bit4=PortB.0 Kesme bitidir.
                     'INTCON=%10010000    yazmıştınız ancak burada daha önce  " INTCON=%10001000   "  yazdınız.                            
IOCBP=%00110000                     
ON INTERRUPT GOTO KESME'KESME OLUŞUNCA TEKRAR ADLI ETİKETE  GİDİLECEK
PAUSE 200
YON=0:ALDI=0
ESKI=PORTB & %00110000 
BASLA:
 
      if PORTB.4=0  then
        LATA.2=1
        WHILE PORTB.4=0:WEND
        GOSUB DELAY
      ENDIF 
 
      if portb.2=0 then          
        LATA.1= 1
        WHILE portB.2=0:WEND
        LATA.1 = 0
        GOSUB DELAY
      ENDIF 
 
      if portb.3=0 then          
        LATA.0 = 1
        WHILE portB.3=0:WEND
        LATA.0 = 0
        GOSUB DELAY
      ENDIF 
 
      IF YON=1 AND ALDI=1 THEN 
         LATA.2=1
         pause 1000
         LATA.2=0
         GOSUB DELAY
      ENDIF
 
      IF YON=0 AND ALDI=1 THEN      
         LATA.3=1
         GOSUB DELAY
         GOSUB DELAY
         LATA.3=0
         GOSUB DELAY
      ENDIF
      LATA=0  
  
      goto basla
 
DELAY:
      FOR W=0 TO 15000
      PAUSEUS 5
      NEXT
      ONAY=0
      ALDI=0
      RETURN 
 
DISABLE  ' DEĞİŞİKLİK KESMESİ İÇİN GEREKLİ
KESME:
       YENI=PORTB & %00110000 
       IF YENI=ESKI THEN CIK  'POT DÖNMÜYORSA ÇIKIŞA GİT BİR ŞEY YAPMA
       YON=ESKI.5 ^ YENI.4  ' YÖNÜ BELİRLE 
       ALDI=1   'BU SADECE BİR TEDBİR BİTİ LEDLER POT DÖNMEDEN YANMASIN DİYE
       ESKI=YENI 'BU ESKİ OKUMA OLACAK
CIK:
    INTCON.0=0 'KESME BAYRAĞINI SIFIRLADIK
    IOCBF=0  'Kesme bayrağı sıfırlanıyor yeniden kesme oluşabilmesi için
    RESUME
    ENABLE    
   
END
Teşekkür ederim.

Powered by EzPortal