avatar_bilsisco

Saat ve ayarlama LCD sorunu

Başlatan bilsisco, 29 Ekim 2016, 15:44:30

bilsisco

Aşağıda bir önceki konuda paylaştığım kodlara ayarlama menüsü ekleme yaptığım projeyi paylaşıyorum
Sorun şu ki saat çalışıyor, eeproma yapılan ayarlar kaydediliyor ama ayar yaparken LCD kafayı yiyor.
Lütfen isiste çalıştırıp dener misiniz?
Derlerken hiçbir sorun olmuyor mikroc versiyon 6.6.2
Değer okuma işini kapattım ama ne yaptıysam düzelmedi
kodun uzunluğuna bakmayın isiste çalıştırdığınızda 1sn içinde ayara basılı tutup ayar menüsüne geçiliyor

// LCD module connections
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;
// End LCD module connections
#define DATA   PORTA.RA0
#define CLK    PORTA.RA1
#define DATA_X TRISA.RA0
#define Ayar   PORTC.RC0
#define Artir  PORTC.RC1
#define Azalt  PORTC.RC2
#define Nem_Cihazi  PORTC.RC3
#define AA     PORTC.RC4
#define BB     PORTC.RC5
#define CC     PORTC.RC6
#define DD     PORTC.RC7
#define Fan    PORTB.RB6
#define Lamba  PORTB.RB7

#define _TEMP   0x03
#define _HUMI   0x05
#define _RESET  0x1E

#include "sht11.h"

const float d1C = -40.1;        //@ 14bit
const float d2C = 0.01;         //@ 14bit
const float C1  = -4.0;         //@ 12bit
const float C2  = 0.0405;       //@ 12bit
const float C3  = -0.0000028;   //@ 12bit
const float t1  = 0.01;         //@ 12bit
const float t2  = 0.00008;      //@ 12bit

float tempt, humi;
float RH_linear, RH_true;
int alt_sck,ust_sck;
int ham,tam,ond,alt1,alt2,ust1,ust2,nem1,nem2,motor_suresi;
char txt[10],txt1[10];
int gun, saat, dk, sn, say, guncelle, gnc, i;
//unsigned short(int)=0 .. 255, int=-32768 .. 32767, (signed)short(int)=- 128 .. 127
char snn[3];
char dkk[3];
char saatt[3];
char gunn[8];
char zaman[]="00:00:00";
char yaz[10];
int zmn[3];
int ayardurum=0;

