Ynt: derleme hatası

Başlatan styx75, 26 Ocak 2016, 23:31:04

styx75

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 :)

styx75

Kimse yokmu yardımcı olacak arkadaşlar tıkandım.

dursuncemal

:=

styx75

glcd text komutunu sadece main içinde kullanabiliyorum başka hiçbir alt fonksiyonda neden kullanılmıyor acaba.

dursuncemal

#4
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.
:=

styx75

dursun cemal yanıtların çok teşekkür ederim.

somaelektronikogr

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

Gökhan BEKEN

@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
Özel mesaj okumuyorum, lütfen göndermeyin.

M_B

@styx75
işlemci adını verin bir sizin kodu derleyeyim bakalım ne olacak.
Yukardaki kod tamamı mı ?

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

somaelektronikogr

16f628 a işlemci. Micro c 2.0 ile yazılmış. Kodlar tamamı

somaelektronikogr

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.

M_B

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
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

styx75

#12
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.

dursuncemal

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.
:=

M_B

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.

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet