PIC BASIC PRO Öğreniyoruz soru cevapları

Başlatan aster, 19 Mayıs 2005, 17:33:33

F.T

reccom madem  ete hocanın çözemediğini anlayacak kadar zeki olduğuna eminsin  bu soruyu neden sordunki  ?
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

reccom

Sorunu çözemediğimden dolayı burda çözüm bulmak için yazıyorum, ete isimli kullanıcının ve diğer bir üyenin önerilerinin yazdığım programda çözüm olmadıklarını belirtmiştim ve ikisindende birdaha öneri gelmeyince onlarında bir çözüm bulamadıklarını düşündüm(bulamadılar demedim )  ama tabi düşük bir ihtimalde olsa mesajları görmemişlerde olabilir. Eğer senin bir çözümün vardıysa, yazdıklarına ekleseydin çok memnun olurdum , bundan sonraki mesajlarına eklersende memnun olurum, niyetim burda kimseyi kırmak yada kötülemek değildir, sorunuma çözüm aramaktır. Senden ricam varsa bir önerin söylemen, birde zeka gibi bir olguyu basit cümleler içinde kullanmaman zira sana bişey kazandırmaz.

Soruna çözüm bulmaya çalışan kullanıcılara tekrardan teşekkür ederim.
mail gungor.h@hotmail.com daha fazla devre ve uygulama için resme tıkla [/url]

DİRİLİŞ_MAK

4511 ile display kontrolüne bakıyorum aklıma takılan bir nokta var arkadaşlar. Örnek programın kafama takılan kısmı üzerinden gideyim.  İki display ve iki 4511 var B portunun ilk dört biti 4511'lere bağlanmış sonraki iki biti ise LE uçlarına bağlanmış, kod kısmı ise şöyle
...
birler=sayi DIG 0
onlar=sayi DIG 1

PORTB=sayi1 | %11110000
LOW PORTB.5
PAUSE 1
HIGH PORTB.5
PAUSE 1
....
şeklinde devam ediyor. Burada bit or'lama işleminde neden 4,5,6,7. bitlerin tamamını 1 yapıyoruz? Benim kullandığım LE bitleri sadece 4 ve 5. bitler. Displayde mutlaka bağladığımız portun son dördü high mı olmalı her zaman? Bu kısmı detaylıca anlatabilir misiniz?

ete

O örnek programın orjinali 4 digit lik idi. senin kullandığn ise 2 digitlik. Bu nedenle yalnızca 4 ve 5 nolu bitleri HIGH da tutabilirsin.

Aynı işi ;
PORTB=(PORTB % %00110000)+BIRLER şeklinde de yaptırabilirsin. Burada temel amaç Bit7-Bit4 aralığını aynen kopyalamak buna Bit0-Bit3 aralığını eklemek hepsi bu. Sen kullanırken yine PORTB=(PORTB & %00110000)+BIRLER şeklinde de kullanabilirsin.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

DİRİLİŞ_MAK

Alıntı yapılan: ete - 30 Ekim 2016, 21:59:09
O örnek programın orjinali 4 digit lik idi. senin kullandığn ise 2 digitlik. Bu nedenle yalnızca 4 ve 5 nolu bitleri HIGH da tutabilirsin.

Aynı işi ;
PORTB=(PORTB % %00110000)+BIRLER şeklinde de yaptırabilirsin. Burada temel amaç Bit7-Bit4 aralığını aynen kopyalamak buna Bit0-Bit3 aralığını eklemek hepsi bu. Sen kullanırken yine PORTB=(PORTB & %00110000)+BIRLER şeklinde de kullanabilirsin.

Ete



Anladım hocam, teşekkürler ederim. O zaman diyelim ki 8 tane tekli Display kullanacağız. B portunun ilk dört biti 4511 ile displaylere diğer dört bit LE ucuna ve açıktan kalan diğer dört display içinde A, C gibi bir herhangi bir porttan LE tetiklemesi alıyor. Böyle bir işlem gerçekleştirilebilir mi? Farklılık varsa yazmamız gereken kod ne olur?