//****************************************************
void kurulum(){
  ADCON1=7;                 // Tüm analog portlar dijitale ayarlandı
  CMCON=7;                  // Tüm karşılaştırıcı modülleri kapatılıp portlar dijitale ayarlandı
  //CCP1CON=0;                // PWM modülü sıfıra çekiliyor(kapatılıyor)
  TRISA=0;
  TRISB=0;
  TRISC=0b00000111;         // ilk 3 pin giriş, diğerleri çıkış
  PORTA=0;
  PORTB=0;
  PORTC=0;
  say=0;
  guncelle=1;
  OPTION_REG=0b10000101;
  INTCON=0b10100000;
  TMR0=0;

  gun=  EEPROM_Read(0x00);
  alt1= EEPROM_Read(0x01);
  alt2= EEPROM_Read(0x02);
  ust1= EEPROM_Read(0x03);
  ust2= EEPROM_Read(0x04);
  nem1= EEPROM_Read(0x05);
  nem2= EEPROM_Read(0x06);
  motor_suresi= EEPROM_Read(0x07);
  gun=0;  saat=23;  dk=59;  sn=58;

//prescaler  101=64(her 64us de bir kesme oluyor)
//bize 1sn gerek. 1sn için gerekli toplam kesme sayısı
//1000000/64=15625 defa.
//Her 256 kesmeden sonra kesme bayrağı (INTCON.T0IF) sıfırlanıyor
//O zaman 15625/256=61~ defa bayrak kesme kontrolünden sonra 1sn geçmiş olacak.
//Kesme oluştuğunda TMR0 içeriği 0 olur ve Timer0 Kesme bayrağı 1 olur(T0IF=1).
}
//****************************************************
void Vakit(){
  if (guncelle==1 && ayardurum==0){ // kesme ve ayarlama yoksa
    zaman[0]=(saat/10)+48;    //tek haneli sayısalı stringe atama
    zaman[1]=(saat%10)+48;
    zaman[3]=(dk/10)+48;
    zaman[4]=(dk%10)+48;
    zaman[6]=(sn/10)+48;
    zaman[7]=(sn%10)+48;

    IntToStr(gun,gunn);   //sayısal değeri stringe dönüştürme
    Ltrim(gunn);          //string ifadenin solundaki boşlukları silme

    Lcd_Out(1,9,zaman);  //Lcd_Chr(1, 3, ':');
    Lcd_Out(2,9,"GUN:");
    Lcd_Out(2,13,gunn);

    //Lcd_Out(1,4,dkk); //Lcd_Chr(1, 6, ':');
    //Lcd_Out(2,7,saatt); Lcd_Chr(1, 3, ':');
    //Lcd_Chr_Cp(223);             // Print degree character
    //Lcd_Chr_Cp('C');             // Print 'C' for Centigrad
    guncelle=0;
  }
}
//****************************************************
void interrupt(){
i=1;
  if(INTCON.T0IF){   //Kesme bayrağı. 256 kesmeden sonra 1 olur.
    say=say+1;
    if(say>=61){
      sn=sn+1;
      say=0;
      if(sn>59) {
        sn=0;
        dk++;
        if(dk>59){
          dk=0;
          saat++;
          if(saat>23){
            saat=0;
            gun++;
          }
        }
      }
    }
    guncelle=1;
    INTCON.T0IF=0;
    //TMR0=0;     //Kesme sayısı
  }
}
//****************************************************
void Deger_oku(){
    if(!ayardurum){ // ayar yapılırken değer okumaması gerek
      //read adc temperature value from SHT
      tempt = SHT_Measure(_TEMP);  //_TEMP = 0x03
      //calculate temperature in Celsius from value
      //formul t = d1 + d2*SOt
      tempt = d1C + (tempt * d2C); //d1C = -40.1 ve d2C = 0.01
      floatToStr(tempt,txt1);  //convert to string
      strncpy(txt,txt1,5);     //txt1'den ilk 5 karakteri txt'ye aktar
      Lcd_Out(1,1,"T:");
      //Ltrim(txt);            // sağdaki boşlukları sil
      Lcd_Out(1,3,txt);
      //----Alt Sıcaklık Kontrol-----------------------
      ham=tempt*100;       //39.40999-->3940.999
      ham=ceil(ham);       //3941 [double ceil(double x);] ceil(0.3); 1 eder.
      alt_sck=alt1*100+alt2;     // 3640
      if(alt_sck>ham) Lamba=1; else Lamba=0;
      //----Üst Sıcaklık Kontrol-----------------------
      ust_sck=ust1*100+ust2;     // 3770
      if(ust_sck<ham) Fan=1; else Fan=0;
     
      //read adc humidity value from SHT
      humi = SHT_Measure(_HUMI);   //_HUMI = 0x05
      //calculate humidity %RH from value
      //formul RHlinear = C1 + C2*SOrh + C3*SOrh*SOrh  %RH
      RH_linear = C1 + (C2*humi) + (C3*humi*humi);
      //formula RHtrue = (Tc-25)*(t1+t2*SOrh)+RHlinear
      RH_true = (tempt-25)*(t1+(t2*humi))+ RH_linear;
      if(RH_true > 100.0) RH_true = 100.0;
      if(RH_true < 0.1) RH_true = 0.1;

      floatToStr(RH_true,txt1);  //convert to string
      strncpy(txt,txt1,5);       //txt1'den ilk 5 karakteri txt'ye aktar
      Lcd_Out(2,1,"N:");
      //Ltrim(txt);   // sağdaki boşlukları sil
      Lcd_Out(2,3,txt);
      delay_ms(100);
    }
}
//****************************************************
void Ekran(int ayar_num){
  switch (ayar_num) {
    case 0: Lcd_Out(1,1,"ALT SCKLIK="); 
            inttostr(alt1,txt);
            inttostr(alt2,txt1);
            Ltrim(txt);         //Sol boşlukları siler
            Ltrim(txt1);
            Lcd_Out(1,12,txt);
            Lcd_Out_Cp(".");
            Lcd_Out_Cp(txt1);
            break;
    case 1: Lcd_Out(1,1,"UST SCKLIK=");
            inttostr(ust1,txt);
            inttostr(ust2,txt1);
            Ltrim(txt);         //Sol boşlukları siler
            Ltrim(txt1);
            Lcd_Out(1,12,txt);
            Lcd_Out_Cp(".");
            Lcd_Out_Cp(txt1);
            break;
    case 2: Lcd_Out(1,1,"NEM SINIRI=");
            inttostr(nem1,txt);
            inttostr(nem2,txt1);
            Ltrim(txt);         //Sol boşlukları siler
            Ltrim(txt1);
            Lcd_Out(1,12,txt);
            Lcd_Out_Cp(".");
            Lcd_Out_Cp(txt1);
            break;
    case 3: Lcd_Out(1,1,"DONUS SAAT=");  break;
    default: Lcd_Out(1,1,"HATA");
    }
    gnc=0;
}
//****************************************************
Ayarlama(){
if(Ayar){ // Ayar(mode)--> PORTC.RC0
    ayardurum=1;
    do{
       delay_ms(200);
    }while(Ayar);
    //-----------Alt Sıcaklık Ayarlama---------------
    Lcd_Cmd(_LCD_CLEAR);
    delay_ms(300);
    Ekran(0); // Ekranı hazırla
    do{
      if(Artir) {alt2=alt2+10; gnc=1; }
      if(Azalt) {alt2=alt2-10; gnc=1; }
      if(alt2>99) {alt1++; alt2=0; }
      if(alt2<0)  {alt1--; alt2=90;}
      if(gnc==1) Ekran(0);
      delay_ms(200);
    }while(!Ayar);
    EEPROM_Write(0x01,alt1);  // Alt sıcaklık tam kısım kayıt
    EEPROM_Write(0x02,alt2);  // Alt sıcaklık ondalıklı kısım kayıt
    Lcd_Out(2,1,"   KAYDEDILDI");
    delay_ms(500);

    //-----------Üst Sıcaklık Ayarlama---------------
    Lcd_Cmd(_LCD_CLEAR);
    delay_ms(300);
    Ekran(1);
    do{
      if(Artir) {ust2=ust2+10; gnc=1; }
      if(Azalt) {ust2=ust2-10; gnc=1; }
      if(ust2>99) {ust1++; ust2=0; }
      if(ust2<0)  {ust1--; ust2=90;}
      if(gnc==1) Ekran(1);
      delay_ms(200);
    }while(!Ayar);
    EEPROM_Write(0x03,ust1);  // Üst sıcaklık tam kısım kayıt
    EEPROM_Write(0x04,ust2);  // Üst sıcaklık ondalıklı kısım kayıt
    Lcd_Out(2,1,"   KAYDEDILDI");
    delay_ms(500);
    Lcd_Cmd(_LCD_CLEAR);
    delay_ms(300);

    //-----------Nem Oranı Ayarlama---------------
    //Lcd_Out(1,1,"NEM SINIRI=");
    Ekran(2);
    do{
      ayardurum=1;
      inttostr(nem1,txt);
      inttostr(nem2,txt1);
      Ltrim(txt);
      Ltrim(txt1);
      Lcd_Out(1,12,txt);
      Lcd_Out_Cp(".");
      Lcd_Out_Cp(txt1);

      if(Artir) nem2=nem2+10;
      if(Azalt) nem2=nem2-10;
      if(nem2>99) {nem1++; nem2=0; }
      if(nem2<0)  {nem1--; nem2=90;}
      delay_ms(200);
    }while(!Ayar);
    EEPROM_Write(0x05,nem1);  // Alt nem tam kısım kayıt
    EEPROM_Write(0x06,nem2);  // Alt nem ondalıklı kısım kayıt
    Lcd_Out(2,1,"   KAYDEDILDI");
    delay_ms(500);
    Lcd_Cmd(_LCD_CLEAR);
    delay_ms(300);

/*   //-----------Motor Dönüş Saati Ayarlama---------------
    // Motorun kaç saatte dönmesi isteniyorsa ayarlanır
    // Eğer sıfır ayarlanırsa motor dönmeyecektir
    //Lcd_Out(1,1,"DONUS SURESI=");
    Ekran(3);
    do{
      ayardurum=1;
      inttostr(motor_suresi,txt);
      Ltrim(txt);
      Lcd_Out(1,14,txt);
      Lcd_Out_Cp("sa");

      if(Artir) motor_suresi=motor_suresi+1;
      if(Azalt) motor_suresi=motor_suresi-1;
      if(motor_suresi>9) motor_suresi=0;
      if(motor_suresi<0) motor_suresi=9;
      delay_ms(200);
    }while(!Ayar);
    EEPROM_Write(0x07,motor_suresi);  // Motor dönüş süresi kayıt
    Lcd_Out(2,1,"   KAYDEDILDI");
    delay_ms(500);   */
    Lcd_Cmd(_LCD_CLEAR);
    delay_ms(300);
    ayardurum=0;
}
}
//****************************************************
void main(){
  Fan=0;
  Lamba=0;
  Nem_Cihazi=0;
  AA=0; BB=0; CC=0; DD=0;
  gnc=0;
  kurulum();
  Lcd_Init();                        // Initialize LCD
  Lcd_Out(1,1,"OTOMATIK KULUCKA");
  Lcd_Out(2,1,"    MAKINESI    ");
  delay_ms(1000);
  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off 
  Ayarlama();
  Lcd_Cmd(_LCD_CLEAR);
     while(1){
        //Deger_oku();
        Vakit();
       
     }
}


bilsisco

en azından arkadaşlar mikcoc varsa derleyip isiste çalıştırabilir misiniz?
isiste çalıştırdığınızda ayar düğmesine basıp ayar yapılıyor, orda lcd de gösterme sorunu var bende. Sizde de oluyor mu merak ettim

Powered by EzPortal