Pic Basic +/- 5 v işlem

makdeniz

Üye
Katılım
4 Ocak 2007
Mesajlar
142
Puanları
1
Yaş
40
Merhaba uzun zamandan beri Vb ve Asp (basic türevi diller) ile kod yazıyorum bu sene Mekatronik bölümünü kazandım Geçen senede merak olarak Pic ile ilgilenmiş ama bir şey ögrenemeden yarım bırakmıstım bu sene üniversitenin kattıgı gaz ile bu işi ögrenmek istiyorum...

Amacım bir proje olusturup biraz Pic temelinden sonra C ögrenerek Mikroişlemcilere terfi etmek...

Aklımda bir kaç pic basic sorusu var...


Pic'in Bir bacagından okuma yapabilirmiyim...

mesela tek bacaktan gelen farklı Voltajları okutabilirmiyim basicten
gelen voltaja göre farklı işlemler yaptırabilir veya bunu işleme dökebilirmiyim...

örnk : 0 - 10 V arası voltajı nasıl okutabilirim.
2 V geldiği zaman bunu işleme nasıl sokabilirim...

Böyle bir şey pic basic te yapılabilir mi ??

Yardımcı olacak arkadaslara simdiden tesekkür ederim

Sadece Basic Dilini biliyorum PİC ve benzeri konularda sıfırım :)
 
bende pic konusuna cok yeni basladım
emin olmamakla birlikte sanırım olabilir

ben eger dogru anladıysam böle bi calısma elimde mevcut sana gönderim bakarsın
 

Ekli dosyalar

  • Yeni Klasör.rar
    15 KB · Görüntüleme: 136
Moderatör tarafında düzenlendi:
0- 10 volt degil de 0-5 volt araasında istedigin degerde giriş verebilirsin
pic lerde analog giriş mevcut
bu arada opamplarıda ıyı bilmen lazım konusunuda ıyı bılmen lazım
 
tomy ve leon ilk önce ilginiz için teşekkür ederim...

Araştırma sırasında Bu tipte picler oldugunu gördüm yada ön bir elektronik kart ile 0-10 v arasını pic'in anlayacagı bir dile getiren kartların oldugunuda bu projeyi uygulamaya alıp kendimi geliştirmek ve daha sonra buradan siz arkadaslar ile paylasmak istiyorum...

yardımlarını bekliyorum
iyi calısmalar
 
projeyi daha da sadeleştirebiliriz sonucta amaç ögrenmek

diyelimki 0- 6 volt arası girişimiz var

Pic' 1 v girdiği Soldaki lamba 1 kez yansın
Pic' 2 v girdiği Soldaki lamba 2 kez yansın
Pic' 3 v girdiği Soldaki lamba 3 kez yansın

Pic' 4 v girdiği sagdaki lamba 1 kez yansın
Pic' 5 v girdiği sagdaki lamba 2 kez yansın
Pic' 6 v girdiği sagdaki lamba 3 kez yansın

sanırım bu hali ile basit bir proje oldu en azından Giriş ve cıkısı nasıl yapabilirim örnek olursa iyi olur bayramdan sonra baslamak istiyorum olmazsa elektronik devreyi arkadaslara yaptırabilirim...

ve Mekatronik bölümünde Pic eğitimi veriyor mu ? saygılar
 
picler genelde 5v ile calışır 6 voltluk yada 10v. deyerini sabit bir gerilim bolucu ile max 5v olacak sekilde bol sonra (16f877 ve 16f628 kullanabilirsin) bunların adc pinlerinden okutma yapman gerek (AN0,AN1 seklinde gorunur kataloglarda) sana 0 - 255 arasında bir deyer verecek bu deyeri bir degişken icerisinde saklayıp degişkenin deyerine gore istedigini yapabilirsin asadaki kodlar 16f877 için daha once yaptıgım bir calışmanın bir kısmı senin işine yarıyacak kısmı var bende 16f628in adc portlarını nasıl kullanacagımı ararken rastladım soruna 16f628 icin tanımlamaların nasıl yapılması gerektigini bilen varsa cok makbule gececek benim içinde.





