EEPROM hafızalı 0-9999 Sayıcı devresi..

Başlatan Mr.Java, 28 Mart 2013, 14:48:17

Mr.Java

Arkadaşlar merhaba.

EEPROM konusunu tam anlayamadım.Bu nedenle yardımınıza ihtiyacım var.0-9999 arası sayıcı devresi enerji kesilse bile kaldığı yerden devam etmesini istiyorum.Acaba mevcut kod üzerinde nasıl bir optimasyon sağlayabiliriz ? Aşağıda kodlar sıkıntısız olarak 0-9999 arası sayıyor.

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

 * TARIH  21 MART 2013
 * MCU    PIC16F877A
 * YAZAR  Fatih ASLAN
 * PROJE  0-9999 Sayici Devresi

 *********************************************************************************************/
#include <pic.h>
#include "BoardConfig.h"
#include "delay.h"
#define uchar unsigned char
#define uint  unsigned int

__CONFIG(0x3F32);

void LED_DISPLAY(void);

uchar LED_DIS[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};

uchar DIS_NUM[4];

void LED_DISPLAY(void)
{
    uchar i, j, k;
    RA3 = 0;

    for (k = 0; k < 50; k++)
        for (j = 0X80, i = 0; i < 4; i++)
        {

            //******************************************************************
            RC4 = 1;
            PORTD = j;
            RC4 = 0;
            //******************************************************************

            //******************************************************************
            RC3 = 1;
            PORTD = LED_DIS[DIS_NUM[i]];
            RC3 = 0;
            //******************************************************************

            j >>= 1;
            DelayMs(2);

            //******************************************************************
            RC4 = 1;
            PORTD = 0X00;
            RC4 = 0;
            DelayMs(2);
            //******************************************************************
        }
}

void main (void)
{
     uint counter;

     Board_Ayar();         

     while(1)
    {
       for(counter=0;counter<9999;counter++)
       {
           DIS_NUM[0]=(uchar)(counter/1000);         
           DIS_NUM[1]=(uchar)((counter%1000)/100);    
           DIS_NUM[2]=(uchar)((counter%100)/10);      
           DIS_NUM[3]=(uchar)(counter%10);            
           LED_DISPLAY();                            
       }
    }
}


Buda "BoardConfig.h"kütüphanem..
/******************Tanımlamalar******************/
#define uchar unsigned char
#define uint unsigned int
#define RA3 PORTA.RA3
#define RC2 PORTC.RC2
#define RC3 PORTC.RC3
#define RC4 PORTC.RC4
#define RC5 PORTC.RC5
#define RE0 PORTE.RE0
#define RE1 PORTE.RE1
#define RE2 PORTE.RE2

/***********************************************
Proje: Board Konfigürasyon Kütüphanesi
Yazar: Fatih ASLAN
Tarih: MART 27-2013
/********************************************/
void Board_Ayar(void)
{

//*****TÜM PORTLAR ÇIKIŞ******************************************************
    TRISA=0x00;
    TRISB=0x00;
    TRISC=0x00;
    TRISD=0x00;
    TRISE=0X00;
//****************************************************************************


//*****¹8 LED KONTROL*********************************************************
   PORTD=0XFF;   //PORTD tüm bitler çıkış
   RA3=0;        //Latch Aktif.
   RC5=1;
   asm {nop;}
   asm {nop;}
   RC5=0;         //Latch kapalı.
//************************************************************************

//*****Display Kontrol****************************************************
   RC3=1;         //Latch Aktif.
   asm {nop;}
   asm {nop;}
   RC3=0;        // Latch Kapalı.
//************************************************************************

//*****Segment Kontrol*****************************************************
    RC4=1;       //Latch Aktif.
    PORTD=0X00;
    asm {nop;}
    asm {nop;}
    RC4=0;      // Latch Kapalı.
//************************************************************************
    PORTD=0XFF;   //PORTD Çıkış Ayarlandı.
    RC2=1;        //LED 10 Açık.
    RE0=0;        //Buzzer
    RE1=0;        //Röle
    RE2=0;        //MAX485
}



İyi forumlar...   :)

Mr.Java


yldzelektronik

Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mr.Java

Aradığımı bulamadığım ve konunun üstünde sorunumu tam belirttiğim için konu açma gereği duydum.

İyi forumlar.

