Hi-Tech hakkında bir kaç soru...

Başlatan Logan, 03 Haziran 2007, 15:03:17

Logan

Merhaba arkadaşlar. Yaklaşık 1 aydır Hi-Tech ile Hi-Tide kullanıyorum ve gayet memnunum. Fakat çözemediğim ve içerisinden çıkamadığım birkaç sorun var.Birincisi program içerisinde değişken tanmılarının önüne konan "static" ve "volatile" ne işe yarıyor?

Örnek; unsigned char a; yerine
          static unsigned char a; ya da volatile unsignec char;

İkinci sorum ise varsayalım ki birisi bizden 320*240 grafik lcd kullanmamızı, ekranda sadece 1 adet grafik göstermemizi istediğini ve maliyet son derece önemli olduğu için kesinlikle eprom vs kullanmamızı istemediğini söyledi.Bizde müşterinin isteklerine uyup programı yazmaya başladık.İşlemci olarak 16F877 kullandık.Şimdi asıl sorumuza gelelim.Ekranda tam görüntü oluşturmak için 9600 byte'a ihtiyacımız olduğuna göre bu byteları programa nasıl adapte ederiz???Mesela Pic Basic'te lookup komutu ile hallolunabilir.ASM'de ise RETLW kullanarak bütün dataları girebilirsiniz.Fakat C'de görüntünün datalarını bir dizine mal etmeden sadece program hafızasına nasıl gömebiliriz.???
Örnek; BASIC ile =>  lookup a,[25,45,78,12,32,2,7,69,78],b
          ASM ile => ADDWF PCL,1
                           RETLW 25
                           RETLW 65
                           RETLW 93 vs.vs.

Not: Huffman kodlama yöntemini biraz araştırdım.Öğrenmek istediğimin bununla pek alakası yoktur... :)

Üçüncü ve son sorum ise BASIC'te;

on-off_led var led_reg.0
start_led   var led_reg.1
motor_led var led_reg.2

gibi değişkenin bitlerine atamalar yapabiliyoruk.C'de bunu nasıl yapabiliriz? İyi günler, iyi çalışmalar...
İmza.

emrahmrcn

Merhabalar ,hi-tech için kendimce yapmış olduğum bir danışma notum var belki yardımcı olur. İYİ ÇALIŞMALAR

http://www.emr-systems.net/test/GENEL_C.pdf
Benim yaradılışımda bir ayrıcalık varsa o da TÜRK olmamdır. M.K ATATÜRK

arslan74

Merhaba,

Alıntı YapMesela Pic Basic'te lookup komutu ile hallolunabilir.ASM'de ise RETLW kullanarak bütün dataları girebilirsiniz.Fakat C'de görüntünün datalarını bir dizine mal etmeden sadece program hafızasına nasıl gömebiliriz.???
Örnek; BASIC ile => lookup a,[25,45,78,12,32,2,7,69,78],b
ASM ile => ADDWF PCL,1
RETLW 25
RETLW 65
RETLW 93 vs.vs.


senin bahs ettiğin const türünden dizilerdir.

Normal dizilerin başına const yazarsan istediğin olay gercekleşmiş olur.


Alıntı Yap

Merhaba arkadaşlar. Yaklaşık 1 aydır Hi-Tech ile Hi-Tide kullanıyorum ve gayet memnunum. Fakat çözemediğim ve içerisinden çıkamadığım birkaç sorun var.Birincisi program içerisinde değişken tanmılarının önüne konan "static" ve "volatile" ne işe yarıyor?

Örnek; unsigned char a; yerine
static unsigned char a; ya da volatile unsignec char;

unsigned char a;   // ( işaretsiz 8 bit sayı anlamına gelir ).

static unsigned char a;   // ( işaretsiz 8 bit sayı anlamına gelir ).
Ancak static deyimi bu değişkene özel anlam katar.
Eğer bu değişkeni global alanda tanıtmışsan o zaman bu değişken sadece bu sayfada bilinir ve kullanılabilir.

Eğer bunu bir blok içerinde bildirmişsen o zaman bunların ömürleriyle ilgili oluyor. Bu değişken global değişken gibi bilgisini programın sonua kadar tutuyor. Ancak Blok dışında ulaşımına izin vermez.

volatile anlamıda bir değişkenin bir kaç kaynak tarafından kullanıldığı anamındadır. Mesela bir değişkeni normal program içerisinde ve interrupt atında kullanacağın zaman yazarsın. Pek sık kullanılan bir komut değil.

Selamlar

Logan

İşte doyurucu cevap :) @arslan74, bu iki soruya gerçekten anlaşılır ve açıklayıcı cevaplar verdiniz.Çok yardımcı oldu.Peki 3. soru hakkında bir bilginiz yok mu acaba???
İmza.

arslan74

Merhaba,

