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 :)
Kimse yokmu yardımcı olacak arkadaşlar tıkandım.
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
glcd text komutunu sadece main içinde kullanabiliyorum başka hiçbir alt fonksiyonda neden kullanılmıyor acaba.
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.
dursun cemal yanıtların çok teşekkür ederim.
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
@somaelektronikogrbu 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
@styx75 işlemci adını verin bir sizin kodu derleyeyim bakalım ne olacak.
Yukardaki kod tamamı mı ?
16f628 a işlemci. Micro c 2.0 ile yazılmış. Kodlar tamamı
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.
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
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.
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.
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.
ç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();
}
}
}