yldzelektronik

#4
/********************************************************************************************

 * TARIH  21 MART 2013
 * MCU    PIC16F877A
 * YAZAR  Fatih ASLAN
 * PROJE  0-9999 Sayici Devresi

 *********************************************************************************************/
#include <pic.h>
#include "eeprom.h"
#include "BoardConfig.h"
#include "delay.h"
#define uchar unsigned char
#define uint  unsigned int

__CONFIG(0x3F32);

void LED_DISPLAY(void);

uchar LED_DIS[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};

uchar DIS_NUM[4];

//*************************************************************************************
void ee_write16(int8 pos, int16 valor) {
   int8 bte;
   bte = valor & 0xFF;
   write_eeprom (pos, bte);
   valor >>= 8;
   
   bte = valor & 0xFF;
   write_eeprom (pos+1, bte);
   valor >>= 8;
}
//////////////////////////////////////////////
int16 ee_read16(int8 pos){
   int8 bte;
   int16 valor = 0;
   
   bte = read_eeprom (pos+1);
   valor += bte;
   valor <<= 8;
   
   bte = read_eeprom (pos);
   valor += bte;
   
   return valor;
}
//**************************************************************************************
void LED_DISPLAY(void)
{
    uchar i, j, k;
    RA3 = 0;

    for (k = 0; k < 50; k++)
        for (j = 0X80, i = 0; i < 4; i++)
        {

            //******************************************************************
            RC4 = 1;
            PORTD = j;
            RC4 = 0;
            //******************************************************************

            //******************************************************************
            RC3 = 1;
            PORTD = LED_DIS[DIS_NUM[i]];
            RC3 = 0;
            //******************************************************************

            j >>= 1;
            DelayMs(2);

            //******************************************************************
            RC4 = 1;
            PORTD = 0X00;
            RC4 = 0;
            DelayMs(2);
            //******************************************************************
          
           

        }
}

void main (void)
{
     uint counter;

     Board_Ayar();         
     
     while(1)
    {
     //******************************************************************       
       unsigned int16 deger=ee_read16(0x00);
    //******************************************************************
       for(counter=deger;counter<9999;counter++)
       {
           DIS_NUM[0]=(uchar)(counter/1000);         
           DIS_NUM[1]=(uchar)((counter%1000)/100);    
           DIS_NUM[2]=(uchar)((counter%100)/10);      
           DIS_NUM[3]=(uchar)(counter%10);            
           LED_DISPLAY();    
           //******************************************************************
            ee_write16(0x01, counter);
           //******************************************************************
                        
       }
    }
}



Sorunu yanlış anlamadıysam aradığın eeprom nedir?

http://tr.wikipedia.org/wiki/EEPROM

Not: Kodlar https://www.picproje.org/index.php?topic=44473.0 linkinde mevcut.
Alıntı yapılan: necati - 09 Ocak 2013, 02:40:37
//eeprom16.c
/*ee_write16************************ee_read16*/
void ee_write16(int8 pos, int16 valor);
int16 ee_read16(int8 pos);

/* Estas funciones son little-endian */
void ee_write16(int8 pos, int16 valor) {
   int8 bte;
   bte = valor & 0xFF;
   write_eeprom (pos, bte);
   valor >>= 8;
   
   bte = valor & 0xFF;
   write_eeprom (pos+1, bte);
   valor >>= 8;
}
//////////////////////////////////////////////
int16 ee_read16(int8 pos){
   int8 bte;
   int16 valor = 0;
   
   bte = read_eeprom (pos+1);
   valor += bte;
   valor <<= 8;
   
   bte = read_eeprom (pos);
   valor += bte;
   
   return valor;
}
//****************************************************//

#include "eeprom16.c"

ft=ee_read16(16);
ee_write16(16,ft);

ct=ee_read16(18);
ee_write16(18,ct);


//kolay gelsin

Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mr.Java

Merhaba.
Cevap için teşekkürler kodunuzu inceledim fakat int16 şeklinde tanımlamaları mplab x hata olarak gördü.Sanırım eeprom.h kütüphanesinden kaynaklanıyor.Bu sebepten datasheete bakarak biraz asm atarak kendim oluşturdum kütüphanemi.Kodlar çalışıyor fakat saymaya 255 değerinden başlıyor.

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

 * TARIH  21 MART 2013
 * MCU    PIC16F877A
 * YAZAR  Fatih ASLAN
 * PROJE  0-9999 Sayici Devresi

 *********************************************************************************************/
