Bildirim
Pic Buton Sorunu
Daha Fazla
Bu Konudaki Kullanıcılar:
Daha Az
1 Misafir - 1 Masaüstü
Giriş
Mesaj
-
-
set_tris_a(0x00100); <-
Sayıyı 16 lık sistemde yazmışsın, 10 luktaki karşılığı 256 dır. Alt 8 bit 00 olduğu için A portu komple çıkış olur. Anladığım kadarıyla 2 numaralı pini giriş, diğerlerini çıkış yapmak istiyorsun. Öyleyse ya 4, ya 0x04, ya da 0b100 yazman gerekir.
Birde 10 us bekleme süresi ark ı önlemek için yeterli değil. En az 50 Ms (milisaniye) olmalı. -
Sorunu dün gece çözdüm;
Sorun "#fuses xt" kısmındaymış. Ben dahili kristali kullanmak istiyordum, kullanma şekli #fuses INTRC olarak yazmak gerekiyormuş. Yardımlarınız için teşekkürler.
< Bu ileti mobil sürüm kullanılarak atıldı > -
-
Gayet açık değil mi? Buton kontrolünü ledlerin yanıp sönmesi bittiği zaman yapıyorsun. k==1 ise toplam 1 saniye delay var orada, bunun anlamı 1 saniye boyunca buton algılanmayacak demek. k==2 ise daha da uzun süre.
Eğer ledler yanıp sönerken de buton algılansın istiyorsan kesme kullanacaksın. Baktım kullandığın denetleyicide 1 tane harici kesme varmış o da RB0 pini, onu kullanacaksın. -
Hocam Merhabalar;
İlk baştaki if içinde bulunan k==1 den mi bahsediyoruz. Ben döngü oluşturmak için onu kullanmıştım yani k ya bastıkça değer yükselecek 1 olduğunda içindeki konfigürasyonu gerçekleştirecek. Bulunduğumuz devreye kesme işlemini nasıl ekleyebilirim ? Her bir mod için içine kesme mi eklemem gerek.
< Bu ileti mobil sürüm kullanılarak atıldı > -
...
int mod;
#INT_EXT
void butona_basildi()
{
++mod;
// Butona basılınca yapılacak diğer işlemler
}
void main()
{
ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(1) {
switch(mod) {
case 0:
// mod 0 işlemleri
break;
case 1:
// mod 1 işlemleri
break;
case 2:
// mod 2 işlemleri
break;
// case 4:
...
}
}
}
Bu şablonla yapabilirsin. "butona_basildi" fonksiyonuna buton basılınca gerçekleşecek işlemleri yazarsın. switch içindeki case lerde o an mod değişkeninin değeri neyse ona uygun işlemleri yapılır. 256 farklı işlem tanımlayabilirsin.
Yapacağın işleri direkt switch içine yazmak yerine her bir mod için ayrı fonksiyon yazmalısın ki kod karman çorman olmasın. Senin kod kabus gibi benden söylemesi. Bekleme süreleri ve pin değişimleri düzenli olsaydı kodunu çok kısa şekilde yazabilirdik ama bu haliyle kısaltmak zor.
-
Hocam öncelikle bıkmadan, üşenmeden cevapladığınız için teşekkür ediyorum. Dediğiniz gibi üstünde de biraz oynayarak yaptım ancak;
kısmını kullanırsam hiç bir şekilde modlara geçmiyor, pic de hiç bir hareket yok. Onun yerine aşağıda yazdığım kod gibi switch'in öncesine butona basılırsa modu artır şeklinde konfigüre edersem kesinlikle verimsiz olsa da modlar arasında geçiş yapılabiliyor. Sanırım dediğiniz kısımı kullanamadım, internetteki interrupt örneklerini de uyguladım ancak bir türlü başarılı sonuç alamadım. Birde modların içerisine yazdığım yan-sön'ler biraz uzun olacak, bunların uzun veya kısa olması problem yaratır mı bana; interrupt'ı doğru şekilde kullanırsam bile ? Sizin dediğiniz şekilde yazdım; mod1' de sadece 1. led, mod2' de sadece 2. led, mod3' de sadece 3. led 1 kez yanacak-sönecek şekilde sağlıklı bir sonuç alamadım başlayınca 2 yanıyor, butona defalarca basınca 3 e geçiyor, bir daha basınca herşey gidiyor.quote:
void butona_basildi
#include <16F628A.h>
#fuses INTRC, NOPROTECT, NOMCLR
#use delay(clock=4000000)
#use fast_io(b)
#INT_EXT
#define buton pin_B0
int mod=0;
void main()
{
set_tris_b(0x01);
output_b(0x00);
ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(1)
{
if(input(pin_B0))
{
mod++;
}
switch(mod)
{
case 1:
{
output_high(pin_b2);
delay_ms(100);
output_low(pin_b2);
delay_ms(200);
output_high(pin_b2);
delay_ms(100);
output_low(pin_b2);
delay_ms(100);
output_high(pin_b2);
delay_ms(100);
output_low(pin_b2);
delay_ms(100);
output_high(pin_b3);
delay_ms(100);
output_low(pin_b3);
delay_ms(50);
output_high(pin_b2);
delay_ms(100);
output_low(pin_b2);
delay_ms(100);
}
break;
case 2:
{
output_high(pin_b3);
delay_ms(100);
output_high(pin_b2);
delay_ms(100);
output_high(pin_b1);
delay_ms(500);
output_low(pin_b1);
delay_ms(100);
output_low(pin_b2);
delay_ms(100);
output_low(pin_b3);
delay_ms(100);
}
break;
case 3:
{
output_high(pin_b3);
delay_ms(50);
output_low(pin_b3);
delay_ms(50);
}
}
}
}
-
PB0 ı giriş olarak ayarlamayı unutmuşuz (set_tris_b(0x01);) Sen ayarlamışsın ama bu sefer de kesme sistemini bozmuşsun. #INT_EXT in altına hangi fonksiyon gelirse kesme fonksiyonu odur. Sen main'i koymuşsun, yanlış.
Birde kesmeyi ayarladıktan sonra pini okumanın bir mantığı yok. Sen butona basınca zaten otomatik olarak #INT_EXT direktifinin altındaki fonksiyon çalışacak. Ancak unuttuğumuz birşey daha var.
ext_int_edge(H_TO_L); <-
Burada dedik ki kesmeyi 1'den 0'a düşerken algıla. Yani bunun çalışması için PB0'ı 10k civarı bir dirençle +5V a bağlaman gerekir. Butonu da 0V a bağlayacaksın. Butona basınca High to Low durumu oluşacak.
Elimde kullanmadığım pic ler var ama programlayıcı yok, o yüzden deneyemiyorum. Ha birde zorunlu değilsen pic kullanmamanı tavsiye ederim. Devir Atmel devri. 16f628a ile aynı fiyata atmega328p alınıyor. Arada uçurumlar kadar fark var. -
Hocam merhaba,
Yaptığım hatayı fark ettim sonradan değiştirdim ancak durum değişmedi. Başında da anlamıştım buton ve direnç kısmını, dediğiniz gibi oluşturdum ancak sonuç yine aynı. Kısa programlar yazdığımızda aralarında geçiş yapılabiliyorken uzun bir program yazarsam geçiş olmuyor. Uzun olana gelip kalıyor orada. 16F628A kullanmamın sebebi ucuz ve küçük olması. Birde bendeki programlayıcı ile programlayabiliyorum, ATMEL'i bendeki programlayıcı ile programlayabilir miyim fikrim yok. Acaba programın uzun olması, programdan çıkmama sebebi olabilir mi ? Geriye bir tek bu kalıyor benim mevcut bilgim ile
Sayfa:
1
Ip işlemleri
Bu mesaj IP'si ile atılan mesajları ara Bu kullanıcının son IP'si ile atılan mesajları ara Bu mesaj IP'si ile kullanıcı ara Bu kullanıcının son IP'si ile kullanıcı ara
KAPAT X
Bu mesaj IP'si ile atılan mesajları ara Bu kullanıcının son IP'si ile atılan mesajları ara Bu mesaj IP'si ile kullanıcı ara Bu kullanıcının son IP'si ile kullanıcı ara
KAPAT X