pic16f877 ile 2 kanaldan ADC okuma ACİL!!!

Başlatan maamed, 12 Aralık 2011, 09:11:03

maamed

iyi günler arkadaşlar
pic16f877'de RA0, RA1'deki analog değerler düzenli olarak okunacak,8 bit çözünürlükte sayısal değere dönüştürülecek ve saklanacak seçilen 4 butondan her hangi birine basılmasıyla, o butona karşılık gelen değerin RA0,RA1 ve RA3'ün okunup  AN0,AN1, AN3'te saklanan değerleri yine 8-bit olarak lcd ekranda göstermem lazım Butona her yeni basışta o butona karşılık gelen ölçüm değerinin en güncel hali lcd de gösterilecek butonlardan birine yeni bir defa daha basılana kadar da kalacak bu işi nasıl hallederim ben adc den verilen voltajı lcd ekranda gösterme işini kavradım programı  da pic basic de yazabiliyorum fakat burda ne demek istediğini anlamadım ben o butonları adc ye mi bağlayacağım öle lcd de göstereceğim yoksa başka türlü mü kafam çok karışık lütfen anlayan varsa yardım etsin
şimdiden teşekkür ederim

saygılarımla

JKramer

Adc ile değeri ekranda gösteriyorsanız işiniz hemen hemen bitmiş demektir. Her okuduğunuz kanalı farklı bir değişkene atacaksınız, ilgili butona basıldığında da, o butona ait değeri ekrana yazacaksınız.

Butonları da analog kanallara fiziksel olarak bağlamayacaksınız; analog kanallar ayrı, butonları bağladığınız pin'ler farklı olacak. Adc işiniz hallettim demişsiniz; isterseniz öncelikle sadece butonların olduğu yeni bir program yazın, bir butona basınca bir değişkenin değeri artsın, diğer bir butona bastığınızda azalsın. Sonra da bu değişkeni ekrana yazdırın.

maamed

[img][img]**************************************
@ 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=%10000101

TRISA=%0001011
TRISB=0
TRISC=%11110000   
TRISD=%00000000     
portc=0:portd=0      'PORTC ve PORTD yi 0 yap

      Low PORTB.2 ' LCD R/W line  Low (W), şemada direkt GND ye bağlanabilir.
      Pause 300

LCDOut $FE,1  ' LCD de CLS  yapar


SW1  var byte
SW2  var byte
SW3  var byte
SW4  var byte
VOLT var word
Mvolt var byte
HAM var word

gosup degisken0

anadongu:
'*******  1.satır taraması ******
portc=%11111110

if portc.4=0 then SW1=1

'*******  2.satır taraması ******
portc=%11111101

if portc.5=0 then SW2=1

'*******  3.satır taraması ******
portc=%11111011

if portc.6=0 then SW3=1

'*******  4.satır taraması ******
portc=%11110111

if portc.7=0 then SW4=1
gosub lcdgoster
gosub degisken0

goto BASLA

BASLA:

ADCIN 0,HAM

BAK:   IF ADCON0.2=1  THEN BAK 'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.
Ham=ham+1 'Hesap kolaylığı açısından Ham değerini bir artırdık

Volt=(ham */ 1250)/100 'Ham ile 1250 yi 32 bit olarak çarp ve 100′böl
Mvolt=Volt // 10        'Mvolt= Volt   MOD  10
Volt=Volt/10
PAUSE 500
gosub lcdgoster

goto anadongu

degisken0:
SW1=0:SW2=0:SW3=0:SW4=0

return

lcdgoster:
if SW1=1 then lcdout $FE,2,"kirmizi led....":portd.0=1   
if SW2=1 then lcdout $FE,2,"sari led.......":portd.1=1   
if SW3=1 then lcdout $FE,2,"yesil led......":portd.2=1   
if SW4=1 then lcdout $FE,2,"role...........":portd.3=1 
lcdout $FE,$C0,"VOLT=",#VOLT,",",# Mvolt"

return

