selamlar arkadaşlar
aşağıdaki image da görünen pals i üretmek için aşağıda yazılı olan kod yeterlimidir. Yoksa arada bulunan for next ve if fazladan gecikmeye sebep olup palsi bozarmı?
picbasicteki arkadaşlardan bir fikir gelmedi. Protonda bu palsi en sağlıklı oluşturmanın yolu nedir acaba?
(http://petterit.files.wordpress.com/2011/04/canon-rc-1.png?w=480)
Device = 12F675
Config INTRC_OSC_NOCLKOUT, MCLRE_OFF, WDT_OFF, PWRTE_ON,
CMCON=7
ANSEL=0
XTAL = 4
Symbol buton1 = GPIO.3
Symbol LED = GPIO.2
x var Word
TRISIO = %000000
MAIN:
Low LED
If buton1=1 Then RECORD
GoTo MAIN
RECORD:
If buton1=0 Then MAIN
For x=1 To 16
DelayUS 15
High LED
DelayUS 15
Low LED
Next
DelayUS 5360
GoTo RECORD
Orijinal sitedeki darbeleri üreten kısım
unsigned int photo = 7330; //A 7330 microseconds delay between bursts shoots a photo.
unsigned int video = 5360; //A 5360 microseconds delay between bursts starts/stops video recording.
void shoot(unsigned int delayBetweenBursts) { //sends the IR signal
//send first 16 bursts
for(int i=0; i<16; i++) {
digitalWrite(irLED, HIGH);
delayMicroseconds(pulseDuration);
digitalWrite(irLED, LOW);
delayMicroseconds(pulseDuration);
}
delayMicroseconds(delayBetweenBursts);
//send second 16 bursts
for(int i=0; i<16; i++) {
digitalWrite(irLED, HIGH);
delayMicroseconds(pulseDuration);
digitalWrite(irLED, LOW);
delayMicroseconds(pulseDuration);
}
return;
}
Basic cesi. Eksikleri tamamlarsınız. Daha önce belirttiğim gibi PicBasic bilmiyorum.
MAIN:
If buton1=1 Then
pulseDuration = 7330 //A 7330 microseconds delay between bursts shoots a photo.
GOTO SHOOT
End If
If buton2=1 Then
pulseDuration = 5360 //A 5360 microseconds delay between bursts starts/stops video recording.
GOTO SHOOT
End If
goto MAIN
SHOOT:
for i=0 to 15
High LED
DelayUS pulseDuration
Low LED
DelayUS pulseDuration
Next
DelayUS delayBetweenBursts
for i=0 to 15
High LED
DelayUS pulseDuration
Low LED
DelayUS pulseDuration
Next
goto MAIN
hassas süreler için interrupt kullanmak lazım
delayms-delayus gibi bekleme komutları o kadar hassas çalışmalarda işe yararmı ? şüpheliyim
Interrupt kullanarak nasil gecikme yapabilirim. Ornek verebilirmisiniz.
interrupt uzun iş
yukarıdaki örnek kodun düzeltilmiş hali bu
birazdan fiziksel olarak denemeye çalışıcam
Dim i As Byte
Dim delayBetweenBursts As Word
Symbol LED =GPIO.0
Symbol Photo = GPIO.5
Symbol Video = GPIO.4
MAIN:
If Photo=0 Then
delayBetweenBursts=7330
GoSub SHOOT
EndIf
If Video=0 Then
delayBetweenBursts=5360
GoSub SHOOT
EndIf
DelayMS 1
GoTo MAIN
SHOOT:
For i=0 To 15
High LED
DelayUS 15
Low LED
DelayUS 15
Next
DelayUS delayBetweenBursts
For i=0 To 15
High LED
DelayUS 15
Low LED
DelayUS 15
Next
delayBetweenBursts=0
Return
Daha önce ACER Projeksiyonlar için IR kumandanın sadece ON-OFF kısmını skopla inceleyip PIC ile yeniden üretmiştim.
Şu anda 50 adet civarında çalışıyor.
#include "C:\PROGRA~1\PICC\DEVICES\12C508A.H"
#fuses INTRC,NOWDT,PROTECT,NOMCLR
#use delay(clock=4Mhz)
#define IR_OUT PIN_B2
unsigned int i=0;
unsigned int k=0;
#use fast_io(B)
void start(){
for(i=0; i<200; i++){
output_high(IR_OUT); delay_us(12);
output_low(IR_OUT); delay_us(5);
}
for(i=0; i<149; i++){
output_high(IR_OUT); delay_us(12);
output_low(IR_OUT); delay_us(5);
}
delay_us(4600);
return;
}
void send_IR(int datas, int adet){
for(i=1;i<=adet;i++){
for(k=1;k<=22;k++){
output_high(IR_OUT); delay_us(12);
output_low(IR_OUT); delay_us(5);
}
if(datas==0) delay_us(1670);
else delay_us(545);
}
return;
}
void data(){
send_IR(1,3);
send_IR(0,1);
send_IR(1,4);
send_IR(0,2);
send_IR(1,2);
send_IR(0,1);
send_IR(1,3);
send_IR(0,3);
send_IR(1,4);
send_IR(0,1);
send_IR(1,3);
send_IR(0,4);
send_IR(1,2);
return;
}
void main(){
set_tris_B(0b11111001);
output_low(IR_OUT);
while(TRUE){
start();
data();
delay_ms(50);
}
}
ilk deneme sonucu:
12F683 pic
internal 8mhz osc ile !!
yüksek puls : 17 us
düşük puls :21.45 us
aradaki bekleme photo için :7347 us
bu şekilde kamerayı kontrol edebiliyormu?
Alıntı yapılan: dyonizos - 14 Ekim 2011, 11:12:35
bu şekilde kamerayı kontrol edebiliyormu?
yok etmez heralde
değerler tam tutmuyorki
picin 8mhz internal osc sini kullandım , fabrika çıkışı %1 hata payına sahiptir
haliyle frekansta kaymalar gayet doğal
normalde böyle hassas frekanslar için int osc kullanılmaz zaten
bunu 20mhz normal kristal ile denemek lazım bence o zaman olacaktır
ama hemen deneyemem onu
ben simdi 20mhz kristal ile 12f675 üzerinde deneme yapıcam. belki olur.
20mhz kristalin config ayarlarını yapamadım. onunla ugrasıyorum.
dyonizos, ASM harici bir dille bu şekildeki bir zamanlamada her zaman gecikmeler olur, kullandığın compiler ürettiği ASM kodlarını gösteriyorsa inceleme şansın olabilir. 16us pulse duration... 4MHz de bir machine cycle zaten 1us, yazılan süre haricinde delay rutinine gitmesi gelmesi, her döngüde 0 ı kontrol etmesi epey cycle alacaktır. En azından 20MHz kristal ile başlanmalı 22pf lar önemli. Elinizde osiloskop veya en azından Salea Lojik Analizör (https://www.picproje.org/index.php/topic,35071.msg254415.html#msg254415) gibi bir araç yoksa fikir sahibi olmak için Protonda aşağıdaki gibi bir programı çalıştırıp çıkışı frekansmetre ile gözleyin, periyodun 30us den ne kadar saptığını görebilirsiniz. Waveform bu kadar sade ise döngülerle yapılabilir, normalde timer kesmeleriyle yapılması gereken bir işlem.
İyi çalışmalar.
For EVER(!)
High LED
DelayUS 15
Low LED
DelayUS 15
Next
Kesin zamanlama kontrolleri sağlamak için assembler dilinde çalışmanızı önerebilirim. Çünkü diğer programlama dillerinde fonksiyonları sağlamak için kütüphanerimdeki kod dizinleri kullanılıyor,bunlarda ne yazık ki bazen programı şişiriyor.
Programı optimize edilmesi ile (örneğin çıkış bacağının açma veya kapatılması ve bekleme kodları birbirini takip edecek şekilde-döngülere girmeden) program daha kararlı çalışması sağlanabilir.
Biz yazana kadar hemen konu iletilmiş-teşekküler..
haklısınız. 20mhz kristal ile denedim yine kontrol etmiyor kamerayı. Ölçüm yapabilmek için osilator malesef elimde yok. Su anki devreden nasıl aralıklarla pulse sinyali alıyorum emin değilim. Aslında orjinal sitede bu delay sürelerine bir referans aralığı vermiş tam birebir aynısı olmadan da çalışıyor galiba ancak ben henüz farklı değerler denememe rağmen çalıştıramadım.
orjinal sitede zaten 15us lik gecikmeler yerine 12us kullanmış.
asm olayı beni aşıyor malesef :(
asm konusunda hiçbir bilgim yok
kamerayı kontrol etmiyor ama devre çalışıyormu ? nasıl emin oldunuz buna ?
Device = 12F675
Xtal 20
Config FOSC_HS, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, BOREN_OFF, CP_OFF, CPD_OFF
pwm
pwm çok uygun değil, zira palsler adetli !
Bunu üretmek 4 mhz osc ile gayet kolay,
Dahili RC osc de bu işe uygun, %1 hata problem değil.
İlgili arkadaşın tek yapması gereken, (kıt kaynaklara sahip olduğundan) kodu Proteus'ta çalıştırıp çıkışın uzunluğunu ölçmek !
Devrede ir ledle beraber birde normal led bagli. Ledin yandigini ve delay surelerini uzattigimda da gozle periyodu alginabiliyor. Ancak tabi desigim gibi pulse surelerinin uydugundan emin olamiyorum dogal olarak.
tamamdır bu %100 çalışır heralde
pulsler tam 15.0us x 16 tane
aradaki bekleme
photo için 7330,7 us
video için 5360,6 us
'High cycle 15,0 uS
'Low cycle 15,0 uS
'Photo Bursts 7330,7 uS
'Video Bursts 5360,6 uS
Device = 12F683
Xtal 20
Config FOSC_HS, WDTE_OFF, PWRTE_ON, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_OFF, IESO_OFF, FCMEN_OFF
GPIO=%00000000
TRISIO=%00111110
Declare All_Digital= true
OPTION_REG.7=0
WPU=%00000110
Dim i As Byte
Dim delayBetweenBursts As Word
Symbol LED =GPIO.0
Symbol Photo = GPIO.1
Symbol Video = GPIO.2
MAIN:
If Photo=0 Then
delayBetweenBursts=7314 '7330
LED=0
GoSub SHOOT
EndIf
DelayMS 15
If Video=0 Then
delayBetweenBursts=5344 '5360
LED=0
GoSub SHOOT
EndIf
DelayMS 15
GoTo MAIN
SHOOT:
For i=0 To 31
Toggle LED
DelayUS 12
Nop
Next
DelayUS delayBetweenBursts
For i=0 To 31
Toggle LED
DelayUS 12
Nop
Next
delayBetweenBursts=0
Return
bu kodları 20mhz de ve 12f675 de denedım ancak aradalı delayms15 den dolayı sanırım ledın yanıp sonus halını gorebılıyorum. yanılmıyorsam kod led e grafıktekı pulse ı verdıkten sonra delay 15 yapıp tekrar aynı pulse ı uretıyor elımızı butondan cekmedıgımız zaman.
bu sorun olmamalı sanırım. Ancak esas sorun kamerayı kumanda edemedım yıne :)
bu kullandıgım pic in 12f675 olmasından kaynaklanmıyor olabılırmı. gercı bu pic te 20 mhz krıstalı desteklıyor ve calısıtırıyor ama kamerada bır hareket yok malesef.
arada 15ms bilerek bekleme koydum
o resimdeki sinyal tam olarak üretiliyor, ondan eminim ölçtüm
12f675 kodu verin bakalım nedir
'High cycle 15,0 uS
'Low cycle 15,0 uS
'Photo Bursts 7330,7 uS
'Video Bursts 5360,6 uS
Device = 12F675
Xtal 20
Config OSC_HS, WDTE_OFF, PWRTE_ON, MCLRE_OFF, CP_OFF, CPD_OFF
GPIO=%00000000
TRISIO=%00111110
Declare All_Digital= true
OPTION_REG.7=0
WPU=%00000110
Dim i As Byte
Dim delayBetweenBursts As Word
Symbol LED =GPIO.0
Symbol Photo = GPIO.1
Symbol Video = GPIO.2
MAIN:
If Photo=0 Then
delayBetweenBursts=7314 '7330
LED=0
GoSub SHOOT
EndIf
DelayMS 15
If Video=0 Then
delayBetweenBursts=5344 '5360
LED=0
GoSub SHOOT
EndIf
DelayMS 15
GoTo MAIN
SHOOT:
For i=0 To 31
Toggle LED
DelayUS 12
Nop
Next
DelayUS delayBetweenBursts
For i=0 To 31
Toggle LED
DelayUS 12
Nop
Next
delayBetweenBursts=0
Return
bu arada led i direct pic e bagladım. arada bır transistor yada direnc yok. zaten pulse li gelicek diye araya direnc koymadım cok zayıf kalıyor ısıgı. (normal led ın)
araya transistor koymam gerekırmı acaba?
transistore gerek yok ama araya mutlaka 220 ohm koyun
bu arada 12f675 kodu bende çalışmıyor ne yaptıysam olmadı tuhaf
hatta config ayarlarında düzeltmelerde yaptım
2 tane 12F675 denedim
benim 12F683 canavar gibi çalışıyor yukardaki kod ile
'High cycle 15,0 uS
'Low cycle 15,0 uS
'Photo Bursts 7330,7 uS
'Video Bursts 5360,6 uS
Device 12F675
Xtal 20
Config FOSC_HS, WDTE_OFF, PWRTE_ON, MCLRE_OFF, BOREN_OFF, CP_OFF, CPD_OFF
Set_OSCCAL
GPIO=%00000000
TRISIO=%00111110
ANSEL =%00000000
Declare All_Digital= true
CMCON = 7
OPTION_REG.7=0
WPU=%00000110
Dim i As Byte
Dim delayBetweenBursts As Word
Symbol LED =GPIO.0
Symbol Photo = GPIO.1
Symbol Video = GPIO.2
MAIN:
If Photo=0 Then
delayBetweenBursts=7314 '7330
LED=0
GoSub SHOOT
EndIf
DelayMS 15
If Video=0 Then
delayBetweenBursts=5344 '5360
LED=0
GoSub SHOOT
EndIf
DelayMS 15
GoTo MAIN
SHOOT:
For i=0 To 31
Toggle LED
DelayUS 12
Nop
Next
DelayUS delayBetweenBursts
For i=0 To 31
Toggle LED
DelayUS 12
Nop
Next
delayBetweenBursts=0
Return
derleme yaparken osilatoru manuel olarak hs secıyorum ben. yanlısmı yapıyorum acaba? direk kodu kullanırsam config ayarlarında osilatoru LP olarak görüyor
çalışmıyor dediğim fiziksel devre olarak çalışmıyor
yoksa proteus tamam
683 ile aynı degerlerimi veriyor proteusta. siz ölçümü proteusta yaptınız sanırım
ben hem proteus hem canlı devreyi test ettim
675 proteusta çalışıyor, canlıda fıss
683 hem proteusta hem canlıda OK
12F675 , bu kod ile gerçek devre çalışıyor
'High cycle 15,0 uS
'Low cycle 15,0 uS
'Photo Bursts 7330,7 uS
'Video Bursts 5360,6 uS
Device 12F675
Xtal 20
Config CPD_OFF,CP_OFF,BODEN_ON,MCLRE_OFF,PWRTE_ON,WDT_OFF,HS_OSC
Set_OSCCAL
GPIO=%00000000
TRISIO=%00111110
ANSEL =0
CMCON = 7
OPTION_REG.7=0
WPU=%00000110
Dim i As Byte
Dim delayBetweenBursts As Word
Symbol LED =GPIO.0
Symbol Photo = GPIO.1
Symbol Video = GPIO.2
MAIN:
If Photo=0 Then
delayBetweenBursts=7314 '7330
LED=0
GoSub SHOOT
EndIf
DelayMS 15
If Video=0 Then
delayBetweenBursts=5344 '5360
LED=0
GoSub SHOOT
EndIf
DelayMS 15
GoTo MAIN
SHOOT:
For i=0 To 31
Toggle LED
DelayUS 12
Nop
Next
DelayUS delayBetweenBursts
For i=0 To 31
Toggle LED
DelayUS 12
Nop
Next
delayBetweenBursts=0
Return
Siz devrede normal led kullaniyorsunuz sanirim. Isik gucu normalmi ?
Alıntı yapılan: dyonizos - 14 Ekim 2011, 20:25:11
Siz devrede normal led kullaniyorsunuz sanirim. Isik gucu normalmi ?
hayır çıkışı ölçüyorum
infrared kullanmak gerekir normalde
ve infrared led gözle görünmez biliyorsun
normal beyaz led ile bu işi denemiyorsun değilmi ? öyle düşünmem gerekmiyor ?
:) infrared kullaniyorum hocam.
Hatta bir kac farkli dalga boyunda cesitli vardi elimde hepsini denedim ama bir turlu kamerayi kontrol edemedim. Denemelere devam ediyorum.
32700 Hz frekansında bir pulse nasıl üretebilirim.
Alıntı yapılan: dyonizos - 17 Ekim 2011, 11:57:33
32700 Hz frekansında bir pulse nasıl üretebilirim.
ne yapacaksınız bunu ? yada yaptınızmı ?
vazgectım :)
Ancak hazır konu acılmısken tekrar yukarıda daha once verdıgınız kodları calıstırmayı basardım. bır sorun yok gıbı ancak led ın ısıgı cok az gelıyor kamerayla baktıgımda. yanı normal bır tv kumandası ıle kıyaslanamıyacak kadar az. bu nedenle de kumanda mesafesı nedeyse 2 metrelere kadar dusuyor. Transıstor falan fılan herseyı denedım ama olmadı ısıgı artırma noktasında. Pulse seklınde bır cıkıs oldugu ıcınmı boyle oluyor. Bu ledın ısıgı nasıl artırılabılır?
Daha kaliteli bir LED kullanmak
Mercek sistemi kullanmak
Ayna sistemi kullanmak
LED için sürücü devresi kullanmak. (Belki Mosfet veya yüksek güçlü transisitör)
Ayna ve mercek sisteminde ışık huzmesinin açısı daralacağı için hassasiyeti artabilir.
transistor kullandım ve direc olarakta 2-10 ohm arası cok kucuk bır dırenc ıle 5v beslemeye dırek baglamama ragmen ısık sıddetı degısmıyor.
Besleme yeterli gelmeme durumu olabilir. Darbe sürelerin çok küçük olduğunda LED'lere verdiğin güç düşük gelebilir. Çözüm olarak gerilimi artırmak olabilir.
Kayan yazılarda 80-100 sütunluk bir tabelayı 5V ile tek parça sürmek istersen ekrandaki LED'ler soluk yanar ama 32 sütunluk bir tabelayı 5 V ile sürersen normal yanar. Yani led için sürme enerjisi gerekir. İşte bu noktada 80 sütunluğu normal parlaklıkta sürmek için besleme gerilimini 12V civarına çıkartıldığında parlaklık normal oluyor.
Pekı bu kumandanın orjınalı saat pili ile calısıyor yani yaklasık 3v ıle nasıl bu kadar yuksek mıktar ısık uretebılıyor? yanı gerılım daha fazla degıl.
farklı ve ledı daha parlak yakacak bır sınyalmı ortada?
Mümkün. Biz piyasada ne varsa onu kullanma durumunda kalıyoruz. Bunlarında en iyisi olma durumu pek nadir!
Malum LED var , Led var, hatta süper LED var.
benim elimde 4-5 çeşit ir led var hepsınde ısık neredeyse aynı duzeyde. Usenmesem kumandayı cıkatrıp ıcındekı led ı kullanıp denıycem ama sankı olay ledden zıyade ikinci bir led in parlak yanmasını saglayacak sınyalmıs gıbı duruyor.