#include <pic.h>
#include "BoardConfig.h"
#include "delay.h"
#define uchar unsigned char
#define uint  unsigned int

__CONFIG(0x3F32);

void LED_DISPLAY(void);



uchar LED_DIS[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};

uchar DIS_NUM[4];

//*************************************************************************************
void write(uchar addr,uchar date)
{    while(WR==1);
     EEADR=addr;
     EEDATA=date;
     EEPGD=0;
     WREN=1;
     EECON2=0X55;
     EECON2=0XAA;
     WR=1;
     WREN=0;
}
//////////////////////////////////////////////
uchar read(uchar addr)
{     EEADR=addr;
      RD=1;
      NOP();NOP();
      return(EEDATA);
}
//**************************************************************************************
void LED_DISPLAY(void)
{
    uchar i, j, k;
    RA3 = 0;

    for (k = 0; k < 50; k++)
        for (j = 0X80, i = 0; i < 4; i++)
        {

            //******************************************************************
            RC4 = 1;
            PORTD = j;
            RC4 = 0;
            //******************************************************************

            //******************************************************************
            RC3 = 1;
            PORTD = LED_DIS[DIS_NUM[i]];
            RC3 = 0;
            //******************************************************************

            j >>= 1;
            DelayMs(2);

            //******************************************************************
            RC4 = 1;
            PORTD = 0X00;
            RC4 = 0;
            DelayMs(2);
            //******************************************************************



        }
}

void main (void)
{
     uint counter;
     uint deger;
     Board_Ayar();

     while(1)
    {
     //******************************************************************
       deger=read(0x00);
    //******************************************************************
       for(counter=deger;counter<9999;counter++)
       {
           DIS_NUM[0]=(uchar)(counter/1000);
           DIS_NUM[1]=(uchar)((counter%1000)/100);
           DIS_NUM[2]=(uchar)((counter%100)/10);
           DIS_NUM[3]=(uchar)(counter%10);
           LED_DISPLAY();
           //******************************************************************
            write(0x01, counter);
           //******************************************************************

       }
    }
}

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

yldzelektronik

#7
Alıntı yapılan: Fkarizmatik - 28 Mart 2013, 21:32:58
Merhaba.
Cevap için teşekkürler kodunuzu inceledim fakat int16 şeklinde tanımlamaları mplab x hata olarak gördü.Sanırım eeprom.h kütüphanesinden kaynaklanıyor.Bu sebepten datasheete bakarak biraz asm atarak kendim oluşturdum kütüphanemi.Kodlar çalışıyor fakat saymaya 255 değerinden başlıyor.

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

 * TARIH  21 MART 2013
 * MCU    PIC16F877A
 * YAZAR  Fatih ASLAN
 * PROJE  0-9999 Sayici Devresi

 *********************************************************************************************/
#include <pic.h>
#include "BoardConfig.h"
#include "delay.h"
#define uchar unsigned char
#define uint  unsigned int

__CONFIG(0x3F32);

void LED_DISPLAY(void);



uchar LED_DIS[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};

uchar DIS_NUM[4];

//*************************************************************************************
void write(uchar addr,uchar date)
{    while(WR==1);
     EEADR=addr;
     EEDATA=date;
     EEPGD=0;
     WREN=1;
     EECON2=0X55;
     EECON2=0XAA;
     WR=1;
     WREN=0;
}
//////////////////////////////////////////////
uchar read(uchar addr)
{     EEADR=addr;
      RD=1;
      NOP();NOP();
      return(EEDATA);
}
//**************************************************************************************
void LED_DISPLAY(void)
{
    uchar i, j, k;
    RA3 = 0;

    for (k = 0; k < 50; k++)
        for (j = 0X80, i = 0; i < 4; i++)
        {

            //******************************************************************
            RC4 = 1;
            PORTD = j;
            RC4 = 0;
            //******************************************************************

            //******************************************************************
            RC3 = 1;
            PORTD = LED_DIS[DIS_NUM[i]];
            RC3 = 0;
            //******************************************************************

            j >>= 1;
            DelayMs(2);

            //******************************************************************
            RC4 = 1;
            PORTD = 0X00;
            RC4 = 0;
            DelayMs(2);
            //******************************************************************



        }
}

