ccs c eeprom

cslyas06

Üye
Katılım
13 Haz 2014
Mesajlar
114
Puanları
1
Yaş
31
s.a iyi geceler ccs c de şöyle bir sıkıntım var yazılımcı arkadaşlar yardımcı olursa sevinirim.
mesela bir değişkenliği eeproma yazdırıp okuyabiliyoruz int i; diye değişkenliğimiz var ve write_eeprom(1,i); diye yazıp tekrar i=read_eeprom(1); okutabiliyoruz burada sorun yok mesela ben röle çektirdim ve sistem kapanıp açıldığında o röle eski konumunda devam etmesinini istiyorum.
örnek olarak #define ROLE pin_d7 degerini tanımlayıp output_high(role); yaparak rölemi aktif ettim burada role bir değişken olmadığı için eeprom a yazdıramıyorum bu sorunu nasıl bir yolla hallederiz ?
 
A.S.
Bunlar işine yarar. Kolay gelsin.

Kod:
#include <18F45K22.h>
#device ADC=10
#use delay(internal=64000000)

unsigned int role;

void role_on(int kontak)
{
 
   bit_set(role,kontak);
   write_eeprom(1,role);
   output_d(role);
}

void role_off(int kontak)
{
 
   bit_clear(role,kontak);
   write_eeprom(1,role);
   output_d(role);
}


void main()
{
   role=read_eeprom(1);
   output_d(role);

   while(TRUE)
   {
       role_on(0);
      delay_ms(500);
      role_on(1);
      delay_ms(500);
       role_on(2);
      delay_ms(500);
       role_on(4);
      delay_ms(500);
    
      role_off(1);
      delay_ms(500);
      role_off(2);
      delay_ms(500);
      role_off(4);
      delay_ms(500);
      role_off(7);
      delay_ms(500);
    
   }

}
 
@muratmert4 hocam verdiğiniz örnek tam istediğim yöntem fakat yine biryerde hata yapıyorum sanırım aşağıdaki yazılımda d portunun 8.biti yani d7 portu lojik 1 olması gerekiyor fakat bende d portunun tümü lojik 1 oluyor biryerde hatamı yapıyorum anlamadım?

#include <16F877A.h>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES LP //Low power osc < 200 khz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES WRT_50% //Lower half of Program Memory is Write Protected

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
unsigned int role;

void role_on(int kontak)
{

bit_set(role,kontak);
write_eeprom(1,role);
output_d(role);
}

void role_off(int kontak)
{

bit_clear(role,kontak);
write_eeprom(1,role);
output_d(role);
}

void main()
{
output_a(0x00);
output_b(0b00000000);
output_c(0b00000000);
output_d(0b00000000);

role=read_eeprom(1);
output_d(role);

while(TRUE)
{
role_on(8);

}

}
 
S.A.
role_on(0);.....portd.0
role_on(1);.....portd.1
role_on(2);.....portd.2
role_on(3);.....portd.3
role_on(4);.....portd.4
role_on(5);.....portd.5
role_on(6);.....portd.6
role_on(7);.....portd.7
 
hocam inanırmısınız bu türlüde çıkışlar hep 1 veriyor eeprom komutlarını kaldırdınmı sorun düzeliyor.
 
eproma role cıkısı aktif için 1 yazın. kapalı için sıfır yazın.

role pin pasif ise baska bir değişkeni mesela char role olsun. role= 0; bunu epraoma yazın.
role pin aktif ise bu sefer bu değişkeni role= 1; bunu epraoma yazın.(bu tek role için)




eproma yazdıgınız veri kaç bit alan kaplıyor?

role_on(0);.....portd.0
role_on(1);.....portd.1
role_on(2);.....portd.2
role_on(3);.....portd.3
role_on(4);.....portd.4
role_on(5);.....portd.5
role_on(6);.....portd.6
role_on(7);.....portd.7

port d 8 bit. bunu role değişkeninde saklayın. eproma yazın ve okuyun.
0,1,2,3 roleler on 4,5,6,7 off olsun. role =0b00001111 olur. bunu yazın okuyun gibi.
0,3,4,7 on 1,2,5,6 of bu sefer role = 0b10011001 bunu yazın okuyun gibi.


unsigned int role 16 bit yani 2 byte olur. 8 roleniz var. burada hata yapıyor olabilirsiniz.
 
Son düzenleme:
S.A.
Hayır 8 bittir.
Unsigned int işaretsiz yani 0-255 arası
int -128 +128 arası dır.
Programına başlamadan önce pice il yükleme anında eepromları FF yerine 00 yap yada program ilk yüklendiğinde bazı degerleri sıfırla.


#include <18F45K22.h>
#device ADC=10
#use delay(internal=64000000)

unsigned int role;
int i=0,kontr=0;

void role_on(int kontak)
{

bit_set(role,kontak);
write_eeprom(1,role);
output_d(role);
}

void role_off(int kontak)
{

bit_clear(role,kontak);
write_eeprom(1,role);
output_d(role);
}


void main()
{
kontr=read_eeprom(0);/// ilk default değer için
if(kontr!=1)
{
for(i=0;i<20;i++){ write_eeprom(i,0);}///0-20 adres eeprom degeri 0 olur
write_eeprom(0,1);
}
role=read_eeprom(1);
output_d(role);

while(TRUE)
{
role_on(0);
delay_ms(500);
role_on(1);
delay_ms(500);
role_on(2);
delay_ms(500);
role_on(4);
delay_ms(500);

role_off(1);
delay_ms(500);
role_off(2);
delay_ms(500);
role_off(4);
delay_ms(500);
role_off(7);
delay_ms(500);

}

}
 

Forum istatistikleri

Konular
129,808
Mesajlar
930,317
Kullanıcılar
452,616
Son üye
mgokce45

Yeni konular

Geri
Üst