ete

8 adet tekli display söylediğin şekilde sürülür. 4 tane LE ucu B portundan diğer 4 taneside diğer çıkış olabilecek pinlerden sürülebilir.
Yazılacak kod çok farklı olmayacak. Her bir digit e ait LE ucuna yeri geldiğinde pals uygulanacak. Genel uygulama şöyle oluyor. 4511 lerin ABCD girişlerini birleştiriyoruz. Hangi digite bilgi yazılacak ise Bilgi ABCD girişlerine veriliyor ve ardından hangi digite gidecek ise ona ait LE ucuna puls uyguluuyoruz. Böylece yollanan bilgiden diğer digitler etkilenmemiş oluyorlar.
Bana kalırsa 74HC595 shift registeride incele. Bezer işleri onunlada yapabilirsin.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mr.Thinking

if gelenbilgi=gidenbilgi then
gosub falan
else
gosub hata
endif

Anladiginiz uzere yukaridaki sorgulamada programa, bilgiler esit se falana degilse hata etiketine git gidiyor.

Bunu matematikte kullandigimiz esitdegilse isareti gibi bir isaret kullanarak
sadece
If gelenbilgi=/gidenbilgi then
gosub hata seklinde yapabilecegimiz bir yol varmi. Cunku ben falan etiketine gitmesini degil sadece hata ekranina gitmesini istiyorum.

ilyas KAYA

Alıntı yapılan: elektro77 - 12 Eylül 2019, 08:36:59if gelenbilgi=gidenbilgi then
gosub falan
else
gosub hata
endif

Anladiginiz uzere yukaridaki sorgulamada programa, bilgiler esit se falana degilse hata etiketine git gidiyor.

Bunu matematikte kullandigimiz esitdegilse isareti gibi bir isaret kullanarak
sadece
If gelenbilgi=/gidenbilgi then
gosub hata seklinde yapabilecegimiz bir yol varmi. Cunku ben falan etiketine gitmesini degil sadece hata ekranina gitmesini istiyorum.

If gelenbilgi<>gidenbilgi then
Yaparsanız eşit değilse olur.

MC_Skywalker


temha

hayırlı geceler
read 0, sira
pause 10
TOGGLE Sira
pause 10
WRITE 0, sira



if sira = 0 then
goto sifir
else
goto bir
endif

sifir:
HIGH GPIO.0
pause 10000
HIGH GPIO.1
GOTO Sifir

bir:
HIGH GPIO.1
pause 10000
HIGH GPIO.0
GOTO bir
end
bu programda sira bit değikenini eproma yazıp
enerji her kesildiğinde çıkışlerı toggle yapmak yani gpıo bir öncekinde 0 sa 1 yapmak 0 sa bir ve 10 saniye bekleyip diğer çıkışı da 1 yapmak her seferinde  GPIO 0 İle baslıyor. her enerji kesildiğinde, toogle yapmıyor

mehmet

#445
Mcunun, enerjinin kesildiğini anlayıp dallanacağı bir kod yazmalısınız.
PB0(INT), PB4-7 pinlerinden birini kullanabilirsiniz bunun için.

Hep aynı zamanda, aynı kod çalışırsa; oluşan değerler aynı olacaktır.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

ete

Programın yalnızca bir parçasını görerek bütün programın işleyişi konusunda hüküm vermek gerçekten zor bir iş. Program bir bütündür. İşlemci seçimi, Sigorta ayarları , tanımlamalar (değişkenler) , açılış ve asıl kod gibi parçalardan oluşur.
Toggle komut bit değişkenleri için kullanılan bir komut. Eprom ise 8 bitlik bilgiyi kayıt eder ve okunan değer de 8 bitliktir. Bu nedenle yazdığınız kod çok yanlış olmasa da usulüne uygun değil.
Bunun haricinde yazılan kod mantığında da bazı kusurlar var. Sırası ile açıklayayım.
Program bir şekilde SIFIR yada BIR isimli alt programlara gelir ise bir daha geldiği yerden çıkamıyor.
Örnek olarak SIFIR etiketli alt programa bakalım.
sifir:
HIGH GPIO.0
pause 10000
HIGH GPIO.1
GOTO Sifir