void main (void)
{
     uint counter;
     uint deger;
     Board_Ayar();

     while(1)
    {
     //******************************************************************
       deger=read(0x00);
    //******************************************************************
       for(counter=deger;counter<9999;counter++)
       {
           DIS_NUM[0]=(uchar)(counter/1000);
           DIS_NUM[1]=(uchar)((counter%1000)/100);
           DIS_NUM[2]=(uchar)((counter%100)/10);
           DIS_NUM[3]=(uchar)(counter%10);
           LED_DISPLAY();
           //******************************************************************
            write(0x01, counter);
           //******************************************************************

       }
    }
}


Sen direk mi denedin?Ben o linkini verdiğim kitabı incelersin diye düşündüm.Kitaba bakarsan orada fonksiyonları görürsün.Kendi fonksiyonunu yazmalısın yani

Edit:Oradaki write ve read fonksiyonları ccs için yazılmış olanlar.data_write_eeprom ve data_read_eeprom olarak değiştirmelisin ve kitapta bahsettiğim fonksiyonları oluşturmalısın.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mr.Java

Zaten ona ve datasheetten bakarak örnek aldım kendi fonksyonumu yazdım hocam.

Read ve Write adında fonksyonlar.Proteusta denedim çalışıyor lakin gerçekte çalışmıyor.Hatta datasheette yazma ve okuma bittiğinde kesme yapılabiliyormuş.Koda onuda ekledim hiçbirşey olmuyor..
kod

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

 * TARIH  21 MART 2013
 * MCU    PIC16F877A
 * YAZAR  Fatih ASLAN
 * PROJE  0-9999 Sayici Devresi

 *********************************************************************************************/
#include <pic.h>
#include "BoardConfig.h"
#include "delay.h"
#define uchar unsigned char
#define uint  unsigned int
char i = 1;
__CONFIG(0x3F32);

void LED_DISPLAY(void);



uchar LED_DIS[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};

uchar DIS_NUM[4];

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

void write(uchar addr, uchar date)
{
    while (WR == 1);
    EEADR = addr;
    EEDATA = date;
    EEPGD = 0;
    WREN = 1;
    EECON2 = 0X55;
    EECON2 = 0XAA;
    WR = 1;
    WREN = 0;
}
//////////////////////////////////////////////

uchar read(uchar addr)
{
    EEADR = addr;
    RD = 1;
    NOP();
    NOP();
    return (EEDATA);
}
//**************************************************************************************

void LED_DISPLAY(void)
{
    uchar i, j, k;
    RA3 = 0;

    for (k = 0; k < 50; k++)
        for (j = 0X80, i = 0; i < 4; i++)
        {

            //******************************************************************
            RC4 = 1;
            PORTD = j;
            RC4 = 0;
            //******************************************************************

            //******************************************************************
            RC3 = 1;
            PORTD = LED_DIS[DIS_NUM[i]];
            RC3 = 0;
            //******************************************************************

            j >>= 1;
            DelayMs(2);

            //******************************************************************
            RC4 = 1;
            PORTD = 0X00;
            RC4 = 0;
            DelayMs(2);
            //******************************************************************



        }
}

void main(void)
{
    uint counter;
    uint deger;
    Board_Ayar();
    EEIE = 1;
    PEIE=1;
    EEIF = 0;
    GIE = 1;
    RC5=1;
    while (1)
    {
        //******************************************************************
        deger = read(0x00);
        //******************************************************************
        for (counter = deger; counter < 9999; counter++)
        {
            DIS_NUM[0] = (uchar) (counter / 1000);
            DIS_NUM[1] = (uchar) ((counter % 1000) / 100);
            DIS_NUM[2] = (uchar) ((counter % 100) / 10);
            DIS_NUM[3] = (uchar) (counter % 10);
            LED_DISPLAY();
            //******************************************************************
            write(0x01, counter);
            //******************************************************************

        }
    }
}

static void interrupt kesme(void)
{
    if (EEIF)
    {
        i = !i;
        PORTD = i;
        EEIF = 0;
    }
}

yldzelektronik

8bit alana 16bit yazmaya çalışıyorsun.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mr.Java

