Siren türü uygulamalar

Başlatan Silberhaar, 31 Mayıs 2006, 14:56:39

Silberhaar

Sayın üstadlar ! ben pic programa konusunda yeniyim."pic programlama"(o.a)kitabı aldım.bayağı bir şeyler öğrendiğimi düşünüyordum.elektronikte olduğu gibi bir flip flop yapayım dedim fakat beceremedim.formlarda aradım bu kadar basit konuları hiçbir yerde bulamadım.sorum oldukça basit bir flip flop nasıl yapabilirim ve hangi değişkenleri değiştirerek frekansını değiştirebilirim.ileri aşamada farklı ses veren bir siren (ambulans sireni gibi )nasıl yapabilirim.
 yardımlarının için şimdiden teşekkürler.

trinitrotoluen

ben de pic işinde yeniyim ama bu konu ile ilgili bir ödevim olduğu için sana az da olsa yardım edebileceğimi sanıyorum. pic ile epromu kontrol ederek dac  ve amplifikatör yardımı ile eproma kaydettiğin sesi dışarı verebilirsin ;ISD  serisi entegreler kullanarak ta bu işi yapabilirsin;sana en fazla bukadar yardım edebilirim bakalım üstatların bu konuda ki önerileri ne olacak;ii çalışmalar
"Gelecek, bu günden gelecek."

Klein

Pic konusunda söyleyecek fazla sözüm yok. Ancak genel ilkelerden bahsedeyim biraz.  Pic'e uyarlama da sana kalsın.

1- Ses çıkarmak için önce bir dalga çıkarmak gerekli. bunu hepimiz biliyoruz. Önce basit dalgalardan başlayıp daha karmaşık dalgalara doğru adım adım ilerlemeni öneririm.
2-mikrokontrolcü ile dalga üretmenin en doğru yolu zamanlayıcı (Timer) kullanmaktır. Ancak sen yeni olduğun için harware timer ile bir süre uğraşma.
3- Önce en basit dalgayı üretmekle başlayalım. Sabit frekanslı sabit oranlı kare dalga.

    çıkış = 1
    bekle ( bekleme süresi )
    çıkış= 0
    bekle (bekleme süresi )

    elimizde şimdi sabit periyot ve sabit oranlı bir kare dalgamız var. bekleme sürelerini değiştirerek değişik frekanslar elde edebiliriz. ilk bekleme ve son bekleme süresini farklı değerlere ayarlayarak da oranları değiştirebiliriz.

4- şimdi biraz daha ileriye gidelim
   bekleme süresi = bekleme süresi +1
   
    bunu da ekleyince elimizde tizden basa doğru giden bir ses oldu.
5- bir adım sonrası bekleme süresini  artırmak ve azaltmak olacak
    yukarıdaki kodu şöyle değiştirelim
    eğer  sayma yönü bayrağı 1 ise {
      bekleme süresi = bekleme süresi+1
      eğer bekleme süresi 1000 den büyük ise sayma yönü bayrağı=0
    }
     
    eğer sayma yönü bayrağı 0 ise {
       bekleme süresi=bekleme süresi-1
       eğer bekleme süresi 0 ise sayma yönü bayrağı=1
   }

   şimdi elimizde bastan tize ve sonrada tizden basa giden bir ses var.
6-  Bunları koda çevirmek de sana kalmış.
7- Bunları bir dene , temeli bir at , daha ileri teknikler için hepimiz yardımcı oluruz.

Silberhaar

