16f84a'da a portlarını dijital çıkış yapmak için gere

Başlatan sanitarium, 23 Aralık 2007, 01:40:20

sanitarium

Ben hazır bir kayan yazı devresi yapmaya karar verdim ve
http://www.yavuzerol.com/dosyalar/kayan_yazi.pdf
deki linkteki projenin aynını yapmayı düşündüm fakat orda gösterilen 16f628a yerine elimdeki 16f84a'yı kullanmaya karar verdim ve pic c lite ile
ordaki kodun aynını yazdım
#include <pic.h>
#include <delay.c>

main(void)
{
//Değişken tanımlamaları
unsigned int i;
unsigned const char oklar[]={
0x08,0x0c,0xfe,0xff,0xfe,0x0c,0x08,0x00,
0x00,0x10,0x30,0x7f,0xFF,0x7f,0x30,0x10};

//port ayarlama işlemleri
TRISB=0; // PortB'nin hepsi çıkış
TRISA=0; // PortA'nin hepsi çıkış
CMCON=0x07; // PORTA sayısal giriş/çıkış
PORTB=0x00; // Başlangıçta LED'ler sönük

//16 adet satır verisini sırayla PORT'a gönder
for(;;){
	for(i=0;i<=15;i++){
	PORTB=oklar[i]; // Verileri PortB'ye gönder
	PORTA=i; // ilgili sütunu seç
	DelayMs(1); // 1ms bekle
}} 
}// Program sonu


(burdaki kod bir kayan yazı değil sabit bir yazı fakat benim soracağım soru bu kodda da yer almakta o yüzden kısa olanı koymayı tercih ettim)


şimdi sorum şudur ki ordaki a portlarını dijital yapmak için kullanılan CMCON=0x07 komutunu derleyici anlamamakta acaba bu 16f84a'ya çevirdiğim için mi böyle yoksa delayms kullanabilmek için ilk kullanımımda delah.h'ı kitaplığa eklediğim gibi bişey mi eklemem gerekiyordu... (bu cmcon komutunu hiç koymadan programı pice yolladığımda galiba çıkışlar analog olduğundan tüm ledler birden yanıyor...)

ve ikinci bir sorum da "unsigned const char oklar[]={
0x08,0x0c,0xfe,0xff,0xfe,0x0c,0x08,0x00,
0x00,0x10,0x30,0x7f,0xFF,0x7f,0x30,0x10};" daki 0x7f gibi şeylerin ne olduğu ve benim 12 gibi bir sayıyı o şekle çevirmek istediğimde nasıl çevirebileceğimle ilgili bir yol söylerseniz sevinirim (12 nin karşılığı 2lik tabanda 0110 olarak biliyorum fakat o diğer türün daha adını bile bilmiyorum...)

deserteagle

hocam bu cmcon 628 de bulunan comparatörü devre dışı bırakıp bu portayı dijita giriş yapar.zaten bildiğim kadarıyla analog çıkışa sahip pic yok.bu kodu yazmanıza gerek yok çünkü 84 a da zaten porta dijital dir yani trısa=0;trısb=0;yazmakla portların 2 sinide çıkış olarak ayarlamışssınız.bu şekilde kullanın.

deserteagle

unutmadan bu basamaklar arasının kolay yolu (a12) sayısı 16 tabanında yani sizin kodunuz gibi olsun bu sayıyı a 10 luk tabanda 10 olduğunu biliyoruz öyleyse 10*16^2+1*16+2=2576 onuk tabanda bulunur.biraz netten araştırın detaylı bilgiler çok var.ayrıca kendiniz mantığı kavradıktan sonra herhangi bir programlama dili ile kendi dönüşüm programınızı bişe yazarsınız.

sanitarium

Bilgiler için teşekkürler fakat ben de o şekilde dijitale çevirme diye bişey yoktur belki diye cmcon kullanmadan attığımda 76hc'ye tarama olarak tek tek çıkışlarını taraması gerekirken hepsini birden low yapıyo olmalı ki ben yaptığımda bir anda bütün ledler yanıyor dotmatrixteki...
ya da belki de hata orda değil fakat ben hatayı o şekilde algılıyorum burdaki hata başka da olabilir çünkü o şekilde düşününce direk hepsinin yanmaması gerekir diye düşünüyorum tekrar bir göz atarsanız sevinirim....
bir de evet a12=2576 gibi sayı olduğunu anladım (lisede bile taban aritmetiğinde öğretirlerdi bu tür şeyleri...) fakat yine o koddaki 0x7f gibi bişey neyi ifade ediyor ordaki seride 16 adet bu tür kod kullanılmış ve her birinin 2lik tabanda bi sayı ifade ettiğini anlıyorum ama mantığını anlayamıyorum da....

