Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: bulut_01 - 09 Ocak 2013, 02:20:20

Başlık: eeprom 16 bit veri yazma
Gönderen: bulut_01 - 09 Ocak 2013, 02:20:20
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);
}
}
}
}
Başlık: Ynt: eeprom 16 bit veri yazma
Gönderen: 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





Başlık: Ynt: eeprom 16 bit veri yazma
Gönderen: Murat Mert - 09 Ocak 2013, 10:33:05
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);
}
Başlık: Ynt: eeprom 16 bit veri yazma
Gönderen: 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);
}
}
}
}
}
}
Başlık: Ynt: eeprom 16 bit veri yazma
Gönderen: omereliusuk - 10 Ocak 2013, 00:30:50
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);
Başlık: Ynt: eeprom 16 bit veri yazma
Gönderen: sadogan - 10 Ocak 2013, 00:38:15
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 .
Başlık: Ynt: eeprom 16 bit veri yazma
Gönderen: bulut_01 - 10 Ocak 2013, 00:46:56
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);
}
}
}
}
Başlık: Ynt: eeprom 16 bit veri yazma
Gönderen: sadogan - 10 Ocak 2013, 00:50:00
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.
Başlık: Ynt: eeprom 16 bit veri yazma
Gönderen: bulut_01 - 10 Ocak 2013, 01:06:49
@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);
}
}
}
}
Başlık: Ynt: eeprom 16 bit veri yazma
Gönderen: elektronik - 26 Mart 2013, 17:09:08

#include <internal_eeprom.c>
write_int16_eeprom()
read_int16_eeprom()
Başlık: Ynt: eeprom 16 bit veri yazma
Gönderen: Murat Mert - 26 Mart 2013, 18:47:00
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.