Led sorunu 12f675

Başlatan okan1234, 29 Mayıs 2016, 21:47:05

okan1234

Iyi Aksamlar degerli arkadaslar.
12f675 ile bir program yazdim soyle.
Soyle Tusa bastigimda diger etikete cekecek led yanacak bir daha bastigimda ikinci led yanacak.
Bir turlu olmuyor ledler yanib sonuyor sacmaliyor. Kod asagida acaba nerede yalnis yapiyorum?

@ DEVICE pic12F675                      'islemci                               
@ DEVICE pic12F675, WDT_off             'Watch Dog timer ac?k
@ DEVICE pic12F675, PWRT_ON             'Power on timer ac?k
@ DEVICE pic12F675, PROTECT_OFF         'Kod koruma kapal?
@ DEVICE pic12F675, MCLR_off            'MCLR pini kullan?lMIYOR.
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT  'Dahili osilator kullan?lacak 

DEFINE OSC 4
DEFINE OSCCAL_1K 1
;DEFINE ADC_BITS 10     
;DEFINE ADC_CLOCK 1     
;DEFINE ADC_SAMPLEUS 11

Trisio=%0000001
Gpio=%00000000

OPTION_REG.7=1

ANSEL=%00000000
ADCON0=%00000000
cmcon=7

sens var word

symbol Tus=Gpio.0
Symbol Led=Gpio.1
Symbol Led2=Gpio.2



basla:
low led
low led2
if tus=0 then Bir
while tus=0
wend
goto basla

Bir:
High led
if tus=0 then Iki
while tus=0
wend
goto bir

Iki:
high led2
if tus=0 then basla
while tus=0
wend
goto iki


end
       

karacan451

@ DEVICE pic12F675                      'islemci                               
@ DEVICE pic12F675, WDT_off             'Watch Dog timer ac?k
@ DEVICE pic12F675, PWRT_ON             'Power on timer ac?k
@ DEVICE pic12F675, PROTECT_OFF         'Kod koruma kapal?
@ DEVICE pic12F675, MCLR_off            'MCLR pini kullan?lMIYOR.
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT  'Dahili osilator kullan?lacak 

DEFINE OSC 4
DEFINE OSCCAL_1K 1
;DEFINE ADC_BITS 10     
;DEFINE ADC_CLOCK 1     
;DEFINE ADC_SAMPLEUS 11

Trisio=%0000001
Gpio=%00000000

OPTION_REG.7=1

ANSEL=%00000000
ADCON0=%00000000
cmcon=7

sens var word

symbol Tus=Gpio.0
Symbol Led=Gpio.1
Symbol Led2=Gpio.2




basla:

IF Tus=1 THEN
sens=sens+1
WHILE Tus=1
WEND
ENDIF

IF sens=3 THEN sens=1

IF sens=1 THEN
HIGH Led
LOW Led2
ENDIF

IF sens=2 THEN
LOW Led
HIGH Led2
ENDIF

goto basla
end
       


Bu kodu dene

okan1234

Hocam tamamda peki neden etiketle caliemiyor onu merak ediyorum?

ete

Sebebi çok basit ama sen göremiyorsun.
Açıklayayım.
basla:
low led
low led2
if tus=0 then Bir
while tus=0
wend
goto basla

Komut dizisinde ilk defa TUS a bastığın zaman program anında BIR etiketine gidiyor. Gönderen "If tus=0 then Bir " komut satırı. O satırın altındaki While tus=0:wend satırlarına program hiç bir zaman ulaşamaz bunu göz ardı etmişsin. Zira daima Bir etiketine gider sonrasında orada ne oluyor ona bakalım.
Program Bir etiketine geldi sen hala tusa basılı tutuyorsun. Bunu unutma program senden daima çok hemde pek çok hızlı.
High led
if tus=0 then Iki
while tus=0
wend
goto bir

