Arkadaşlar Merhaba
P10 Panellerle uğraşıyorum. Ekranın kullanımı konusunda sıkıntım yok. Ekran için kütüphane yazacağım ama ekranın yapısını nasıl en verimlik şekilde kullanarak ekranın istediğim noktasına ulaşabilirim? Bu soruya cevaben biraz algortima önerisine ihtiyacım var.
Ekranın 16X32 olduğunu düşünürsek Kısaca amacım X ve Y kordinatını verdiğim yerdeki ledi yakmasını sağlamak.
Excel de bir tablo oluşturdum.
(http://s8.postimg.cc/d9kmspln9/Ekran_Al_nt_s.png) (http://postimg.cc/image/90fwqjidt/full/)
screenshot windows (http://postimg.cc/app.php)
iki boyutlu bir ram bölgesi ayırıp 16x4 bu ram alanındaki dataları sürekli ekrana yansıtmayı planlıyorum. Buraya kadar sıkıntım yok. Sorunum burdan sonra başlıyor. Bu ram bölgesini ekrana nasıl yerleştirmem uygun olur. Örneğin resimde sağdaki tabloda kafama göre bir yerleşim yaptım. Bu konuda sizin önerilerinizi almak isterim.
Bunu uygun şekilde başarırsam ikinci aşama olarak dediğim gibi ekranın belirlene kordinatındaki ledi yakmaya çalışacağım.
İyi çalışmalar
//Değişken tanımlama
unsigned int32 satir[16]; //16x32
//İşlev tanımlama
void yx(int8 y, int8 x)
{
bit_clear(satir[y],x); //y satırının x bitini sıfırla.
}
//İşlevin çağırılması
yx(8,32);
Daha sonra da make8 kullanarak 32 bitlik satır bilgisini byte olarak ilgili adreslere göndermek ve datayı basmak. En iyi böyle mi yapılır bilemiyorum ama bir fikir.
Display_Ram[] [] [] 3 boyutlu dizi belirler isen satır, sütun, renk şeklinde kullanımı daha kolay olabilir mi? yada 2 boyutlu olup sadece satır, sütun şeklinde de yapabilirsin.
Ekranda Renk yok.
Tabloyu farklı şekilde renklendirmemin amacı P10 panelin yapısından dolayı. A ve B ucları 00 iken kırmızı, 01 ise mavi, 10 ise yeşil 11 ise sarı satırlar aktif olur. Bunu belirtmek kafa karışıklığına sebeb olmamak için yaptım.
@Nedenler,
Hocam o ikinci aşamada yer alıyor.
Ekran tasarımı hakkında başka fikri olan var
evet şimdi farkettim belirttiğin adreslemede ikinci vektör, A ile B nin konumunu ifade ediyor sanırsam. ilk vektör de sırayla gitmiş kullanımı daha kolaylaştırmak için ilk vektörü iki parça şeklinde yatay düşey şeklinde düşünsek daha kolay kullanabilir miyiz diye düşündüm. çokta önemli değil gerçi sadece bir fikir olsun diye .
Bitirdim Çok Şükür
http://arectron.com/yazilim/p10-panel-kullanimi.html (http://arectron.com/yazilim/p10-panel-kullanimi.html)
Güzel olmuş ;)
Baya uğraşmışsınız ama güzel olmuş. Fontları da mı hazır kullandınız?
Hocam mikroe nin font creator programıyla dönüşüm yaptım. Ama karakterleri teker teker elden gecirip düzenlemek gerekiyor. Çünkü diyelim karakter boyutu 12x16 ise bu boyutta font ayarlamak çok uğraştırıcı. Bu sebeble 2. Ve 3 fontlarla tam olarak ilgilenenedim. Bi ara onlarda elden geçirecegim
P10 panelleri kullanması çok eğlenceli gerçekten. Özellikle düşen fiyatlarına bakılınca nerdeyse grafik lcd ile aynı fiyat. Bende bu paneller ile bir iki uygulama yapmıştım askerden önce, yaptığınız gibi bir program yapmayı planlamıştım ama vaktim olmadığından bu kadar kapsamlı yapamamıştım. Elinize sağlık hocam olmuş. Çok güzel olmuş ;)
Teşekkürler hocam :)
Paneller kullanım açısından cok pratik. Fiyat açısından da cok uygunlar.
Şimdi 2 adet paneli Stm32f103 ile kullanacağım.Vakit Buldukça ona uğraşıyorum. Panelleri çalıştırdım fakat spi clock hızı çok yüksek.(17-18 mhz)
Ekranda birşeyler çıkardığım zaman ekranın rastgele noktalarında bazı ledler cok kisa aralıklarla yanıp sönüyor.
Kutuphanede bir degisiklik yok. Spi clock hızında kaynaklandığını düşünüyorum.
Spi baudrate degeri 4 şuanda. Ben bu degeri 8 veya daha farklı bir deger yapsam bu sefer 32 bit data gonderme formatında gönderim yapılıyor (1 Byte için 8 den fazla clock palsi görüyorum. ) Şimdi bunu çözmeye çalışıyorum
Benim şöyle bir sıkıntım vardı.Örneğin ekrana düz bir yazı yazdırdık diyelim. Yazının 2 piksel üstünde tek sıra halinde sanki yazının silüetiymiş gibi ledler yarı parlaklıkta kırpışıyorlardı. Dediğiniz gibi clock hızı ile oynayarak onları yok etmeye çalışıyordum. Parlaklıkla da değişiyordu bazen. tek yada 2 panel kullandığımda yan yana sıkıntı olmuyordu ama bi ara 6 panel kullanmıştım baya zorlamıştı. Ne yaptıysam bir türlü kararlı bir düzen oturtamamıştım. Sonra dan öğrendim,parlaklığın ayarlandığı OE pini var biliyorsunuz kart üzerinde tarama yapan entegrenin output enanle pini idi yanlış hatırlamıosam,o pinin ayarı + ya da - yapılıyordu kendi TF serisi kontrol kartlarında, elimdeki bazı led grafiklerin ki + bazılarının ki de - olarak ayarlanıyormış. Bizim teknik bilgisi olmayan ithalatçı arkadaşlar bunu bana söylemedikleri için baya uğraşmıştım.
Buna ek olarak aynı şekilde rastgele noktalarda yanıp sönme sorunum da vardı o da dediğiniz gibi iletişim hızından kaynaklanıyor büyük ihtimal onu nasıl çözdüm hatırlamıyorum askerlik girince araya unutmuşum :(
17-18 mhz bence çok yüksek bir rakam bu panellere spi dan veri göndermek için...
bir kontrol kartında 3-4-5 mhz gibi opsiyonlar old. hatırlıyorum ama bu 6 mhz ve üstü değildi.
10mhz nin altında bir spi clock hızı kullanmak lazım.
Bazı parametreleri çözdüm. Mesela tarama süresi display parlaklığını çok etkiliyor. Spi clock hızının da uygun olanını bulursam donanımda pek problem kalmaz gibi.
Yazılımsal olarakta bazı eksiklikler var.
LAboratuvarımı topluyorum yavaş yavaş, çalışmaya başlayınca sizi rahatsız ederim yine hocam takıldığım yerlerde. bir de p10 lara alternatif p6 lar getirmeye başladılar şimdi. onlarda 16x64 piksel ve 96 x 384 mm, iki tane p10 u yanyana koyup pikseller arası boşluğu minimuma indirmişler. Küçük uygulamalar için çok güzel ve fontlar resimler daha güzel görünüyor.
Bir Sorum Olacak,
Satır kaydırma fonksiyonunu tümüyle değiştirdim
/*******************************************************************************
* Satir Kaydirma Fonksiyonu *
* Parameter: Line, clstart, clend, ZeroBit *
* Return: OwerFlow *
* Not: Bu Fonksiyon belirtilen satirin clstart ve clend parameteleri *
* ile verilen araliktaki ledleri bir bit sola kaydirir. *
*******************************************************************************/
BOOL LineScroll(uint8_t Line, uint8_t clstart, uint8_t clend, BOOL ZeroBit){
int i=0;
uint8_t y1=Line%4;
uint8_t y2=(Line/4)*8;
BOOL OwerFlow=0;
BOOL Carry=0;
ZeroBit=1-ZeroBit;
OwerFlow=(display_ram[((y2)+clstart)][y1]/128)&0x01; // Sol Taraftan Tasan bit aliniyor
for(i=clstart;i<clend+1;i++)
{
display_ram[((y2)+i)][y1] = display_ram[((y2)+i)][y1]<<1; //1 Bit Sola kaydir
if(i<7)
{
Carry=(display_ram[((y2)+(i+1))][y1]/128)&0x01; //Bir Sonraki Byte'in Tasan Bitini Carry'e yerlestir.
display_ram[((y2)+i)][y1]=(uint8_t)display_ram[((y2)+i)][y1] | Carry; //Carry'yi Bir Önceki Byte'in 0. bitine yerlestir Yerlestir
}
}
if(ZeroBit){ //Sag Taraftan Fonksiyona gönderilen bit ekleniyor..
display_ram[((y2)+clend)][y1]=(uint8_t)display_ram[((y2)+clend)][y1] | 0x01;
}else{
display_ram[((y2)+clend)][y1]=(uint8_t)display_ram[((y2)+clend)][y1] & 0xFE;
}
return OwerFlow; //Soldan Tasan Biti Geri gönder
}
Önceden yan yana bulunan 4 byte değişkeni birleştirip tek bir 32 bitlik değişken haline getiriyordum. Ardından bir bir sola kaydırıp tekrar 4 byte parçalıyordum.
Şimdi Yaptığım sistem biraz farklı çalışıyor. Her byte ı ayrı ayrı kaydırıp sağdaki byte dan taşan biti alıp soldakine veriyorum.
Kodlar çalışıyor fakat ufak bir problem var..
Örnekle açıklayayım
aşağıdaki kodda display_ram isimli dizinin ilgili byte'ını bir bit sola kaydırmışım.
display_ram[((y2)+i)][y1] = display_ram[((y2)+i)][y1]<<1;
Ardından kaydırılacak olan bir sonraki byte'ın 7. bitini alıp, bir önceki byte ın 0. bitine eklemek gerekiyor. Bunuda burada yapıyorum.
Carry=(display_ram[((y2)+(i+1))][y1]/128)&0x01;
display_ram[((y2)+i)][y1]=(uint8_t)display_ram[((y2)+i)][y1] | Carry;
Bundan sonra en son kaydırdığımız elemanın 0. bitine fonksiyona gönderilen bit ekleniyor. Oda burada yapılıyor.
if(ZeroBit){ //Sag Taraftan Fonksiyona gönderilen bit ekleniyor..
display_ram[((y2)+clend)][y1]=(uint8_t)display_ram[((y2)+clend)][y1] | 0x01;
}else{
display_ram[((y2)+clend)][y1]=(uint8_t)display_ram[((y2)+clend)][y1] & 0xFE;
}
P10 Paneli sürerken display_ram isimli dizi ekranın ram alanını temsil ediyor ve kesme ile sürekli ekrana yani ledlere yansıtılıyor. Bu P10panel üzerindeki ledler ise ortak anot olarak bağlı Yani 74595 lerin çıkışı lojik 0 olduğu zaman led yanıyor.
Sıkıntı şudur.
Biz örneğin display_ram isimli dizinin herhangi bir elemanını bir bit sola kaydırdığım zaman sağ taraftan 0 ekleniyordu. Eğer tam bu sırada sola kaydırdığım eleman alınıp ekrana gönderilirse sağ taraftan eklenen sıfır o bite denk gelen ledin yanmasına sebeb oluyor. Bu satır kaydırma fonksiyonunda hemen düzeltiliyor ama 800us aralıklarla kesme oluştuğu için aynı elemanın güncellenmesi 2.4ms sürüyor. Dolayısıyla o yanık kalan led 2.4 ms süreyle yanık kalmış oluyor. Göze çok çarpıyor.
Bu şekilde kurduğum mantık öncekine göre çok hızlı çalışıyor fakat bahsettiğim sorun yaşanıyor.
Bu dediğim sorunu nasıl önleyebilirim. Aklıma birşey gelmiyor ???
Kimsenin fikri yokmu?
Fonksiyon işini yapana kadar ekran güncellenmesin .
Aslında tarama işlemine karışmak istemiyorum. O kısım kendi başında iyi çalışıyor. Kapatıp açarak düzenini bozmayalım. Benim aklıma şöyle bir fikir geliyor
Her 4 kez kesme oluştuğunda ekrandaki bir byte lık alan güncelleniyor. Diğer 3 kesmede başka bölgeler güncelleniyor. Bende kesme sırasını takip edip her seferinde ekrana gönderilmeyen bölgeler üzerinde kaydırma yapayım diyorum. Nasıl yaparım bilmiyorum ama bi bakayım. Başka fikri olan varmı?
Akşam Akşam Esti yine :D Ufak birşeyler yapayım dedim.
STM32F103 ile P10 Panelde Bargraph Testi, Random sayılar basılıyor. Spectrum Analyser lere benzedi.
P10 Panel Test (http://www.youtube.com/watch?v=BYgNlNHWt-U#)
Güzel olmuş. Zaten bu panellerle standart işler yaparak para kazanma devri gecti, specific birşeyler yapmak gerek.
Alıntı yapılan: OG - 06 Ekim 2013, 01:04:07
Güzel olmuş. Zaten bu panellerle standart işler yaparak para kazanma devri gecti, specific birşeyler yapmak gerek.
Aynen öyle hocam. Panellerin kullanımı çok esnek. Güzel çözümler getiriyor.
s.a. merhabalar. mucit hocam üzerinden 1 sene geçmiş ama stm ile yaptığınız uygulamanın dosya paylaşımı var mı aceba? teşekkürler.
@Mucit23 Hocam;
Stm icin duzenlemiş olduğunuz kodu paylaşabilirmisiniz. Once Tek renkle test edip sonra dual renk icin duzenleyecem. ( picle RG icin duzenlemiştim )
Stm deki bilgilerimi unutmusum yeninden çalışmaya başladım. Timer vb.. arabirimlere yeniden göz atacam.
Hocam vereyim ama main kodlarını bulamadım. STM32 için aşağıdaki iki dosyayı düzenlemiştim. Timer rutinleri main.c dosyasında olacaktı. main dosyasını almamışım. Timer rutinlerini ve SPI rutinlerini yeniden yazmalısınız.
Font dataları da const unsigned char tipinde olacak.
P10_Panel_Driver.c
#include "stm32f10x.h"
#include "P10_Panel_Driver.h"
#include "SPI.h"
#include "PWM.h"
#include "systick.h"
#include "Font1.h"
#include "Font2.h"
#include "Font3.h"
#include "Font4.h"
uint8_t display_ram[32][4];
unsigned char Text[50];
void P10_Panel_Init(){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* Configure P10_Panel pins: A, B, OE and LATCH */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
SPI1_Init();
PWM_init();
}
void Write_Data(int row_adr){
uint8_t i=0,j=0;
uint8_t k=7,z=0;
while(k!=255) // Bu Döngü ileriye dogru sayarsa panel sagdan
{j=31-k; // Sola Dogru yüklenir.
for (i=0;i<4;i++) // Satirlar dolduruluyor..
{
SPI1_WriteByte(display_ram[j][row_adr]);
z=2;while(z!=0){z--;}
j-=8;
}
k--;
}
Set_LATCH;
i=50;while(i!=0){i--;}
Clr_LATCH;
}
void Panel_Test(void){
int x=0;
for(x=0;x<16;x++)
{
LineScroll(x,0,6,0);
}
}
/***********************Türkçe KArakterler burada ayrilir**********************/
int CharAdres(char c){
int adr=0;
switch(c)
{
case 'Ü':adr=96;break;
case 'Ö':adr=97;break;
case 'S':adr=98;break;
default:
adr=c-32;
break;
}
return adr;
}
/*******************************************************************************
* Satir Kaydirma Fonksiyonu *
* Parameter: Line, clstart, clend, ZeroBit *
* Return: OwerFlow *
* Not: Bu Fonksiyon belirtilen satirin clstart ve clend parameteleri *
* ile verilen araliktaki ledleri bir bit sola kaydirir. *
*******************************************************************************/
BOOL LineScroll(uint8_t Line, uint8_t clstart, uint8_t clend, BOOL ZeroBit){
int i=0;
uint8_t y1=Line%4;
uint8_t y2=(Line/4)*8;
BOOL OwerFlow=0;
BOOL Carry=0;
ZeroBit=1-ZeroBit;
OwerFlow=(display_ram[((y2)+clstart)][y1]/128)&0x01; // Sol Taraftan Tasan bit aliniyor
for(i=clstart;i<clend+1;i++)
{
if(i<7)
{
Carry=(display_ram[((y2)+(i+1))][y1]/128)&0x01; //Bir Sonraki Byte'in Tasan Bitini Carry'e yerlestir.
display_ram[((y2)+i)][y1] = display_ram[((y2)+i)][y1]<<1; //1 Bit Sola kaydir
display_ram[((y2)+i)][y1]=(uint8_t)display_ram[((y2)+i)][y1] | Carry; //Carry'yi Bir Önceki Byte'in 0. bitine yerlestir Yerlestir
}
else
{
display_ram[((y2)+i)][y1] = display_ram[((y2)+i)][y1]<<1; //1 Bit Sola kaydir
}
}
if(ZeroBit){ //Sag Taraftan Fonksiyona gönderilen bit ekleniyor..
display_ram[((y2)+clend)][y1]=(uint8_t)display_ram[((y2)+clend)][y1] | 0x01;
}else{
display_ram[((y2)+clend)][y1]=(uint8_t)display_ram[((y2)+clend)][y1] & 0xFE;
}
return OwerFlow; //Soldan Tasan Biti Geri gönder
}
/*******************************************************************************
* Ekran Temizleme Fonksiyonu *
* Parameter: fill *
* Return: *
*******************************************************************************/
void Clear_Display(BOOL fill){
uint8_t i=0,j=0,fdata=0;
if (fill){
fdata=0x00;
}else{
fdata=0xFF;
}
for (i=0;i<4;i++)
{
for (j=0;j<32;j++)
{
display_ram[j][i]=fdata;
}
}
}
/*******************************************************************************
* Ekran Tersleme Fonksiyonu *
* Parameter: *
* Return: *
*******************************************************************************/
void invert_screen(void){
uint8_t i=0,j=0;
for(i=0;i<4;i++)
{
for(j=0;j<32;j++)
{
display_ram[j][i] =~ display_ram[j][i]; //Önbellekteki deger degillenip geri yaziliyor
}
}
}
/*******************************************************************************
* Pixel Fonksiyonu *
* Parameter: Xpos, Ypos, fill *
* Return: *
*******************************************************************************/
void PutPixel(uint8_t Xpos,uint8_t Ypos, BOOL fill)
{
uint8_t y1=0,x1=0;
uint8_t y2=0,x2=0;
uint8_t temp=0;
y1 = Ypos%4;
y2 = Ypos/4;
x1 = Xpos%8;
x2 = Xpos/8;
if(fill) //Nokta Koy
{
temp=display_ram[(y2*8)+x2][y1]; //Ram'deki deger ön bellege aliniyor.
display_ram[(y2*8)+x2][y1] = (temp & (255-(128>>x1))); //x'inci bit 0 yapilir
}
else //Noktayi Sil
{
temp=display_ram[(y2*8)+x2][y1]; //Ram'deki deger ön bellege aliniyor.
display_ram[(y2*8)+x2][y1] = (temp | (128>>x1)); //x'inci Bit 1 yapilir
}
}
/*******************************************************************************
* Pixel Okuma Fonksiyonu *
* Parameter: Xpos, Ypos *
* Return: value *
*******************************************************************************/
BOOL GetPixel(uint8_t Xpos, uint8_t Ypos){
uint8_t y1=0,x1=0;
uint8_t y2=0,x2=0;
uint8_t temp=0;
BOOL value=0;
y1 = Ypos%4;
y2 = Ypos/4;
x1 = Xpos%8;
x2 = Xpos/8;
temp=display_ram[(y2*8)+x2][y1]; //Ram'deki deger ön bellege aliniyor.
value=1-(0x80 & temp<<x1)/128; //Ram adresindeki bit geri gönderiliyor
return value;
}
/*******************************************************************************
* Çizgi Çizme Fonksiyonu *
* Parameter: x1, x2, y1, y2, fill *
* Return: *
*******************************************************************************/
void Line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, BOOL fill)
{
signed int addx=1, addy=1, P;
signed int i, dy, dx, diff;
if(x2>x1)
{
dx = x2 - x1;
}else{
dx = x1 - x2;
addx = -1;
}
if(y2>y1)
{
dy = y2 - y1;
}else{
dy = y1 - y2;
addy = -1;
}
if(dx >= dy)
{
dy *= 2;
P = dy - dx;
diff = P - dx;
for(i=0; i<=dx; i++)
{
PutPixel(x1, y1, fill);
if(P < 0)
{
P += dy;
x1 += addx;
}
else
{
P += diff;
x1 += addx;
y1 += addy;
}
}
}
else
{
dx *= 2;
P = dx - dy;
diff = P - dy;
for(i=0; i<=dy; ++i)
{
PutPixel(x1, y1, fill);
if(P < 0)
{
P += dx;
y1 += addy;
}
else
{
P += diff;
x1 += addx;
y1 += addy;
}
}
}
}
/*******************************************************************************
* Dikdörtgen Çizme Fonksiyonu *
* Parameter: x1, x2, y1, y2, fill *
* Return: *
*******************************************************************************/
void Rectangle(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, BOOL fill)
{
uint16_t i, xmin, xmax, ymin, ymax;
if(fill)
{
if(x1 < x2)
{
xmin = x1;
xmax = x2;
}
else
{
xmin = x2;
xmax = x1;
}
if(y1 < y2)
{
ymin = y1;
ymax = y2;
}
else
{
ymin = y2;
ymax = y1;
}
for(; xmin <= xmax; ++xmin)
{
for(i=ymin; i<=ymax; ++i)
{
PutPixel(xmin, i, 1);
}
}
}
else
{
Line(x1, y1, x2, y1, 1);
Line(x2, y1, x2, y2, 1);
Line(x2, y2, x1, y2, 1);
Line(x1, y2, x1, y1, 1);
}
}
/*******************************************************************************
* Çember Cizme Fonksiyonu *
* Parameter: x, y, Size, fill *
* Return: *
*******************************************************************************/
void Circle(uint8_t x, uint8_t y, uint8_t size, BOOL fill)
{
signed int a,b,P;
a=0;
b=size;
P=1-size;
do
{
if(fill)
{
Line(x-a, y+b, x+a, y+b,1);
Line(x-a, y-b, x+a, y-b,1);
Line(x-b, y+a, x+b, y+a,1);
Line(x-b, y-a, x+b, y-a,1);
}
else
{
PutPixel(a+x, b+y,1);
PutPixel(b+x, a+y,1);
PutPixel(x-a, b+y,1);
PutPixel(x-b, a+y,1);
PutPixel(b+x, y-a,1);
PutPixel(a+x, y-b,1);
PutPixel(x-a, y-b,1);
PutPixel(x-b, y-a,1);
}
if(P < 0)
P+= 3 + 2*a++;
else
P+= 5 + 2*(a++ - b--);
}while(a<=b);
}
/*******************************************************************************
* Bargraph Çizme Fonksiyonu *
* Parameter: x1, y1, x2, y2, Mode, Value *
* Return: *
*******************************************************************************/
void Bargraph (uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, BOOL hor, uint8_t value)
{
uint8_t w=0;
uint8_t h=0;
uint8_t a=0,b=0;
uint16_t barval=0;
if(x1>x2) w=x1-x2;
if(x1<x2) w=x2-x1;
if(y1>y2) h=y1-y2;
if(y1<y2) h=y2-y1;
if(value>100)value=100;
if(hor) //Bar Dikey Olarak Olusturulacak
{
barval=((int16_t)value*h)/100;
for (a=0;a<h+1;a++)
{
for(b=0;b<w+1;b++)
{
if(barval>=a){
PutPixel(x1+b,15-a+y1,1);
}else{
PutPixel(x1+b,15-a+y1,0);
}
}
}
}else{ //Bar Yatay olarak Olusturulacak
barval=((int16_t)value*w)/100;
for (a=0;a<w+1;a++)
{
for(b=0;b<h+1;b++)
{
if(barval>=a)
{
PutPixel(x1+a,y1+b,1);
}else{
PutPixel(x1+a,y1+b,0);
}
}
}
}
}
/*******************************************************************************
* Karakter Basma Fonksiyonu Font1 *
* Parameter: x, y, char, Fill *
* Return: *
*******************************************************************************/
void DrawCharFont1(unsigned int x, unsigned int y, unsigned char c, BOOL fill){
unsigned int a=0,b=0;
unsigned int cdata=0;
for(b=0;b<5;b++)
{
cdata=Font_5x7[c-32][b];
for(a=0;a<8;a++)
{
PutPixel(x+b,y+a,(fill-(cdata>>a) & 0x01));
}
}
}
/*******************************************************************************
* Karakter Basma Fonksiyonu Font2 *
* Parameter: x, y, char, Fill *
* Return: *
*******************************************************************************/
void DrawCharFont2(unsigned int x, unsigned int y, unsigned char c, BOOL fill){
unsigned int a=0,b=0;
unsigned int cdata=0;
for(b=0;b<16;b=b+2)
{
cdata=Font_8x12[c-32][b];
for(a=0;a<8;a++)
{
PutPixel(x+(b/2),y+a,(fill-(cdata>>a) & 0x01));
}
cdata=Font_8x12[c-32][b+1];
for(a=0;a<4;a++)
{
PutPixel(x+(b/2),y+8+a,(fill-(cdata>>a) & 0x01));
}
}
}
/*******************************************************************************
* Karakter Basma Fonksiyonu Font3 *
* Parameter: x, y, char, Fill *
* Return: *
*******************************************************************************/
void DrawCharFont3(unsigned int x, unsigned int y, unsigned char c, BOOL fill){
unsigned int a=0,b=0;
unsigned int cdata=0;
for(b=0;b<24;b=b+2)
{
cdata=Font_12x14[c-32][b];
for(a=0;a<8;a++)
{
PutPixel(x+(b/2),y+a,(fill-(cdata>>a) & 0x01));
}
cdata=Font_12x14[c-32][b+1];
for(a=0;a<6;a++)
{
PutPixel(x+(b/2),y+8+a,(fill-(cdata>>a) & 0x01));
}
}
}
/*******************************************************************************
* Text Basma Fonksiyonu Font4 *
* Parameter: x, y, char, Fill *
* Return: *
*******************************************************************************/
void DrawCharFont4(unsigned int x, unsigned int y, unsigned char c, BOOL fill){
unsigned int a=0,b=0;
unsigned int cdata=0;
unsigned int cadr=0;
cadr=CharAdres(c); //Türkçe Karakterler Belirleniyor.
for(b=0;b<24;b=b+2)
{
cdata=Font_12x16[cadr][b];
for(a=0;a<8;a++)
{
PutPixel(x+(b/2),y+a,(fill-(cdata>>a) & 0x01));
}
cdata=Font_12x16[cadr][b+1];
for(a=0;a<8;a++)
{
PutPixel(x+(b/2),y+8+a,(fill-(cdata>>a) & 0x01));
}
}
}
/*******************************************************************************
* Text Basma Fonksiyonu *
* Parameter: x, y, size, fill *
* Return: *
*******************************************************************************/
void ShowString(uint8_t x, uint8_t y, uint8_t size, BOOL fill, unsigned char *s){
unsigned int clm=x,row=y;
BOOL exit=0;
while(*s!='\0')
{
switch(size)
{
case 1: //1. Font Secili ise
if(clm+5>WIDTH) //Satir sonuna gelindimi Bir Alt Satira Geç
{
clm=0;
row=row+8;
if(row+8>HEIGHT+1) exit=1;
}
DrawCharFont1(clm, row, *s, fill);
clm=clm+6;
break;
case 2:
if(clm+8>WIDTH) exit=1; //Satir sonuna gelindimi döngüden çik
DrawCharFont2(clm, row, *s, fill);
clm=clm+8;
break;
case 3:
if(clm+12>WIDTH) exit=1;//Satir sonuna gelindimi Bir Alt Satira Geç
DrawCharFont3(clm, row, *s, fill);
clm=clm+12;
break;
case 4:
if(clm+12>WIDTH) exit=1;//Satir sonuna gelindimi Bir Alt Satira Geç
DrawCharFont4(clm, row, *s, fill);
clm=clm+12;
break;
default: break;
}
s++; //Karakter adresini Arttir
if(exit) break; //Döngüden çikis biti
}
}
/*******************************************************************************
* Text Kaydirma Fonksiyonu *
* Parameter: clstart, clend, ypos, size, fill *
* Return: *
*******************************************************************************/
void TextScroll(uint8_t clstart, uint8_t clend, uint8_t ypos, uint8_t speed, uint8_t size, BOOL fill, unsigned char *s){
unsigned int a=0,b=0;
unsigned int cdata=0;
unsigned int delay=110-(speed*10);
unsigned int cadr=0;
BOOL ZeroBit=0;
while(*s!='\0')
{
switch(size)
{
case 1:
for(b=0;b<5;b++)
{
cdata=Font_5x7[*s-32][b];
for (a=0;a<8;a++) //
{
ZeroBit=fill-(cdata>>a) & 0x01;
LineScroll(ypos+a,clstart,clend,ZeroBit);
}
delay_ms(delay);
}
for (a=0;a<8;a++) //Harf Arasi Bosluk ekleniyor..
{
LineScroll(ypos+a, clstart, clend, 0);
}
delay_ms(delay);
break;
case 2:
for(b=0;b<16;b=b+2)
{
cdata=Font_8x12[*s-32][b];
for(a=0;a<8;a++)
{
ZeroBit=fill-(cdata>>a) & 0x01;
LineScroll(ypos+a, clstart, clend, ZeroBit);
}
cdata=Font_8x12[*s-32][b+1];
for(a=0;a<4;a++)
{
ZeroBit=fill-(cdata>>a) & 0x01;
LineScroll(ypos+8+a, clstart, clend, ZeroBit);
}
delay_ms(delay);
}
break;
case 3:
for(b=0;b<24;b=b+2)
{
cdata=Font_12x14[*s-32][b];
for(a=0;a<8;a++)
{
ZeroBit=fill-(cdata>>a) & 0x01;
LineScroll(ypos+a, clstart, clend, ZeroBit);
}
cdata=Font_12x14[*s-32][b+1];
for(a=0;a<6;a++)
{
ZeroBit=fill-(cdata>>a) & 0x01;
LineScroll(ypos+8+a, clstart, clend, ZeroBit);
}
delay_ms(delay);
}
break;
case 4:
cadr=CharAdres(*s);
for(b=0;b<24;b=b+2)
{
cdata=Font_12x16[cadr][b];
for(a=0;a<8;a++)
{
ZeroBit=fill-(cdata>>a) & 0x01;
LineScroll(a, clstart, clend, ZeroBit);
}
cdata=Font_12x16[cadr][b+1];
for(a=0;a<8;a++)
{
ZeroBit=fill-(cdata>>a) & 0x01;
LineScroll(8+a, clstart, clend, ZeroBit);
}
delay_ms(delay);
}
break;
}
s++; //Sonraki Karakteri al..
}
}
void NumberToUpScroll(uint8_t oldnumber, uint8_t newnumber)
{
}
#include "main.h"
/*********************************Pin Tanimlamalari******************************/
#define Set_A GPIOA->BSRR = 0x00000002;
#define Clr_A GPIOA->BRR = 0x00000002;
#define Set_B GPIOA->BSRR = 0x00000004;
#define Clr_B GPIOA->BRR = 0x00000004;
#define Set_OE GPIOA->BSRR = 0x00000008;
#define Clr_OE GPIOA->BRR = 0x00000008;
#define Set_LATCH GPIOA->BSRR = 0x00000010;
#define Clr_LATCH GPIOA->BRR = 0x00000010;
/********************************************************************************/
#define Font1H 8
#define Font2H 12
#define Font3H 14
#define Font4H 16
#define RIGHT 0 //
#define LEFT 1 //
#define WIDTH 63
#define HEIGHT 15
/****************************Fonksiyonlar***************************************/
extern void P10_Panel_Init (void);
extern void Write_Data (int row_adr);
extern void Panel_Test (void);
extern BOOL LineScroll (uint8_t Line, uint8_t clstart, uint8_t clend, BOOL ZeroBit);
extern void Clear_Display (BOOL fill);
extern void invert_screen (void);
extern void PutPixel (uint8_t Xpos, uint8_t Ypos, BOOL fill);
extern BOOL GetPixel (uint8_t Xpos, uint8_t Ypos);
extern void Line (uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, BOOL fill);
extern void Rectangle (uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, BOOL fill);
extern void Circle (uint8_t x, uint8_t y, uint8_t size, BOOL fill);
extern void Bargraph (uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, BOOL hor, uint8_t value);
extern void ShowString (uint8_t x, uint8_t y, uint8_t size, BOOL fill, unsigned char *s);
extern void TextScroll (uint8_t clstart, uint8_t clend, uint8_t ypos, uint8_t speed, uint8_t size, BOOL fill, unsigned char *s);
extern void NumberToUpScroll (uint8_t oldnumber, uint8_t newnumber);
/****************************Global Degiskenler*********************************/
/*******************************************************************************/
//PinA GPIOA.1
//PinB GPIOA.2
//PinOE GPIOA.3
//PinLatch GPIOA.4
//PinSCK GPIOA.5
//PinDTA GPIOA.7
//PWM GPIOB.0
Merhaba,
Panel p10 nasıl 4 parçaya kadar?
Metin nasıl çalışır hale getirilir.
@Mucit23 Merhaba sizin yapmış olduğunuz p10 panel kütüphanesini 2 panel ile kullanıyorum normal text basabiliyorum sıkıntı yok fakat text i kaydıramıyorum anlamsız ledler yanıyor ne gibi değişiklik gerekiyor kütüphanenizde çözümü nedir yardımcı olursanız sevinirim.
güncel.
LineScroll ve text kaydırma fonksiyonlarınıda düzenlemeniz gerekecektir.
stm32 için kullandığınız kaydırma fonksiyonunu pic18 için kullanmak istedim fakat çalışmadı ilk 3 satırda anlamsız ledler kayıyor linescroll ve text kaydırma fonksiyonlarında nasıl bir düzenleme gerekli örnek ile açıklayabilirmisiniz.
Aslında yarını beklerseniz bu kütüphanenin yeni versiyonunu paylaşacağım. Kütüphanede bayağı iyileştirmeler yaptım. Panel sayısı girilerek kütüphanenin kendini configüre edebilmesi için birçok düzenleme yaptım. Font dosyaları text basma kaydırma fonksiyonlarını yeniden yazdım. Bu dediğim değişiklikleri gerçi bayadır yapmışım Yazı yazmam lazım ama vakit bulamıyorum. Yarın paylaşmaya çalışacağım.
Anladım yarını merakla bekliyorum.2 gündür uğraşıyorum kaydırma mantığıyla ilgili bir arpa boyu ilerleyemedim bunaltmıştı beni.kaydırma mantığınıda ayrıntılı anlatabilirseniz çok iyi olur.
@Mucit23 kütüphane ne durumda paylaşabilicekmisiniz ?
https://www.picproje.org/index.php/topic,69924.msg536751/topicseen.html#msg536751
Ben başarıyla iki panel oluşturduk. Nasıl böyle bir DMD kütüphane oluşturmak için? Bu yüzden bir anda birden animasyonlar görüntüleyebilir.
Sorry if bad in turkish, because i am from Indonesia,
example marquee text :
https://github.com/ninjablocks/arduino/blob/master/DMD/DMD.cpp
https://github.com/freetronics/DMD2/blob/master/DMDFrame.cpp
example : https://www.youtube.com/watch?v=Op6ovu7J67Y
@nobitaemon arkadaşımızın yayınladığı video gerçekten orijinal olmuş.Yatayda 3 panel olarak dikeyde ise sanırım tek panel.İstediği bölgeye istediği veriyi yazdırıp birde animasyonlu göstermesi takdire şayan.Bu tarz bir kütüphaneyi pic için oluştursak el birliği ile birçok kullanım alanı olur diye tahmin ediyorum.
Son mesajlar Ekim 2017 olmasından dolayı sorumu burada sorayım yeni konu açmayım diye düşündüm.
Led panel'e arapça yazı yazdırmak istiyorum.
Çeşitli araştırmalar yaptım UTF-8'e baktım ama aklım bir türlü almadı.
Arapça yazıyı basabilmem için hangi C kütüphanelerini kullanmalıyım ?
set_locale fonksiyonunda değişikliği yapsam etkisi olacak mı ?
UTF-8 tablosuna bakıyorum arapça harfler yok, nasıl bir dönüşüm olacak ?
Araştırdım sanırım her arapça harfi 4 byte ile temsil edeceğim, kimi yerde wprintf kullanacağım söyleniyor.
Aklımın almaması koyucağım string mi arapça olacak yoksa ben byte byte koyup göndericem mi anlayamadım bu işi nasıl yaparım nasıl led panel'e arapça yazarım.
Bir karakter tablosu olacak elbet. Ama Normal Latin alfabesindeki gibi her karakter ayrı ayrımı kaydediliyor. Arapça nın yapısını iyi bilmek lazım.
Güzel konu asında. Mesela Sabit bir Arabic String keil den nasıl gireriz?
Keili geçtim hocam direk C bazında ne yapılabilir ? Bunun bir kütüphanesi yok mudur ? Sonuçta led panele arapça yazı basanlar var mutlaka bir kütüphane bulunuyordur diye düşünüyorum
Konu üzerinden uzun bir süre geçmiş ama şu anda p10 paneli stm32 ile sürmeye çalışıyorum acaba Ferhat Bey kütüphaneyi bitirdiyseniz paylaşma imkanınız var mıdır?
İyi forumlar