eeprom 16 bit veri yazma

Başlatan bulut_01, 09 Ocak 2013, 02:20:20

bulut_01

iyi  geceler picproje ailesi sorunum 50.000 rakamını eeproma yazma bitane sayac yapdım 50.000cide çıkıs verecek cıkısı verıyor 50.000/500 işlemini yapıp eeproma yazamadım nerde hata yapıyorum bulamadım floor işlemini ccs derleyemedım hata verdı.

#include <12F675.h> 
#fuses INTRC_IO,NOPROTECT,NOWDT,NOMCLR
#use delay(clock=4000000)

int16 ct=0 ;
int16 ft=0 ;
int8 x=0;
unsigned int8 eeprom_adres;

void main()
{ 
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 setup_timer_1(T1_DISABLED);
 setup_comparator(NC_NC_NC_NC);
 setup_vref(FALSE);
 setup_adc(adc_clock_div_32);
 setup_adc_ports(AN0_analog); 
 set_adc_channel(0);
 
set_tris_a(0B00000101);
output_a(0x00);

output_high(pin_a5);
x=read_adc();
delay_us(200);
if(x>5 && x<8)
{
output_low(pin_a1);
}
else
{
output_high(pin_a1);
}
ft=read_eeprom(00);
delay_ms(20);

if(ft==100)           ///////
{
output_high(pin_a1);
output_low(pin_a5);
}
while(true)
{
if(ct<50000)    ///////
{
if(input(pin_a2)==1)
{
ct++;
{
eeprom_adres=floor(ct/500);
write_eeprom(eeprom_adres,ct);

delay_us(100);
}
while(input(pin_a2));
{
delay_ms(1);
}
}

if((ct)==100)           //////// 
{
output_high(pin_a1);
}
}
}
}
YENİLMEZ..

necati

#1
//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





[email]entegreterbiyecisi@yahoo.com[/email]

Murat Mert

#2
S.A.
Bende şöyle bişi yapmıştım. Bu sayede 16 f serisi pic de baya yer kazanmıştık.

//------------------EEPROM YAZMA 8 BIT------------------------------------------------
void kaydet (int adres,int deger)
{
write_eeprom(adres,deger);
}

//------------------EEPROM YAZMA 16 BIT------------------------------------------------

void kaydet_16 (int adres,int16 deger)
{
write_eeprom(adres,make8(deger,0));
write_eeprom(adres+1,make8(deger,1));
}

//---------ACILISTA ILK OKUMA ICINDE BU KODLARI KULLANDIM------------

//-----------------8BIT EEPROM OKUMA--------------------------------------------
void ilkoku (int adres ,int deger)
{
 deger=read_eeprom(adres);
}
//-----------------16 BITEEPROM OKUMA-------------------------------------------
void ilkoku_16 (int adres ,int16 deger)
{
 make8(deger,0)=read_eeprom(adres);
 make8(deger,1)=read_eeprom(adres+1);
}
mert07

bulut_01

#3
söyle bişey yazdım derlemıyor ccs denen program 10.000 değerini eeproma yazmam lazım bu değer anlık artıyor 0 baslıyor 10.000 kadar gidiyor kodda nerde yanlışlık var ?
void kayıt  satırını sıldım dırek asagıdakı gıbı yazdım bundan bı sıkıntı cıkarmı

#include <12F675.h> 
#fuses INTRC_IO,NOPROTECT,NOWDT,NOMCLR
#use delay(clock=4000000)

int16 ct=0 ;




void main()
{ 
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 setup_timer_1(T1_DISABLED);
 setup_comparator(NC_NC_NC_NC);
 setup_vref(FALSE);
 setup_adc(adc_clock_div_32);
 setup_adc_ports(AN0_analog); 
 set_adc_channel(0);
 
set_tris_a(0B00000101);
output_a(0x00);


while(true)
{
if(ct<10000)    ///////
{
if(input(pin_a2)==1)
{
ct++;
{



write_eeprom(00,make8(ct,0)) ;    ///// bu şekilde ne kadar saglıklı olur
write_eeprom(00+1,make8(ct,1));


delay_us(100);
}
while(input(pin_a2));
{
delay_ms(1);
}


if((ct)==50)           //////// 
{
output_high(pin_a1);
}
}
}
}
}
}
YENİLMEZ..

omereliusuk

#4
adress=hangi_adress;
*((int8 *) & yazacaginveri   +0) =write_eeprom(adress++);
*((int8 *) & yazacaginveri   +1) =write_eeprom(adress);

okurken de 
adress=hangi_adres;
*((int8 *) & ct   +0) =read_eeprom(adress++);
*((int8 *) & ct   +1) =read_eeprom(adress);

sadogan

Alıntı yapılan: bulut_01 - 09 Ocak 2013, 21:20:21
söyle bişey yazdım derlemıyor ccs denen program 10.000 değerini eeproma yazmam lazım bu değer anlık artıyor 0 baslıyor 10.000 kadar gidiyor kodda nerde yanlışlık var ?
void kayıt  satırını sıldım dırek asagıdakı gıbı yazdım bundan bı sıkıntı cıkarmı

#include <12F675.h> 
#fuses INTRC_IO,NOPROTECT,NOWDT,NOMCLR
#use delay(clock=4000000)

int16 ct=0 ;