Program sıfır etiketine gelince ilk iş olarak GPIO.0 pinini HIGH yapıyor. 10 sn bekliyor ve bu seferde GPIO.1 pini HIGH yapıyor. Ardından GOTO SIFIR komutunu görerek tekrar SIFIR isimli etikete geliyor. Bir nevi programı bu konumda hapsetmiş oluyorsunuz. Üstelik bu işlemin bir sonucunu da göremezsiniz sürekli aynı şeyi yapıyor çünki.
Benzer şekilde BIR etiketine gider ise aynı program bu seferde orada hapsetmiş oluyorsunuz programı ve bir daha herhangi bir sonuç almanız yada görmeniz mümkün olmuyor.

Diğer bir olumsuz mantık ise gerek sıfır ve gerekse Bir isimli alt programlarda farklı bir işlem yapılmıyor olmasıdır. Daha açık anlatmak gerekir ise, diyelimki program ilk etapta SIFIR etiketine geldi. Orada önce GPIO.0=1 yapılıyor ve 10 sn sonra da GPIO.1=1 yapılıyor.
Bu konumda her iki pin de HIGH konumunda bekliyor. Diyelimki program bir sonraki etap da bu seferde BIR etiketine geliyor. Burada diğerinden tek fark önce GPIO.1=1 yapılması ama zaten bu pin 1 konumunda idi. Yeniden 1 yapılmasını bir anlamı olmuyor. 10 sonra bu seferde GPIO.0=1 yapılıyor ki bu pin de zaten 1 konumunda bekliyor idi.
Sonuç olarak program bir kod içeriyor ama anlamsız kodlar. Yapılan işlerde bir fark oluşturulmalıdır. Örnek vereyim. SIFIR etiketi şöyle yazılsa bir anlam ifade edebilirdi.
LOW GPIO.0
PAUSE 10000
LOW GPIO.1
bu şekilde olur ise program sıfır etiketine gelince ilgli pinler sıfır olur bir etiketine gelince de 1 olurlar ve kullanıcıda ne olup bittiğini görebilir.


Ben olsam şöyle yapardım;
ARA VAR BYTE

SYMBOL SIRA=ARA.0'ara değişkeninin 0 nolu bitini toggle biti olarak kullanacağız adına da SIRA diyoruz.

PAUSE 200  '200 ms açılış gecikmesi verdik
READ 0,ARA  'öncelikle ara değişkenini epromdan okuyoruz ve değeri 255 ise sıfırlıyoruz.
IF ARA>1 THEN 
  ARA=0
  WRITE 0,ARA:PAUSE 10
ENDIF

BASLA:

        READ 0, ARA
        TOGGLE SIRA :PAUSE 50'  sıra bitini toggle yaptık
        IF SIRA=0 THEN  'değeri sıfır ise 
           GOSUB SIFIR   'sıfır etiketine git
        ELSE
           GOSUB BIR     'değil ise yani değeri 1 ise bir etiketine git
        ENDIF
             
        
        WRITE 0, ARA  ' ara isimli byte değişkeninin yeni değerini eproma kayıt ediyoruz
        PAUSE 100     '100 ms bekliyoruz ve 
        GOTO BASLA    'tekrardan başa dönüyoruz.


SIFIR:
        PORTB.0=0
        PAUSE 1000
        PORTB.1=0 
        PAUSE 1000
        RETURN

BIR:
        PORTB.0=1
        PAUSE 1000
        PORTB.1=1
        PAUSE 1000
        RETURN
        end
Aslında sizin yaptıklarınıza bakarak 12F serisinden bir işlemci ile çalıştığınızı anladım. Bende yazdığım düzeltme kodunu 12F675 üzerinden vereyim dedim ama bakım elimdeki proteus sürümünde bu kod çalışmıyor. Aynı kod 16F628A ile sorunsuz çalışıyor. Aslında 12F de de çalışması gerekir ama sanırım simulsayon programında bir sorun var yada bu işlemcinin DLL dosyasında bir sorun olsa gerek. Gerçek devrede deneyebilirseniz çalışacağından eminim.
Ben yinede örnek kodu 16F628A üzerinden verdim. Değiştirmek isterseniz başlık kısmı değişecek ve port isimleri GPIO olarak değişecek.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

temha

Teşekkürler cevabiniz için sizin bahsettiğiniz sekilde de olur ama ben mcu nun her start inda epromdaki veriyi toggle yapmak bana mantikli geliyor ama hata mi yapıyorum. Aslida yapmak istesigim ahize kumandalarındaki gibi kapatip acindmca diger lamba yaniyor ya onun gibi.

temha

Alıntı yapılan: ete - 17 Haziran 2026, 11:53:03Programın yalnızca bir parçasını görerek bütün programın işleyişi konusunda hüküm vermek gerçekten zor bir iş. Program bir bütündür. İşlemci seçimi, Sigorta ayarları , tanımlamalar (değişkenler) , açılış ve asıl kod gibi parçalardan oluşur.
Toggle komut bit değişkenleri için kullanılan bir komut. Eprom ise 8 bitlik bilgiyi kayıt eder ve okunan değer de 8 bitliktir. Bu nedenle yazdığınız kod çok yanlış olmasa da usulüne uygun değil.
Bunun haricinde yazılan kod mantığında da bazı kusurlar var. Sırası ile açıklayayım.
Program bir şekilde SIFIR yada BIR isimli alt programlara gelir ise bir daha geldiği yerden çıkamıyor.
Örnek olarak SIFIR etiketli alt programa bakalım.
sifir:
HIGH GPIO.0
pause 10000
HIGH GPIO.1
GOTO Sifir

Program sıfır etiketine gelince ilk iş olarak GPIO.0 pinini HIGH yapıyor. 10 sn bekliyor ve bu seferde GPIO.1 pini HIGH yapıyor. Ardından GOTO SIFIR komutunu görerek tekrar SIFIR isimli etikete geliyor. Bir nevi programı bu konumda hapsetmiş oluyorsunuz. Üstelik bu işlemin bir sonucunu da göremezsiniz sürekli aynı şeyi yapıyor çünki.
Benzer şekilde BIR etiketine gider ise aynı program bu seferde orada hapsetmiş oluyorsunuz programı ve bir daha herhangi bir sonuç almanız yada görmeniz mümkün olmuyor.

Diğer bir olumsuz mantık ise gerek sıfır ve gerekse Bir isimli alt programlarda farklı bir işlem yapılmıyor olmasıdır. Daha açık anlatmak gerekir ise, diyelimki program ilk etapta SIFIR etiketine geldi. Orada önce GPIO.0=1 yapılıyor ve 10 sn sonra da GPIO.1=1 yapılıyor.
Bu konumda her iki pin de HIGH konumunda bekliyor. Diyelimki program bir sonraki etap da bu seferde BIR etiketine geliyor. Burada diğerinden tek fark önce GPIO.1=1 yapılması ama zaten bu pin 1 konumunda idi. Yeniden 1 yapılmasını bir anlamı olmuyor. 10 sonra bu seferde GPIO.0=1 yapılıyor ki bu pin de zaten 1 konumunda bekliyor idi.
Sonuç olarak program bir kod içeriyor ama anlamsız kodlar. Yapılan işlerde bir fark oluşturulmalıdır. Örnek vereyim. SIFIR etiketi şöyle yazılsa bir anlam ifade edebilirdi.
LOW GPIO.0
PAUSE 10000
LOW GPIO.1
bu şekilde olur ise program sıfır etiketine gelince ilgli pinler sıfır olur bir etiketine gelince de 1 olurlar ve kullanıcıda ne olup bittiğini görebilir.


