avatar_mierdogan

ADC Denemesi

Başlatan mierdogan, 25 Nisan 2012, 16:19:43

mierdogan

ETE Hocam 5. Ders konusu olan ADC ile uğraşıyorum

Sizinki ile bire bir aynı sayılır işlemci 16F877A. Okuma ucu AN3(RA3) yazılımı derleyip pic'e attığım zaman 8x2 LCD üzerinde HAM =1 VOL =0.1 gözüküyor.

AN3'e bağlı potu çevirince HAM değeri aniden(sonlara doğru) 19 oluyor okunan voltaj 0.3 oluyor uygulama doğrumu?

Birde yazdığım kodda sanki pic bacak komutlarını eksik yazıyormuşum geldi AN3'ü analog okumaya nasıl kodlayacağım ADCON ve CMCON satırlarında hata veya eksiğim varsa lütfen söyleyin ben düzeltmeye çalışayım...

KOD:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 25.04.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

CMCON=7
'ADCON1=7
TRISA=%00000001
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000

'---------------------------------------------------------------
@ DEVICE PIC16F877A                                                    
@ DEVICE PIC16F877A, WDT_OFF             
@ DEVICE PIC16F877A, PWRT_OFF            
@ DEVICE PIC16F877A, PROTECT_OFF        
@ DEVICE PIC16F877A, XT_OSC   
'-----------------------------------------------------------------
DEFINE  LCD_DREG    PORTB
DEFINE  LCD_DBIT    0
DEFINE  LCD_EREG    PORTB
DEFINE  LCD_EBIT    5
DEFINE  LCD_RWREG   PORTB
DEFINE  LCD_RWBIT   6
DEFINE  LCD_RSREG   PORTB
DEFINE  LCD_RSBIT   4
DEFINE  LCD_BITS    4
DEFINE  LCD_LINES   2

DEFINE  ADC_BITS    10
DEFINE  ADC_CLOCK   3

DEFINE  ADC_SAMPLEUS    100
'------------------------------------------------------------------
ADCON1=%10001110
'---------------------------------------------------------------
HAM VAR WORD
VOLT    VAR WORD
Mvolt   VAR BYTE
'---------------------------------------------------------------------
LOW PORTB.2
LCDOUT  $FE,1
PAUSE   250

BASLA:
        ADCIN 1,HAM
        
BAK:    IF ADCON0.2=1 THEN BAK
        
        LCDOUT  $FE,1,   "HAM=",# HAM
        HAM=HAM+1
        
        VOLT=(HAM */ 1250)/100
        Mvolt=VOLT//10
        
        VOLT=VOLT/10
        
        LCDOUT  $FE,$C0,"VOLT=",#VOLT,",",# Mvolt
        PAUSE 500
        GOTO BASLA


Saygılar


"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

ete

Pic16F877 data sheet'ini aç ve ADCON1 registerini incele. Aradıkların orada mevcut. Bu registerin bitlerinin aldığı değerlere göre hangi kanalların seçileceğini Ders notlarında da göstermiştim. Orada bir tablo mevcut ve tablodan seçim yaparak bir veya daha fazla analog pini aktif edebiliyorsunuz.

Ayrıca madem AN3 ile uğraşıyorsun neden programda AN1  (ADCIN 1) okumaya çalışıyorsun?
Hangi kanalı okuyacaksanız ADCIN komutu önüne onun numarasını yazmanız gerekiyor.

Ete


mierdogan

#2
Aslında kodu değiştirdim fakat görmediniz sanırım(yada burada düzeltmedim hatırlamıyorum) AN1'i seçsem ne gösterecek diye merak ettim sadece orada LM35 takılı...
Ne gösterdi diye sorarsanız HAM=3-4 arasında geziyor VOLT=0.1 ve 0.3 arasında geziyor

Ben ADCON inceleyeyim

Saygılar
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

mierdogan

Hocam kodları ekteki dosya gibi değiştirdim ADCON okudum notlardan.

Kart üzerinde denedim şu haliyle HAM değer değişiklik gösteriyor fakat voltajda değişiklik yok...

Saygılar

"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

ete

Bir ADC pinini kullanabilmen için o pini giriş olarak ayarlaman gerekir.
Bak bakalım AN3 pini (PORTA.3) sende ne olarak ayarlanmış.

Ete

mierdogan

Aman allahım oralara hiç bakmıyorum.. canavar oldu...

Neyse çalışmaya devam

Peki hocam diyelimki bir motor kasnağına mıknatıs ve mıknatısı görecek sabit bir yerede reed röle koyduk(bisiklet hız sensörleri gibi) ve pic'e her puls geldiğinde tur sayısını veya dahada fazlası hızını tespit etmek istedik bunu nasıl yaparız? Bu konuyu işlemek için erkenmi? Aklıma geldi birden erkense sonrada bakabilirim..

