Şimdi Ara

Proteus 8 pic simülasyonunda sorun yaşıyorum.

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
14
Cevap
0
Favori
500
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba.
    Step motor sürücüsü için ccs c'de kod yazmaya başladım. Elimde şimdilik boşta fiziksel pic olmadığı için, Proteus'ta sanal pic ile deneme yapıyorum.

    Motor sürücüsünde aynı kodların sürekli tekrar etmesi gerekiyor. Main fonksiyonunda if ve else ile CW ve CCW yönleri için kodları yazdım. Sürekli tekrar etmesi için while (true) kodunu kullanıyorum. Ancak Proteus bu kodu algılamıyor.

    output_b(0b01100001);
    delay_ms(200);
    output_b(0b01010001);
    delay_ms(200);
    output_b(0b10010001);
    delay_ms(200);
    output_b(0b10100001);
    delay_ms(200);
    böyle bir kod yazdım. Bunu while ile sürekli tekrarlamasıni istiyorum. Sorunsuz derlenmesine rağmen, Proteus'ta çalışırken 0b1010001'den sonra duruyor, başa (0b01100001'e dönmüyor.
    Sorun nerede?

    İnternetten indirdiğim hazır kodları da denedim, onlarda da while komutları Proteus'ta çalışmıyor, simülasyondaki pic programın sonuna gelince duruyor, öyle kalıyor.
    Basit bir fonksiyon yazıp goto komutu ile döndürünce sorunsuz döngü yapıyor. Ama bir türlü while ile döngü yapamadım.
    Sorun nerede olabilir?

    Pic olarak ucuz ama iş gördüğü için 16f628a kullanacağım. Ona göre kod yazıyorum.



    < Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 13 Mart 2022; 20:20:55 >







  • while(1)

    {

    output_b(0b01100001);

    delay_ms(200);

    output_b(0b01010001);

    delay_ms(200);

    output_b(0b10010001);

    delay_ms(200);

    output_b(0b10100001);

    delay_ms(200);

    }


    veya alttakini deneyince çalışır galiba


    BASLA:

    output_b(0b01100001);

    delay_ms(200);

    output_b(0b01010001);

    delay_ms(200);

    output_b(0b10010001);

    delay_ms(200);

    output_b(0b10100001);

    delay_ms(200);

    GOTO BASLA

  • limbesh kullanıcısına yanıt
    Teşekkürler.
    Üstteki while(1) komutu ile yapılan çalıştı.
    goto komutu da, sadece main fonksiyonu olan basit kodlarda işe yarıyor. Birden fazla fonksiyon kullanmam gerektiğinde goto sorun çıkarıyor. Program kısır döngüye giriyor diğer fonksiyonlara dallanmıyor.



    < Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 14 Mart 2022; 9:22:42 >
  • @limbesh im yukarıdaki mesajındaki while ve goto kullanımı arasında fark yok. Yukarıdaki mesajdaki kodu aynen kullandıysanız tek sorun çıkartacak nokta GOTO BASLA; satırında ";" ün unutulması olabilir.


    Goto komutunda kısır döngüye girmesi, kodlamada bir yerlerde mantık hatası yapıyorsunuz anlamına gelir.

  • rafet32 kullanıcısına yanıt
    Yardımlarınız için teşekkürler.

    Pic programlamanın üstadları da goto kullanmayın, while kullanın diyor. Goto sorun çıkarabilir diyor. Goto yapınca program main fonksiyonunda sıkışıp kalmaz mı?

    Benim kafamdaki proje main fonksiyonunda if saat yönü(CW), else saat yönünün tersi(CCW) olacak şekilde if else ikilisi ile akışı yapacağım.

    Birinci alt fonksiyon yön fonksiyonu ile CW/CCW ayarlayacağım. Yön fonksiyonu 1 döndürdüğünde CW, 0 döndürdüğünde CCW olacak.

    İkinci alt fonksiyon olarak hız fonksiyonu oluşturacağım. delay_ms komutuna da hız fonksiyonunun döndürdüğü değeri gireceğim. Şimdilik sabit delay veriyorum, kendimi biraz geliştirince hız fonksiyonunu da ekleyeceğim.

    Yön fonksiyonu A0 pininin lojik durumunu döndürecek.
    Hız fonksiyonu da A1, A2 ve A3 pinlerinin lojik durumunu döndürecek.
    A1 0 iken hızlı
    A2 0 iken orta
    A3 0 iken yavaş olacak.
    Hız ve yön seçimini jumperlarla yapacağım.

    Şimdi bir sorun daha var. Kristal girişleri Port A'nın 6 ve 7. pinleri ile paylaşımlı yapıdaymış. Şimdi PIC'i çalıştırmak için kristal bağladığımda portA çalışmaya devam eder mi?

    Pic'imiz bu:
    Proteus 8 pic simülasyonunda sorun yaşıyorum.

    İlk defa pic programlama işine giriyorum. Umarım altından kalkabilirim. Projeyi tamamlarsam burada paylaşırım bir yararımız dokunur.
    Süreceğim motor lazer yazıcıların ana motoru, mitsumi m49sp-2k, eski bir yazıcıdan söktüm.
    https://www.mitsumi.co.jp/latest/Catalog/compo/motor/m49sp2k_e.html



    < Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 14 Mart 2022; 15:9:42 >




  • rafet32 kullanıcısına yanıt

    Arkadaş öyle yapmaya çalıştığı için, hiç sorgulamadan kısır döngü yaptım hocam.

  • limbesh kullanıcısına yanıt

    Düzeltilmiş mesaj bir altta




    < Bu mesaj bu kişi tarafından değiştirildi rafet32 -- 14 Mart 2022; 19:37:46 >
  • Öncelikle kristal girişi ile ilgili sorunuza cevap vereyim. Evet Geri kalan pinleri istediğini gibi kullanabilirsiniz.


    Diğer bir öneri 16f628A da dahili 4Mhz kristal var. Bunu kullanmayı düşünebilirsiniz. Bu şekilde yaparsanız A6 ve A7 yi IO olarak kullanabilirsiniz. 4Mhz yeterli gelmeyecekse 628A serisi harici kristal ile sanırım 20Mhz ye kadar çalışabiliyor.


    CCS kullandığınız için GOTO komutunun kullanımında sorun yok, PIC assemblerde kullanacaksanız gideceğiniz adresin durumuna göre bazı registerler işlemleri yapmanız gerekebilir, fakat siz ccs kullandığınız için, CCS sizin yerine bu işlemleri arka planda otomatik olarak yapar.


    Genelde birisi kuyuya taş atar 40 akıllı çıkartamaz. Tüm komutların kullanımı kontrolü sizin elinizde, hepsi alet çantanızda farklı farklı yetenekleri olan şeyler, niye var olan bir aleti hiç kullanmayayım :) . İşin mantığını kavrayınca bu tip ikilemleden kurtulmuş olursunuz.



    Not: Microchipin komut setinde WHILE komutu bulunmaz GOTO komutu bulunur. Proteus 8 pic simülasyonunda sorun yaşıyorum.  Bunu şöyle bir örnekle açıklamaya çalışayım.




    Proteus 8 pic simülasyonunda sorun yaşıyorum.



    Şöyle basit anlamsız bir kod yazmış olalım. Bu örnek kodda while(TRUE) {....}; nin altındaki kodlar pratik olarak çalışmayacaktır. Amacımız bunların çalışması değil while goto konusuna açıklama getirmek içindir.


    Bu kodların ASM karşılığı



    Proteus 8 pic simülasyonunda sorun yaşıyorum.



    Dikkat ederseniz while son parantezde tekrar başa döneceği adrese 0x00D GOTO ile gidiyor

    İkinci goto kullanım örneğinde ise 0x012 adresine yönlendiriliyor.



    Umarım kafanızı daha fazla karıştırmadan konuyu açıklayabilmişimdir. Proteus 8 pic simülasyonunda sorun yaşıyorum. 


    --------------------------------------


    Edit: Bir önceki cevabı yazarken yanlışlıkla @ipli jeton yerine @limbesh in mesajından alıntı yaptığımı fark ettim. Hatalı mesajı konu bütünlüğü açısından silerek doğru alıntı yapılmış halini yeniden paylaşıyorum.


    @limbesh karılışlık için kusura bakma Proteus 8 pic simülasyonunda sorun yaşıyorum. 





  • rafet32 kullanıcısına yanıt
    Teşekkürler. Şimdi haricî kristal modunda iken a portunu giriş ya da çıkış yapmam için ne yapmam gerekiyor? normal set_tris_a komutundan başka bir şeye ihtiyaç var mı?
  • ipli jeton kullanıcısına yanıt

    CCS de #fast_io veya #fixed_io direktiflerini kullanmadıysanız (başlangıç aşamasında olduğunuzu belirttiğiniz için bunları kullanmadığınızı değerlendiriyorum) set_tris_a gibi bir kullanım yapmak zorunda değilsiniz.


    Output_high(PINA6);


    dediğiniz zaman ccs, pini çıkış yapacak tris ayarlarını kendisi otomatik olarak arka planda yapar.




    < Bu mesaj bu kişi tarafından değiştirildi rafet32 -- 17 Mart 2022; 4:37:50 >
  • rafet32 kullanıcısına yanıt
    Teşekkürler. CCS'de harici osilatör kullanacak şekilde proje oluşturdum.
    set_tris_a(0xFF); yapıp port a'yı çıkış yaptım. Ardından
    Port A'nın tüm portları A0, A1, A2, ... A7 sırayla yanacak şekilde kod yazdım. LED devresi ile denedim bunu. A5, A6, A7 portlarına bağlı ledler yanmadı.
    Evet, o portlar otomatik devbre dışı kalıyormuş. İnternal osilatör seçip kod yazınca o portlar aktif oluyor.
  • quote:

    void main()
    {
    set_tris_a(0xFF);
    set_tris_b(0x00);
    int dir = input_a();
    while(TRUE)
    {
    if(dir = 0x01){
    output_b(0x51);
    delay_ms(200);
    output_b(0x61);
    delay_ms(200);
    output_b(0xA1);
    delay_ms(200);
    output_b(0x91);
    delay_ms(200); //TODO: User Code
    }else{
    output_b(0x61);
    delay_ms(200);
    output_b(0x51);
    delay_ms(200);
    output_b(0x91);
    delay_ms(200);
    output_b(0xA1);
    delay_ms(200);
    }
    }
    }

    Böyle bir kod yazdım. Proteusta denedim. Ama sanırım if kısmı çalışmıyor. Bir yerde hata mı var acaba?



    < Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 30 Mart 2022; 15:59:5 >
  • ipli jeton kullanıcısına yanıt

    if li satırı şu şekilde düzenleyin


    if(dir = 0x01){ // yanlış kullanım burada "dir" değişkenine 0x01 değerini atıyorsunuz


    if(dir == 0x01){ // doğru kullanım "dir" ile 0x01 değerleri eşitmi kontrolü yapılıyor

  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.