çok sayıda ADC örnek almak ve her alınan örneği ayrı isimli değişkene atamak

Başlatan FUNKY, 19 Haziran 2010, 18:02:55

FUNKY


arkadaşlar  ..ben ADlN.0  dan mesela 100 adet 20us lik ölçüm yapıp  bunların her birini  farklı  değişkenlere atamak için ...
basla:
 ornek1=ADIn.0
 ornek2=ADIn.0
'
'
'
ornek99=ADIn.0
ornek100=ADIn.0
goto basla


yapabilirim  fakat  bunun doğrusu 100 adet kod yazmak  olmadığını düşünüyorum ..

doğru ve farklı yöntemleri  yazmanızı  rica ediyorum..

fatihinanc

basic için çok bir bilgim yok fakat tamsayı dizi değişken tanımlayarak ve
her ölçüm için aynı label a dizi değişkenin indisini arttırarak deneyebilirsiniz.

Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

FUNKY


  '' Diziler bu kara günler için elbette''  ;D


vardır başka  bir yolu mutlaka... peki  FFT yaparken birsürü örnek alıp yazdırıyorlar  .. onlarda yüzlerce kod yazmıyorlar herhalde...

picmanya

bu bölümde yazmak ne derece mantıklı bilmiyorum ama yazılan C kodları ile derleyicileri bunu otomatik yapabiliyor
yeterki örnekleme 2 ve katları sayılarda olsun bunun nedeni ise sonucu direkt bölme ile değilde bitleri örneklendiği ölçüde sağa kaydırark çıkarması hatta bir adım ötesi olarak bu işlemi aynı anda 2 veya 4 kanal adc için bile çoklu okuyup tek sonuç döndürebiliyor sizin derleyiciler insana daha yakın bildiğim kadarı ile C de bu iş oluyorsa basic de çok daha rahat olmalı herhalde

picmanya

unsigned char count=0;
unsigned int POT(void)
{
   ADCHS  = 0x0000;   
   volatile unsigned int *ADC16Ptr=0;   
   unsigned int ADCValue=0;

   ADC16Ptr = &ADCBUF0;          
   IFS0bits.ADIF = 0;         
   ADCON1bits.ASAM = 1;          
   while (!IFS0bits.ADIF);       
   ADCON1bits.ASAM = 0;          
   for (count = 0; count < 16; count++) 
   {
      ADCValue = ADCValue + *ADC16Ptr++;   
   }
   ADCValue = ADCValue >> 4;
         
   return ADCValue;
}

unsigned int potun_degeri = (unsigned int) unsigned int POT();

bu kodun tercümesini satır bazında yapabilecekler varmı?

fatihinanc

@FxDev;

imag dizisinin indislerini neden her seferinde 0 yapıyorsunuz. ayrıca başka bir işlemde hiç yer almıyor bu değişken. ana programda mı kullanıyorsunuz?

ek : C de int veri tipi ilk tanımlandığı zaman zaten otomatik olarak signed tanımlanıyor.neden tür dönüşümü yaparken signed int yazma gereği duydunuz?
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

fatihinanc

birazdan bakarım mihri nin projesine.
ben de de var o.
unsigned tanımlamazsam belleği israf ediyormuşum gibi hissediyorum.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

FUNKY


FxDev  hocam   bu forumda Protonla yavaş yavaş yazmaya çalışıyorum  ama ben de  bir değişkene yazılmak üzere sayısız örnek almayı biliyorum sayenizde.. soru   her alınan örneğe başka bir değişkene atamak.  mesela siz aldığınız 256 örneğin içinden 200 cü örneği alıp  kullanabilirmisiniz ?. değişkenleri biz yazarken belirlememiz gerek olduğundan benim sorum un cevabı olmaz sanıyorum..
ikincisi çok sayıda örnek almanın yeri basla : döngüsü içinde yapılmayacağını da biliyorum ..

ete

İşin çözümü 100 elemanlık bir dizi değişkeni tanımlayarak bir index döngüsü kurmak ve okunan adc değerlerini index değişkenine bağlı dizi değişkenine vermek olacaktır. Örnek vermek gerekir ise;
DIM  Ornek[100] as byte 
DIM I as Byte

BASLA:
FOR I=0 to 99
ORNEK[I]=ADIN 0
Delayus 10
Next
..
..
..
GOTO BASLA

Bu şekilde komut dizisi ile 0-99 arası toplam 100 adet ADC değeri okunarak Ornek değişkenine index sırası ile atılmış olur.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

FUNKY



ETE hocam  çevabın için çok teşekkürler... ben "100 elemanlık bir dizi değişkeni tanımlayarak " ifadenizi protonda yapmaya çalıştım  fakat yapamadım..  9 cu örneği lcd de göremedim .
yazım kolaylığı açısından  10 adet örnek alıyorum..
üstatlar nerede hatalarım var ?

Device = 16F870
Xtal = 20
Config HS_OSC,WDT_OFF,PWRTE_ON,BODEN_OFF,CP_OFF,CPD_OFF,LVP_OFF 

Declare LCD_Type = 0        
Declare	LCD_DTPin		PORTC.4
Declare	LCD_RSPin		PORTC.0
Declare	LCD_ENPin		PORTC.3
Declare LCD_Lines		2
Declare LCD_Interface	4

Declare Adin_Res 10      
Declare Adin_Tad 32_FOSC  
Declare Adin_Stime 20     
  