Saygılar
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

ete

Bu işi yapmanın pek çok yolu var. Bunlardan birisi TMR0 veya TMR1 sayaçlarını dışarıdan puls alacak şekilde kurarsın.
Her birinin özel ayrılmış pinleri vardır. Mesel TMR0 PORTA.4 den giriş yapar. TMR1 işlemciye bağlı olarak B portunda bir pini kullanır.
Devir ve puls ölçme zaman bazında yapılması gereken sayımlardır. Bu nedenle en azından 1000 ms zaman tutarak bu pinlerden kaç puls geldiğini sayarsın. Aslında senin sayman gerekmiyor. Bu sistem geri planda çalışır ve senin programınıda etkilemez.
Yapman gereken tek şey zaman dolduğunda Timer değerini kendi değişkenine aktarmak olacaktır.
Daha sonrada aldığınbu değer devir/Sn  değeri olduğundan bunu devir/dak ya çevirmen gerekiyor.
Zaman tutmaya başlamadan önce Timer sıfırlanır ve zaman bitiminde timer değeri okunur.

Benzer şekilde puls ucu PORTB.0 dan girilerek PORTB.0 kesmesi aktif edilir. Sayac değeri sıfırlanır ve yine zaman tutulur.
Kesme etiketi altında sayac değeri bir artırılır. Zaman bitince  sayac değerini okursun buda sana devir bilgisini verir.

Her iki konununda dersler içinde örnekleri mevcuttur.

Ete

mierdogan

Bundan vazgeçtim

Şimdilik ADC konusundan LM35 ile 7 segment üzerinde sıcaklık ölçmeyi deneyeceğim 5. dersdeki örneklerle yapabilirim umarım(LM35 hakkında bilgim yok incelemedim)

Saygılar
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

mierdogan

Hocam aklıma bir konu takıldı

Mesela ders anlatımlarında aşağıdaki gibi bir paragraf var...

Tabloya baktığımızda sanki biraz kısıtlı seçim hakkımız varmış gibi hissettim... demek istediğim sadece istediğim portun analog olarak input olmasını nasıl sağlayabiliriz? tabloda olduğu gibi kullanmak zorundamıyız giriş ayarlarını?

Örnek: Ben sadece AN6 Analog olsun diğerleri dijital olsun istersem ne yapmalıyım?

Alıntı YapŞimdi diyelim ki bize 3 adet Analog giriş lazım diğerleri Digital olabilir. +5V ve GND de referans voltajları olarak kullanılacak. Bu durumda tabloya bakar isek 0100 değeri tam istediğimiz ayarlamayı yapabiliyor. Tablonun en son hanesinde  ilk değer kaç Analog giriş olduğunu / işaretinden sonraki değer ise harici referans voltaj girişi adedini gösteriyor. Seçtiğimiz değerde burası 3/0 olarak görülmektedir. Anlamı 3 adet Analog giriş ve sıfır referans voltajı var demek. Zaten biz Pic'in kendi voltaj girişlerini kullanmak istediğimizden gerçektende bize sıfır referans girişi lazımdır.
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

ete

#9
Eski nesil işlemcilerde tek tek analog pin seçimi 12F serisi haricinde pek mümkün olmuyor. Yenilerde ANSEL registeri var . Bu registerin olduğu he rişlemcide analog pinler tek tek seçilebiliyor. Mesela 16f88 de bu mümkün. Ama 16F877A da mümkün değil. Sanırım onun yenisi 16F887 ve bir küçüğü 16F886 da bu iş mümkün.

Ete

mierdogan

#10
ETE Hocam

ben bu LM35 i 7 segment displaylerden görüntüleyemiyorum neden derseniz bendeki sürücü chip'i kullanamadım daha doğrusu kullanılmantığını anlamadım

Deneme kartımda 4 haneli 7 segment display var
Birde seven segment sürücü chip var HD74LS48

sürücünün ABCD uçları sırasıyla rb0-rb1-rb2- ve rb3 e bağlı

15-4-5-3 nolu pinler direkt +5 volta bağlı

QA -- QG uçları  displey'in A--G uçlarına bağlı

8 nolu bacak GND

ortak katotlu display sanırım hepsi bc337 ile eksiye çekilmiş

TR1 = 10 k dirençle rb 7'e bağlı
TR2 = 10 k dirençle rb 6'e bağlı
TR3 = 10 k dirençle rb 5'e bağlı
TR4 = 10 k dirençle rb 4'e bağlı

LM35 AN0' da bağlı

bü sürücü kullanma işini anlamadım... aslında derslerdeki 74hc595' de var ama breadboard umu bulamıyorum...