Sayın üstadlar..değerli cevaplarınız için teşekkürler.amacım pic öğrenmek ,ışık tuttuğunuz yönde çalışmaya başladım ve yaklaşık 1Khz e (kulakmetre ile ölçtüm)yakın bir sinyal ürettim.bunu yaklaşık (20+20)adet "NOP" komutu kullanarak yaptım.biraz uzun bir program oldu ama çalıştı.nop adetlerinde azaltma çogaltma ile frekans değişiyor.
  acemi işi olduğu bayağı belli.o:) gördüğüm değişik türdeki pic programlarında böyle bir uygulama yok gibi.
   bekleme süresi+1 türü uygulama için daha epeyi uğraşmam gerekli anlaşılan (vakit buldukça uğraşıyorum).
   nop'lardan ziyade döngülerle zaman oluşturmanın uygun olacağını düşündüğüm halde "hoca bildiğini okurmuş" misali oldu.sadeleştirmeye çalışırken gelebilecek yardımlara hayır demiyeceğim kesin.o:) selamlar

Klein

Uzun zamandır pic ASM kullanmıyorum. Jargonu unuttuğum için hata yapabilirim. ama mantık anlaşıldıktan sonra düzenlemeyi yaparsınız artık.

equ sayac 10

mainloop:
bsf 1 ,  porta  ; sanıyorum böyle yazılıyordu port a nın 1. biti
call delay
bcf 1,porta
call delay
goto mainloop

delay :
movlw 200,sayac
delayloop:
decfsz sayac
goto delayloop
return

PhD

Bende arkadaşa biraz düzeltme yapayım... ;)


list	p=16f84a
	include	"p16f84a.inc"

sayac	equ 10

	org 0x000
	goto start
	
	org 0x004
	return

	org 0x005
start

	clrf porta

	bsf status,5
	movlw b'00000000'
	movwf trisa
	bcf status,5

mainloop
	bsf porta,1
	call delay 
	bcf porta,1
	call delay 
	goto mainloop 

delay 
	movlw d'200'
	movwf sayac

delayloop 
	decfsz sayac 
	goto delayloop 
	return

	end


kolay gelsin...
...hiç...

Silberhaar

Selam üstadlar.
Her çalışkan öğrenci (!) gibi bende,hemen çömlekçiler kardeşimizin gönderdiği metni kopyalayım mplab'a yapıştırdım fakattt mpasmwin ayak koydu. :cry: bütün uğraşmalarıma rağmen ikna olmadı.bende daha evvel okuduğumu sandığım "pic programlama" kitabını tekrardan okurken orada
bir flip flop işi yapan program buldum.denedim mükemmel çalışıyor.benim gibi acemiler yararlansın diye buraya gönderirken.Klein kardeşimizin yazdığı "gittikçe hızlanan ve belli bir hızdan sonra geri yavaşlayan bir osilatör" yapma fikri kafama girdi.Elimdeki elmanın neresinden ısırmaya başlamalıyım diye düşünüp duruyorum.yardımcı olursanız sevinirim.şimdiden teşekkürler.

;YANIP SÖNEN LED'LER
          LIST   P=16F84
INCLUDE	"P16F84.INC"

SAYAC1   EQU      h'0C'
SAYAC2   EQU      h'0D'
         CLRF     PORTB
         BSF      STATUS, 5
         CLRF     TRISB
         BCF      STATUS, 5

         MOVLW    h'0F'
         MOVWF    PORTB
TERSLE
		COMF	PORTB, F
		CALL	GECIKME
		GOTO	TERSLE              
    
GECIKME
         MOVLW    h'FF'
         MOVWF    SAYAC1
DONGU1
         MOVLW    h'FF'
         MOVWF    SAYAC2
DONGU2
         DECFSZ   SAYAC2, F
         GOTO     DONGU2
         DECFSZ   SAYAC1, F
         GOTO     DONGU1
    RETURN
	END

Silberhaar

Selam üstadlar..uzun uğraşmalarıma karşın yavaştan başlayarak hızlanan belirleyaceğimiz bir değerden  itibaren geri yavaşlayan bir programı yazamadım.  :cry:
  belki picbasicpro ile daha kolay olur dediysemde oradada başarılı olamadım (sıfırdan 39 000 Hz ye çıkarmayı hedeflemiştim)(sıfırdan itibaren
yükselmesine rağmen 10 000 Hz civarına kadar çıkıyor)
 yardımlarınız için şimdiden teşekkürler