Basic bilmediğin için bu yazdıkların ne anlama geldiğini tam bilmiyorum.
Ama anladığım kadarıyla acıklamaya çalışayım.

Pic'in bazı bacaklarını özel amaçlar için kullaniyorsan. örneğin Buzzer, led v.b. elemanlar bağladın. Led'i RB7 ye Buzzeri RB6 pinlerine bağladık. O zaman bunları aşağıdaki gibi tanımlayabiliriz.

static	bit	BUZZER		@ (unsigned)&PORTB*8+3;	// use this bit to 

	static	bit	LED   	@ (unsigned)&PORTB*8+7;	// use this bit to


Yada bazı bacakları direkt tanımlaya bilirsin.

Örneğin.

#define BUZZER	RB7

#define LED	RB6

#define AC	1

#define KAPA	0


RB6 ve RB7 önceden tanımlı olduğu için bu şekilde de kullanabilirsin.

O zaman şöyle yazabilirsin.

BUZZER = AC;

LED = KAPA;


Selamlar.

Logan

@arslan74, bahsettiğin konuyu biliyorum ve kullanıyorum fakat benim merak ettiğim pic içerisinde herhangi bir registere değilde (porta, portb vs.vs.) kendi oluşturduğumuz bir değişkenin bitlerine isim vermektir. Mesela a registerinin 0. bitine A1, 1. bitine A2, 2. bitine A3 gibi isimler verilebilir mi?
İmza.

arslan74

Merhaba,

Alıntı Yap
Mesela a registerinin 0. bitine A1, 1. bitine A2, 2. bitine A3 gibi isimler verilebilir mi?

Evet verilebilir, ancak bu soru Hi-Tech daha ziyade Standart C genel konuları, o yüzden Standart C de nasıl yapılıyorsa aynı şekilde da yapılabilir.

Sana link veriyorum bu dökümanda aradığın bütün bilgiler var.

http://rapidshare.com/files/35216573/CFull3_1.pdf.html

Selamlar

Elektron74

@arslan74
Hocam, verdiğin C dökümanının şifresi nedir ? Verirmisiniz?
Yarın; yorgun kimselerin değil rahatlarına kıyabilenlerindir.

arslan74

Merhaba,


Şifre:  cdernek



Selamlar

M_B

Merhaba arkadaslar hayırlı cumalar;
Oncelıkle herkese kolay gelsın. Nette satır taramaya ornek bır kayan yazı programı ararken HiTec C ile yazılmıs ufak bır program buldum ıncelemeye basladım. Ve porogramda sadece kafamı karıstıran ve anlamayamadıgım bır  kısım var bu konuda sızlerden yardım ıstıyorum.
anlayamadıgım komut kısmı  burası.
COL_DATA = ~(dsp_buf[14-j]>>(7-i));
  ~(dsp_buf[14-j]>>(7-i)); bu kısmı ınceledıgımde  sonuc 1 ve 0 dan bazen buyuk cıkıyor. ( ornegın 4 gibi ) COL_DATA ise 74hc595 ın bilgi girisine baglı 1 ve 0 dan farklı rakam cıktıgında veri nasıl gonderılıyor. Birde bu programda neden satır numarası degısınce kaydırma sayısıda degısıyor.





[code]#include <pic.h>
#include "delay.h"
#define COL_RESET RB0    // Reset clock 74HC595 (SRCLR)
#define COL_SHIFT RB1     // Shift clock 74HC595 (SRCLK)
#define COL_LATCH RB2    // Latch clock 74HC595 (RCLK)
#define COL_ENABLE RB3     // Enable output 74HC595 (G)
#define COL_DATA RB5       // Data input 74HC595 (SER)
#define ROW_ENABLE RB4    // Enable 4017 (ENA)
#define ROW_RESET RB6     // Reset 4017 (RST)
#define ROW_DATA RB7       // Clock input 4017 (CLK)
main(void)
int i,j;
unsigned char dsp_buf[15];         // dsp_buf[n] for column n+1 (ignore the LSB)
dsp_buf[0] = 0b10001000;
dsp_buf[1] = 0b01000100;
dsp_buf[2] = 0b00100010;
dsp_buf[3] = 0b00010001;
dsp_buf[4] = 0b10001000;
dsp_buf[5] = 0b01000100;
dsp_buf[6] = 0b00100010;
dsp_buf[7] = 0b00010000;
dsp_buf[8] = 0b10001000;
dsp_buf[9] = 0b01000100;
dsp_buf[10] = 0b00100010;
dsp_buf[11] = 0b00010000;
dsp_buf[12] = 0b10001000;
dsp_buf[13] = 0b01000100;
dsp_buf[14] = 0b00100010;
TRISB = 0x00;        // Set Port B as output
PORTB = 0x00;     // Initialize Port B
ROW_ENABLE = 0;            // Enable row output (4017)
while(1)
ROW_RESET = 1; ROW_RESET = 0;    // Clear row output scan (4017)
for (i=0;i<7;i++)           // Row (0=top, 6=bottom)
{
COL_ENABLE = 1;             // Disable output column (74HC595)
COL_RESET = 0; COL_RESET = 1;      // Reset column output (74HC595)
for (j=0;j<15;j++)       // Column (0=right, 14=left)
{
COL_DATA = ~(dsp_buf[14-j]>>(7-i));     // Send data out from display buffer -
active low (74HC595)
COL_SHIFT = 1; COL_SHIFT = 0;       // Shift clock at rising edge (74HC595)
}
COL_LATCH = 1; COL_LATCH = 0;        // Send a pulse to latch data from shift register
to output (74HC595)
ROW_DATA = 1; ROW_DATA = 0;     // Row scan = row scan + 1 (4017)
COL_ENABLE = 0;      // Enable output column (74HC595)
DelayMs(1);           // Delay 1 ms
}
}
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

