12f675 ile ilgili bir problem

Başlatan muyat, 09 Aralık 2014, 11:57:42

muyat

Şu şekilde yaptıgım programda program "ASAGIIN" etiketine atladıktan sonra RL2 ismini verdigim GPIO.1 pininden çıkış alamiyorum.Geri kalan herşey normal ama kart üzerinde bu RL2 rölesi çekmiyor bi türlü.Devreyi kontrol ettim yollar saglam .Sorun ne olabilir?
Sigorta ayarlarından mı acaba?Yardımcı olur musunuz?

@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON &_MCLRE_OFF & _CP_ON
ANSEL=0
CMCON = 0         
ANSEL = %0010100         
trisio = %000011100
CMCON = 7
VRCON.7 = 0       ' Turn Off Voltage Reference


DEFINE OSC 4
DEFINE OSCCAL_1K 1

RL1 VAR GPIO.0
RL2 VAR GPIO.1
RL3 VAR GPIO.5

POTB VAR GPIO.2
GIRIS VAR GPIO.3
POTA VAR GPIO.4


C VAR WORD
BAY VAR word
DEGER VAR BYTE
SURE VAR BYTE
I VAR BYTE
GPIO=0

PAUSE 500

CLEAR




BAS:
IF GIRIS=0 THEN
PAUSE 1000
IF GIRIS=1 THEN GOTO DEVAM

GOTO ASAGIIN

DEVAM:

ENDIF

PAUSE 50

GOTO BAS



ASAGIIN:

GOSUB POTOKU

RL1=0
RL3=1
PAUSE 200
RL2=1

PAUSE DEGER*19
RL2=0
RL1=0

BEKLE:
FOR c=0 to 7000
IF GIRIS=0 THEN BEKLE
PAUSE 1
NEXT
IF GIRIS=1 THEN GOTO YUKARICIK
GOTO BEKLE


YUKARICIK:

GOSUB POTOKU2
RL2=0
RL3=1
PAUSE 200
RL1=1

PAUSE bay
RL2=0
RL1=0
PAUSE 200
RL3=0
GOTO BAS


POTOKU:
ADCIN 4,DEGER
bay=deger*19
RETURN

POTOKU2:
ADCIN 2,DEGER
bay=deger*19
RETURN

END

Hattuşa

trisio = %000011100

burdaki tris girişleriniz 9 adet sanırım bundan kaynaklı

İlyas KAYA

#2
Alamamanız gayet normal çünkü pause DEGER*19 demişsiniz sonra low'a çekmişsiniz.

DEGER=0 olduğuna göre 0*19= sıfırdır yani hiç beklemeden direk portu kapatır.

clear komutundan sonra DEGER değişkenine bir değer atamalısınız.


Edit: Ben gosub ' ı görmemişim..
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

MS_59

#3
benim gördülerim bu işlemcide 4 adet adc pini var bunlar AN0,AN1,AN2 ve AN3
sen ise pot oku etiketinde ADC 4 demişsin
ADC pinlerini ADCON0 registeri ayarlar bunu ayarlamamışsın
birde adc için define tanımlamaları eksik

DEFINE ADC_BITS 10    ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 3    ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 10 ' ADC sampling time (uSec)
mehmet

muyat

#4
Arkadaşlar problemi çözdüm.

ANSEL = %0010100    yerine ANSEL = %0001100   yazdım.Bu birinci hatam idi
2.hata ise buna baglı olarak. POTOKU etiketindeki ADCIN 4,DEGER yerine ADCIN 3,DEGER yazmam gerekliymiş.Onu farkettim.
Son olarak ise sigorta ayarlarını aşagıdaki gibi yaptım.
DEFINE  ADC tanımlamalarını yapmadan da potla ayarlanabilir süre ayarı bu şekılde yapabiliyorum.Program kartta problemsiz çalışıyor.
Fakat asıl  ama asıl ögrenmek istedigim şey DEFINE ADC tanımlamaları yapılmadan bu şekılde potla istedigimiz çıkışı nasıl alabiliyoruz.Çünkü bu yöntemi bana bir arkadaşım ögretmişti.Ete hocam umarım mantıklı açıklamasını yapcaktır.