end
****************************
öncelikle ilgin için teşekkür ederim ben ekranda yazdırma işlemini hallettiğimi sanıyordum fakat bu yazdıgım program işe yaramadı compile edince hatalar verdi.öncelikle yapacağım işi anlatayım her bir butona bastığımda ilgili olan bir led yanacak veya role atacak ve bu da lcd ekranın 1. satırında "mesela hangi led yanıyor?" gibisinden yazdırılacak aynı zamanda lcd nin 2. satırında butona bastıgımız zaman adc den okunan değer yazdırılacak örneğin volt:... şeklinde yazdırılacak.ben bu işi bir türlü beceremedim  pic basic dilini çok iyi bilmiyorum 2 günden beri çalışıyorum fakat gördümki pek bir yol kat edememişim bu işi nasıl yaparım bu işi yapacak olan program nasıl olur veya benim yazdıgım program dogru mu bir kac eksiklik mi var yardım ederseniz sevinirim proteus görüntüsünü ekte gönderiyorum devrenin
şimdiden teşekkür ederim saygılarımla....
http://imageshack.us/photo/my-images/15/adszefog.png/

maamed

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      5 'LCD  Enable Bacağı Hangi bite bağlı ?
define LCD RWREG         PORTB  'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT          6  'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG   PORTB 'LCD  RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT   4 '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

hatalarımdan biri bu programın bir kısmını başka kaynaklardan kopyaladığım için  bu kısım da değişiklik yapmayı unutmusum şimdi düzelttim fakat bu kısmın compile işlemini etkilememesi lazım pic e programı attıgımda sorun cıkarması lazım

maamed

yanıt gelene kadar biraz daha geliştirip programı ve devreyi şu hale getirdim fakat proteusta simule edince devre çalışmıyor arkadaşlar bilir kişiler bir ilgilenin lütfen


@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 2
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50

DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50

TRISA=%00000011
TRISB=%00000000
TRISC=%00001111
TRISD=%00000000

LOW PORTB.2

ADCON1=%10000101

PORTD=0

lcdout $FE,1
PAUSE 500

ADC1_DEGERI var word
ADC2_DEGERI var word
GERILIM1 var word
GERILIM2 var word

anadongu:

IF PORTC.0=0 THEN PORTD.0=1
IF PORTC.1=0 THEN PORTD.1=1
IF PORTC.2=0 THEN PORTD.2=1
IF PORTC.3=0 THEN PORTD.3=1

gosub lcdgoster
gosub adc_oku

GOTO anadongu

lcdgoster:
if portd.0=1 then lcdout $FE,2,"kirmizi led....."
if portd.1=1 then lcdout $FE,2,"sari led........"
if portd.2=1 then lcdout $FE,2,"yesil led......."
if portd.3=1 then lcdout $FE,2,"role atiyor....."

return

adc_oku:
ADCIN 0,ADC1_DEGERI
GERILIM1=ADC1_DEGERI*48/10
LCDOUT $FE,$C0,"ADC1:",#GERILIM1

ADCIN 1,ADC2_DEGERI
GERILIM2=ADC2_DEGERI*48/10
LCDOUT $FE,$C4,"ADC2:",#GERILIM2
pause 250

return

end


proteus çizimi: http://img543.imageshack.us/img543/4161/adszwf.png

Maxim

buraya proteus devresinin resmini değil kendisini koyman lazımki insanlar deneme yapsın
kimse oturup senin şemanı baştan çizmez yoksa

Pir-O

Öncelikle mikrodenetleyici ile o şekilde button okuyamazsın butonların her bir ucuna direnç bağlaman gerekir. Devreyi oturdum baştan çizdim programını da yazdım fakat ben Proton+ ile yazdım PIC Basic ile istiyorsan aynı program üzerinde biraz oynaman gerekiyor o kadar sadece değişkenleri tanımlama ve gecikmede farklı komutlar kullanılmış onları değiştirirsen bire bir çalışır. Kolay gelsin.

https://rapidshare.com/files/2645455625/LCD_ROLE.rar

Maxim

@Pir-O
butonlarda pull-up dirençleri var şemada?

Pir-O

Alıntı yapılan: Maxim - 13 Aralık 2011, 09:46:04
butonlarda pull-up dirençleri var şemada?

Ben üstteki mesajdaki şemaya bakmıştım onda yoktu evet alttaki mesajdaki şemada var :)