PIC16F877 ile ilgili anlayamadığım bir sorun (2) ...

Başlatan ErX, 30 Ekim 2005, 04:19:55

ErX

S.A. Arkadaşlar ....

Hiç mantığıma yatmayan bir sorun ile karşı karşıyayım ....

Basitçe anlatmaya çalışacağım ...

PIC'in RA0 ve RA1 portlarına birer LED bağlı. RA2 portunada bir buton bağlı.butonun diğer ucu ise +5V bağlı. dirençleri falan hiç yazmıyorum.
Diğer portlarda aşağı yukarı bu şekilde bağlı. programda ise amaç butona basıldığında ledlerden birini yakıp diğerini söndürmek ve bunu her butona başılışta değiştirmek. Basit ama diğer fonksiyonlar için gerekli bir işlem. RA0,RA1,RA2 grup halinde düşünürsek. Bu gruplardan 5 adet var.

Gelelim soruna,

Diğer gruplar bahsettigim amacı sorunsuz yerine getiriken RA0,RA1,RA2 grubu ile RE0,RE1,RE2 grupları butona basıldığında bir led yanıp diğeri sönüyor ve o şekilde kalıyor. Multimetre ile baktığımda buton ucuna sürekli +5 geliyor. devreyi defalarca kontol etmeme rağmen bu iki grupki sorun çözülmüş değil. Zaten devrede sorun olduğunuda sanmıyorum.

