PORTA BINARY SAYMA SORUNU YARDIM

Başlatan My75, 22 Nisan 2008, 00:03:36

My75

Merhaba arkadaslar,porta kullanarak 4 bit binary sayma yapıyorum 0...15 arası.bunun için porta.0....porta.3 kullanıyorum fakat bunu yaparken diğer portları kullanamıyorum daha önce maskeleme yaparak yapmıştım ama şimdi yapamadım,program içinde usart kesme kullanıyorum bu etkilermi acaba...Tamamını yazmadan kısa bir örnek...

SYMBOL LEDLER=$5
TRISA=%00110000
PORTA=0
SAY  VAR BYTE

BASLA:
SAY=SAY+1
POKE LEDLER,SAY
IF SAY=16 THEN
SAY=0
ENDIF
GOTO BASLA
END


POKE LEDLER,SAY KOMUTUNDAN ÖNCE VE SONRA MASKELEME YAPTIM AMA OLMADI..SAY=SAY & %11110000 YADA %00001111 gibi hepsini denedim..
Tabi bu sayma işlemi içinde koca bir program parçası var,yansıtmadım..
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

ete

Programda tek eksik olan bir PAUSE 200 komutu.
Bu hali ile program sayar ancak sen göremezsin.
Ayrıca hangi işlemci kullanılmış belirtmemişsin. şayet 16f628 kullandı isen öntanımlı olarak Analog açılan A portunu digital'e çevirmek için CMCON=7 komutunuda koyman gerekir.
Aslında maskeleme yapmak her zaman iyidir. Ancak PortA nın ilk 4 bitini sayac için kullanırsan maskeleme yapmaya gerek yoktur. Zira diğer pinlerde oluşacak değişiklik sayac değerini değiştirmeyecektir.


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

My75

Hocam pause 200 kullanamam usart kesme kullanıyorum ayrıca dediklerinizin hepsi var.Şimdi isis ve bas dosyasını upload ettim,normalde porta'da kullanmak istediğim portb'de sorunsuz çalışıyor.Porta'daki sorun 4bit sayarken her döngüde resetlemesi,maskeleyemiyorum bir türlü..Devredeki amaç 4bit tarama ve 4 adet kontol ile 64 adet butonun kontrol edip bilgileri seri olarak göndermek.4 bit sayarak 74154 entegresinin 16 çıkışını tarama mantığı ile kullanıyorum.Hocam yanılmadım tek sizden cevap bekliyordum sağolun..

http://rapidshare.com/files/109482005/test.rar
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

Veli B.

İlk 2 cümleyi okudum ve usart konusunda ki hatanızla ilgili cevap yazmaya niyetlenmiştim ki sadece Sevgili Erdal' dan cevap beklediğinizi okuyunca ayıp etmiyeyim, sohbeti bölmiyeyim diye teknik cevap yazmaktan imtina ettim.  ;)

My75

Ne demek hocam yanlış anlaşıldıysam özür dilerim,siz ve sizin gibi bilgili arkadaşlarımızın sayısını ben çok iyi biliyorum,özellikle yorum yapmasakta sizlerin yorumlarınızı takip ediyorum.Demek istediğim pic ile anca flip-flop yaparken Erdal hocamın dersleri sayesinde nerelere geldiğimiz(daha prof.olmadık ama :lol: ).Özellikle cevap bekliyordum derken artık hocamızın pbp konusunda uzmanlaşmış olmasından kaynaklanması,yoksa herkes yorum yapsa çok memnun olurum..
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

Veli B.

Usart kesmesi kullanmanız delay demenize engel değil proton için. Usart delay esnasında da çalışır. Pbp da başka çözümler bumak lazım.

My75

Evet delay kullanıyorum direkt pause olarak değil,çünkü pbp'de bir komut bitmeden başka işlem yaptıramıyoruz bunun için örnek olarak...

pause 200 yerine

for i=1 to 1000
next i

olması 1000'e kadar sayarken 1000 defa kesme yapabileceğiz yada

