Picproje Elektronik Sitesi

DERLEYİCİLER => Hi-Tech => Konuyu başlatan: alikilavuz - 18 Şubat 2013, 18:49:59

Başlık: PIC RESETLENINCE DAHİLİ EEPROM DATALARI DEĞİŞİYOR.
Gönderen: alikilavuz - 18 Şubat 2013, 18:49:59
Merhaba,

PIC16F914 ile yaptığım bir LCD projesi var. Bilgisayardan uart ile pic'in dahili eepromuna programını atıyorum.

Problemim devrem belli bir zaman sonra veya gücü açılıp kapanınca eeprom verilerinin değişmesi. Sanki bilgisayardan program almaya girip
eeprom_write yapıyor. Her zaman yapmadığı için tam çözemedim.

Kodlarım aşağıda. Yardımcı olabilecek arkadaşlarıma şimdiden teşekkür ederim.

Gereksiz kodları kaldırdım.

Saygılarla,


#include <htc.h>
#include <pic.h>
#include <stdio.h>

#include "delay.h"
#include "segments.h"
#include "main.h"

__CONFIG(INTIO & WDTEN & PWRTEN & BORDIS & CP & MCLRDIS & IESODIS & FCMDIS);

unsigned char A,B,C,D;
unsigned char buffer;

unsigned char ilkkat;
unsigned char sonkat;
unsigned char code=0x01;
unsigned char temp;
signed char     floor;


unsigned int tempo;
unsigned int bus_change;
unsigned int old_bus_data;
unsigned int k;

bit  not=0;

void interrupt
_isr(void)
{
if(RCIF)
{
      buffer=RCREG;
  if(buffer=='y') {not=1;} else {not=0;}
}

}




