Picproje Elektronik Sitesi

DERLEYİCİLER => MikroC - PIC => Konuyu başlatan: styx75 - 26 Ocak 2016, 23:31:04

Başlık: Ynt: derleme hatası
Gönderen: styx75 - 26 Ocak 2016, 23:31:04
selam arkadaşlar ..
microc ye yeni başladım kodları veriyorum aşağıda..aldıgım hata " Reentrancy is not allowed: function 'Glcd_Write_Data' called from two threads __Lib_Glcd.c"   " Reentrancy is not allowed: function 'Glcd_Set_Page' called from two threads __Lib_Glcd.c"
#define led1 porte.re0
#define led2 porte.re1
#define led3 porte.re2
char GLCD_DataPort at PORTD;sbit GLCD_CS1 at LATC0_bit;
sbit GLCD_CS2 at LATC1_bit;
sbit GLCD_RS  at LATA2_bit;
sbit GLCD_RW  at LATC2_bit;
sbit GLCD_EN  at LATA0_bit;
sbit GLCD_RST at LATA1_bit;
sbit GLCD_CS1_Direction at TRISC0_bit;
sbit GLCD_CS2_Direction at TRISC1_bit;
sbit GLCD_RS_Direction  at TRISA2_bit;
sbit GLCD_RW_Direction  at TRISC2_bit;
sbit GLCD_EN_Direction  at TRISA0_bit;
sbit GLCD_RST_Direction at TRISA1_bit;

init () {
  Glcd_Write_Text("ISTASYON.1", 0, 0, 1);
}
void interrupt()
{
GIE_bit=0;
    if(!portb.rb0)
    {
    led1=~led1;
      init ();
     INT0IF_bit=0;

    }
    if(!portb.RB1){
     porte.re1=1;
     INT1IF_bit=0;
    }
    if(!portb.RB2){
     porte.re2=1;
     INT2IF_bit=0;
    }
  GIE_bit=1;
}


void main() {
  INTCON2=0;
  TRISA=0;
  TRISB=0xFF;
  //------------
  INT0IE_bit=1;
  INT0IF_bit=0;
  INT1IE_bit=1;
  INT1IF_bit=0;
  INT2IE_bit=1;
  INT2IF_bit=0;
  INTEDG0_bit=0;
  INTEDG1_bit=0;
  INTEDG2_bit=0;
  PORTA=0;
  PORTB=0;
  PEIE_bit=1;
  GIE_bit=1;
  ADCON1 |= 0x0F;
  CMCON  |= 7;
  Glcd_Init();
  Glcd_Fill(0x00);
  trise=0x00;
  porte=0;

  while(1) {

}
  }


ayrıca program yazılımı sırasında sıralama yada mantık hatalarınıda bildirirseniz çok sevinirim saygılar..

mesaj birleştirme:: 27 Ocak 2016, 01:10:46

bu arada arkadaşlar.
glcd ye değişken nasıl yazdırılıyor   short int sayi     Glcd_Write_Text(sayi, 0, 0, 1); bu şekilde olmadı
bayaa bakındım ama bulamadım :)
Başlık: Ynt: derleme hatası
Gönderen: styx75 - 31 Ocak 2016, 19:44:40
Kimse yokmu yardımcı olacak arkadaşlar tıkandım.
Başlık: Ynt: Ynt: derleme hatası
Gönderen: dursuncemal - 01 Şubat 2016, 00:43:10
microc ye hakim diilim ama;
http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/graphic_lcd_library.htm (http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/graphic_lcd_library.htm)
belki isine yarar
Başlık: Ynt: derleme hatası
Gönderen: styx75 - 01 Şubat 2016, 00:49:58
glcd text komutunu sadece main içinde kullanabiliyorum başka hiçbir alt fonksiyonda neden kullanılmıyor acaba.
Başlık: Ynt: Ynt: derleme hatası
Gönderen: dursuncemal - 01 Şubat 2016, 01:15:14
yukarida init diye bir fonksiyon yazmisin ama mainde oraya gitmemissin yanlis gormuyor iserm.

program main blogunun en basindan calismaya baslar     while(1) icinde doner durur    mainin  disina yazdigin fonksiyona mainin icinden  veya  while(1)  gidersin.
Başlık: Ynt: derleme hatası
Gönderen: styx75 - 01 Şubat 2016, 12:55:41
dursun cemal yanıtların çok teşekkür ederim.
Başlık: Ynt: derleme hatası
Gönderen: somaelektronikogr - 01 Şubat 2016, 23:08:50
bende aşağıdaki micro c kodlarını derleyince hata mesajı alıyorum.";" expected but kesme found  ve Inretnal error


