“Arguments cannot have explicit memory specificator” Hatası

Gömülü sistem ile uğraşan arkadaşların karşılaşacağı bir problem de “Arguments cannot have explicit memory specificator”
hatası olabilir bu hatanın nedeni ise kullandığınız derleyicideki keywordlerden birini değişken olarak kullanmaya çalışmanızdır.
Mesela ben Micro C derleyicisine “data” isimli bir değişken verince böyle bir sorunla karşılaşıyorum. Eğer değişkenin ismini değiştirirseniz bu hata ortadan kalkacaktır.

Reklamlar

I2C Haberleşmesi Kullanılarak Sıcaklığı Lcd’de Yazdırma

İlk olarak ı2c modülünün ne olduğunu anlatarak başlayalım.
i2c Inter-Integrated Circuit ifadesinin kısaltması olup, iki tel arayüz olarak anılır. i2c protokolü philips firması tarafından bulunmuş olup, düşük hızlı çevre birimlerini birbirine bağlamak için kullanılır.Dijital sistemlerde kablolu seri haberleşme ile ilgili birçok standart vardır. SPI, I2C bunlara örnek olarak verilebilir.I2C protokolünde temel olarak iki hat vardır. Bunlar SCL ve SDA olup, SCL (SerialCLock) veri senkronizasyonu için kullanılan clock darbeleri hattı, SDA (SerialDAta) ise veri hattıdır.

Genel bir bilgi verdikten sonra projemiz de ne yapacağımızdan bahsedelim.Projemizin amacı i2c protokolünü kullanıp TC74 sensörüyle sıcaklığı Lcd ekrana yazdırmak.
Bununiçin ilk olarak aşağıdaki şemayı isisde çizmemiz gerekmektedir.

sicaklik

Kodlarımız da aşağıdaki şekildeki gibi olursa Lcd de Tc74 ile alınan sıcaklık değerini görebiliriz.

Kodlarımız şu şekildedir:

unsigned short temp;

sbit LCD_RS at Rb0_bit;
sbit LCD_EN at Rb1_bit;
sbit LCD_D7 at Rb7_bit;
sbit LCD_D6 at Rb6_bit;
sbit LCD_D5 at Rb5_bit;
sbit LCD_D4 at Rb4_bit;

sbit LCD_RS_Direction at TRISb0_bit;
sbit LCD_EN_Direction at TRISb1_bit;
sbit LCD_D7_Direction at TRISb7_bit;
sbit LCD_D6_Direction at TRISb6_bit;
sbit LCD_D5_Direction at TRISb5_bit;
sbit LCD_D4_Direction at TRISb4_bit;

void main() {
char temperature[6];
Lcd_Init();
Lcd_Cmd(_Lcd_Cursor_Off);

while(1){

I2C1_Init(10000);
I2C1_Start();
I2C1_Wr(0x92);
I2C1_Wr(0x00);
I2C1_Repeated_Start();
I2C1_Wr(0x93);
temp=I2C1_Rd(0);
shorttostr(temp,temperature);
I2C1_Stop();
Lcd_Out(1,2,”sicaklik”);
Lcd_Out(2,2,temperature);

delay_ms(10);
}
}

Micro C’de “Demo Limit” Sorunu

MicroC’nin demo sürümünü kullananlar böyle bir hatayla karşılaşabilirler.Özellikle de mmc ile programlama yapılıyorsa böyle bir sorunla karşılaşılması mümkün.Demo sürümü bize sadece 2k okuma ve yazma sınırı veriyor.Eğer bu limiti geçerse MicroC programı derlemez.

Peki biz böyle Ram’in yetmediği durumda ne yapacağız?

Demo sürümünü cracklayıp kullanacağız.Cracklama işlemi çok basit.

HIDDongleDLL.dll dosyasını MicroC nin kurulu olduğu dizinde aynı isimle dosyayla yer değiştireceğiz.

Crack dosyasını buradan paylaşamıyorum.Bu yüzden ihtiyacınız olursa mail yoluyla size ulaştırabilirim.

Pwm Modülünün Osiloskop’da Gösterimi

İlk olarak pwm modülü ile ilgili bilginiz yoksa bu modülle ilgili bilgi alabileceğiniz linki aşağıda veriyorum.

https://dosya.sakarya.edu.tr/Dokumanlar/2013/440/125663773_h5_mikro_ii.pdf

16F877A işlemcisine entegre olan pwm modülünün osiloskopta kare dalga formatında gösterme işlemini yapacağız.

Bu işlem için  gerekli modülleri bulabileceğiniz isis görüntüsü şu şekilde olmalıdır.

isisİsis’de yaptığımız programı kısaca anlatayım.Yukarıdaki butona basıldığında duty cycle’ı arttırıyoruz.Aşağıdaki butona bastığımız da ise duty cycle azaltılıyor.Peki osiloskopun en üstteki girişine neden bağlıyoruz?Çünkü kare dalga formatında çıkış istedik.

Ayrıca  Osiloskobu 16F877A işlemcisinin pwm entegresine bağlıyoruz.

Duty cycle dediğimiz ise iş süresidir.İş süresi ile pals genişliği ayarlanır.