Kod:
'*****GİRİŞ VE ÇIKIŞLARI TANIT*****
TRISA=%00001111      'PORTA GİRİŞ
TRISB=0          '2*16 LCD BAĞLI ÇIKIŞ
trisD=%00000000
trisC=%00000011
PortD=0
PortC=0
'----------------------------------
input PortC.0
input PortC.1
output PortC.7
output PORTD.2
output PORTD.1
output PORTD.0
low PortC.7
'*****LCD TANIMLAMALARI*****
DEFINE LCD_DREG  PORTB 'LCD DATA BACAKLARI PORTB'YE BAĞLI
DEFINE LCD_DBIT  4   'LCD DATA BACAKLARI PORTB.4 BAĞLI
DEFINE LCD_EREG  PORTB 'LCD ENABLE PİNİ PORTB'YE BAĞLI
DEFINE LCD_EBIT  3   'LCD ENABLE PİNİ PORTB.3 BAĞLI
DEFINE LCD_RSREG  PORTB 'LCD RS PİNİ PORTB'YE BAĞLI
DEFINE LCD_RSBIT  2   'LCD RS PİNİ PORTB.2 BAĞLI
DEFINE LCD_BITS  4   'LCD 4 BIT BAĞLI
DEFINE LCD_LINES  2   'LCD 16*2
'RW PİNİ TOPRAĞA BAĞLADIK DOLAYISIYLA BI PİN GEREKLİ KOMUT YAZMAYA GEREK YOKTUR.
'*****ADC TANIMLAMALARI*****
DEFINE ADC_BITS   10  'ADC 10 BİT
DEFINE ADC_CLOCK  1000
DEFINE ADC_SAMPLEUS 1000  'ÖRNEKLEME ZAMANI 50 MİKROSANİYE
ADCON1=%10000010      '10 BİTLİK ADC İÇİN GEREKLİ DEĞER
A   VAR word     'ADC_DEGER 16 BİT WORD CİNSİNDEN TANIMLAMA
B   VAR word     'ADC_DEGER 16 BİT WORD CİNSİNDEN TANIMLAMA
C   VAR word     'ADC_DEGER 16 BİT WORD CİNSİNDEN TANIMLAMA
AH   VAR word
BH   VAR word
CH   VAR word 
i   VAR byte
Zmn  VAR byte
FNC  VAR byte
STRT  VAR byte
STP  VAR byte

'---------MotKontPortTanımlamaları------------------------

'--------ProgramBaşlangıcı------------------------------------------------
TARA:
fnc = 0
  if PortC.0 = 1 then calis 
    if PortC.1 = 1 then goto DUR              
button portC.2, 1, 250, 250, fnc, 1, func
'------------------------------------------------------------------------
ADCIN 0,A   'AN0 KANALINDAN ADC DEGERINI OKU
ADCIN 1,B   'AN1 KANALINDAN ADC DEGERINI OKU 
ADCIN 2,C   'AN2 KANALINDAN ADC DEGERINI OKU

a = a / 8  ' değişkenler Word olarak tanımlandığı için 4' e bölüp katsayı 128' düşürülür
A = A * 300 ' Max Volt Deyeri Belirlenir
A = A / 127 ' 128 - 1 = 127 (1 bit sıfır oldugu için)
B = ((B / 8) * 300) / 127
C = ((C / 8) * 300) / 127


  LCDOUT $FE,1      'LCD İÇERİĞİNİ TEMİZLE
    LCDOUT "1= ",DEC a,"v." ' A deyerinin karşılığını LCD yaz
      LCDOUT "2= ",DEC b, "v."
  LCDOUT $FE,$C0
    LCDOUT "3= ",DEC C, "v."

      IF A < 170 THEN GOTO HATA ' DUSUK VOLTAJDA CALIŞMAYI DURDUR
        IF B < 170 THEN GOTO HATA ' DUSUK VOLTAJDA CALIŞMAYI DURDUR
          IF C < 170 THEN GOTO HATA ' DUSUK VOLTAJDA CALIŞMAYI DURDUR
          IF A > 240 THEN GOTO HATA ' YUKSEK VOLTAJDA CALIŞMAYI DURDUR
        IF B > 240 THEN GOTO HATA ' YUKSEK VOLTAJDA CALIŞMAYI DURDUR
      IF C > 240 THEN GOTO HATA ' YUKSEK VOLTAJDA CALIŞMAYI DURDUR
IF PORTD.0 = 1 THEN LCDOUT " START"
IF PORTD.0 = 0 THEN LCDOUT " STOP"

GOTO TARA



16f628in katalogundaki comparator örnegi bunu pic basıce cevirebilen varmı acaba asmden anlamıyorum henuz.
Kod:
FLAG_REG EQU 0X20
CLRF FLAG_REG ;Init flag register
CLRF PORTA ;Init PORTA
MOVF CMCON, W ;Load comparator bits
ANDLW 0xC0 ;Mask comparator bits
IORWF FLAG_REG,F ;Store bits in flag register
MOVLW 0x03 ;Init comparator mode
MOVWF CMCON ;CM<2:0> = 011
BSF STATUS,RP0 ;Select Bank1
MOVLW 0x07 ;Initialize data direction
MOVWF TRISA ;Set RA<2:0> as inputs
;RA<4:3> as outputs
;TRISA<7:5> always read ‘0’
BCF STATUS,RP0 ;Select Bank 0
CALL DELAY10 ;10µs delay
MOVF CMCON,F ;Read CMCON to end change
;condition
BCF PIR1,CMIF ;Clear pending interrupts
BSF STATUS,RP0 ;Select Bank 1
BSF PIE1,CMIE ;Enable comparator interrupts
BCF STATUS,RP0 ;Select Bank 0
BSF INTCON,PEIE ;Enable peripheral interrupts
BSF INTCON,GIE ;Global interrupt enable
 
