Arama butonu
Bu konudaki kullanıcılar: 1 misafir
12
Cevap
508
Tıklama
0
Öne Çıkarma
Proteus 8 pic simülasyonunda sorun yaşıyorum.
İ
2 yıl
Yarbay
Konu Sahibi

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 >

< Bu ileti mini sürüm kullanılarak atıldı >

L
2 yıl
Binbaşı

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


Bu mesaja 1 cevap geldi.
İ
2 yıl
Yarbay
Konu Sahibi

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 >

< Bu ileti mini sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @limbesh
R
2 yıl
Binbaşı

@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.


Bu mesaja 2 cevap geldi.

Bu mesajda bahsedilenler: @limbesh
İ
2 yıl
Yarbay
Konu Sahibi

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:
< Resime gitmek için tıklayın >

İ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 >

< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @rafet32
L
2 yıl
Binbaşı

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


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @rafet32
R
2 yıl
Binbaşı

Düzeltilmiş mesaj bir altta





< Bu mesaj bu kişi tarafından değiştirildi rafet32 -- 14 Mart 2022; 19:37:46 >


Bu mesajda bahsedilenler: @limbesh
R
2 yıl
Binbaşı

Ö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. Bunu şöyle bir örnekle açıklamaya çalışayım.



< Resime gitmek için tıklayın >


Şö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ığı


< Resime gitmek için tıklayın >


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.

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

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


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @limbesh , @ipli jeton
İ
2 yıl
Yarbay
Konu Sahibi

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ı?



< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @rafet32
R
2 yıl
Binbaşı

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 >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @ipli jeton
İ
2 yıl
Yarbay
Konu Sahibi

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.



< Bu ileti mini sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @rafet32
İ
2 yıl
Yarbay
Konu Sahibi

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 >

< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @rafet32
R
2 yıl
Binbaşı

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




Bu mesajda bahsedilenler: @ipli jeton
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.