Micro c kısmı ise şu şekilde olmalıdır.
int duty_cycle=100;
int okunan_deger=50;
void main()
{

ADCON1=7;
CMCON=7;
TRISC=0;
portc=0;
PortA.RA0=0;
PortA.RA1=0;
porta.ra2=0;
PWM1_Init(5000);
PWM1_Start(); // start PWM2
PWM1_Set_Duty(duty_cycle);
while(1)
{
if(PORTA.RA0==1)
{
duty_cycle++;
PWM1_Set_Duty(duty_cycle);
}
if(PORTA.RA1==1)
{
duty_cycle–;
PWM1_Set_Duty(duty_cycle);
}
if(porta.ra2)
{
okunan_deger=ADC_Read(2);
PWM1_Set_Duty(okunan_deger);

}

}

}

Sanal Terminalden Girilenleri Lcd’de Yazdırma

Gömülü Sistem Tasarımı dersinde yaptığımız projeleri burada paylaşacağım.

İlk anlatacağım proje Sanal Terminal’den girilen stringleri Lcd ekranında yazdırma.Bu projeyi yapabilmek için ilk önce isis ve micro c programlarını bilgisayarınıza kurmanız gerekmektedir.

İlk olarak projemizin görsel kısmını yani İsis de olan kısmını yapıp kodlama kısmına daha sonra geçeceğiz.İsis’de oluşturulan dosyalar .dsn uzantılıdır.Bizim de .dsn uzantılı dosyamızda olması gereken elemanlar şu şekilde olabilir;

İlk olarak bir microişlemciye ihtiyacımız var ben microişlemci olarak 16F877A işlemcisini kullanıyorum.

Microişlemcinin çalışmaya başlaması için de power elemanımız olmalı.

Yazdığımız yazıları ekranda göstereceğimiz bir LCD miz ve bu yazıları yazmak için bir sanal terminalimiz olmalı.

Ayrıca haberleşmeyi sağlayabilmemiz için Compim modülümüz gereklidir.

Bizim bu projeyi gerçekleştirmek için Usart modülüyle ilgili bilgimizin olması gerekir bu yüzden aşağıda Usart ile ilgili biraz bilgi vereceğim.

USART modülü mikrodenetleyicilerin çoğunda bulunan kullanımı basit ve standart seri RS232 haberleşme birimidir. Universal Synchronous Aynchronous Receiver Transmitter (Evrensel Senkron Asenkron Alıcı Verici) anlamına gelmektedir. Bu modülden gönderilmek istenen datalar, sıra ile lsb den msb ye doğru yani en düşük değerlikli bitten en yüksek değerlikli bite doğru gönderilir.  Gönderici taraf TX (transmitter) hattını data göndermezken Lojik1 seviyesinde tutar. Data gönderileceği anda hat Lojik 0 seviyesine çekilerek data gönderilmeye başlanır. Bu işlemdeki hattı Lojik 1 den Lojik 0 seviyesine çekme olayına start biti denir.  Yukarıdaki şekilde bunu daha iyi görmekteyiz zaten. Start bitinden sonra, datalar bit bit gönderilip dataların sonunda ise Stop biti gönderilir. Stop biti ise, son bitten sonra(MSB den sonra) hattı lojik 1 seviyesine çıkarma işlemidir. Eğer 9 bitlik data gönderimi veya parity(eşlik biti gönderimi yapılmıyor ise) bir byte data gönderimi için toplam 10 bit gönderilir. 1 start bit + 8 data bit + 1 stop bit..

Alıcı taraf ise hattın lojik1 den lojik0 seviyesine çekildiğinde data gönderiminin başladığını anlar gelen bitleri ayarlanan baudrate süresince alır ve buffer ı na yazar. Stop biti ile buffera gelen data yazılmış olur. Ve ilgili flag set edilir. Eğer kesme kullanıyorsak, kesme alt programına dallanır. Kesme kullanmıyor isek, buffer dolduğunda set edilen barağı sürekli kontrol ederek datanın gelmiş olduğunu anlarız.

Baudrate meselesine gelince… Baudrate 1 bitin ne kadar sürede gönderileceğini ve alınacağını belirleyen bps(bit per second – 1 saniyede gönderilen bit sayısı) birimi ile ölçülür.  Sizde birçok yerde görmüşsünüzdürki, Baudrate parametresi 1200,2400,4800,9600,19200,115200 gibi değerler almaktadır. Alıcı taraf ile gönderici tarafın baudrate değeri aynı olmalıdır ki, gönderilen datalar alıcı tarafında doğru bir şekilde alınabilsin.

Usart ile ilgili bilgi verdiğimize göre artık projemize geçebiliriz.Projemizin isis de görüntüsü aşağıda görüldüğü gibidir.

isis

Micro c deki kodlarımıza gelince:

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;

sbit LCD_D7_Direction at TRISB3_bit;

char uart_rd;
main()
{
int i;
TRISB=0;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR); //
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,6,”Hosgeldiniz”);
UART1_Init(9600);
UART1_Write_Text(“istediginizi girin”);
UART1_Write(13);

while (1) { // Endless loop
if (UART1_Data_Ready()) { // If data is received,
uart_rd = UART1_Read(); // read the received data,
UART1_Write(uart_rd); // and send data via UART
Lcd_Chr_CP(uart_rd);

if(uart_rd==13) Lcd_Cmd(_LCD_SECOND_ROW);

}
}

}