Hala tus a basılı tuttuğun için rogram bu seferde "If tus=0 then Iki" isimli komut satırının yönlendirmesi nedeni ile Ikı etiketine anında atılıyor. Sen hala tusa basılı tutuyorsun!!!!!.
Iki etiketinde ise "if tus=0 then basla" komut satırı nedeni ile program Basla etiketine atlıyor. Sen hala tusa basılı tutuyorsun.
Bu durumda program Önce Bir sonra Ikı sonra Basla etiketleri arasında dolaşıp duruyor. Bu arada tuşu bıraktığın anda program neredeyse oradaki ledi yakıyor tamamen tesadüflere kalmış bir durum bu anlayacağın.
Peki ne yapılması gerekiyor. Her şeyden önemlisi tuşa bastıktan sonra programı bir yere gönderiyor isen orada öncelikle tuşun bırakılmasını kontrol etmen gerekir. Bunuda orada hangi led yakılacak ise önce onu yakıp sonra bırakılıp bırakılmadığını kontrol edersen görsel olarak oraya gittiğini ve artık tuşu bırakman gerektiğini anlarsın. Örnekle açıklamak gerekirse Programını aşağıdaki şekilde değiştirelim bakalım ne olacak?
@ DEVICE pic12F675                      'islemci                               
@ DEVICE pic12F675, WDT_off             'Watch Dog timer ac?k
@ DEVICE pic12F675, PWRT_ON             'Power on timer ac?k
@ DEVICE pic12F675, PROTECT_OFF         'Kod koruma kapal?
@ DEVICE pic12F675, MCLR_off            'MCLR pini kullan?lMIYOR.
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT  'Dahili osilator kullan?lacak 

DEFINE OSC 4
DEFINE OSCCAL_1K 1

Trisio=%0000001
Gpio=%00000000

OPTION_REG.7=1

ANSEL=%00000000
ADCON0=%00000000
cmcon=7

sens var word

symbol Tus=Gpio.0
Symbol Led=Gpio.1
Symbol Led2=Gpio.2

low led
low led2

basla:
if tus=0 then Bir
goto basla

Bir:
High led 'birinciyi yakıp ikinciyi söndürüyoruz ki Bir etiketinde olduğumuzu anlayalım.
Low led2
while TUS=0:Wend
Pause 100
BIR_BIR:  'buraya gelince tuş bırakılmış oldu bırakılmadan buraya gelemez zaten.
if tus=0 then Iki    'şimdi yeniden tuşa basılmışmı kontrol edebilirsin.
goto bir_Bir          'basılmamış ise tekrar bakmak üzere etikete git.

Iki:
high led2
Low Led
while TUS=0:Wend
Pause 100
While tus=0:wend
pause 100
Iki_bir:
if tus=0 then
  Low led:low Led2 'önce iki ledi de söndürüyoruz ki Basla etiketine gidildiği anlaşılsın.
  while Tus=0:wend 'gitmeden önce tuşu bıraktığımızdan emin oluyoruz
  pause 100        'tuş titremesini önlemek için biraz gecikme koyuyoruz
  Goto basla       'sonra Basla etiketine gidiyoruz.
endif
Goto Iki_iki
end

Dene bakalım kusursuz çalıştığını göreceksin!!!.

Ete

okan1234

Hocam cok cok tesekkur ederim :) simdi anlasildi

ete

Umarım anlaşılmıştır. Burada senin yazdığın ile benim yazdığım aslında program yaarken mantık kullanımına çok güzel iki örnektir. Yeni öğrenen arkadaşların her iki programı dikkatlice incelemeleri ve açıklamalara bakarak nasıl mantık çalıştırııyor anlamaları gerekir. Bir program yazma işleminde mutlaka işi mantıkçerçevesinde incelemeniz gerekir. İnceleme adım adım yapılmalıdır benim yaptığım gibi. Bu şekilde bir düşünce mantığı geliştirirseniz programlarınız kusursuz çalışır.

Ete

Powered by EzPortal