#include <pic.h>
#include <delay.c>
#include <lcd.c>
#include <stdio.h>
#include <stdlib.h>

// Butonlar ve LED'ler için pin tanımlamaları
#define BASLAT RB4
#define DURDUR RB5
#define KIRMIZI RB6
#define YESIL RB7

// Konfigürasyon ayarları
__CONFIG(WDTDIS&LVPDIS&PWRTEN&XT);

// Global değişkenler
unsigned int CX;
unsigned char kontrol;

// TIMER Kesme Alt Programı
void interrupt kesme(void){
CX++;
if(CX>2000)kontrol=1; // Zaman aşımı için
T0IF=0; // Bayrağı temizle
TMR0=131; // TIMER'ı tekrar yükle
}

//------------ ANA PROGRAM -----------------
main(void)
{
unsigned char sonuc[]="GECiKME=        ";
unsigned int i,deger;
unsigned char sayi,hata;

// Port ayarları       
TRISA=0x00; // Bütün pinler çıkış
TRISB=0x30; // RB4,RB5 giriş, diğerleri çıkış
PORTA=0; PORTB=0; 
CMCON=0x07;

// TIMER işlemleri
T0CS=0; // Dahili clock
PSA=0; // Prescaler TMR0 için ayarlı
PS0=0; PS1=1; PS2=0; // Oran 1:8
ei(); // Bütün kesmeler etkin
T0IE=0; //Başlangıçta TIMER pasif
T0IF=0; // Bayrağı temizle

DelayMs(250); // 250 ms bekle
lcd_init(); // LCD hazırlık aşaması
lcd_clear(); // LCD'yi temizle
lcd_write(0x0C); // imleci gizle
lcd_goto(0x00); lcd_puts(" REFLEKS OLCER  ");
lcd_goto(0x40); lcd_puts(" BASLAT'A BASIN ");

for(;;){ // Ana işlem döngüsü
kontrol=0; CX=0; hata=0;

while(BASLAT==0); // Butona basılana kadar bekle

lcd_clear(); // Butona basılınca LCD'yi temizle

KIRMIZI=1; YESIL=0; // Kırmızı LED'i yak
lcd_goto(0x00); lcd_puts(" YESiL YANINCA  ");
lcd_goto(0x40); lcd_puts(" DURDUR'A BASIN ");

sayi=rand(); // rand() ile rastgele sayı üret
deger=3*sayi;
if(deger<=75)deger=deger+75; //en düşük 75 yap 

// Rastgele bir süre bekle. Süre=degerx(10 ms)
for(i=0;i<deger;i++){
DelayMs(10);
if(DURDUR==1){hata=1; break;}
}

if(hata==1){ // Kırmızı ışıkta durdur'a basılırsa
lcd_goto(0x00); lcd_puts("BUTONA COK ERKEN");
lcd_goto(0x40); lcd_puts("   BASTIN !!!   ");
KIRMIZI=0;
}

else{
YESIL=1; KIRMIZI=0;  // Yeşil LED'i yak

TMR0=131;//125 sayım için değer yükle (256-131=125)
T0IE=1; // TIMER'ı başlat

while(DURDUR==0); //Durdur'a basılmadıysa bekle

T0IE=0; // TIMER'ı durdur

lcd_clear();
lcd_goto(0x00);

if(kontrol==0){//CX değerine göre uygun mesajı yaz
       if(CX<=100)lcd_puts("   TEBRiKLER !  ");
if(CX>100&CX<=200)lcd_puts("    MUKEMMEL    ");
if(CX>200&CX<=300)lcd_puts(" DAHA HIZLI OL  ");
if(CX>300&CX<=600)lcd_puts("BiRAZ PRATiK YAP");
if(CX>600&CX<=1000)lcd_puts("  COK YAVASSIN  ");
if(CX>1000&CX<2000)lcd_puts("UYUYORSUN GALiBA");

// Tepki süresini milisaniye cinsinden yaz
sprintf(sonuc+8,"%d ms",CX);
lcd_goto(0x40); lcd_puts(sonuc);
}
// Zaman aşımı durumunu dikkate al
else lcd_puts("  YENiDEN DENE  ");


} // İşlemleri tekrarla
}// Programın sonu

Başlık: Ynt: derleme hatası
Gönderen: Gökhan BEKEN - 02 Şubat 2016, 10:02:17
@somaelektronikogr
bu tanımlamalarda eksiklik var, kodu hangi derleyiciye yazıyorsunuz bilmiyorum ama PORTB.RB4 gibi tanımlamak gerekir sanırım:
#define BASLAT RB4
#define DURDUR RB5
#define KIRMIZI RB6
#define YESIL RB7
Başlık: Ynt: derleme hatası
Gönderen: M_B - 02 Şubat 2016, 10:12:02
@styx75
işlemci adını verin bir sizin kodu derleyeyim bakalım ne olacak.
Yukardaki kod tamamı mı ?

Başlık: Ynt: derleme hatası
Gönderen: somaelektronikogr - 02 Şubat 2016, 17:20:29
16f628 a işlemci. Micro c 2.0 ile yazılmış. Kodlar tamamı
Başlık: Ynt: derleme hatası
Gönderen: somaelektronikogr - 02 Şubat 2016, 17:26:30
tanımlamaları PORTB.RB4 gibi yaptım ama yine aynı hatayı veriyor. bu kodun hex kodu çalışır vaziyette elimde var ama ben içine bi kaç satır eklemek istiyorum ama derleyemiyorum.
Başlık: Ynt: Ynt: derleme hatası
Gönderen: M_B - 02 Şubat 2016, 23:37:12
Alıntı yapılan: somaelektronikogr - 02 Şubat 2016, 17:20:29
16f628 a işlemci. Micro c 2.0 ile yazılmış. Kodlar tamamı

Yukarda verdiğin kodlar mikroc ye ait değil. Hitech c ile yazilmis
Başlık: Ynt: derleme hatası
Gönderen: styx75 - 03 Şubat 2016, 17:36:41
sayın M_B ilgnize çok teşekkür ederim 18f4550 sorunun kökenini bulursak çok minnettar olacagım.
saygılar..

mesaj birleştirme:: 04 Şubat 2016, 07:40:23

evet kodun tamamı yukarıda.. sorun sanki sıralamayla ilgili ama anlam veremedim .kesme rutininden herhangi bir altprogram çağrılıyor sorun yok ama çağrılan prgramın içinde glcd komutları varsa sorun oluyor.lcd içinde aynı sorun varmı açıkcası denemedim.

mesaj birleştirme:: 03 Şubat 2016, 18:07:24

lcd ile kodlarda hiç sıkıntı yok arkadaşlar.
Başlık: Ynt: Ynt: derleme hatası
Gönderen: dursuncemal - 03 Şubat 2016, 21:05:35
kesmenin icinden normal lcd veya glcd fonksiyonlarina gitmek cok tehlikeli bir durum zira bu fonksiyonlar kesme suresinden daha buyuk olabilir bu yuzden  program kilitlenmeye kadar gidebilir.
Başlık: Ynt: Ynt: derleme hatası
Gönderen: M_B - 04 Şubat 2016, 08:59:41
Alıntı yapılan: dursuncemal - 03 Şubat 2016, 21:05:35
kesmenin icinden normal lcd veya glcd fonksiyonlarina gitmek cok tehlikeli bir durum zira bu fonksiyonlar kesme suresinden daha buyuk olabilir bu yuzden  program kilitlenmeye kadar gidebilir.
dedigi gibi kesme icinde fonksiyon kullanma.
Ornek olması acısından şu şekilde yapabilirsin.


#define led1 porte.re0
#define led2 porte.re1
#define led3 porte.re2

char GLCD_DataPort at PORTD;
sbit GLCD_CS1 at LATC0_bit;
sbit GLCD_CS2 at LATC1_bit;
sbit GLCD_RS  at LATA2_bit;
sbit GLCD_RW  at LATC2_bit;
sbit GLCD_EN  at LATA0_bit;
sbit GLCD_RST at LATA1_bit;

sbit GLCD_CS1_Direction at TRISC0_bit;
sbit GLCD_CS2_Direction at TRISC1_bit;
sbit GLCD_RS_Direction  at TRISA2_bit;
sbit GLCD_RW_Direction  at TRISC2_bit;
sbit GLCD_EN_Direction  at TRISA0_bit;
sbit GLCD_RST_Direction at TRISA1_bit;

char flag=0;

init ()
{
   Glcd_Write_Text("ISTASYON.1", 0, 0, 1);
}

void interrupt()
{
GIE_bit=0;
    if(!portb.rb0)
    {
    led1=~led1;
     //init ();
     flag=1;
     INT0IF_bit=0;

    }
    if(!portb.RB1){
     porte.re1=1;
     INT1IF_bit=0;
    }
    if(!portb.RB2){
     porte.re2=1;
     INT2IF_bit=0;
    }
  GIE_bit=1;
}


void main() {
  INTCON2=0;
  TRISA=0;
  TRISB=0xFF;
  //------------
  INT0IE_bit=1;
  INT0IF_bit=0;
  INT1IE_bit=1;
  INT1IF_bit=0;
  INT2IE_bit=1;
  INT2IF_bit=0;
  INTEDG0_bit=0;
  INTEDG1_bit=0;
  INTEDG2_bit=0;
 
  PORTA=0;
  PORTB=0;
  PEIE_bit=1;
  GIE_bit=1;
  ADCON1 |= 0x0F;
  CMCON  |= 7;
  Glcd_Init();
  Glcd_Fill(0x00);
  trise=0x00;
  porte=0;

  while(1)
   {
    if(flag)
            {
             flag=0;
             init();
            }
    }
  }

Not: Projenin oldugu klasore __Lib_GlcdFonts.c dosyasını da eklemeyi unutma.

Başlık: Ynt: derleme hatası
Gönderen: styx75 - 04 Şubat 2016, 16:12:19
çok ama çok teşekkürler.daha net anlamaya başladım ee yaş 42 olunca biraz zor kavranıyor sanırım .arkadaşlar arada sorularımla kafanızı yorabilirim :)