Şimdi ise ekrana hiçbirşey gelmiyor hocam.Acaba nerede yanlışlık yaptık ?

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

 * TARIH  21 MART 2013
 * MCU    PIC16F877A
 * YAZAR  Fatih ASLAN
 * PROJE  0-9999 Sayici Devresi

 *********************************************************************************************/
#include <pic.h>
#include "BoardConfig.h"
#include "delay.h"
#define uchar unsigned char
#define uint  unsigned int
char i = 1;
__CONFIG(0x3F32);

void LED_DISPLAY(void);
extern void data_eeprom_write(unsigned char address, unsigned char data);
extern unsigned char data_eeprom_read(unsigned char address);
void ee_write16(uchar pos, uint valor);
uint ee_read16(uchar pos);

uchar LED_DIS[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};

uchar DIS_NUM[4];

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

void data_eeprom_write(unsigned char address, unsigned char data)
{
    EEADR = address;
    EEDATA = data;
    WREN = 1;
    EECON2 = 0x55;
    EECON2 = 0xAA;
    WR = 1;
    while (WR);
    WREN = 0;
}

unsigned char data_eeprom_read(unsigned char address)
{
    EEADR = address;
    RD = 1;
    return (EEDATA);
}

/* Estas funciones son little-endian */
void ee_write16(uchar pos, uint valor)
{
    uchar bte;
    bte = valor & 0xFF;
    data_eeprom_write(pos, bte);
    valor >>= 8;

    bte = valor & 0xFF;
    data_eeprom_write(pos + 1, bte);
    valor >>= 8;
}
//////////////////////////////////////////////

uint ee_read16(uchar pos)
{
    uchar bte;
    uint valor = 0;

    bte = data_eeprom_read(pos + 1);
    valor += bte;
    valor <<= 8;

    bte = data_eeprom_read(pos);
    valor += bte;

    return valor;
}
//**************************************************************************************

void LED_DISPLAY(void)
{
    uchar i, j, k;
    RA3 = 0;

    for (k = 0; k < 50; k++)
        for (j = 0X80, i = 0; i < 4; i++)
        {

            //******************************************************************
            RC4 = 1;
            PORTD = j;
            RC4 = 0;
            //******************************************************************

            //******************************************************************
            RC3 = 1;
            PORTD = LED_DIS[DIS_NUM[i]];
            RC3 = 0;
            //******************************************************************

            j >>= 1;
            DelayMs(2);

            //******************************************************************
            RC4 = 1;
            PORTD = 0X00;
            RC4 = 0;
            DelayMs(2);
            //******************************************************************



        }
}

void main(void)
{
    uint counter;
    uint deger;
    Board_Ayar();
    EEIE = 1;
    PEIE = 1;
    EEIF = 0;
    GIE = 1;
    RC5 = 1;
    while (1)
    {
        //******************************************************************
        deger = ee_read16(0x00);

        //******************************************************************
        for (counter = deger; counter < 9999; counter++)
        {
            DIS_NUM[0] = (uchar) (counter / 1000);
            DIS_NUM[1] = (uchar) ((counter % 1000) / 100);
            DIS_NUM[2] = (uchar) ((counter % 100) / 10);
            DIS_NUM[3] = (uchar) (counter % 10);
            LED_DISPLAY();
            //******************************************************************
            ee_write16(0x01, counter);
            //******************************************************************

        }
    }
}

static void interrupt kesme(void)
{
    if (EEIF)
    {
        i++;
        PORTD = i;
        EEIF = 0;
    }
}

yldzelektronik

1. adresten itibaren yazmaya başlıyor 0. adresten okuma yapmaya çalışıyorsun.Özel bir sebebin mi var?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mr.Java

#12
Konu Çözüldü.Yardımcı olan herkese teşekkürler..
while (1)
    {
        //******************************************************************
        deger = ee_read16(0x01);

        //******************************************************************
        for (counter = deger; counter < 9999; counter++)
        {
            DIS_NUM[0] = (uchar) (counter / 1000);
            DIS_NUM[1] = (uchar) ((counter % 1000) / 100);
            DIS_NUM[2] = (uchar) ((counter % 100) / 10);
            DIS_NUM[3] = (uchar) (counter % 10);
            LED_DISPLAY();
            //******************************************************************
            ee_write16(0x01, counter);
            //******************************************************************

        }