pause 10:pause 10:pause 10:pause 10:pause 10
pause 10:pause 10:pause 10:pause 10:pause 10
pause 10:pause 10:pause 10:pause 10:pause 10
pause 10:pause 10:pause 10:pause 10:pause 10

ile en fazla 20 defa kesmeye gidebileceğiz,bunun için zamanında kafayı yedim biliyordumki kesme anında hemen pause içindede olsan kesmeye gittiğin ama öyle değilmiş bunuda Erdal hocamın sayesinde keşfetmiştim..
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

sitenindelisi

Yok, hayır anlatamadım, pbp için Erdalın söyledikleri geçerli, lakin Protonda delayms 1000 desen ve bu süre içerisinde kesme oluşsa sorun yok, ISR ye dallanır mcu.

Gurkan-Demirbas

Merhabalar;
PBP kullanıyorum ben de, kesmeler ile ilgili bu sorunu ben de yaşıyorum. ETE hocam daha önceleri bu konudan bahsetmişti defalarca;
Assembly'de nasıl komut biterbitmez (kesme oluştuysa) ISR'e (Interrupt Service Routine) dallanıyorsa, PBP'da da aynı mantık yakalanmaya çalışılmış. Yazılan her komut bittikten sonra ISR'ye dalllanıyor; ki bu komut PAUSE 3000 ise 3 sn bekleyip öyle ISR'yi işletiyor. Ve  bu durumu yaratmak için ASM programını çok acayip şişiriyor.

Ben bu durumu şöyle çözüyorum kendimce;

ON INTERRUPT GOTO Benim_Kesmem

yerine
define  INTHAND Benim_Kesmem


yazıp ISR'yi mecburen ASM yazıyorum, böylelikle bir sorun yaşamıyorum.

Size önerim, Interrupt olan çok kısa ve de basit bir program yazın (gerçekte çalışabilmesinin hiçbir önemi yok! sadece farkı görmek amaç); bu programı ayrı ayrı ON INTERRUPT GOTO ile ve de DEFINE  INTHAND ile yazıp ayrı ayrı derleyin; çıkan Hex dosyalarını PIC disassembler'da ASM kodlara döndürün ve farkı inceleyip görün derim.
Çok uğraştım ama bulabildiğim tek çözüm de bu; define  INTHAND  kullanıp, ISR'yi ASM yazmak. Böylece PBP'nun bu handikap'ındn kurtuluyorum kendi aklımca; ama bu konuda daha farklı ve de etkili önerileri olan varsa dinlemeye hazırım.

Goto start                          ' Skip around interrupt handler
define  INTHAND Benim_Kesmem    ' Define interrupt handler

' Assembly language interrupt handler
asm

; Save W, STATUS and PCLATH registers, if not done previously
Benim_Kesmem
        movwf   wsave
        swapf   STATUS, W
        clrf    STATUS
        movwf   ssave
        movf    PCLATH, W
        movwf   psave


; Main ISR Code
        bcf     _led            ; If interrupt, turn off LED
        bcf     INTCON, 1       ; Clear interrupt flag

; Restore saved registers
        movf    psave, W
        movwf   PCLATH
        swapf   ssave, W
        movwf   STATUS
        swapf   wsave, F
        swapf   wsave, W

        retfie                  ; Return from interrupt

endasm

My75

Bende dediğim gibi hallediyorum,for next olarak  bir sorun yaşamıyorum.Kesmelerde  özellikle usart kesmelerinde kesinlikle pause kullanmıyorum,hatta usart kesme ve pulsin komutuyla  birlikte çok uğraştırmıştı beni sonra bu mantıkla çözdüm,pulsin boşta iken 65535 kez darbe alımı için bekler buda oldukça etkiliyor eğer böyle sorun yaşayanlar olursa bu sayıyı DEFINE PULSIN_MAX 1000 YAPARAK bu sorunu giderebilirler,kolay gelsin..
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

karbal656

Merhaba ;
birde şöyle dene :
porta=240 | say
bit OR lamayla olması lazım ETE hocanın derslerinde görmüştüm.