void main()
{ 
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 setup_timer_1(T1_DISABLED);
 setup_comparator(NC_NC_NC_NC);
 setup_vref(FALSE);
 setup_adc(adc_clock_div_32);
 setup_adc_ports(AN0_analog); 
 set_adc_channel(0);
 
set_tris_a(0B00000101);
output_a(0x00);


while(true)
{
if(ct<10000)    ///////
{
if(input(pin_a2)==1)
{
ct++;
{



write_eeprom(00,make8(ct,0)) ;    ///// bu şekilde ne kadar saglıklı olur
write_eeprom(00+1,make8(ct,1));


delay_us(100);
}
while(input(pin_a2));
{
delay_ms(1);
}


if((ct)==50)           //////// 
{
output_high(pin_a1);
}
}
}
}
}
}

Hiç sıkıntı olmaz .

bulut_01

saolun arkadaslar sorunu çözdüm örnek kod.

#include <12F675.h> 
#device ADC=10
#fuses INTRC_IO,NOPROTECT,NOWDT,NOMCLR
#use delay(clock=4000000)
#use fast_io(a)

int16 ct=0 ;
int16 ft=0 ;
unsigned long int oku ;
float ok;

void main()
{ 
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 setup_timer_1(T1_DISABLED);
 setup_comparator(NC_NC_NC_NC);
 setup_vref(FALSE);
 setup_adc(adc_clock_div_32);
 setup_adc_ports(AN0_analog); 
 
 set_tris_a(0B00000101);
output_a(0x00);

set_adc_channel(0);
delay_us(20);
oku=read_adc();
ok=0.0048828125*oku;

if(ok<3.00 && ok>2.50)
{
output_low(pin_a1);
}
else
{
output_high(pin_a1);
}

make8(ft,0)=read_eeprom(00);
make8(ft,1)=read_eeprom(00+1);
delay_us(100);
if(ft==10)      ////
{
output_high(pin_a1);
}

while(true)
{
if(ct<10)    ///////
{
if(input(pin_a2)==1)

{
ct++;
{
write_eeprom(00,make8(ct,0)) ;
write_eeprom(00+1,make8(ct,1));
delay_us(10);
}
while(input(pin_a2));
{
delay_ms(1);
}
}

if((ct)==10)           ////////
{
output_high(pin_a1);
}
}
}
}
YENİLMEZ..

sadogan

#7
Ama kodunda yanlışlıklar var lüleli parentezlerinde karışmalar olmuş

void main()
{ 
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 setup_timer_1(T1_DISABLED);
 setup_comparator(NC_NC_NC_NC);
 setup_vref(FALSE);
 setup_adc(adc_clock_div_32);
 setup_adc_ports(AN0_analog); 
 set_adc_channel(0);
 
set_tris_a(0B00000101);
output_a(0x00);


while(true)
{
      if(ct<10000)    ///////
      {
         if(input(pin_a2)==1)
         {
            ct++;
         {  ----> burda herhangi sorgu dongü vs başlangıcı yok  !!!!

write_eeprom(00,make8(ct,0)) ;    ///// bu şekilde ne kadar saglıklı olur
write_eeprom(00+1,make8(ct,1));


delay_us(100);
} ----> burda kapanmış  !!!!
while(input(pin_a2));
{
delay_ms(1);
}


if((ct)==50)           //////// 
{
output_high(pin_a1);
}
}
}
}
} ---> bu fazla
}

görebildiklerim bunlar

mesaj birleştirme:: 10 Ocak 2013, 00:58:11

bulut_01 hocam
pin_a2 niz 1 oldugu sürece eeproma sürekli yazıyorsunuz.

bulut_01

#8
@sadogan kardesım eyw sağolasın bi parantez orda fazladan kalmıs düzeltim  :D evt eeproma yazmam gerekli sürekdi bir cihazı modifiye ettım ona uyduracam bunu bakalım.
not:katalogunda 1 mılyon kez yazma cızma ömrü varmıs microchip abimiz öyle diyor.  ;)

#include <12F675.h> 
#device ADC=10
#fuses INTRC_IO,NOPROTECT,NOWDT,NOMCLR
#use delay(clock=4000000)
#use fast_io(a)

int16 ct=0 ;
int16 ft=0 ;
unsigned long int oku ;
float ok;

void main()
{ 
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 setup_timer_1(T1_DISABLED);
 setup_comparator(NC_NC_NC_NC);
 setup_vref(FALSE);
 setup_adc(adc_clock_div_32);
 setup_adc_ports(AN0_analog); 
 
set_tris_a(0B00000101);
output_a(0x00);

set_adc_channel(0);
delay_us(20);
oku=read_adc();
ok=0.0048828125*oku;

if(ok<3.00 && ok>2.50)
{
output_low(pin_a1);
}
else
{
output_high(pin_a1);
}

make8(ft,0)=read_eeprom(00);
make8(ft,1)=read_eeprom(00+1);
delay_us(100);
if(ft==10)      ////
{
output_high(pin_a1);
}

while(true)
{
if(ct<10)    ///////
{
if(input(pin_a2)==1)
{

ct++;

write_eeprom(00,make8(ct,0)) ;
write_eeprom(00+1,make8(ct,1));
delay_us(10);

while(input(pin_a2));
{
delay_ms(1);
}
}

if((ct)==10)           ////////
{
output_high(pin_a1);
}
}
}
}
YENİLMEZ..

elektronik

#include <internal_eeprom.c>
write_int16_eeprom()
read_int16_eeprom()

Murat Mert

S.A.
hımm evet hazırı varmış :D hiç dikkatimi çekmemişti. Görmekten görmeye fark varmış.
Benim yaptığım fonksiyon buna benziyor.
mert07