mesaj birleştirme:: 05 Şubat 2016, 07:21:33

arkaşlar aşağıdaki programda glcd ye 1-255 arasındaki sayıları kesme ve buton sayesinde yazdırıyorum sıkıntı hane sayısı değişince rakamlar kaybolmuyor ..yani glcd ye eksiltme butonuyla  1 den 255 geldiniz  sonra arttırma butonu ile tekrar 1 e getirdiginiz zaman 55 rakamı glcd silinmiyor taki 9 dan 10 a geçinde biri 99 100 geçince diğeri sanırım değişkeni glcd için cevirmede mi sorun var..protonda direkt değişken yazılabiliyordu..
saygılar.

mesaj birleştirme:: 04 Şubat 2016, 17:22:00

#define led1 porte.re0
#define led2 porte.re1
#define led3 porte.re2

char GLCD_DataPort at PORTD;
sbit GLCD_CS1 at LATC0_bit;
sbit GLCD_CS2 at LATC1_bit;
sbit GLCD_RS  at LATA2_bit;
sbit GLCD_RW  at LATC2_bit;
sbit GLCD_EN  at LATA0_bit;
sbit GLCD_RST at LATA1_bit;

sbit GLCD_CS1_Direction at TRISC0_bit;
sbit GLCD_CS2_Direction at TRISC1_bit;
sbit GLCD_RS_Direction  at TRISA2_bit;
sbit GLCD_RW_Direction  at TRISC2_bit;
sbit GLCD_EN_Direction  at TRISA0_bit;
sbit GLCD_RST_Direction at TRISA1_bit;

