avatar_ewreka

mz80 (e18-d80nk) çalıştıramadım

Başlatan ewreka, 28 Ocak 2020, 14:43:57

ewreka

Merhabalar dostlar, pic16f628a ile mz80 projem var, mz80'e pull up direnci olarak 10K lık bir direnç bağlı sinyal ucuna, pbp kodlar denedim çalışmadı.

mz80 in arkasındaki ışık engeli algılasa da A7 deki led tepki vermiyor.

pbp 2.60 daki kod şu şekilde:

@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _BODEN_ON

DEFINE OSC 4

OPTION_REG.7=0

CMCON = 7
VRCON = 0

INPUT (PORTB)
OUTPUT (PORTA)

TRISA = %00000000
TRISB = %11111111

PORTA = 0
symbol LED = PORTA.7     
symbol SAG_MZ80 = PORTB.5

MAIN:

    pause 50;

    IF SAG_MZ80 = 0 THEN
        TOGGLE LED
    ENDIF

    GOTO MAIN
end

İlyas KAYA

A7 giriş olarak ayarlı tepki vermemesi normal.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ewreka

#2
Sayın İlyas KAYA cevabınız için çok teşekkür ederim.

Konuyu biraz daha açarmısınız hatamı göremedim.

Ben TRISA = %00000000 olarak yazdım yani çıkış olarak.

Yoksa siz PORTA = 0 satırınımı söylüyorsunuz anlayamadım.

ete

Basic de INPUT ve OUTPUT komutları bit bazında kullanılır.
Sen ise Byte bazında kullanmışsın ki öncesinde TRIS registerinide kullanmışsın.
Bu aynı amaç için iki ayrı komut kullandığın anlamına geliyor.
Yani
INPUT (PORTB) komutu anlam olarak TRISB = %11111111 komutu ile aynıdır.Ancak INPUT (PORTB) komutunu pek kullanmayız. Bu komut bir PORT'un herhangi bir pinini Çıkış yapmak için kullanılır. Yani INPUT PORTB.5 desen doğru olacak idi. Ama bütün portu INPUT yapmak için TRIS registerin kullanmak daha doğru olacaktır.
Aynı şey PORTA içinde geçerli.

OUTPUT (PORTA) yerine TRISA = %00000000 kullanmak yeterlidir. İkisi bir arada kullanılmamalıdır.

MZ80 aktif olduğunda yani önünde bir engel geldiğinde HIGH vermesi gerekir diye biliyorum. Ancak benzer bir çok proximity sensörde hem NPN (cisim görünce LOW veren) hemde PNP (cisim göründe HIGH veren) çıkışlar mevcuttur.
Bu durumda pic'e bağladığın o output çıkışını bir ölçü aleti ile kontrol etmelisin.
Ölçü aletini DC Voltaj ölçme konumuna al ve aletin siyah probunu GND deye bağla. Kırmızı probu ise MZ80'in output çıkışına bağla önüne engel koy ve ölçü aletinde bir voltaj görüyormusun ona bak. Görüyorsan alet PNP çıkışlıdır. Bir şey göremiyorsan BU sefer Kırmızı probu +5V ta bağla siyah probu da Output çıkışına tut. Önüne bir engel koy bak bakalım ölçü aleti bir şey gösteriyormu. Gösteriyor ise çıkış PNP dir.
Şimdi out put çıkışının NPN yada PNP olma durumuna göre programa bakalım.
Şayet alet PNP çıkışlı ise;
    IF SAG_MZ80 = 1 THEN
        TOGGLE LED
        pause 500
    ENDIF 
Şayet alet NPN çıkışlı ise mevcut hali doğru ancak uzun bir gecikme eklemen gerekir. Zira gecikme olmaz ise program son derece süratli bir şekilde sürekli toggle yapar ve sende ledde bir şey göremezsin.

BU arada Programda açılış gecikmesi göremedim. Bu olmazsa olmazlarldan biridir. Mutlaka MAIN etiketinden önce PAUSE 300 komut satırını koyman gerekir. Aksi halde sistem abuk subuk çalışabilir. Çalışabilir diyorum çünki ilk açılışta regsterler rastgele değerler alabilir. Alırsa abuk subuk çalışır En iyisi açılışı desteklemek amacı ile 300 ms lik bir gecikme koymak ve register değerlerinin işlemci tarafından doğru şekilde oluşturulmasına imkan tanımak gerekir.

Ete

İlyas KAYA

Haklisin 2 defa baktım ama ikindinde de nasıl tris b yi a diye okudum anlamadım  :)
Bazen oluyor böyle. Elimdeki mz80 lerin birtanesi PNP ama datasheette NPN yazıyor. Demek ki hem npn hemde pnp olanı var. Mz80 den sonra bir kod daha olması lazım e18 ile başlayan. Onu bir kontrol edin elinizdeki sensor NPN mi PNP  mi
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ewreka

Hocam kusura bakmayın hemen cevap yazamadım test ediyordum fakat, datasheet den sinyal'e 10-47kohm direnç bağlamamı yazıyordu o direnci iptal edince çalıştı kod ise

    IF SAG_MZ80 = 0 THEN
        HIGH LED
        PAUSE 500
    ELSE
        LOW LED
    ENDIF

Hocam çok ama çok teşekkür ederim. Saygılar.

ewreka

Hocam birşey daha sorssam
16f628a da

b0 = sol cny
b1 = Arka cny
b2 = Sag cny

b3 = sol mz80
b4 = ON mz80
b5 = Sag mz80

bağlı bunları bana önceden verdiğiniz

sensor=(PORTB & %00111000)>>3
IF SENSOR=1 OR SENSOR=7 THEN
        GOSUB ileri_git

    ENDIF    

gibi bir kod ile
6 sensörü kontrol etmem mümkün mü?

Teşekkürler.

ete

Bağlantın;
b3 = sol mz80
b4 = ON mz80
b5 = Sag mz80
şeklinde ise
sensor=(PORTB & %00111000)>>3
IF SENSOR=1 OR SENSOR=7 THEN
 GOSUB ileri_git
ENDIF
komutları ile 3 sensörü test edebilirsin. Ama bunun ötesinde ne yapacağına karar vermen gerekiyor. Sensörün NPN çalıştığına göre
Olası konumlar;
%000 hepsi aktif (önlerinde engel var)
%001 Yanlızca ON ve SAĞ aktif sol pasif
%010 SOl ve sağ aktif (sanırım ikisi birden aktif olamaz ama olasılık dahilinde)
%011 Sağ aktif diğerleri pasif
%100 Sağ pasif diğerleri aktif
%101 On aktif diğerleri pasif
%110 Sol aktif diğerleri pasif
%111 Hepsi pasif
Bu konumlara göre gerekli algoritmayı oluşturursan sistemin çalışır.
Dikkat edilmesi gerekn bir diğer husus, led yakarken gecikme yaratma ihtiyacın vardır. Ama bu bir araç ise hızlı karar vermesi gerekeceği için gecikmeleri kaldırman gerekir. Bunu unutma. Yada çalışmayı etkilemeycek 10 ms lik bir gecikme sorun çıkarmayacaktır.

Ete

Powered by EzPortal