ADCON1 =%10000100
TRISA = %00000001
TRISB = %00000000
TRISC = %00000000
Input PORTA.0 
 
 Dim index As Byte
 Dim Ornek As Byte
 Dim Orn As Byte
 '10 adet örneğin sırayla yazılacağı değişkenler
 Dim or1 As Word:Dim or2 As Word:Dim or3 As Word:Dim or4 As Word
 Dim or5 As Word:Dim or6 As Word:Dim or7 As Word:Dim or8 As Word
 Dim or9 As Word:Dim or10 As Word
 
 Orn= LookUpL index,[or1,or2,or3,or4,or5,or6,or7,or8,or9,or10]
 
 BASLA:
 For index =0 To 9
 Ornek = ADIn 0
 DelayUS 10
 Orn=Ornek
 Next
 
 
 Print At 1,1,"ornekX:",Dec or9
GoTo BASLA	   

ete

Dizi değişkenini verdiğin programda göremedim.
Ya olmadı diye değiştirdin yada programın başındaki gibi yanlış tanımladın.
Dizi değişkeni yapmayı planladığın iş için tek çözümdür ve açıkladığım şekilde yapılır.
Sen en iyisi dizi değişkeni tanımladığın programı buraya koyda bakalım neresi olmamış

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

FUNKY


ETE hocam    mesajınızdan gereken uyarıyı aldım ve yanlış birşey yaptığımı anladım  vee hemen derslerinize göz attım ve değişiklik yaptım şimdi çalışıyor.ama siz de bir bakın doğrumu yapmışım..

öğrendiklerim şunlar: dizi değişkeni içinde atamalar 0 dan başlayarak "ornek[0],ornek[1],,,ornek[10] atanır
                                :ornek[ ] parantez içine    yazacağımız rakam  o sayılı örneği temsil eder,olduğu gibi veya başka bir değişkene atayıp kullanabiliriz.. Doğrumudur...?

çok teşekkürler hocam ETE..

Device = 16F870
Xtal = 20
Config HS_OSC,WDT_OFF,PWRTE_ON,BODEN_OFF,CP_OFF,CPD_OFF,LVP_OFF 

Declare LCD_Type = 0        
Declare	LCD_DTPin		PORTC.4
Declare	LCD_RSPin		PORTC.0
Declare	LCD_ENPin		PORTC.3
Declare LCD_Lines		2
Declare LCD_Interface	4

Declare Adin_Res 10     
Declare Adin_Tad 32_FOSC  
Declare Adin_Stime 20     
  
ADCON1 =%10000100
TRISA = %00000001
TRISB = %00000000
TRISC = %00000000
Input PORTA.0 
 
 Dim I As Byte
 Dim Ornek[10] As Word
 Dim a As Word
 
  
 
 BASLA:
 
 For I =0 To 9
 Ornek[I] = ADIn 0
 DelayUS 10
 
 Next
 a=Ornek[9]
 a=a*0.0048  'pot 0-5 gösterimi
 Print At 1,1,"ornek9:",Dec a

 GoTo BASLA	   



FUNKY


FxDev hocam  önceki mesajınızda bu örneği verdeydiniz  daha çabuk kavrar ve o soruyu sormazdım  ama  fena olmadı iki gündür araştırıyorum  :) ETE  hocam zaten herşeyi vermiş te ben anlamamışım  kendisinin derslerinden dizi değişkenleri bölümünü ve kendisine ait bir saat,tarih uygulamasında örneği görünce  ne anlatmak istediğinizi anladım   hepiniz sağolun..

FxDev bu arada tavsiyeniz ğzerine radix algoritmalarına baktım..hocam böyle konular beni aşar... ;D

ete

Funky,
Yaptıkların şimdi doğru. Biraz dikkat ile her şeyi anlayıverdin. Çok da zor değilmiş değilmi?
Tebrik ederim.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

FUNKY



ETE hocam sayenizde ...eksik olmayın..


şimdi ben bir haftadır  bu  işi  kesme içerisinde yaptırmak ve  hiç kullanmadığım GO_DONE komutunu kullanarak  örnek almak için çalışıyorum ..maalesef tek bilgi buldum o da FxDev hocamın arka sayfada verdiği 256 örneklik kod..

FxDev hocama soracağım ama  www. FxDev.org  da "soru sorma sanatı" adlı bir yazı okudum bir kere daha okuyayım da kendisine karşı kusur işlemeyelim  :-\  kodun çoğunu vermiş  az bişey kalmışş zaten..



proton ide help inde 12f675 için bir ADC örneği  var GO_DONE  kullanmış  ama orada sanki bir yanlışlık yapmışlar gibi geliyor (şimdi diyeceksiniz ki daha yazmaya yeni başlamışsın proton help de  hatalı bir yer var diyorsun  ;D )

aşağıdaki kod da " While GO_DONE = 0"  olmayacakmı ...? data sheet lerde  ve de FxDev hocamın kodun da "while(!GODONE);"
0 olması  gerekir gibi geldi.. ??

'-------[START AN ADC CONVERSION]----------------------------------------
GET_ADC:
 ADON = 1     ' Enable the ADC
 Delayus 50                ' Wait for sample/hold capacitors to charge
 GO_DONE = 1              ' Start conversion
 While GO_DONE = 1 : Wend  ' Poll the GO_DONE flag for completion of conversion
 ADON = 0     ' Disable the ADC, to save power
 Return