PIC RESETLENINCE DAHİLİ EEPROM DATALARI DEĞİŞİYOR.

Başlatan alikilavuz, 18 Şubat 2013, 18:49:59

alikilavuz

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



F.T

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.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

LukeSkywalker

İlk açılışa 500 ms'lik veya daha uzun bir gecikme koyun.

F.T

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.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

mehmet

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..
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

alikilavuz

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,

gogge

Benzer sorunu ben de yaşıyorum. Bor'u deneyelim bakalım.