arslan74

Alıntı yapılan: "sanitarium"Ben hazır bir kayan yazı devresi yapmaya karar verdim ve
http://www.yavuzerol.com/dosyalar/kayan_yazi.pdf
deki linkteki projenin aynını yapmayı düşündüm fakat orda gösterilen 16f628a yerine elimdeki 16f84a'yı kullanmaya karar verdim ve pic c lite ile
ordaki kodun aynını yazdım
#include <pic.h>
#include <delay.c>

main(void)
{
//Değişken tanımlamaları
unsigned int i;
unsigned const char oklar[]={
0x08,0x0c,0xfe,0xff,0xfe,0x0c,0x08,0x00,
0x00,0x10,0x30,0x7f,0xFF,0x7f,0x30,0x10};

//port ayarlama işlemleri
TRISB=0; // PortB'nin hepsi çıkış
TRISA=0; // PortA'nin hepsi çıkış
CMCON=0x07; // PORTA sayısal giriş/çıkış
PORTB=0x00; // Başlangıçta LED'ler sönük

//16 adet satır verisini sırayla PORT'a gönder
for(;;){
	for(i=0;i<=15;i++){
	PORTB=oklar[i]; // Verileri PortB'ye gönder
	PORTA=i; // ilgili sütunu seç
	DelayMs(1); // 1ms bekle
}} 
}// Program sonu


(burdaki kod bir kayan yazı değil sabit bir yazı fakat benim soracağım soru bu kodda da yer almakta o yüzden kısa olanı koymayı tercih ettim)


şimdi sorum şudur ki ordaki a portlarını dijital yapmak için kullanılan CMCON=0x07 komutunu derleyici anlamamakta acaba bu 16f84a'ya çevirdiğim için mi böyle yoksa delayms kullanabilmek için ilk kullanımımda delah.h'ı kitaplığa eklediğim gibi bişey mi eklemem gerekiyordu... (bu cmcon komutunu hiç koymadan programı pice yolladığımda galiba çıkışlar analog olduğundan tüm ledler birden yanıyor...)

ve ikinci bir sorum da "unsigned const char oklar[]={
0x08,0x0c,0xfe,0xff,0xfe,0x0c,0x08,0x00,
0x00,0x10,0x30,0x7f,0xFF,0x7f,0x30,0x10};" daki 0x7f gibi şeylerin ne olduğu ve benim 12 gibi bir sayıyı o şekle çevirmek istediğimde nasıl çevirebileceğimle ilgili bir yol söylerseniz sevinirim (12 nin karşılığı 2lik tabanda 0110 olarak biliyorum fakat o diğer türün daha adını bile bilmiyorum...)

Merhaba,

Bu verdiğin kod eksik, bu kodlarla kayan yazı programı olmaz. Kodun tarama mantığı gösteren kod yok.
Ayrıcan senin PIC ve C bilgin cok zayıf. Kayan yazı projesine başladadan önce bu bilgilerini geliştir. Kullandığın PIC in datashhetlerini iyi incele hatta bazı yerlerini ezberle. Ayrıca C yi anladan Türkçe bir sürü kaynaklar var bu sitede yayınlanmıştı onları okyuyub C bilginizi gelişitebilirsiniz.

Selamlar

arslan74

Merhaba,

Kodu iyi incelememişsim. İyi bakınca tarama kısmını gördüm, yanlız burada 74154 entegresi kullanılmış. O yüzden bu tarama mantığı pek sağlıklı değil. Sistem gelişmeye müsait değil. Basit bir uygulama için yeterli. Yanlız gecişlerde ekranı kapatmadığı için karekterlerin yanında kücükte olsa yansıma olur.

Hex olarak gösterdiği şey aslında ekrana gözükecek olan şekillerdir. Onun binary formatında yazmış olsaydı. o zaman ekrana gözükecek, yazıları kodtada belli olurdu.

unsigned const char oklar[]={ 
0x08,0x0c,0xfe,0xff,0xfe,0x0c,0x08,0x00, 
0x00,0x10,0x30,0x7f,0xFF,0x7f,0x30,0x10};


Öyle değilde

unsigned const char oklar[]={ 

0b00001000,  // 0x08, 
0b00001100,  // 0x0c,
0b11111110,  // 0xfe,
0b11111111,  // 0xff,
0b11111110,  // 0xfe,
0b00001100,  // 0x0c,
0b00001000,  // 0x08,
0b00000000,  // 0x00, 
0b00000000,  // 0x00,
0b00010000,  // 0x10,
0b00110000,  // 0x30,
0b01111111,  // 0x7f,
0b11111111,  // 0xFF,
0b01111111,  // 0x7f,
0b00110000,  // 0x30,
0b00010000,  // 0x10
};


Yan baktığınızda 1 olan yerlerin yanan ledleri teşkil etiğini görürsünüz.
Ona göre şekiller cıkar ortaya.


Selamlar

sanitarium

Açıkçası pic bilgim pek yok sadece temel olarak biliyorum ve c bilgim de bilgisayarda bir kaç yaptığım uygulamadan ibaret ve evet orda 74hc154 entegresi kullanılarak ve porta=i koduyla tarama yapması istenmiş fakat ordaki i 1 olduğunda a portları için 0001, 2 olduğunda 0010 gibi gibi yolladığını gördüm...
Şu anda aslında amacım kayan yazı yapmak değil sadece sabit bir şekil ekrana çıkarmak o yüzden burdaki ok şeklinin nasıl yapıldığını görmek benim için yeterli olacak... sizce ordaki sorun ne olabilir? (çünkü birebir aynısını yaptım ve elimde tümü yanmakta olan bir dotmatrix var da)
bu arada vakit ayırıp yanıtlayan bilgi veren herkese teşekkürler...

sanitarium

0b00001000,  // 0x08,
0b00001100,  // 0x0c,
0b11111110,  // 0xfe,
0b11111111,  // 0xff,
0b11111110,  // 0xfe,
0b00001100,  // 0x0c,
0b00001000,  // 0x08,
0b00000000,  // 0x00,
0b00000000,  // 0x00,
0b00010000,  // 0x10,
0b00110000,  // 0x30,
0b01111111,  // 0x7f,
0b11111111,  // 0xFF,
0b01111111,  // 0x7f,
0b00110000,  // 0x30,
0b00010000,  // 0x10
};

ve ayrıca şeklinde yazdığın şey işime yarayacak teşekkür ederim =)

omenek

1ms bekledikten sonra PORTA yı tekrar sıfıra çek ve öğle dene.

arslan74

Alıntı yapılan: "omenek"1ms bekledikten sonra PORTA yı tekrar sıfıra çek ve öğle dene.

Bu cevabı tam olarak neye göre verdiğini bilemiyorum. Ancak PORTA yi sıfırlamak diye birşey söz konus değil. Yani PORTA sıfırlandığında 74hc154 sıfırıncı cıkışı aktif olur. Bu devrede mutlaka bir sütün secilmiş oluyor.

Ama söyle bir kod yazarsan daha mantıklı olur.

#include <pic.h> 
#include <delay.c> 

main(void) 
{ 

//Değişken tanımlamaları 
unsigned int i; 

unsigned const char 
oklar[]={ 
0b00001000, 
0b00001100, 
0b11111110,  
0b11111111,   
0b11111110,   
0b00001100,   
0b00001000,   
0b00000000,   
0b00000000,   
0b00010000,   
0b00110000,   
0b01111111,   
0b11111111,   
0b01111111,   
0b00110000,   
0b00010000,   
}; 

//port ayarlama işlemleri 
PORTB=0; // PortB'nin hepsi sıfır 
PORTA=0; // PortA'nin hepsi sıfır 
TRISB=0; // PortB'nin hepsi çıkış 
TRISA=0; // PortA'nin hepsi çıkış 
CMCON=0x07; // PORTA sayısal giriş/çıkış 
PORTB=0x00; // Başlangıçta LED'ler sönük 


//16 adet satır verisini sırayla PORT'a gönder 

for(;;){ 

   for(i=0;i<=15;i++){ 
   PORTA=i; // ilgili sütunu seç 
   PORTB=oklar[i]; // Verileri PortB'ye gönder 
   DelayMs(1); // 1ms bekle 
   PORTB=  0; // PortB'ye sıfırlar

}} 
}// Program sonu



Yani önce sütün secer sonrada satır yüklersen o zaman daha iyi olur. O zaman PROTB yi sıfırladığınızda tüm cıkışada sıfırlamış olursunuz.

Selamlar

sanitarium

hmm mantıklı bunu eve gittiğimde deneyeceğim ve o zaman sonucu yazarım teşekkürler...

isikyasar

arkadaşlar 16f84a nın porta.0 dan seri veri çıkışı yapıyorum..  porta.3 e led bağlamak istiyorum çalışmıyor.. analogdan dijitale çevirmek gerekiyormuş. yardımcı olabilirmisiniz...