Şu an pic üzerinden 40 khz'lik bir sinyal üretmeye çalışıyorum.İnternetten bi kod buldum.Fakat çalıştıramadım.Assembly hakkında da çok fazla tecrübe sahibi değilim.Yardım edebilecek olan var mıdır.Kodu aşağıya yazdım.

list p=16f877A
#include <P16F877A.INC>

radix dec

#DEFINE PAGE0 BCF 3,5
#DEFINE PAGE1 BSF 3,5

MISC1 EQU 0x0C ;misc use
MISC2 EQU 0x0D ;misc use
COUNT0 EQU 0x0E ;counter 0
COUNT1 EQU 0x0F ;counter 1
RECORD0 EQU 0x10 ;recording store LSB
RECORD1 EQU 0x11 ;recording store MSB
FEET1 EQU 0x12 ;feet byte 1 LSB
FEET2 EQU 0x13 ;feet byte 2 MSB
ANSA1 EQU 0x14 ;answer byte 1 LSB
ANSA2 EQU 0x15 ;answer byte 2 MSB
ANSA3 EQU 0x16 ;answer byte 3 MSB
ANSA4 EQU 0x17 ;answer byte 4 LSB
ANSA5 EQU 0x18 ;answer byte 5 MSB
ANSA6 EQU 0x19 ;answer byte 6 MSB
TOP0 EQU 0x1A ;top of division byte 1 LSB
TOP1 EQU 0x1B ;top of division byte 2 NSB
TOP2 EQU 0x1C ;top of division byte 3 MSB
DIV1 EQU 0x1D ;divider byte 1 LSB
DIV2 EQU 0x1E ;divider byte 2 MSB
LOOPB EQU 0x1F ;loop counter B
STORE1 EQU 0x20 ;general store 1
STORE2 EQU 0x21 ;general store 2
LOOPA EQU 0x22 ;loop counter A - for LCD only
RSLINE EQU 0x23 ;bit 4 = RS line flag for LCD
CLKCNT EQU 0x24 ;pre-counter for CLOCK
METRE0 EQU 0x25 ;metres byte 1 LSB
METRE1 EQU 0x26 ;metres byte 2 NSB
METRE2 EQU 0x27 ;metres byte 3 MSB
INCH1 EQU 0x28 ;inches byte 1 LSB
INCH2 EQU 0x29 ;inches byte 2 MSB
MASK EQU 0x2A ;foreground mask value (1 per metre)
ZERO EQU 0x2B ;zero count flag
LOOPW EQU 0x2C ;eeprom write counter (record counter)
LOOPR EQU 0x2D ;eeprom read counter (replay counter)
SAVE EQU 0x2E ;SAVE flag
TSTFLG EQU 0x2F ;test/setup flag

W EQU 0
C EQU 0
DC EQU 1
Z EQU 2
GIE EQU 7 ;global interrupt bit
RBIF EQU 0 ;RB4-RB7 change interrupt flag

WR EQU 1 ;eeprom write initiate flag
WREN EQU 2 ;eeprom write enable flag
RD EQU 0 ;eeprom read enable flag

ORG 0x0004
goto START
ORG 0x0005

START

clrf PORTA
movlw b'01000000'
movwf PORTB
PAGE1
movlw b'00011100'
movwf TRISA ;Port A0-A1 as output, A2-A4 as input
movlw b'11000000'
movwf TRISB ;Port B0-B5 as output, B6-B7 as input
movlw b'00000101' ;set timer ratio 164
movwf OPTION_REG ;pull-ups on (bit 7 = 0)
PAGE0

BEAMIT
nop ;send 40kHz signal
nop ;command qty sets freq/mark-space
nop
nop
nop
nop
nop
nop
comf PORTA,F ;toggle push-pull RA0/RA1
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
comf PORTA,F ;toggle push-pull RA0/RA1
decfsz LOOPB,F
goto BEAMIT
clrf PORTA
call RECEIVE

RECEIVE btfsc TSTFLG,0 ;is TSTFLG bit 0 set (basic correction)?
goto MASK0 ;yes
movf MASK,W
movwf LOOPB

MASK0 bcf INTCON,RBIF ;clear RB4-RB7 interrupt change flag
bcf ZERO,0

END

 

Kullandığın PIC 16f877 değil mi ? Ayrıca bir sürü gereksiz değişken tanımı var, bunlara gerek yok.

Kullandığın kristal'e göre her işlemin ne kadar süre aldığını hesaplaman lazım. Ona göre döngü kurup portları süreceksin. Uzun süredir pic assembly kullanmadığım için açıkçası üşeniyorum kitap kurcalamaya ama bir araştırayım google'dan.

kimlanbu

Ya ben bu konuda çokda fazla bilgi sahibi değilim.Assembly de nasıl döngü kurulur çokda bilmiyorum.Verdiğiniz cevap için teşekkürler..

bloodrayne

şu komuttan haberiniz var mı: DJNZ

bir anlamda for loop'tur bu.

bir de, nasıl bir sinyal almaya çalışıyorsunuz ki 40 khz'den. sinüzoidal? kare dalga? testere? kristalin center frekansı ne? bunları da yazın ki en azından pseudo-kod yazalım.

djnz yerine timer kullandırın aslında. daha mantıklı.

tom riddle

bu arada ben 8051 için assembly görmüştüm de, pic assembly'de timer oluyor mu bilmiyorum. oluyorsa bu dalgayı timer ile oluşturursunuz.

tom riddle

ya pic assembly için de timer oluyor.Üretmek istediğimiz sinyal kare dalga.Aslında ultrasonik mesafe ölçer yapıyoruz.Bunun için bunca soru :D Ama daha yolun başındayız.Yavaş yavaş öğrenece galiba.Hazır kodlar bulduk ama.Anlaması çok zor.Kodları anlayarak parça parça biz yazmaya çalışıyoruz şimdi.

bloodrayne

soruna cevap değil ama bir öneri:

eğer assembly kullanmak gibi bi zorunluluğun yoksa, daha yüksek seviyeli bir dil seç. pic c biçilmiş kaftandır, yazması ve hata ayıklaması kolaydır. interrupt, timer gibi sıkıntılı hadiseler kolaylıkla kullanılabiliyor. bahsettiğin sinyal yaratma hadisesini 3 satırlık bir kodla çözersin...

derleyici olarak CCS PCW'yi öneririm.

makineci

Hevesinizi kırmak gibi olmasın ama bence ilk iş olarak kullanacağınız microcontroller'ı tanıyın. Türkçe kaynak oldu mu bir haftada kaba taslak program yazabilecek hale geliyorsunuz altyapınız varsa. Aşağıdaki kitabı öneririm.

altaskitap.com

Ayrıca sesle mesafe ölçmek için sayısal sinyal işleme görmüş olmanız gerekiyor, sağdan soldan yansıyan dalgaları sönümleyecek filtreler de tasarlamanız gerekecek. Kolay gelsin. Bitirme projesi değilse oldukça ağır bir iş altına girmişsiniz.

kimlanbu

timer kullanıp kimlanbu'nun ilk cevabında söylediğini yapacaksın o halde, yani her 1/2 periyodun süresini bulup timer yaptıracaksın, ve timer her işleyişinde sinyali toggle edecek. ama kimlanbu iyi bir noktaya değinmiş, 40 khz'de gelecek diğer dalgalardan kendi sinyalinizi nasıl ayırt edeceksiniz?

tom riddle
1

mobil görünümden çık