ETE' ye cok tesekkurler.

Kod:
'****************************************************************
'* Name  : ADC.BAS                   *
'* Author : [ETE]                *
'* Notice : Copyright (c) 2005 [ETE]             *
'*     : All Rights Reserved                *
'* Date  : 20.04.2005                    *
'* Version : 1.0                        *
'* Notes  :                          *
'*     :                          *
'****************************************************************
TRISA=%00000001
TRISB=0
TRISC=0
TRISD=0
'-------------------------------------------------------------------------------
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
'-------------------------------------------------------------------------------
DEFINE LCD_DREG		PORTB	'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT		4		'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG		PORTB	'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT		3		'LCD Enable Bacağı Hangi bite bağlı ?
define LCD RWREG  PORTB  'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT  2    'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG	PORTB	'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT	1		'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_BITS		4		'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES	2		'LCD Kaç sıra yazabiliyor

DEFINE	ADC_BITS	10	  'A/D çevirim sonucu kaç bit olacak
DEFINE	ADC_CLOCK	3	  'Clock kaynağı (3=rc)
DEFINE	ADC_SAMPLEUS	100	'Örnekleme zamanı mikro saniye cinsinden.
'-------------------------------------------------------------------------------
ADCON1=%10001110 '7. bit 1 yapıldı 10 bit sonuç almak için.
'-------------------------------------------------------------------------------
HAM  var word 'ADC den okunan ham digital değer.                                    
VOLT  var word '16 bit değişken tipi seçtik kullanacağımız değer 10 bit olacak.
Mvolt var byte
'-------------------------------------------------------------------------------
Low PORTB.2		' LCD R/W line low (W), şemada direkt GND ye bağlanabilir.
LCDOut $FE,1	' LCD de CLS yapar
pause 200    ' LCD nin açılması için gerekli süredir.
'------------------------------------------------------------------------------- 

BASLA:
   ADCIN 0,HAM '0 nolu kanaldan Analog değeri oku ve RAW değişkenine aktar.
   
BAK: IF ADCON0.2=1 THEN BAK 'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.
   
   lcdout $FE,1," HAM =",# HAM
   Ham=ham+1 'Hesap kolaylığı açısından Ham değerini bir artırdık
   
'Okunan değer 0-5 volt için 0-1024 olacağından okunacak değer başına volt değeri
' 5/1024 =0,0048828 olacaktır. Sayı çok küçük olduğundan bu değeri 1000 ile 
'çarpmalıyız. Ohalde (Okuma/V)= 4,8828 bu değeri 256 ile çarpar isek 
'4,8875 x 256 = 1250 değerini buluruz. Bu değeri kullanarak 32 bit işlem yapabiliriz.
'1250 değeri (5/1024)*256 değerine karşılık gelmektedir. 
'sonuçta ADC HAM değerini bu sayı ile çarpıp 256'ya bölersek sonucu elde etmiş oluruz.
'ancak sonuç 32 bitlik sınırda olduğundan bu işi 32 bit çarpma ile yapıyoruz ve orta
'baytı aldığımızda ise zaten sayının 256'ya bölünmüş halini aldığımızdan başka bir
'işlem yapmadan sonucu elde etmiş oluruz.

   Volt=(ham */ 1250)/100 'Ham ile 1250 yi 32 bit olarak çarp ve 100'böl
   Mvolt=volt//10

'Burada yeni bir komut veya işlem şekli görüyorsunuz. MOD alma yani (//) kalan bulma
'Bir sayını başka bir sayıya bölünmesinden sonra kalan miktarı bulma işlemine MOD
'alma denir. Örnek W=A//1000 , A'yı 1000'e böl kalanı W değişkenine koy anlamındadır.
'bizde yukarıda Milivolt değerini bulmak için volt (10 ile çarpılmış halini) 10'a 
'bölüp kalanı Mvolt değişkenine yerleştiriyoruz.

   Volt=Volt/10

   LCDOUT $FE,$C0," VOLT=",#VOLT,",",# Mvolt
   PAUSE 500
[b]'buraya istedigin voltaj aralıgında netur bir işlem yaptırmak istiyorsan bir if dongusu 
'olusturup altprograma dallanmak yoluyla istedigini yaptırabilirsin. [/b] 
   GOTO BASLA
 
Teşekkür Ederim bu uygulamayı alıp istediğim şekilde tekrar yazabilir ve geliştirebilirim... :)

Peki bu pic basic dosyasını nasıl compile edebilirim... ?
 

Forum istatistikleri

Konular
130,159
Mesajlar
933,798
Kullanıcılar
453,265
Son üye
34yusuf52
Geri
Üst