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 4DEFINE OSCCAL_1K 1;DEFINE ADC_BITS 10     ;DEFINE ADC_CLOCK 1     ;DEFINE ADC_SAMPLEUS 11 Trisio=%0000001Gpio=%00000000OPTION_REG.7=1ANSEL=%00000000 ADCON0=%00000000cmcon=7sens var wordsymbol Tus=Gpio.0Symbol Led=Gpio.1Symbol Led2=Gpio.2basla:low led low led2 if tus=0 then Bir while tus=0 wendgoto baslaBir:High ledif tus=0 then Ikiwhile tus=0 wend goto bir Iki:high led2if tus=0 then baslawhile tus=0wendgoto 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 4DEFINE OSCCAL_1K 1;DEFINE ADC_BITS 10     ;DEFINE ADC_CLOCK 1     ;DEFINE ADC_SAMPLEUS 11 Trisio=%0000001Gpio=%00000000OPTION_REG.7=1ANSEL=%00000000 ADCON0=%00000000cmcon=7sens var wordsymbol Tus=Gpio.0Symbol Led=Gpio.1Symbol Led2=Gpio.2basla:IF Tus=1 THEN sens=sens+1WHILE Tus=1WENDENDIFIF sens=3 THEN sens=1IF sens=1 THEN HIGH LedLOW Led2ENDIFIF sens=2 THEN LOW LedHIGH Led2ENDIFgoto 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 wendgoto 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 ledif tus=0 then Ikiwhile 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 4DEFINE OSCCAL_1K 1Trisio=%0000001Gpio=%00000000OPTION_REG.7=1ANSEL=%00000000 ADCON0=%00000000cmcon=7sens var wordsymbol Tus=Gpio.0Symbol Led=Gpio.1Symbol Led2=Gpio.2low led low led2basla:if tus=0 then Birgoto baslaBir:High led 'birinciyi yakıp ikinciyi söndürüyoruz ki Bir etiketinde olduğumuzu anlayalım.Low led2while TUS=0:WendPause 100BIR_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 led2Low Ledwhile TUS=0:WendPause 100While tus=0:wendpause 100Iki_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.endifGoto 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