16f877 de tum portların kontrolu

Başlatan hkalaycioglu, 14 Nisan 2006, 18:42:13

hkalaycioglu

iyi gunler
ben pıcbasıc pro ile ve pıc16f877 ile butun pınlerını kullanarak bır role kontrol devresı yapıyorum bu serı porttan kontrol edılecek ben bunun serı port kısmını hallettım porta.4 uncu bıtı porte,portc,portd yi trıs yazmacıyla cıkıs olarak ayarlamama ragmen ben bunları kontrol edemıyorum yanı ben rolenın bırını cektırdığımde o ben sondurene kadar yanık kalacak fakat bu yukarıda yazdığım porta.4 porte portc ve portd de bunu sağlayamıyorum bunları nasıl kontrol edebılırım bu konuda bana yardımcı olabılırmısınız veya fıkır verebılırmısınız sımdıden teşekkürler bu pıcbasıc pro ıcın olacak sağolun

ete hocam ilginiz için teşekkür ederım programıda buraya eklıyorum

INCLUDE "bs2defs.bas"
relay   VAR   byte
serpin  VAR   PORTC.7
n9600 con 6  'proteus ile uygulamada burası 2 olacak
ADCON1=7
TRISA = 0
TRISB = 0
TRISC = %10000000
TRISD = 0
TRISE = 0

loop:
 SERIN serpin,N9600,relay
 IF relay =  "1"  THEN outr1
 IF relay =  "2"  THEN outr2
 IF relay =  "3"  THEN outr3
 IF relay =  "4"  THEN outr4
 IF relay =  "5"  THEN outr5
 IF relay =  "6"  THEN outr6
 IF relay =  "7"  THEN outr7
 IF relay =  "8"  THEN outr8
   
 GOTO loop

outr1:
 TOGGLE PORTC.0
 goto loop

outr2:
 toggle portC.1
 GOTO loop

outr3:
 toggle portC.2
 GOTO loop  

outr4:
toggle portC.3
GOTO loop

outr5:
toggle portC.4
GOTO loop

outr6:
toggle portC.5
GOTO loop

outr7:
toggle portC.6
GOTO loop

outr8:
toggle portB.7
GOTO loop

ete

PortA ve PortE de bunu sağlayamamanın sebebi muhtemelen analog olan portları digital yapmamışsındır.
Programın başına
ADCON1=7
komutunu ilave et.
C ve D portlarında sözünü ettiğin komutların çalışması lazım.
Yazdığın programıda buraya koymamışsın bu nedenle fazla bri şey söylemek zor. İşin mantığı belli ve sende zaten onu açıklamışsın.

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

hkalaycioglu

ete hocam picbasıc programı yukarıya koydum pıc 16f877 de tum portların aynı anda cıkıs yapmak ıstıyorum yanı portun bırıne bağlı led yandığında portun dığer bıtınde bağlı ledın sonmesını istemıyorum portb.4 ncü biti harıc diğerlerı normal çalısıyor bır de porta.4 porta.4 u anladım yanı bu pic için normal bır davranısmı onu bılmıyorum ama yanı boyle bır uygulamayı ilk defa yapıyorum ve 16f877 ilk defa kullanıyorum pıcde bu sorunlu dedıgım porta.4 porte,portc,portd portları bırkac işlev için kullanılıyor ondan olabılırmı bılmıyorum proteus uygulaması gayet guzel bır sekılde calısıyor ama yukarıdakı programda da gormussunuzdur proteus uygulamasının çalışabılmesı ıçın baud rate ayarını n9600 con 2 olarak ayarlamak gerekıyor ve gercek uygulamada ıse n9600 con 6 ayarlamak gerekıyor aksı takdırde saçma bir şekilde calısıyor onun için proteus sımılasyonlarına da güvenemeiyorum  bununla ilgili olarak uygulama yaptınızmı proteus similasyonu değil


çok teşekkur ederım şımdıden sağolun

ete

Bana kalırsa yazdığın kod doğru. Yalnızca her bir toggle komutundan sonra pause 200 gibi bir gecikme koymanda yarar var. Muhtemelen bilgi alınıyor ve port pini toggle yapılıyor. Ardından hemen yeniden toggle yapıldığı için sen değişikliği görmüyor olabilirsin. Bir denemekte yarar var.

Genelde devreler isiste çalışır gerçek uygulamada hatalar yapıldığı için çalışmaz. Çünki isis hataların yapıldıkları yerler öntercihli olarak var kabul eder.
Örneğin isis de
- devreye hiç kristal bağlamasanda devre çalışır.
- MCLR ye pull up yapmasanda devre çalışır.
- Besleme bağlamasanda devre çalışır.

