Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: mesmert - 10 Nisan 2007, 15:04:32

Başlık: 10 BIT ADC IKILI SAYIDA GOSTERME?
Gönderen: mesmert - 10 Nisan 2007, 15:04:32
Slm arkadaşlar PIC16F877 okuduğum ADC bilgisini iki digit te göstermek istiyorum bunun mantığı nedir veya ellinde örnek kod olan varmı?
Başlık: 10 BIT ADC IKILI SAYIDA GOSTERME?
Gönderen: arslan74 - 10 Nisan 2007, 15:57:25
Merhaba,

10bit ADC sayisını 2 dijite gösteremessin. Cünkü 10 bit onluk tabanda 1024'e tekabül eder. Oda 4 dijitlik bir sayidir. Yanlız son iki dijitlik sayıyı göstermez isen ancak öyle olur.

Bunu göstermek cok basit.

Önce ADC girişinden okuma yaparsın. Okuduğun değeri okuyub bir registerde saklarsın. 10 bit olduğu için 8 bit lik registerde saklanamiyor. O yüzden iki ayrı registerde saklaniyor. Bu değeri onluk tabanına cevirib nasıl bir ekran kullaniyorsan ona göre bir yazılımla ekrana iletmelisin.

ADC okumasıyla örnek kod:



;*****************************************************
; ADC Değeri oku
; Sonucları F1,f0 regifterine ata.
ADC
BSF ADCON0,GO ; ADC start.
ADCloop
BTFSC ADCON0,GO ; okuma bitti mi?
GOTO ADCloop ; Hayir bitmedi, tekrar bekle.
movfw ADRESH ; üst  2 Bit oku.
movwf f1 ; üst  2-Bit  f1 registerine ata.
bsf STATUS,RP0 ; Bank1
movfw ADRESL ; alt 8 Bit oku.
bcf STATUS,RP0 ; Bank0
movwf f0 ; alt 8-Bit f0 resiterine ata.
return



Sonra bu sayı 10luk tabanına cevirmek için. örnek kod veriyorum.


;*****************************************************
; Dönüşüm değeri 10000 den kücük olmalı.
; Binary sayılar f1,f0 saklı.
; Onluk sayılar  ST (binler), SH (yüzler),
; SZ (onlar) und SE (birler) registerinde BCD olarak saklanır.

B2D
; Binlik testi 1000d = 0x03E8
movlw 0x03
movwf xw1
movlw 0xE8
movwf xw0
call B2Da
movwf ST
; Yüzlük testi 100d = 0x0064
clrf xw1
movlw 0x64
movwf xw0
call B2Da
movwf SH
; Onluk testi 10d = 0x000A
clrf xw1
movlw 0x0A
movwf xw0
call B2Da
movwf SZ
movfw f0
movwf SE
return

B2Da
clrf counter
B2Sb
incf counter, f ; Kac kere cağrıldı?
call Sub16 ; f:=f-xw
btfss STATUS, C ; Cok fazla cağrıldı?
goto B2Sb ; Hayır: tekrar dene.
call Add16 ; f:=f+xw
decf counter, w ; Cünkü her zaman bit tane fazla sayıldığı için
return

Başlık: 10 BIT ADC IKILI SAYIDA GOSTERME?
Gönderen: mesmert - 10 Nisan 2007, 22:06:14
Arslan_74 verdiğin bilgi icin sağol benim asıl sorunum iki ayrı sıcaklık ölçmemdi ve yan yana iki adet LM 35 bağladım ama okunan değerler arasında yaklaşık 5 derece gibi bir fark var ben yaptığım ADC bölümünden şüpelenmiştim onun için sordum

2-) Lm35 birini ısıttığım zaman gayet güzel bir şekilde sıcaklık lcd ekranda yükseliyor ama ikincisini ısıttığımda ise lcd ekran 25 derece sonra sapıtıyor . Aşağı yaptığım kodları koyuyorum


MOVLW B'01000001' ;RA0 1TH READ TEMPATURE
MOVWF ADCON0
BSF ADCON0,GO
BCF PIR1,ADIF
BTFSS PIR1,ADIF
GOTO $-1
MOVF ADRESH,0
MOVWF LM1_35
               return

MOVLW B'01001001';RA1 2TH READ TEMPATURE
MOVWF ADCON0
BSF ADCON0,GO
BCF PIR1,ADIF
BTFSS PIR1,ADIF
GOTO $-1
MOVF ADRESH,0
MOVWF LM2_35
               return
Başlık: 10 BIT ADC IKILI SAYIDA GOSTERME?
Gönderen: arslan74 - 11 Nisan 2007, 06:56:18
Merhaba,

Kanallar arasında geçişte araya bekleme süresi koymalısın. Aksi takdirde kanalı değiştirdikten sonra bekleme süresi koymassan, ölçmeleri düzgün yapamaz..

Selamlar.
Başlık: 10 BIT ADC IKILI SAYIDA GOSTERME?
Gönderen: mesmert - 11 Nisan 2007, 12:41:35
Merhaba,

Arslan hocam ilgin için sağol benim kendi yaptığım hatadan dolayı yanlış değer okuyormuşum. Port'un birini giriş diğerini çıkış yapmışım port ayarlarını düzeltim sorun çözüldü. Program yazarken eski yazdığım softwarelerden copy paste yaptığımdan bu tür  hatalar devamlı  gözden kaçıyor.