Örnek kod forumda bir üyenin paylaştığı ledli termometre devresinden alıntıdır;

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [wishes]                                          *
'*  Notice  : xxxxxxxxxxxxx 2012 [select VIEW...EDITOR OPTIONS] *
'*          : Telif hakkı yoktur.                               *
'*  Date    : 14.04.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   : Ete hocamızın örneğinden aldığım kodlarla, mucit23*     
'*          : Ve est32 arkadaşlarımın yardımıyla 11 ledli, 7 SEGMENT 
'*            Display'li bir termometre yaptım. Isıyı 0-1 volt 
'*            aralığında 0-100 C derece ölçebilen LM35DZ ölçüyor.
'*            her 5 C derecede bir 0-50 C derece arası bir LED yanıyor.    
'****************************************************************
DEFINE OSC 4                     
  
@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_ON        
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF                 
@ DEVICE pic16F877A, XT_OSC


CMCON=7
'ADCON1=7

PORTA=0:TRISA=%000111                       
PORTB=0:TRISB=%00000000                       
PORTC=0:TRISC=%00000000 


DEFINE ADC_BITS     10   
DEFINE ADC_CLOCK    1
DEFINE ADC_SAMPLEUS 100 
  
  ADCON1=%10001110   'sadece A0 portundan analog değer oku
  ON INTERRUPT GoTo KESME   
  OPTION_REG=%00000011 
      INTCON=%10100000 
        TMR0=130
    ''     ''      ''    ''     Değişkenler      ''    ''     ''      ''
       HAM      VAR     WORD            
       ISI      VAR     WORD 
       index    var     BYTE
       SAYI     var     BYTE
       BIRLER   VAR     BYTE
       ONLAR    VAR     BYTE
       X        VAR     BIT
    
       
       symbol L9=PORTA.3
       symbol L10=PORTA.4
       symbol L11=PORTA.5
     
       SYMBOL DISP0=PORTA.1      ' onlar  hanesi ortak uç
       SYMBOL DISP1=PORTA.2      ' birler hanesi ortak uç
       
       PAUSE 100
''     ''      ''    ''     BAŞLANGIÇ      ''    ''     ''      ''    
     
BASLA: 
        ADCIN 0, HAM  ' 0 nolu kanaldan analog değeri oku ve HAM değişkenine aktar
        GOSUB ISIHESAP 
        GOSUB DIJITLER
GOTO BASLA

    ''     ''      ''       ''     ''      ''    ''     ''      ''
DIJITLER:
     index=ISI DIG 0:GOSUB AL:BIRLER=SAYI
     index=ISI DIG 1:GOSUB AL:ONLAR=SAYI
RETURN   
      
AL:
     LOOKUP index,[63,6,91,79,102,109,125,7,127,111],SAYI
RETURN
    ''     ''      ''       ''     ''      ''    ''     ''      ''
ISIHESAP: 
    IF ADCON1.0=1 THEN ISIHESAP   
            ISI=(HAM*61)/125   '0-100 'C arası ölçüm yapabilen LM35DZ formülü
'       PAUSE 100              BU GECiKME PROGRAMIN CALIŞMASINI AKSATIR
RETURN
    ''     ''      ''      ''     ''      ''    ''     ''      ''


    ''     ''      ''    ''     Kesme      ''    ''     ''      ''
  DISABLE
    KESME:
      X=1-X
      SELECT CASE X
      CASE 0 
        LOW DISP0
        PORTB=BIRLER
        HIGH DISP1
      CASE 1
        LOW DISP1
        PORTB=ONLAR
        HIGH DISP0        
      END SELECT
        TMR0=130
        INTCON.2=0
    RESUME
  ENABLE 
    ''     ''      ''    ''     ''      ''    ''     ''      '' 
END
    ''     ''      ''    ''     ''      ''    ''     ''      '' 

Saygılar
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

mierdogan

Üstteki sorumdan vazgeçtim derslerin tatbiki için gerekli malzemeleri aldım...

SAY devresindeyim şu an derslerdeki 4511 ile yapılmış olan bu iki display ile biraz uğraşacağım saygılar
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

ete

Eskiden kalma alışkanlık olarak 7 segment display sürücülerinde 7448 veya 4511 gibi sürücüler kullanırdım.
Ama sonradan 74HC595'i keşfedince hiçde onlara gerek olmadığına kararverip bütün display sürücülerimi artık 595 ile sürüyorum.
Bu nedenle sanada tavsiyem 595 üzerine yoğunlaşman yönünde. Çokbasit bir neden söyleyeyim. Standart sürücülerde 6 harfinin kulağı yoktur. Ama 595 ile istediğin şekli verebilirsin. Bu nedenle daha esnek çalışma için 595leri tercih etmelisin.

Ete

mierdogan

74HC595 aldım fakat eve dönme zamanı geliyor deneyemeyeceğim...

"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

Powered by EzPortal