char flag_1=0;
char flag_2=0;
char cevir[4];
int arti;
//---------
goster ()
{
   byteToStr(arti,cevir);
   Ltrim(cevir);
   Glcd_Write_Text(cevir, 0, 0, 1);
}
//---------
void interrupt()
{
GIE_bit=0;
    if(!portb.rb0)
    {
    led1=~led1;
     arti=arti++;
     flag_1=1;
     INT0IF_bit=0;

    }
    if(!portb.RB1){
      led2=~led2;
    arti=arti--;
     flag_1=1;
     INT1IF_bit=0;
    }
    if(!portb.RB2){
     led3=1;
     INT2IF_bit=0;
    }
  GIE_bit=1;
}
//--------------
void main() {
  INTCON2=0;
  TRISA=0;
  TRISB=0xFF;
  //------------
  INT0IE_bit=1;
  INT0IF_bit=0;
  INT1IE_bit=1;
  INT1IF_bit=0;
  INT2IE_bit=1;
  INT2IF_bit=0;
  INTEDG0_bit=0;
  INTEDG1_bit=0;
  INTEDG2_bit=0;

  PORTA=0;
  PORTB=0;
  PEIE_bit=1;
  GIE_bit=1;
  ADCON1 |= 0x0F;
  CMCON  |= 7;
  Glcd_Init();
  Glcd_Fill(0x00);
  trise=0x00;
  porte=0;

  while(1)
   {
    if(flag_1)
            {
             flag_1=0;
             goster();
            }
}
}