for komutu neden bu şekilde çalışıyor?

Başlatan Dege, 29 Kasım 2025, 14:15:22

Dege

Merhabalar
İlk pic programımı yazdım bugün. MPLAB IDE kullanarak. Bir kaç temel basit uygulama yaptım. Fakat
uygulamaları yaparken senaryoları değiştirerek ve farklı komutları kullanarak, komutların çalışmasını anlamaya çalışıyorum ve aşağıda belirttiğim durumun nedenini bir türlü anlayamadım ve sorunu çözemedim. Yardımcı olursanız sevinirim.

Senaryo
1-8 led önce soldan sağa,
2-daha sonra sağdan sola kayacak
3-ve sonrasında ilk 4 led HIGH olacak
4-ve sonrasında son 4 led HIGH olacak

Bu programı farklı metotlarla yapıyorum  sorun yok. Fakat for döngüsünü aşağıdaki şekilde denediğimde
neden 3 ve 4. adım çalışmıyor. Sadece 1 ve 2. adım çalışıyor.

int animasyon[8]={0b00000001,0b00000011,0b00000111,0b00001111,0b00011111,0b00111111,0b01111111,0b11111111};
int animasyon2[8]={0b10000000,0b11000000,0b11100000,0b11110000,0b11111000,0b11111100,0b11111110,0b11111111};
int animasyon3[8]={0b11110000,0b00001111,0b11110000,0b00001111,0b11110000,0b00001111,0b11110000,0b00001111};
void main() {
    TRISB=0;//0b00000000;0x00
    PORTB=0;
    while(1){
              {
              for(int j=0; j<=7; j++) //BU FOR DÖNGÜSÜ ÇALIŞIYOR. LEDLERİ SAĞDAN SOLA YAKIYOR
              {
                  PORTB=animasyon[j];
                __delay_ms(150);
              }
              for(int k=0; k<=7; k++) //BU FOR DÖNGÜSÜ ÇALIŞIYOR. LEDLERİ SOLDAN SAĞA YAKIYOR. 
              {
                  PORTB=animasyon2[k];
                __delay_ms(150);
              }
              for(int i=0; i<=7; i++) //BU KISIM ÇALISMIYOR
              {
                  PORTB=animasyon3[i];
                __delay_ms(150);
              } 
              } 
            }
} 


aRci

#1
Merhaba animasyon3 şeklinde deneyin. diğerlerindeki uygulama profiline göre bu şekilde yazdım

for(int i=0; i<=7; i++) //BU KISIM ÇALISMIYOR
              {
                  PORTB=animasyon3[i];
                __delay_ms(150);
              }

Dege

CEVAP İÇİN TEŞEKKÜR EDRİM...
Fakat anlayamadım ne demek istediğinizi. Yazdığınız kodun benimkinden ne farkı var.?
Gerçekten anlamadığım için soruyorum. animasyon3 tek başına yazıp yüklediğimde çalışıyor onu denedim..
Ama senaryosunu yukarıda bahsettiğim şekilde yaptığımda animasyon 3 çalışmıyor. For döngüsü ile ilgili bilmediğim veya yanlış yaptığım bir kural mı vs. mi var anlayamadım.?

ete

Soru sorulan ve kod örneği verilen mesajlarda sıklıkla yapılan bir yanlışı dile getirmek istiyorum. Üyelerden birisi bir mesaj yazıyor kod örneği veriyor ve çalışmadığını belirtiyor. Mesaja cevap yazan diğer bir üye de yine bir kod örneği veriyor ve şunu dene diyor. Bu bir hata ve zaman zaman bende yapıyorum bu hatayı. Neden hata onu açıklayayım. Öncelikle bir şeyin hata olması için onun doğrusuna göre yanlış olması gerekir. Soruyu soran zaten onun doğrumu yanlışmı olduğunu bilmiyor ve genellikle hata verilen örnek kodun ufak bir parçası bir şaret nokta virgül gibi elamanlardan kaynaklanıyor. Bu nedenle cevaplayaının önce hatanın ne olduğunu ortaya kouyması ardından da doğrusunu belirtmesi gerekir. Bu sayede soruyu soran hatanın ne olduğunu ve nasıl düzeltilmesi gerektiğini öğrenmiş olur.
Bu konudaki soru ve karşılığında gelen cevap bu açıklamama iyi bir örnek teşkil ediuyor. Soru sorulmuş şunu dene şeklinde bir cevap gelmiş. Cevaba bakıyorum sorudan bir farkı yok. Hata ne belli değil cevap ise hatalı olan kodun bir tekrarı. Yada bize öyle geliyor. Çünki ufak bir noktalama işareti yada başka bir şey kodu düzeltiyor olabilir. Bilmeyen ise iki kodu aynı görebilir bizim gibi.
Sonuca gelecek olursak. Bundan böyle bir mesaja cevap verirken özellikle yanlış olan bir kodu düzeltiyor isek önce hatanın ne olduğunu ardından da doğrusunun ne olduğunu belirtmeye çalışalım lütfen. Bu şekilde bu forum sitesinin ana amaçlarından biri olan "öğretme" seçeneğine hizmet etmiş olacağız.