3 ayrı pic ile denedim ama sorun değişmedi. sabahım bu saatine kadar bu işle uğraştım :(

aşağıda programıda yazdım. işyeri için hazırladığım bir devre ve çok önemli ... Umarım bana yardımcı olursunuz.

Hayırlı RAMAZANLAR ...


'------------------------ TANIMLAMALAR ------------------------

ADCON1=7

TRISA = %001010                  
TRISB = %00000000
TRISC = %00101100
TRISD = %10010000
TRISE = %001


G1Y var PORTA.0     ' 1.Buton Giriş Yeşil Led
G1K var PORTA.1     ' 1.Buton Giriş Kırmızı Led
G1S var PORTA.2     ' 1.Buton Giriş Sinyal Ucu
G2Y var PORTA.3     ' 2.Buton Giriş Yeşil Led
G2S var PORTA.4     ' 2.Buton Giriş Sinyal Ucu
G2K var PORTA.5     ' 2.Buton Giriş Kırmızı Led

C4K var PORTB.0     ' 4.Devre Çıkışı Kırmızı Led
C4S var PORTB.1     ' 4.Devre Çıkışı Yeşil Led ve Sinyal Çıkışı
C3K var PORTB.2     ' 3.Devre Çıkışı Kırmızı Led
C3S var PORTB.3     ' 3.Devre Çıkışı Yeşil Led ve Sinyal Çıkışı
C2K var PORTB.4     ' 2.Devre Çıkışı Kırmızı Led
C2S var PORTB.5     ' 2.Devre Çıkışı Yeşil Led ve Sinyal Çıkışı
C1K var PORTB.6     ' 1.Devre Çıkışı Kırmızı Led
C1S var PORTB.7     ' 1.Devre Çıkışı Yeşil Led ve Sinyal Çıkışı

G4Y var PORTC.0     ' 4.Buton Giriş Yeşil Led
G4K var PORTC.1     ' 4.Buton Giriş Kırmızı Led
G4S var PORTC.2     ' 4.Buton Giriş Sinyal Ucu
GGL var PORTC.3     ' Gece Devresi Sinyal Led
MYS var PORTC.4     ' Merkez Yakma Sinyali
MSS var PORTC.5     ' Merkez Söndürme Sinyali                                            
ERR var PORTC.6     ' Buton Arıza Led ve Sinyal Çıkışı
MSL var PORTC.7     ' Merkez Söndürme Led

GGS var PORTD.0     ' Gece Devresi Sinyal Girişi
SLY var PORTD.1     ' System Led Yeşil
SLK var PORTD.2     ' System Led Kırmızı
GKS var PORTD.3     ' Genel Kurul Sinyal Girişi
MYL var PORTD.4     ' Merkez Yakma Led
GKL var PORTD.5     ' Genel Kurul Led
CGK var PORTD.6     ' Gece Devresi Çıkışı Kırmızı Led
CGS var PORTD.7     ' Gece Devresi Çıkışı Yeşil Led ve Sinyal Çıkışı

G3Y var PORTE.0     ' 3.Buton Giriş Yeşil Led
G3K var PORTE.1     ' 3.Buton Giriş Kırmızı Led
G3S var PORTE.2     ' 3.ButonGiriş Sinyal Ucu


'------------------------ DEĞİŞKENLER ---------------------------

K1    var   bit     '1.Buton Arıza Kontol Bit'i
K2    var   bit     '2.Buton Arıza Kontol Bit'i
K3    var   bit     '3.Buton Arıza Kontol Bit'i
K4    var   bit     '4.Buton Arıza Kontol Bit'i
SYC   var   word    'Buton Arıza Kontol Zaman Sayacı
ARZ   con   1000    'Buton Arıza Sinyal Süresi
BYP   var   bit     'Normal çalışma By-Pass Bit'i

SLYZ1  var   word    'System LED Yeşil 1.Zaman Sayıcı
SLYZ2  var   word    'System LED Yeşil 2.Zaman Sayıcı
SLYN  con   2500      'System LED Yeşil Yanma Süresi
SLYF  con   2500     'System LED Yeşil Sönme Süresi

'-------------------------- RESET -------------------------------

PORTA = %00000      'Port A'nın tamamını resetle
PORTB = %00000000   'Port B'nin tamamını resetle
PORTC = %00000000   'Port C'nin tamamını resetle
PORTD = %00000000   'Port D'nin tamamını resetle
PORTE = %000        'Port E'nin tamamını resetle  

'******************************************************************

Led_Test:

   Pause 500

high G1Y     ' 1.Buton Giriş Yeşil Led
high G1K     ' 1.Buton Giriş Kırmızı Led
high G2Y     ' 2.Buton Giriş Yeşil Led
high G2K     ' 2.Buton Giriş Kırmızı Led

high C4K     ' 4.Devre Çıkışı Kırmızı Led
high C4S     ' 4.Devre Çıkışı Yeşil Led ve Sinyal Çıkışı
high C3K     ' 3.Devre Çıkışı Kırmızı Led
high C3S     ' 3.Devre Çıkışı Yeşil Led ve Sinyal Çıkışı
high C2K     ' 2.Devre Çıkışı Kırmızı Led
high C2S     ' 2.Devre Çıkışı Yeşil Led ve Sinyal Çıkışı
high C1K     ' 1.Devre Çıkışı Kırmızı Led
high C1S     ' 1.Devre Çıkışı Yeşil Led ve Sinyal Çıkışı

high G4Y     ' 4.Buton Giriş Yeşil Led
high G4K     ' 4.Buton Giriş Kırmızı Led
high GGL     ' Gece Devresi Sinyal Led
high err     ' Buton Arıza Led ve Sinyal Çıkışı
high MSL     ' Merkez Söndürme Led

high SLY     ' System Led Yeşil
high SLK     ' System Led Kırmızı
high MYL     ' Merkez Yakma Led
high GKL     ' Genel Kurul Led
high CGK     ' Gece Devresi Çıkışı Kırmızı Led
high CGS     ' Gece Devresi Çıkışı Yeşil Led ve Sinyal Çıkışı

high G3Y     ' 3.Buton Giriş Yeşil Led
high G3K     ' 3.Buton Giriş Kırmızı Led

   Pause 3000
   
PORTA = %00000      'Port A'nın tamamını resetle
PORTB = %00000000   'Port B'nin tamamını resetle
PORTC = %00000000   'Port C'nin tamamını resetle
PORTD = %00000000   'Port D'nin tamamını resetle
PORTE = %000        'Port E'nin tamamını resetle

'------------------------------------------------------------------

Baslangic_Degerleri:

high G1K     ' 1.Buton Giriş Kırmızı Led
high G2K     ' 2.Buton Giriş Kırmızı Led
high G3K     ' 3.Buton Giriş Kırmızı Led
high G4K     ' 4.Buton Giriş Kırmızı Led
high C1K     ' 1.Devre Çıkışı Kırmızı Led
high C2K     ' 2.Devre Çıkışı Kırmızı Led
high C3K     ' 3.Devre Çıkışı Kırmızı Led
high C4K     ' 4.Devre Çıkışı Kırmızı Led
high SLK     ' System Led Kırmızı
high CGk     ' Gece Devresi Çıkışı Kırmızı Led

'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Start:                          'Başla Bakalım, Noolcak? :)

'------------------------------------------------------------------

Buton_Giris_1:                  '1.Devre Giriş/Çıkış işlemleri

   If  g1s=0  Then Buton_Giris_2
   If  K1=1  Then Buton_Giris_2
   If  g1s AND c1s=0 Then Cikis1_Yak
   If  g1s=1 AND c1s=1 Then Cikis1_Son
 
