Pals üretmek ile ilgili bir sorun

Başlatan dyonizos, 13 Ekim 2011, 22:38:47

dyonizos

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?



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


iyildirim

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

Maxim

hassas süreler için interrupt kullanmak lazım
delayms-delayus gibi bekleme komutları o kadar hassas çalışmalarda işe yararmı ? şüpheliyim

dyonizos

Interrupt  kullanarak nasil gecikme yapabilirim. Ornek verebilirmisiniz. 

Maxim

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

Erol YILMAZ

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);
   }
   
}

Maxim

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

dyonizos

bu şekilde kamerayı kontrol edebiliyormu?

Maxim

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

dyonizos

ben simdi 20mhz kristal ile 12f675 üzerinde deneme yapıcam. belki olur.
20mhz kristalin config ayarlarını yapamadım. onunla ugrasıyorum.

ferdem

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 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


Kabil ATICI

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..
ambar7

dyonizos

#12
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

Maxim

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

omereliusuk