@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON &_MCLRE_OFF & _CP_ON
ANSEL=0
CMCON = 0          ' Sets Digital Mode
ANSEL = %0001100         
TRISIO = %011100
VRCON.7 = 0       ' Turn Off Voltage Reference
WPU = %110000       ' Any Pin PullUp  1 Pull 0 Disable Pin  '%110000
OPTION_REG.7=0

DEFINE OSC 4
DEFINE OSCCAL_1K 1

RL1 VAR GPIO.0
RL2 VAR GPIO.1
RL3 VAR GPIO.5

POTB VAR GPIO.2
GIRIS VAR GPIO.3
POTA VAR GPIO.4

C VAR WORD
BAY VAR word

DEGER VAR BYTE
SURE VAR BYTE
I VAR BYTE
GPIO=0
PAUSE 500
CLEAR
BAS:
IF GIRIS=0 THEN
PAUSE 1000
IF GIRIS=1 THEN GOTO DEVAM
GOTO ASAGIIN
DEVAM:
ENDIF
PAUSE 50
GOTO BAS

ASAGIIN:
GOSUB POTOKU2

RL1=0
RL3=1
PAUSE 200
RL2=1

PAUSE BAY
RL2=0
RL1=0

BEKLE:
FOR c=0 to 7000
IF GIRIS=0 THEN BEKLE
PAUSE 1
NEXT
IF GIRIS=1 THEN GOTO YUKARICIK
GOTO BEKLE


YUKARICIK:

GOSUB POTOKU
RL2=0
RL3=1
PAUSE 200
RL1=1

PAUSE bay
RL2=0
RL1=0
PAUSE 200
RL3=0
GOTO BAS


POTOKU:
ADCIN 3,DEGER
bay=deger*19
RETURN

POTOKU2:
ADCIN 2,DEGER
BAY=deger*19
RETURN

END


ete

12F675 de analog girişleri için define ayarlaı yalnızca kaç bitlik okuma yapacağını belirliyor. Sen ise bu ayarı vermeyerek default değer olan 8 bitlik değeri seçmiş oluyorsun. Bu yüzden okunan maksimum değer 255 olabiliyor ve sende onu 19 ile çarparak yaklaşık 4845 ms lik bir gecikme yaratmış oluyorsun. Başka bir şey değil. Bu seçenekle 2550*19=4845 ms den daha büyük gecikme elde edemezsin. Elbette 19 değerini değiştirerek sayıyı büyütebilirsin.

Asıl önemli ADC organizasyonunu ANSEL registeri yapmakta olduğundan define komutlarına pek fazla iş kalmıyor.
Ama yinede doğrusu bu komutların verilmesidir. Böylece OSC frekansına göre min okuma süresi programa bildirilmiş olur.
Bu şekilde o sürelerin doğru olduğundan emin değilim.
DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 11 ' ADC sampling time (uSec)
şeklndeki 3 adet komut satırınan birincisi kaç bit çalıştığını belirliyor.
İkincisi ADC ölçümünde kullanılacak CLK kaynağını belirliyor. BU kaynak yine çalışma frekansına bağlı olarak belirlenmesi gerekiyor.
Üçüncüsüde ADC örnekleme zamanı için gereken süreyi belirliyor. Buda çalışma frekansına bağlı olarak belirlenmesi gereken bir parametre. Bunları vermez isen default değer neyse onu kullanır sistem. Ama doğru olup olmadığı garanti olmaz.
Bu parametreleri en güzel PicMultiCalc isimli program kullanarak belirleyebilirsin. Pic ile çalııyorsanbu programı mutlaka kullanmakta fayda var zira bir çok yardımcı fonksiyonu mevcut. Kurulum gerektirmeyen basit bir exe şeklinde program ve her türlü bilgiyide veriyor.

Ete

Powered by EzPortal