Cikis1_Yak:

   k1=1
   swap c1s,c1k
   swap g1y,G1k
   goto Buton_Giris_2
   
Cikis1_Son:

   k1=1
   swap c1s,c1k
   swap g1y,G1k

'------------------------------------------------------------------

Buton_Giris_2:                  '2.Devre Giriş/Çıkış işlemleri

   If  g2s=0  Then Buton_Giris_3
   If  K2=1  Then Buton_Giris_3
   If  g2s AND c2s=0 Then Cikis2_Yak
   If  g2s=1 AND c2s=1 Then Cikis2_Son
 
Cikis2_Yak:

   k2=1
   swap c2s,c2k
   swap g2y,G2k
   goto Buton_Giris_3
   
Cikis2_Son:

   k2=1
   swap c2s,c2k
   swap g2y,G2k

'------------------------------------------------------------------

Buton_Giris_3:                  '3.Devre Giriş/Çıkış işlemleri

   If  g3s=0  Then Buton_Giris_4
   If  K3=1  Then Buton_Giris_4
   If  g3s AND c3s=0 Then Cikis3_Yak
   If  g3s=1 AND c3s=1 Then Cikis3_Son
 
Cikis3_Yak:

   k3=1
   swap c3s,c3k
   swap g3y,G3k
   goto Buton_Giris_4
   
Cikis3_Son:

   k3=1
   swap c3s,c3k
   swap g3y,G3k

'------------------------------------------------------------------

Buton_Giris_4:                  '4.Devre Giriş/Çıkış işlemleri

   If  g4s=0  Then Gece_Giris
   If  K4=1  Then Gece_Giris
   If  g4s AND c4s=0 Then Cikis4_Yak
   If  g4s=1 AND c4s=1 Then Cikis4_Son
 
Cikis4_Yak:

   k4=1
   swap c4s,c4k
   swap g4y,G4k
   goto Gece_Giris
   
Cikis4_Son:

   k4=1
   swap c4s,c4k
   swap g4y,G4k

'------------------------------------------------------------------

Gece_Giris:                    'Gece Devresi Sinyali Giriş/Çıkış işlemleri

   If ggs=0 Then Gece_Son    
   high cgs
 '  low cgk
   'high ggl                  
   goto Normal_Giris        
   
Gece_Son:

   'low ggl
   low cgs
 '  high cgk
                     
 
'------------------------------------------------------------------

Normal_Giris:                   'Normal Devre sinyali Giriş/Çıkış işlemleri
         

   if gKs=1 and ggs=1 then Normal_Yak
   if gks=0 or GgS=0 and byp=0 then Normal_Son
   if gkS=0 or GgS=0 and byp=1 then Buton_Giris_Sayaclarinin_Resetlenmesi                              
   
Normal_Yak:
 
   high c1s                      ' Tüm Devreleri Yak  
   high c2s                        
   high c3s
   high c4s
   high cgs

   byp=0
   
   goto Buton_Giris_Sayaclarinin_Resetlenmesi                                
       
Normal_Son:

   LOW c1s                        ' Tüm Devreleri Söndür.
   low c2S
   low c3s
   low c4s
   low cgs
   
   byp=1

'------------------------------------------------------------------
Buton_Giris_Sayaclarinin_Resetlenmesi:          

   if  g1s=0 then k1=0                  ' Buton girişleri sıfırsa
   if  g2s=0 then k2=0                  ' sayaçları da sıfırla
   if  g3s=0 then k3=0
   if  g4s=0 then k4=0

'------------------------------------------------------------------
Buton_Ariza_Kontrol:  
   
   if g1s=1 then SYC=SYC+1
   if g2s=1 then SYC=SYC+1
   if g3s=1 then SYC=SYC+1
   if g4s=1 then SYC=SYC+1
   
   if SYC=>ARZ then High ERR
   if syc=>arz then syc=arz
   

Ariza_Sinyal_Cikisi_ve_Sayacin_Resetlenmesi:
 
   if g1s=0 and g2s=0 and g3s=0 and g4s=0 then low err
   if g1s=0 and g2s=0 and g3s=0 and g4s=0 then SYC=0

'------------------------------------------------------------------

System_LED:          ' System Çalışıyor LED'i işlemleri
   
   if SLY=0      then SLYZ2=0
   if slY=0      then slYz1=slYz1+1
   if slYz1=slyf then swap slY,slk
   if slY=1      then SLYZ1=0
   if slY=1      then SLYZ2=SLYZ2+1
   if SLYZ2=slyn then swap slk,sly
 