Ben olsam şöyle yapardım;
ARA VAR BYTE

SYMBOL SIRA=ARA.0'ara değişkeninin 0 nolu bitini toggle biti olarak kullanacağız adına da SIRA diyoruz.

PAUSE 200  '200 ms açılış gecikmesi verdik
READ 0,ARA  'öncelikle ara değişkenini epromdan okuyoruz ve değeri 255 ise sıfırlıyoruz.
IF ARA>1 THEN 
  ARA=0
  WRITE 0,ARA:PAUSE 10
ENDIF

BASLA:

        READ 0, ARA
        TOGGLE SIRA :PAUSE 50'  sıra bitini toggle yaptık
        IF SIRA=0 THEN  'değeri sıfır ise 
           GOSUB SIFIR   'sıfır etiketine git
        ELSE
           GOSUB BIR     'değil ise yani değeri 1 ise bir etiketine git
        ENDIF
             
        
        WRITE 0, ARA  ' ara isimli byte değişkeninin yeni değerini eproma kayıt ediyoruz
        PAUSE 100     '100 ms bekliyoruz ve 
        GOTO BASLA    'tekrardan başa dönüyoruz.


SIFIR:
        PORTB.0=0
        PAUSE 1000
        PORTB.1=0 
        PAUSE 1000
        RETURN

BIR:
        PORTB.0=1
        PAUSE 1000
        PORTB.1=1
        PAUSE 1000
        RETURN
        end
Aslında sizin yaptıklarınıza bakarak 12F serisinden bir işlemci ile çalıştığınızı anladım. Bende yazdığım düzeltme kodunu 12F675 üzerinden vereyim dedim ama bakım elimdeki proteus sürümünde bu kod çalışmıyor. Aynı kod 16F628A ile sorunsuz çalışıyor. Aslında 12F de de çalışması gerekir ama sanırım simulsayon programında bir sorun var yada bu işlemcinin DLL dosyasında bir sorun olsa gerek. Gerçek devrede deneyebilirseniz çalışacağından eminim.
Ben yinede örnek kodu 16F628A üzerinden verdim. Değiştirmek isterseniz başlık kısmı değişecek ve port isimleri GPIO olarak değişecek.

Ete

Çok teşekkürler
RABBIN razi olsun.

ete

Bu arada 12F675 de kodun neden çalışmadığını anladım.
TOGGLE komutu değişken bitini konum değiştirmek üzere kullanıyoruz ki bu komut değişken bazında 12F675 de çalışmıyor. Onun yerine SIRA=1-SIRA yazarsam program çalışıyor. Bu aslında toggle komutunun matematik kullanılarak yapılmış hali.
Çalışan 12F675 kodunu da burada veriyorum.

ete

#config
 __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CPD_OFF
#endconfig

DEFINE OSCCAL_1K 1  'bu komut mutlaka olacak OSCCAL değerini yeniden pice yazdırıyor

DEFINE OSC 4

INTCON=0 'TMR0 kesmesi açıldı
CMCON = 0

GPIO=0
TRISIO=%00000000


ARA VAR BYTE  56

SYMBOL SIRA=ARA.0

PAUSE 200

READ 0,ARA
IF ARA>1 THEN 
  ARA=0
  WRITE 0,ARA:PAUSE 10
ENDIF

BASLA:
        
        READ 0, ARA
        SIRA=1-SIRA 
        PAUSE 50
        IF SIRA=0 THEN 
           GOSUB SIFIR
        ELSE
           GOSUB BIR
        ENDIF
        
        WRITE 0, ARA
        PAUSE 100
        
        GOTO BASLA


SIFIR:
        GPIO.0=0
        pause 1000
        GPIO.1=0 
        PAUSE 1000
        RETURN

BIR:
        GPIO.0=1
        pause 1000
        GPIO.1=1
        PAUSE 1000
        RETURN
        end
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Benzer Konular (5)