Merhaba , keypad ile değiştirilebilir dot matrix gerçeklemeye çalışıyorum . Yazılımını kod paylaşımı yapılmış birkaç yerde buldum,sanırım daha önce çok farklı mikrodenetleyici,fpga vs. gibi entegrelerle çokça denenmiş bir proje . Bulduğum yazılımın çalışıp çalışmayacağına emin değilim , 89c51rd2 mcu' su kullanılmış projede.Yazılım hangi programlayıcıda yazılmış , compile eden program nedir araştırmaya çalışıyorum.
Fikir verebilirseniz çok yardımınız dokunur,şimdiden teşekkür ederim hepinize
8051 ailesinin gelişmiş bir modeli. Bir önceki serisinden farklı olarak ISP (sistemde programlama) özelliği ile devre üzerinde programlanabilir , veya paralel programlama kullanılabilir.
C için Keil Compilers kullanılabilir. Sitesinde önerilmekte.
İstersen atmel.com bir incele. Daha fazla ayrıntı bulabilirsin.
http://www.keil.com/dd/chip/3176.htm (http://www.keil.com/dd/chip/3176.htm) ayrıntılı bilgi verilmiş...
düzeltme: pardon şimdi olması lazım...
Sağolun cevabınız için. Verdiğiniz linke girdim ama sayfayı bulamıyor.
Yani başka bir atmel modeli ile (isp olmayan) bu devreyi gerçeklemek mümkün değil ? En azından keypad ile değiştirilebilme özelliğini.Benim bulduğum kodu aşşağıya ekliyorum böylece özellikle o işlemcinin neden seçildiğini anlatmak ve sormak daha kolay olacak. İnceleyebilirseniz sevinirim.
Mikrodenetleyici Programı
/* Kütüphane Dosyasi */
#pragma large // Bütün değişken ve sabitleri büyük boyutlu kılar.
#include <89c51rd2.H>
#define satirtarama P1 // Satırları Tarar.
// Tus Takimi Sütun Tanimlamalari
#define Sutun1 P2_0
#define Sutun2 P2_1
#define Sutun3 P2_2
// Tus Takimi Satir Tanimlamalari
#define SatA P2_3
#define SatB P2_4
#define SatC P2_5
#define SatD P2_6
/* Kaymali Kaydedici Uc Tanimlamalari */
#define reset P3_0 // Shift Register'i Resetler.
#define clock P3_1 // Shift Register'a (Clock)saat Palsi Gönderir.
#define datas P3_2 // Shift Register'a Data'yı Gönderir.
#define sil P3_3 // Yazılacak Verileri Siler.
#define rst P3_4 // İşlemciyi resetler.
// Değişkenlerin ilk değerleriyle birlikte tanımlaması.
int enter=1,
dizidekikarakter=0,
tus=0,
tekrar[10]={0,0,0,0,0,0,0,0,0,0},
sifirmi=0,
bak=0,
sifirla=0,
satirelemani=0,
yazilacakdizi[20][6],
krkt=0,
kar=0,
esasyaz[240],
yazmayitekraret=0,
satirsay=0,
satelm=0,
gecsatirtarama=0x01,
bekle=0,
karaktersayisi=29;
code unsigned int
karakterler[50][6]={{0x00,0x00,0x00,0x00,0x00,0x00}, // Bosluk
{0x00,0x00,0x60,0x60,0x00,0x00}, // .
{0x00,0x00,0x58,0x38,0x00,0x00}, // ,
{0x00,0x00,0x66,0x66,0x00,0x00}, // :
{0x00,0x3E,0x51,0x49,0x45,0x3E}, // 0
{0x00,0x00,0x42,0x7F,0x40,0x00}, // 1
{0x00,0x08,0x08,0x3E,0x08,0x08}, // +
{0x00,0x00,0x08,0x08,0x08,0x00}, // -
{0x00,0x22,0x14,0x7F,0x14,0x22}, // *
{0x00,0x20,0x10,0x08,0x04,0x02}, // /
{0x00,0x42,0x61,0x51,0x49,0x46}, // 2
{0x00,0x7E,0x09,0x09,0x09,0x7E}, // A
{0x00,0x7F,0x49,0x49,0x49,0x36}, // B
{0x00,0x3E,0x41,0x41,0x41,0x22}, // C
{0x00,0x1E,0x21,0x61,0x21,0x12}, // Ç
{0x00,0x22,0x49,0x49,0x49,0x36}, // 3
{0x00,0x7F,0x41,0x41,0x41,0x3E}, // D
{0x00,0x7F,0x49,0x49,0x49,0x41}, // E
{0x00,0x7F,0x09,0x09,0x09,0x01}, // F
{0x00,0x3E,0x41,0x49,0x49,0x7A}, // G
{0x00,0x0F,0x08,0x08,0x08,0x7F}, // 4
{0x00,0x3C,0x43,0x53,0x53,0x74}, // Ğ
{0x00,0x7F,0x08,0x08,0x08,0x7F}, // H
{0x00,0x00,0x41,0x7F,0x41,0x00}, // I
{0x00,0x00,0x42,0x7F,0x42,0x00}, // İ
{0x00,0x4F,0x49,0x49,0x49,0x31}, // 5
{0x00,0x20,0x40,0x40,0x40,0x3F}, // J
{0x00,0x7F,0x08,0x14,0x22,0x41}, // K
{0x00,0x7F,0x40,0x40,0x40,0x40}, // L
{0x00,0x7F,0x02,0x04,0x02,0x7F}, // M
{0x00,0x3E,0x49,0x49,0x49,0x32}, // 6
{0x00,0x7F,0x02,0x04,0x08,0x7F}, // N
{0x00,0x3E,0x41,0x41,0x41,0x3E}, // O
{0x00,0x3C,0x43,0x42,0x43,0x3C}, // Ö
{0x00,0x7F,0x09,0x09,0x09,0x06}, // P
{0x00,0x01,0x71,0x09,0x05,0x03}, // 7
{0x00,0x3E,0x41,0x51,0x61,0x7E}, // Q
{0x00,0x7F,0x09,0x19,0x29,0x46}, // R
{0x00,0x26,0x49,0x49,0x49,0x32}, // S
{0x00,0x02,0x15,0x55,0x15,0x08}, // Ş
{0x00,0x36,0x49,0x49,0x49,0x36}, // 8
{0x00,0x01,0x01,0x7F,0x01,0x01}, // T
{0x00,0x3F,0x40,0x40,0x40,0x3F}, // U
{0x00,0x3C,0x41,0x40,0x41,0x3C}, // Ü
{0x00,0x1F,0x20,0x40,0x20,0x1F}, // V
{0x00,0x06,0x49,0x49,0x49,0x3E}, // 9
{0x00,0x3F,0x40,0x30,0x40,0x3F}, // W
{0x00,0x63,0x14,0x08,0x14,0x63}, // X
{0x00,0x03,0x04,0x78,0x04,0x03}, // Y
{0x00,0x61,0x51,0x49,0x45,0x43}}; // Z
//////////////////////////////////////////////////////////////////////
// Tus Takimini Tarama Fonksiyonu //
//////////////////////////////////////////////////////////////////////
tusoku() large // Metin Girişi (Tuşları Okur.)
{
SatA=0; // satir-a'nın taranır.
while(!SatA)
{// Tus 1
if (Sutun1==0) {tus=1; tekrar[tus]++; tekrar[tus]=tekrar[tus]%5; while(!Sutun1){;}}
// Tus 2
if (Sutun2==0) {tus=2; tekrar[tus]++; tekrar[tus]=tekrar[tus]%5; while(!Sutun2){;}}
// Tus 3
if (Sutun3==0) {tus=3; tekrar[tus]++; tekrar[tus]=tekrar[tus]%5; while(!Sutun3){;}}
SatA=1;
}
SatB=0; // satir-b taranır.
while(!SatB)
{// Tus 4
if (Sutun1==0) {tus=4; tekrar[tus]++; tekrar[tus]=tekrar[tus]%5; while(!Sutun1){;}}
// Tus 5
if (Sutun2==0) {tus=5; tekrar[tus]++; tekrar[tus]=tekrar[tus]%5; while(!Sutun2){;}}
// Tus 6
if (Sutun3==0) {tus=6; tekrar[tus]++; tekrar[tus]=tekrar[tus]%5; while(!Sutun3){;}}
SatB=1;
}
SatC=0; // satir-c taranır.
while(!SatC)
{// Tus 7
if (Sutun1==0) {tus=7; tekrar[tus]++; tekrar[tus]=tekrar[tus]%5; while(!Sutun1){;}}
// Tus 8
if (Sutun2==0) {tus=8; tekrar[tus]++; tekrar[tus]=tekrar[tus]%5; while(!Sutun2){;}}
// Tus 9
if (Sutun3==0) {tus=9; tekrar[tus]++; tekrar[tus]=tekrar[tus]%5; while(!Sutun3){;}}
SatC=1;
}
SatD=0; // satir-d taranır.
while(!SatD)
{// * Tuşu
if (Sutun1==0) {
dizidekikarakter++;// Bir sonraki karaktere geçer.
tus=0; // Tuş bilgisi sıfırlanır.
while(!Sutun1){;}
for(sifirla=0;sifirla<10;sifirla++)
tekrar[sifirla]=0; //"tekrar" dizisi sıfırlanır.
}
// Tus 0
if (Sutun2==0) {tus=0; tekrar[tus]++; tekrar[tus]=tekrar[tus]%5; while(!Sutun2){;}}
// Yazı okumayı bitirir.
if (Sutun3==0) {enter=0;while(!Sutun3){;}}
SatD=1;
}
}
////////////////////////////////////////////////////////////////////////////////////
// Karakterleri Yazdirilacak Diziye Ekleyen Fonksiyon //
///////////////////////////////////////////////////////////////////////////////////
yazial() large // Karakteri "yazilacakdizi" dizisine ekler.
{
for (satirelemani=0;satirelemani<6;satirelemani++)
yazilacakdizi[ dizidekikarakter ][satirelemani]
=karakterler [ (tus*5)+tekrar[tus] ][satirelemani];
}
/////////////////////////////////////////////////////////////////////////
// Yazilacak Karakteri Görüntüleme Fonksiyonu //
/////////////////////////////////////////////////////////////////////////
goster() large
{// Harflerin görünebilmesi için yazmayı tekrar eder.
for(yazmayitekraret=0;yazmayitekraret<2;yazmayitekraret++)
for (satirsay=0;satirsay<7;satirsay++) // Herbir satırı tek tek yazmak için.
{
reset=0; // Shift Register resetlenir.
reset=1;
// "yazilacakdizi" dizisindeki kaydırılacak yazıyı yazdirmak için.
for(satelm=0;satelm<(dizidekikarakter+1)*6;satelm++)
{// "yazilacakdizi" dizisinden, yazılacak satır bilgisi seçilir.
datas=yazilacakdizi[krkt][satelm]&gecsatirtarama;
clock=0; // Herbir Clock'ta hazır olan sütun elemanı,
clock=1; // Shift Register'da kayar.
}
// gecsatirtarama değişkeni kaçıncı satırın aktif olacağını ifade eder.
satirtarama=gecsatirtarama;
// Herbir yazmada ledlerin yandığının görünmesi için gecikme.
for(bekle=0;bekle<1;bekle++) {;}
// Bir sonraki satırın bilgisi hazırlanırken görünmemesi için satır silinir.
satirtarama=0x00;
gecsatirtarama=gecsatirtarama<<1; // Bir sonraki satıra geçilir.
// 7 Satır tarandıktan sonra, taramayı başa döndürür.
if (gecsatirtarama==0x80) gecsatirtarama=0x01;
if (sil==0)
{// En son alınmış karakteri "yazilacakdizi" dizisinden siler.
while (!sil) {;}
for(kar=0;kar<6;kar++) yazilacakdizi[dizidekikarakter][kar]=0;
// "dizidekikarakter" dizisi 1 eksiltilir.
if (dizidekikarakter!=0) dizidekikarakter--;
tus=0; // Tuş bilgisi sıfırlanır.
}
}
satirtarama=0x00; // Ekran her tarama sonunda temizlenir.
}
////////////////////////////////////////////////////////////////////////////////////////
//Matris LEDlere Gönderilecek Diziyi Olusturan Fonksiyon//
////////////////////////////////////////////////////////////////////////////////////////
tekbdizi() large // "esasyaz" dizisine 10 karakterlik boşluk bırakacak şekilde
//"yazilacakdizi" dizisinden "esasyaz" dizisine karakterleri aktarır.
{
for (krkt=9;krkt<karaktersayisi;krkt++)
for (kar=0;kar<6;kar++)
esasyaz[(krkt*6)+kar]=yazilacakdizi[krkt-9][kar];
// "esasyaz" dizisinin kullanılmamış yerlerine 0 atar.
for (kar=(krkt*6)+kar;kar<240;kar++) esasyaz[kar]=0;
}
//////////////////////////////////////////////////////////////////////
// Yaziyi Kaydirma Fonksiyonu //
//////////////////////////////////////////////////////////////////////
kaydir() large // Metni Yazar ve Kaydırır.
{
while (1)
{
for (krkt=0;krkt<60+(dizidekikarakter*6);krkt++)
// Harflerin görünebilmesi için yazmayı tekrar eder.
for(yazmayitekraret=0;yazmayitekraret<10;yazmayitekraret++)
for (satirsay=0;satirsay<7;satirsay++) // Herbir satırı tek tek yazmak için.
{// Shift Register resetlenir.
reset=0;
reset=1;
// esasyaz dizisindeki 60 sütun elemanını yazdirmak için.
for(satelm=0;satelm<60;satelm++)
{// esasyaz dizisinden, yazılacak satır bilgisi seçilir.
datas=esasyaz[krkt+satelm]&gecsatirtarama;
clock=0; // Herbir Clock'ta hazır olan sütun elemanı,
clock=1; // Shift Register'da kayar.
}
// gecsatirtarama değişkeni kaçıncı satırın aktif olacağını ifade eder.
satirtarama=gecsatirtarama;
// Herbir yazmada ledlerin yandığının görünmesi için gecikme.
for(bekle=0;bekle<1;bekle++) {;}
// Bir sonraki satırın bilgisi hazırlanırken görünmemesi için satır silinir.
satirtarama=0x00;
gecsatirtarama=gecsatirtarama<<1; // Bir sonraki satıra geçilir.
// 7 Satır tarandıktan sonra, taramayı başa döndürür.
if (gecsatirtarama==0x80) gecsatirtarama=0x01;
if (sil==0)
{// Diziler Silinir.
while (!sil) {;}
for(sifirla=0;sifirla<10;sifirla++) tekrar[sifirla]=0;
for(sifirla=0;sifirla<20;sifirla++)
for(kar=0;kar<6;kar++) yazilacakdizi[sifirla][kar]=0;
for(sifirla=0;sifirla<192;sifirla++) esasyaz[sifirla]=0;
rst=0; //Program Resetlenir.
rst=1;
}
}
}
}
//////////////////////////////////////////////////////////////////////
// ANA FONKSIYON //
//////////////////////////////////////////////////////////////////////
main() large
{
rst=1;
while(enter)
{
if (dizidekikarakter==20) break;
tusoku();
yazial();
goster();
}
tekbdizi();
kaydir();
Buradan anlaşılmayan tek şey işlemcinin çalışma hızı. Teorik olarak at89c51, at89c52 veya daha üstü kullanılabilir. Ama bu modellerin hızları belirttiğin işlemciye göre çok düşüktür.
Programda kullanılmış gibi görünmese de bu işlemcilerin içinde eeprom yok.
En önemli ayrım bacak sayısı olabilir....
Teşekkürler,birebir aynı işlemciyi bulup programı denesem çalışır mı bilemiyorum. Şemada keypad P2'den verilmiş,reset buton Dot matrix'i nereden sürüldüğüne dair bir bilgi yok, bir de 74164 entegresi kullanılmış.
Board'da kurup denemek istiyorum ama 74164 ile mcu bağlantısını çözebilmem gerekiyor.
main() large
Buradaki "large" deyiminin anlamı nedir ? Pic ve avr örneklerinde hiç görmemiştim. Genelde fonksiyon değer döndürmediği için void yazılırdı.
Kod bana ait değil , cevap verebilmek isterdim ama ben de birkaç sorum olduğu için yazdım kodu.
devrenin şemasını çıkarmak için uğraşıyorum ama beceremedim . bir çizim programında deneyimli olup orada nasıl yapılacağını anlatabilecek deneyimli birine duacı olacağım
şekil aşağıdaki gibi ama bağlantıları bir türlü beceremedim ben :
http://www.mcu-turkey.com/wp-content/uploads/2011/07/kayan-yaz%C4%B1.jpg (http://www.mcu-turkey.com/wp-content/uploads/2011/07/kayan-yaz%C4%B1.jpg)
yardımcı olursanız gerçekten çok sevineceğim
Açıkçası kodların tamamını incelemedim ama AT89C51RD2'de 64k kod belleği var, 89c55'de bile 20k, büyük programlar yazarsan veya kod belleğine lookup table koyarsan yetmiyor bu boyut.
Ayrıca AT89C51RD2'de 256byte RAM'e ek olarak 1k'nın üstünde ekstra ram var. Verdiğin program da 8 bit işlemci için o kadar verimsiz bir kod ki masaüstü uygulaması yazar gibi dünya kadar integer değişken kullanmış.
8x8'lik dot matrisleri shift registerlar ile pcb üzerine oturtmak hakikaten zahmetli. PIC ile yaptığım okul projesinde çift taraflı pcb kullanmak zorunda kalmıştım.
Benim önerim tarama mantığını öğrenip kendi kodunu yazman. Ayrıca 8x8'lik dot matris kullanma, şu an piyasada 20 pinlik bağlantı soketleri olan kayan yazı modülleri var. üzerlerinde 74hc245 ve 74hc595 ile yapılmış sürücüleri de hazır. tek yapman gereken kontrol sinyallerini göndermek.
Kolay gelsin.
Not : 89c51RD2'yi çoğu standart programlayıcı programlayamıyor, ben yurt dışından sipariş vermek zorunda kaldım.