Ete

istinaf duvarı

#4
Sayıları hex olarak yazsan daha derli toplu gözükür. Üçüncü kısımda for içindeki ilk satırda port b'ye 0 göndererek portu bir temizle bakalım ne olacak. Baktım baktım bir sorun göremedim. Aklıma gelen tek ihtimal bu.

Aynı kodu CCS'de derledim. Üçüncü animasyon çalışıyor. Kodu komple kopyalayıp CCS içerisine yapıştırdım. tris, outputb ve __delay_ms ifadelerini ccs'deki karşılıkları olan set_tris, output_b ve delay_ms olarak değiştirdim. Geri kalan hiç bir yere dokunmadım. Bu şekilde derlediğimde sorunsuz çalıştı.
#include <main.h>

int animasyon[8]={0b00000001,0b00000011,0b00000111,0b00001111,0b00011111,0b00111111,0b01111111,0b11111111};
int animasyon2[8]={0b10000000,0b11000000,0b11100000,0b11110000,0b11111000,0b11111100,0b11111110,0b11111111};
int animasyon3[8]={0b11110000,0b00001111,0b11110000,0b00001111,0b11110000,0b00001111,0b11110000,0b00001111};

void main()
{
set_tris_b(0x00);
output_b(0x00);
   while(TRUE)
   {
      {
      for(int j=0; j<=7; j++) //BU FOR DÖNGÜSÜ ÇALIŞIYOR. LEDLERİ SAĞDAN SOLA YAKIYOR
{
output_b(animasyon[j]);
delay_ms(150);
}
      
      for(int k=0; k<=7; k++) //BU FOR DÖNGÜSÜ ÇALIŞIYOR. LEDLERİ SOLDAN SAĞA YAKIYOR. 
               {
               output_b(animasyon2[k]);
               delay_ms(150);
               }

      for(int i=0; i<=7; i++) //BU KISIM ÇALISMIYOR
               {
               output_B(animasyon3[i]);
               delay_ms(150);
               } 
      }
      
      


      //TODO: User Code
   }

}

:1000000000308A00192800003B3084008313000868
:10001000031918280130F800F701F70B0D28F80B29
:100020000C284A30F700F70B13281628800B0A28F3
:10003000080003081F39830083168E1507308312CA
:100040009F0083130130A0000330A1000730A200FD
:100050000F30A3001F30A4003F30A5007F30A60062
:10006000FF30A7008030A800C030A900E030AA000F
:10007000F030AB00F830AC00FC30AD00FE30AE002C
:10008000FF30AF00F030B0000F30B100F030B20000
:100090000F30B300F030B4000F30B500F030B600D0
:1000A0000F30B70000308316860086018312860168
:1000B000B8013808073C031C6D282030380784003D
:1000C00083130008BB008316860183123B08860059
:1000D0009630BB000420B80A5928B9013908073CFA
:1000E000031C822828303907840083130008BB00D2
:1000F0008316860183123B0886009630BB000420DD
:10010000B90A6E28BA013A08073C031C9728303018
:100110003A07840083130008BB008316860183120C
:100120003B0886009630BB000420BA0A8328582872
:0201300063006A
:02400E00703F01
:00000001FF
;PIC16F628A
;CRC=94C6  CREATED="05-Ara-25 19:58"


mehmet

#5
İlk kod paylaşıldığında üçüncü blokta
PORTB = animasyon3;
olarak yazılmıştı.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

istinaf duvarı

='in önünde ve arkasında boşluk olması sorun çıkarmaz normalde. Rahat okunması için çoğu zaman böyle yazarız. Sorunun bundan kaynaklı olduğunu zannetmiyorum.

mehmet

PORTB = animasyon3[i];
olarak yazılmalıydı. Boşluklarla alakalı değil.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Powered by EzPortal
▲