void init(void)
{
OPTION = 0xF0;
    WDTCON = 0x14;

CLRWDT();

  TRISA = 0x09;
  TRISB = 0x00;
  TRISC = 0x80;
  TRISD = 0x0C;
TRISE = 0x00;

PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTE = 0x00;

SPBRG=0X19; //19200 BPS ASYNC USART
TXSTA=0X24;
RCSTA=0X80;

DelayMs(50);

buffer=RCREG;

TX_pin=1;

LCDSE0 = 0x0F;
LCDSE1 = 0x0C;
LCDSE2 = 0x1E;

LCDPS  = 0x30;
LCDCON = 0x93;

OSCCON = 0x75;

ANSEL  = 0x00;
OPTION = 0xC8;

CMCON0 = 0x07;
not=0;
ilkkat = 0;

GIE = 1;
PEIE = 1;
RCIE = 1;

        sonkat = eeprom_read(0xF5);
DelayMs(50);
code =  eeprom_read(0xF6);
DelayMs(50);
floor=0;

clear_lcd();
DelayMs(50);
not=0;



void set_code(void)
{
  if((code == 0x20) || (code == 0x00)) code = 0x01;

  BINARY = 0;
  GRAY = 0;
  SAYICI_1 = 0;
  SAYICI_2 = 0;
  SEGMENT = 0;

   switch(code)
   {
     case 1 : {BINARY = 1;break;}
     case 2 : {GRAY = 1;break;}
     case 4 : {SAYICI_1 = 1;break;}
     case 8 : {SAYICI_2 = 1;break;}
     case 16 :{SEGMENT = 1;break;}
default : {BINARY = 1;break;}
   }

  DelayMs(100);
  floor = 0;
}

//****************************************************************************

void putch(unsigned char byte)
{
while(!TXIF)
continue;
TXREG = byte;
}

//****************************************************************************

unsigned char getch()
{
while(!RCIF)
continue;
return RCREG;
}



//****************************************************************************

void DataAl(void)       // Bilgisayardan LCD ye datalar aktarılıyor.
{
    unsigned int i;
unsigned char data;
DelayMs(100);
for(i=0;i<256;i++)
{
data = getch();
eeprom_write(i,data);
DelayMs(33);
CLRWDT();
}
asm("clrf pclath");
asm("goto 0x0000");
}
//****************************************************************************

void DataVer(void)    // Datalar LCD den bilgisayara gönderiliyor
{
    unsigned int i;
unsigned char data;
DelayMs(100);
for(i=0;i<256;i++)
{
data = eeprom_read(i);
        putch(data);
DelayMs(5);
CLRWDT();
}
asm("clrf pclath");
asm("goto 0x0000");
}
//***************************************************************************

//*******************Begin Main Program****************************
main(void)
{
    unsigned char opr = 0;
DelayMs(200);
CLRWDT();
DelayMs(200);
    DelayMs(100);

init();

    DelayMs(200);
CLRWDT();
DelayMs(200);
    DelayMs(100);
set_code();
    DelayMs(100);

    while(1)
{
  CLRWDT();

  if(BUTON==0)
      {
DelayMs(100);
while(!BUTON)
DelayMs(100);
code <<= 1;
DelayMs(5);
set_code();
DelayMs(100);
      eeprom_write(0xF6,code);
while(WR)continue;
DelayMs(100);
  }

  not = 0;
  CREN=0;
  CREN=1;
  TX_pin=1;
  buffer=RCREG;
  DelayMs(100);
 

  if(not==1)
  {
        not=0;
RCIE = 0;
        putch('E');
    TX_pin=1;
    RCREG=0;
        opr = getch();
        if(opr == 'w') DataAl();
if(opr == 'r') DataVer();
if(opr == 's') Show();
  }

}  //whie main
} //main


Başlık: Ynt: PIC RESETLENINCE DAHİLİ EEPROM DATALARI DEĞİŞİYOR.
Gönderen: F.T - 18 Şubat 2013, 19:05:39
geçenlerde hazır alıp kullandığımız bir modüldede aynı sorunu yaşadık.işlemci olarak 16f819 kullanılmıştı.modül normal çalışıyor configrasyon olarakta ayarlıyorsunuz herşey güzel uzun bir süre sorunsuz çalışıyor ama hiç ummadık bir anda tüm konfigrasyonlar uçmuş oluyor.sebebini bende bulamadım.
Başlık: Ynt: PIC RESETLENINCE DAHİLİ EEPROM DATALARI DEĞİŞİYOR.
Gönderen: LukeSkywalker - 18 Şubat 2013, 19:43:08
İlk açılışa 500 ms'lik veya daha uzun bir gecikme koyun.
Başlık: Ynt: PIC RESETLENINCE DAHİLİ EEPROM DATALARI DEĞİŞİYOR.
Gönderen: F.T - 18 Şubat 2013, 20:02:07
pic confgrasyonundan bahsetmedim yanlış anlaşıldı heralde.modülün configrasyonuna girdiğimiz çalışma ayarları.tabi aşağıdaki sorun gibi ,dahili eepromdaki datalar resetleniyor.
Başlık: Ynt: PIC RESETLENINCE DAHİLİ EEPROM DATALARI DEĞİŞİYOR.
Gönderen: mehmet - 18 Şubat 2013, 22:27:23
BOR devre dışı bırakılmış sanıyorum. Atmel de de aynı sonunu
yaşamıştım.
Güçlü PSU, 220 tarafından kapatılınca yavaşça boşalan
kondansatörler gerilimin aniden kesilmesini engelliyordu ve
EEprom abuk değerle alıyordu. BOR'u yüksek değerine ayarladım
sorun kalmadı. Besleme gerilimi BOR geriliminden aşagı düşünce
mcu resette kaldığı için sorun çıkmıyor..
Başlık: Ynt: PIC RESETLENINCE DAHİLİ EEPROM DATALARI DEĞİŞİYOR.
Gönderen: alikilavuz - 19 Şubat 2013, 10:04:02
Merhaba,

main()  bloğunun başlangıcında 500 ms lik bir gecikme koydum zaten. Başka bir yere de mi koymam lazım acaba ? Cihaz 24 V besleme ile çalışıyor.
34063 entegresi ile step down olarak 5V a düşürülüyor gerilim. Ama ben yine de BOR u açayım.

Ya o kadar acemi de değilim bu pic ler konusunda ama hep beni buluyor. Hata hemen belli olmuyor ya insanı çıldırtıyor. 100 kere açıp kapıyorsun devreyi sorun vermiyor. Takılı olduğu yerde 101. defa da ya da 3 ay sonra arıza veriyor ya o çok kötü birşey.

Daha önce ki bi devremde de ATMEGA16 ile i2c eeprom larda sorun yaşamıştım. devre çok güzel çalışyor derken 2-3 ay sonra olmadık yerde donuyordu. O problemi WDT ı aktif ederek aştım ancak bu problemi nasıl aşacağız bakalım. Umarım BOR aktif olunca sorun çözülür.

Saygılarla,
Başlık: Ynt: PIC RESETLENINCE DAHİLİ EEPROM DATALARI DEĞİŞİYOR.
Gönderen: gogge - 19 Şubat 2013, 12:22:09
Benzer sorunu ben de yaşıyorum. Bor'u deneyelim bakalım.