'------------------------------------------------------------------  

   goto Start

   end
 
'*****************************************************************  

diğer

ete

Programın TRIS registerlşerini kontrol et hatalı gibi geldi bana!.
Daha kesin bir cevap vermek  isterdim ama. İftar saati geldi ve kullandığın değişken tipleri çok karmaşık. Hangisi buton hangisi led anlayamadım.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ErX

Ramazan'da çalışmak oldukça zor oluyor. Hele iftar yaklaştıkca tiryakiler için çay ve sigara ihtiyacı son safhasına çıkınca  8O

sadece 8 port buton girişi olarak kullanılıyor. Bunlar :

G1S var PORTA.2 ' 1.Buton Giriş Sinyal Ucu
G2S var PORTA.4 ' 2.Buton Giriş Sinyal Ucu
G4S var PORTC.2 ' 4.Buton Giriş Sinyal Ucu
MYS var PORTC.4 ' Merkez Yakma Sinyali
MSS var PORTC.5 ' Merkez Söndürme Sinyali
GGS var PORTD.0 ' Gece Devresi Sinyal Girişi
GKS var PORTD.3 ' Genel Kurul Sinyal Girişi
G3S var PORTE.2 ' 3.ButonGiriş Sinyal Ucu

Diğer portların tamamı çıkış olarak kullanılıyor. Led çıkış olarakta düşünülebilir.


Tris değerleri ise :

TRISA = %001010
TRISB = %00000000
TRISC = %00101100
TRISD = %10010000
TRISE = %001

ben kontrol ettim ama yanlış değer göremedim.

bir deneme yaptım. RA2 bağlı buton ile diğer B,C,D,E portlarındaki ledleri yakıp söndürdüğümde sorun yaşamadım. Yine diğer portlardaki her hangi bir buton ile A portundaki LED leri yaktığımda da sorun yaşamadım.
Ama neden RA0 ve RA1'e bağlı ledleri RA2 ye bağlı butonla kontrol ettiğimde takılıp kalıyor ? yani bir kez butondan +5V gönderdiğimde  buton girişinde sürekli +5V oluyor. Buton girişlerini söktüm.Bu +5V de pic den geliyor. Yani giriş portu çikiş portuna dönüşüyor. Halen bundan bir şey anlamadım  :(

ete

PortA.2 buton giriş ucu diyorsun ama Tris değerinde;
TRISA = %001010  yazmışsın. Bu şu demek,
PortA.0 = Çıkış
PortA.1 = Giriş
PortA.2 = Çıkış    
PortA.3 = Giriş
PortA.4 = Çıkış
PortA.5 = Çıkış.

Senin istediğin şekle göre tris değeri şöyle olmalı;
TrisA=%10100

Aynı sorun TrisC registerinde de var.
Giriş uçların PortC.2 - PortC.4 ve PortC.5
Yazdığın TrisC şekli ise
TRISC = %00101100
yani PortC 2 - PortC.3 ve PortC.5 'pinlerini giriş yapmışsın. Halbuki şöyle olmalı idi
TRISC=%00110100

D portu için PortD.0 ve PortD.3'ü giriş olduğunu söylemişsin . Halbuki Tris Registerini şöyle ayarlamışsın; TRISD = %10010000 . Yani PortD.4 ve PortD.7 pinşlerini giriş yapmışsın. Doğrusu TrisD=%0001001 olmalı idi.

PortE.2 giriş ucu demişsin halbuku TrisE registerini şöyle ayarlamışsın;
TRISE = %001 , yani PortE.0 pinini giriş yapmışsın. Doğrusu;
TrisE=%100 olmalı idi.

Bütün bu hatalardan senin sıralama hatası yaptığını anlıyorum. Yani Bir Tris registerinde sıfırıncı bit ile yedinci bitlerin yerini yanlış biliyorsun hatan burada. Doğru sıralama şöyledir;Bit numaralarına göre yazıyorum.
TRISX=%76543210. Sanırım şimdi hatanı anlamışsındır.

KOlay gelsin
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ErX

@ete Hocam,

Sorun aynen senin söylediğin gibi ve değişiklik yapınca düzeldi...

PIC ler konusunda yeni sayılırım, tris değerlerinin sırasını o yüzden
karıştırmışım. Daha önce yazdığım bir kaç programda portun tamamını giriş veya çıkış olarak ayarladığım için bu sorunla karşılaşmamışım...


Saolasın, Allah kolaylık versin ...