M_B

merhaba arkadaslar bu konuda gorusu ve yorumu olan arkadaslar yokmu ?
Tesekkurler



Alıntı yapılan: "M_B"Merhaba arkadaslar hayırlı cumalar;
Oncelıkle herkese kolay gelsın. Nette satır taramaya ornek bır kayan yazı programı ararken HiTec C ile yazılmıs ufak bır program buldum ıncelemeye basladım. Ve porogramda sadece kafamı karıstıran ve anlamayamadıgım bır  kısım var bu konuda sızlerden yardım ıstıyorum.
anlayamadıgım komut kısmı  burası.
COL_DATA = ~(dsp_buf[14-j]>>(7-i));
  ~(dsp_buf[14-j]>>(7-i)); bu kısmı ınceledıgımde  sonuc 1 ve 0 dan bazen buyuk cıkıyor. ( ornegın 4 gibi ) COL_DATA ise 74hc595 ın bilgi girisine baglı 1 ve 0 dan farklı rakam cıktıgında veri nasıl gonderılıyor. Birde bu programda neden satır numarası degısınce kaydırma sayısıda degısıyor.





[code]#include <pic.h>
#include "delay.h"
#define COL_RESET RB0    // Reset clock 74HC595 (SRCLR)
#define COL_SHIFT RB1     // Shift clock 74HC595 (SRCLK)
#define COL_LATCH RB2    // Latch clock 74HC595 (RCLK)
#define COL_ENABLE RB3     // Enable output 74HC595 (G)
#define COL_DATA RB5       // Data input 74HC595 (SER)
#define ROW_ENABLE RB4    // Enable 4017 (ENA)
#define ROW_RESET RB6     // Reset 4017 (RST)
#define ROW_DATA RB7       // Clock input 4017 (CLK)
main(void)
int i,j;
unsigned char dsp_buf[15];         // dsp_buf[n] for column n+1 (ignore the LSB)
dsp_buf[0] = 0b10001000;
dsp_buf[1] = 0b01000100;
dsp_buf[2] = 0b00100010;
dsp_buf[3] = 0b00010001;
dsp_buf[4] = 0b10001000;
dsp_buf[5] = 0b01000100;
dsp_buf[6] = 0b00100010;
dsp_buf[7] = 0b00010000;
dsp_buf[8] = 0b10001000;
dsp_buf[9] = 0b01000100;
dsp_buf[10] = 0b00100010;
dsp_buf[11] = 0b00010000;
dsp_buf[12] = 0b10001000;
dsp_buf[13] = 0b01000100;
dsp_buf[14] = 0b00100010;
TRISB = 0x00;        // Set Port B as output
PORTB = 0x00;     // Initialize Port B
ROW_ENABLE = 0;            // Enable row output (4017)
while(1)
ROW_RESET = 1; ROW_RESET = 0;    // Clear row output scan (4017)
for (i=0;i<7;i++)           // Row (0=top, 6=bottom)
{
COL_ENABLE = 1;             // Disable output column (74HC595)
COL_RESET = 0; COL_RESET = 1;      // Reset column output (74HC595)
for (j=0;j<15;j++)       // Column (0=right, 14=left)
{
COL_DATA = ~(dsp_buf[14-j]>>(7-i));     // Send data out from display buffer -
active low (74HC595)
COL_SHIFT = 1; COL_SHIFT = 0;       // Shift clock at rising edge (74HC595)
}
COL_LATCH = 1; COL_LATCH = 0;        // Send a pulse to latch data from shift register
to output (74HC595)
ROW_DATA = 1; ROW_DATA = 0;     // Row scan = row scan + 1 (4017)
COL_ENABLE = 0;      // Enable output column (74HC595)
DelayMs(1);           // Delay 1 ms
}
}
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet