16f877 sİnuse gore ÇİkİŞ yardım (acil)

ezmoce

Üye
Katılım
31 Mar 2008
Mesajlar
22
Puanları
1
Yaş
39
arkadaşlar sinus işaretini doğrultarak pic e veriyorum ve sinuz tepe değerine ulaştığında çikiş elde etmek istiyorum şöyle bi program düşünüdüm fakat bu programda giriş olmadan bile çikiş 1 oluyo hatayı anlayan veya başka onerisi olna varsa ;yardım etmek isteyen olursa minnettar olurum

DEFINE ADC_BITS 8 'ADC 8 BIT
DEFINE ADC_CLOCK 3 'CLOCK KAYNAĞI
DEFINE ADC_SAMPLEUS 50 'ÖRNEKLEME ZAMANI 50uS

TRISA=%00000001 'A PORTUNUN A0 UCU GİRİŞ
TRISB=0 'B PORTU ÇIKIŞ
PORTA=0 'A PORTUNUN İLK DEĞERİ 0
PORTB=0 'B PORTUNUN İLK DEĞERİ 0

ADCON1=%0001000 '8 bit değişken tipi seçtik kullanacağımız değer 8 bit

ADC_DEGER VAR byte
ADC_ESKI VAR byte

BASLA:
ADCIN 0,ADC_DEGER '0 nolu kanaldan Analog değeri oku ve ADC_DEĞER değişkenine aktar.

BAK:IF ADCON0.2=1 THEN BAK
ADC_ESKI=ADC_DEGER

IF ADC_DEGER>=ADC_ESKI THeN BAK
PORTB.0=1


END
 
programda karışıklık var


BASLA:
ADCIN 0,ADC_DEGER '0 nolu kanaldan Analog değeri oku ve ADC_DEĞER değişkenine aktar.

BAK:IF ADCON0.2=1 THEN BAK
ADC_ESKI=ADC_DEGER ;okuduğun değeri adc_eski'ye kaydediyorsun

IF ADC_DEGER>=ADC_ESKI THeN BAK ;burada iki değişken de eşit
PORTB.0=1 ;bu yüzden program buradan devam ediyor


END ;ve bitiyor
 
tyildizak ' Alıntı:
programda karışıklık var


BASLA:
ADCIN 0,ADC_DEGER '0 nolu kanaldan Analog değeri oku ve ADC_DEĞER değişkenine aktar.

BAK:IF ADCON0.2=1 THEN BAK
ADC_ESKI=ADC_DEGER ;okuduğun değeri adc_eski'ye kaydediyorsun

IF ADC_DEGER>=ADC_ESKI THeN BAK ;burada iki değişken de eşit
PORTB.0=1 ;bu yüzden program buradan devam ediyor


END ;ve bitiyor

evet anladım VE O KISMI BOYLE YAPTIM


AA:IF ADCON0.2=1 THEN AA
ADC_ESKI=ADC_DEGER

BAK: ADCIN 0,ADC_DEGER

IF ADC_DEGER>=ADC_ESKI THeN BAK

PORTB.0=1

FAKAT SORUN DEVAM EDİYO



aslında benim yapmak istedim değerleri karşilaştirarak tepe den sonra bi onceki değer o anki değerden küçük olacapğından

yalnız bu aralar kafam çok karişik bi çözümünüz varsa sevinirim
 
İlk aklıma gelen şu oldu:
;___________________________
define adc_bits 8 'adc 8 bit
define adc_clock 3 'clock kaynaĞi
define adc_sampleus 50 'Örnekleme zamani 50us

trisa=%00000001 'a portunun a0 ucu gİrİŞ
trisb=0 'b portu ÇikiŞ
porta=0 'a portunun İlk deĞerİ 0
portb=0 'b portunun İlk deĞerİ 0

adcon1=%0001000 '8 bit değişken tipi seçtik kullanacağımız değer 8 bit
temp var byte
adc_eski var byte
adc_yeni var byte

basla:

gosub olcum
adc_eski=temp
gosub olcum
adc_yeni = temp

if adc_yeni > adc_eski then basla ;sİnÜs hala yÜkselİyor

portb.0=1 ;sİnÜs dÜŞmeye baŞlar baŞlamaz buradan devam eder

;________________________________________________
olcum:
adcin 0, temp ; oku ve temp değişkenine aktar.
return



end
 
tyildizak ' Alıntı:
İlk aklıma gelen şu oldu:
;___________________________
define adc_bits 8 'adc 8 bit
define adc_clock 3 'clock kaynaĞi
define adc_sampleus 50 'Örnekleme zamani 50us

trisa=%00000001 'a portunun a0 ucu gİrİŞ
trisb=0 'b portu ÇikiŞ
porta=0 'a portunun İlk deĞerİ 0
portb=0 'b portunun İlk deĞerİ 0

adcon1=%0001000 '8 bit değişken tipi seçtik kullanacağımız değer 8 bit
temp var byte
adc_eski var byte
adc_yeni var byte

basla:

gosub olcum
adc_eski=temp
gosub olcum
adc_yeni = temp

if adc_yeni > adc_eski then basla ;sİnÜs hala yÜkselİyor

portb.0=1 ;sİnÜs dÜŞmeye baŞlar baŞlamaz buradan devam eder

;________________________________________________
olcum:
adcin 0, temp ; oku ve temp değişkenine aktar.
return



end

YARDIMIN İÇİN TEŞEKKURLER. fakat proteusta denediğim kadarıyla giriş olmadan bile çikiş var:S
 
demek ki sinüs dalgası simülasyonun başında düşüşte, o halde başlangıçta yükselişini beklemek gerekiyor



basla0:

gosub olcum
adc_eski=temp
gosub olcum
adc_yeni = temp

if adc_yeni <= adc_eski then basla0 ;sİnÜs genliği yükselmeye başlayana kadar tekrar et


basla:

gosub olcum
adc_eski=temp
gosub olcum
adc_yeni = temp





if adc_yeni > adc_eski then basla ;sİnÜs hala yÜkselİyor

portb.0=1 ;sİnÜs dÜŞmeye baŞlar baŞlamaz buradan devam eder

;________________________________________________
olcum:
adcin 0, temp ; oku ve temp değişkenine aktar.
return



end
 
Arkadaşım;
PIC ile değeri sürekli değişen bir işareti ölçmeye çalışırsan PIC hata yapabilir. Bunun için bir sample and hold devresi gereklidir. Önce değişken işaretten bir örnekleme yapar ve bu değeri çıkışta sabitlersin. Daha sonra PIC ile değeri ölçersin. Bu iş içinde LF298 entegresini kullanabilirsin.
Ayrıca sinüs işaretinin değeri sabitse PIC ile neden uğraşıyorsun? Bir Comparatör devresi ile de bu işi basitçe halledebilirsin.
Kolay gelsin.
 
1. Genellikle pic değil tasarımcılar hata yapar.
2. Flash adc kullanılan bir sistemde(direct conversion) s&h kullanmak gereksiz diyebilirim.
3. Kesinlikle daha basit biçimde yapılabilir fakat sanırım arkadaş mc kullanmayı öğrenmeye çalışıyor.
 
bkmonr ' Alıntı:
Arkadaşım;
PIC ile değeri sürekli değişen bir işareti ölçmeye çalışırsan PIC hata yapabilir. Bunun için bir sample and hold devresi gereklidir. Önce değişken işaretten bir örnekleme yapar ve bu değeri çıkışta sabitlersin. Daha sonra PIC ile değeri ölçersin. Bu iş içinde LF298 entegresini kullanabilirsin.
Ayrıca sinüs işaretinin değeri sabitse PIC ile neden uğraşıyorsun? Bir Comparatör devresi ile de bu işi basitçe halledebilirsin.
Kolay gelsin.

aslında lf298 i de düşündüm ancak nasıl kullanılacağı hakkında bilgim yok birde girişi değiştirdiğimizde de çalişması gerekli
 
aslında program proteus t çalişiyo fakat asıl devremde ( boardta) giriş olmadan çikiş verio

"BAK:IF ADCON0.2=1 THEN BAK" bu satırın giriş yokken çikiş olmamsını sağlaması gerekmezmi
 

Forum istatistikleri

Konular
127,956
Mesajlar
913,896
Kullanıcılar
449,606
Son üye
rasit.

Yeni konular

Geri
Üst