PortA.4 pinleri open collectör dür ve bir pull up direnci bağlanması gerekir. Aksi taktirde çıkış yaptığın zaman HIGH çıkış vermez.

Buna benzer pek çok işi gerçek devrelerde yapmış idim. Zaman zaman toggle komutundan veya HIGH- LOW komutlarından kaynaklanan sorunlar yaşadım. Bu yüzden ben genelde tek bir bir ile bile oynayacak olsan bütün portu ele alarak bunu yaparımki port etkilenmesin. Örnek vermek gerekir ise, diyelimki PORTB.0 bitini toggle yapacaksın ben olsam aşağıdaki gibi yapardım.

PORTB=PORTB XOR %00000001

Aynı şekilde PORTB.3 pini ni toggle yapalım.

PORTB=PORTB XOR %00001000

İstersenbirde bu komutları dene. İşe yarayabilir.
Birde çalışma frekansına dikkate et. Genelde 4 MHz 9600 baud için uygun bir frekans değildir. Şayet bu işi 4 MHz de yapıyor isen frekansını en az 10 MHz ve mümkünse 20 MHz ye çıkarmalısın. Yada baud rate i düşür. Örneğin 2400 ile veya 1200 ile bir dene.

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

hkalaycioglu

ETE Hocam teşekkur ederım bu tavsıyelerınızı uygulayacağım sonucu tekrar bıldırırım sıze sağolun

hkalaycioglu

ETE HOCAM GENE OLMADI KODLARI C PORTU ICIN AYARLADIM FAKAT PORTC.1 BITDEKI LEDI YAKIYORUM PORTC.2 ICIN 2 YE BASTIĞIMDA PORTC.2 YANIYOR PORTC.1 SONUYOR BU İŞLEM DİĞER BITLER IÇINDE SOZKONUSU BAŞKA AKLINIZA GELEN BIR SEY VARSA YARDIMLARINIZI BEKLIYORUM TESEKKURLER

ete

Sorunun kaynağını daha iyi tespit edebilmek için aşağıdaki programı pic'e ver bakalım. B portuna buton veya butonlar bağla. Hepsini 10K ile pull-up yap. Yani normalde PortB pinleri tamamı HIGH da duruyor olsuni. Butona basınca pin LOW'a çekilmiş olsun. Bu dururmda D portuna bak.Toggle yapıyormu.
Şayet yapıyor ise senin sorunun serin komutundan kaynaklanıyor olması gerek. Toggle komutunu çalıştıracak çok sık komut geliyor olması lazım böyle bir sorunun ortaya çıkması için.


PortA=0:TrisA=%00000001    
Portb=0:TrisB=%11111111
Portc=0:TrisC=%00000000
PortD=0:TrisD=%00000000
PortE=0:TrisE=%00000000
ADCON1=7
DEFINE OSC 4

@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF

basla:
pause 200
if portb.0=0 then  
  toggle portd.0
  PORTC.0=PORTC.0 XOR NOT PORTB.0
  ENDIF
if portb.1=0 then  toggle portd.1
if portb.2=0 then  toggle portd.2
if portb.3=0 then  toggle portd.3
if portb.4=0 then  toggle portd.4
if portb.5=0 then  toggle portd.5
if portb.6=0 then  toggle portd.6
if portb.7=0 then  toggle portd.7

while portB<255
pause 1
wend
pause 300
goto basla
end


Burada enteresan bir olay var. Basla satırından hemen sonra yer alan Pause 200 komutunu silersen bu programda çalışmıyor veya abuk subuk çalışıyor. Sendede benzer bir sorun olabilir. Sebebini bende anlayamadım.

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

hkalaycioglu

ETE hocam sorun cözüldü 16f877 de C,D,E portlarını ben dırek LED ile kullanıyordum portlar sapıtıyordu ama sımdı bu portların cıkıslarına 330 ohm dırencle ledlerı surmeyı denedım su an gayet guzel calısıyor butun portları bu sekılde kontrol edebılıyorum bu projeye ıhtıyacı olan arkadaslar da visaul basıc veya baska bır dilde bır arayüz programı yazarak bu programı kullanabılır program bu seklıyle gayet guzel bır sekılde çalışmaktadır bılgısayardan pıc kontrolune ornek olarak kullanabılırler teşekkür ederım sağolun