CCS hex kodunun sadece proteusta çalışmasını istiyorum devrede çalışmasın?

Başlatan abstruse, 12 Mayıs 2014, 08:11:07

abstruse

Alıntı yapılan: sezgin05 - 13 Mayıs 2014, 22:44:48
Hocam pice her enerji verdiğinde dahili eepromdaki bir sayıcıyı artır.Örneğin bu sayıcı 20 olduğunda program direkt END yapsın.Böylece pice yüklendiğinde en fazla 20 defa çalışır.Denenmiştir :)
ilk belirttiğim gibi bunu en son çare düşünüyordum başka bi yolu varsa ama malesef çıkmadı çok bi yol :(

Gökhan BEKEN

Yol var. Harici eeprom kullanmadan yapabilirsiniz. Pic'in dahili eepromuna 1 kereye mahsus, bir veri atın.  Sonra asıl programda onu sorgulayın. Gerçek devredeki pic'in dahili hafızasında o veri olmayacağı için çalışmaz.
Özel mesaj okumuyorum, lütfen göndermeyin.

abstruse

Alıntı yapılan: meftun - 14 Mayıs 2014, 09:04:25
Yol var. Harici eeprom kullanmadan yapabilirsiniz. Pic'in dahili eepromuna 1 kereye mahsus, bir veri atın.  Sonra asıl programda onu sorgulayın. Gerçek devredeki pic'in dahili hafızasında o veri olmayacağı için çalışmaz.

o veriyi proteusta nasıl yapıyorum ? yani gerçek devrede olmayan veri proteusta nasıl olacak :/ anlayamadım hocam.

Gökhan BEKEN

Alıntı yapılan: aliemremen - 14 Mayıs 2014, 09:11:28
o veriyi proteusta nasıl yapıyorum ? yani gerçek devrede olmayan veri proteusta nasıl olacak :/ anlayamadım hocam.
Proteus dosyanızdaki pic'e asıl hex dosyasını göstermeden önce,
pic'in dahili eepromuna 1 byte(isteğinize göre daha fazla da olabilir) veriyi yazan programın hex dosyasını gösterip, 1 kere çalıştırıyorsunuz. Böylece proteustaki devre şartları sağlamış oluyor, gerçek devre de o veriler olmadığı için çalışmıyor. Bahsettiğim veriler bir şifre olabilir. Sayaç şeklinde yaparsanız adam sizin arka planda birşeyler yaptığınızı anlayabilir, eğer bunu istemiyorsanız şifre şeklinde yapın.

Eğer sadece sayaç şeklinde yapmak istiyorsanız işiniz daha kolay:
Sizin normal programınız, ilk çalışmasında, dahili eeproma baksın ilgili adresteki veri 20'den küçükse 1 artırıp çalışsın, ama 20 ise çalışmasın gibi...
Bu yöntemde proteusta da gerçek devrede de 20 kereden fazla çalışmaz.

Tercih size kalıyor bu noktada.
Özel mesaj okumuyorum, lütfen göndermeyin.

abstruse

Alıntı yapılan: meftun - 14 Mayıs 2014, 10:02:54
Proteus dosyanızdaki pic'e asıl hex dosyasını göstermeden önce,
pic'in dahili eepromuna 1 byte(isteğinize göre daha fazla da olabilir) veriyi yazan programın hex dosyasını gösterip, 1 kere çalıştırıyorsunuz. Böylece proteustaki devre şartları sağlamış oluyor, gerçek devre de o veriler olmadığı için çalışmıyor. Bahsettiğim veriler bir şifre olabilir. Sayaç şeklinde yaparsanız adam sizin arka planda birşeyler yaptığınızı anlayabilir, eğer bunu istemiyorsanız şifre şeklinde yapın.

Eğer sadece sayaç şeklinde yapmak istiyorsanız işiniz daha kolay:
Sizin normal programınız, ilk çalışmasında, dahili eeproma baksın ilgili adresteki veri 20'den küçükse 1 artırıp çalışsın, ama 20 ise çalışmasın gibi...
Bu yöntemde proteusta da gerçek devrede de 20 kereden fazla çalışmaz.

Tercih size kalıyor bu noktada.

Şimdi eprom.hex programı yazdım 1 tane ve malum devremi bu eprom.hex ile bir kez çalıştırdım sonra stop ettim asılprogram.hex te eprom.hex ile yüklediğim şifreyi sorguladım ve asilprogram.hex ile artık proteusta çalışır mı diyorunuz ben simülasyon 1 kez durunca veriler komple siliniyor diye biliyorum eeprom silinmiyomu ?

t2

eeprom silinmiyor. Bunu silmek için menüden seçim yapılıyordu.
vereceğiniz hex içinde eprom datası olmaz. simülasyon dosyalarında bulunursa işlem tamam demektir. programınız pice yüklense bile eepromdan okuma yapamayacak dolayısıyla çalışmayacak. tabi proteusu kullanan kişi bunu fark edip hexi  pickit2 yazılımı ile açıp eprom datasını eliyle düzeltip yeniden başka hex kaydederse program çalışabilir.

abstruse

Evet galiba mutlu sona ulaştık  :)



Devremiz bu olsun ve öncelikle eeproma bir adet şifre belirleyelim ve ilk programımızı bunu üzerine oluşturalım.
#include <18F452.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOCPD                    //No EE protection
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads

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

#int_eeprom
void eeprom_kesme()
{
output_d(1);
delay_ms(1000);
output_d(0);
delay_ms(1000);
output_d(2);
delay_ms(1000);
output_d(0);

}

int8 sifrem0,sifrem1;
void main()
{
   
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   enable_interrupts(INT_eeprom);
   enable_interrupts(GLOBAL);
   set_tris_d(0x00);
   output_d(0);
   
sifrem0=14;
sifrem1=53;


while(1)
{


write_eeprom(10,sifrem0);
delay_ms(100);
write_eeprom(11,sifrem1);
delay_ms(100);


}
}


Eeproma 1453 şifresini;
10 adresine => 14
11 adresine => 53
olacak şekilde yazdım ve yazma işleminden sonra eeprom kesmesi ile önce sağdan 1. ledi (rd0) sonra sağdan 2. ledi (rd1) yakarak yazma işlemini kontrol ettim emin oldum.
Yaptığım devreyi üzerinde hiç oynama yapmadan baska bir klasöre daha kopyaladım. Daha sonra eeprom yazdığım ile yazmadığım arasındaki farkı görebilmek için.

Kontrol programı.
#include <18F452.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOCPD                    //No EE protection
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads

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



int sifre0;
int sifre1;
void main()
{
 int8 sifre0,sifre1;  
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);

   set_tris_d(0x00);
   output_d(0);
   



while(1)
{
sifre0=read_eeprom(10);
sifre1=read_eeprom(11);

if(sifre0==14 & sifre1==53)
{
output_d(0b00000001);
delay_ms(150);
output_d(0b00000011);
delay_ms(150);
output_d(0b00000111);
delay_ms(150);
output_d(0b00001111);
delay_ms(150);
output_d(0b00011111);
delay_ms(150);
output_d(0b00111111);
delay_ms(150);
output_d(0b01111111);
delay_ms(150);
output_d(0b11111111);
delay_ms(150);
}
else
{
output_d(0xff);
delay_ms(250);
output_d(0x00);
delay_ms(250);
}



}
}

Sonra aynı devre üzrine bu programı derleyip yükledim eğer epromda istediğim adreste istediğim değer varsa ledler sağdan sola dolacak. Yoksa yanıp Sonuç olarakta başarmış olduk.

Evet eeprom içeriği belki okunup daha sonra programı alan kişi değerleri kendiside yazar eeproma ama söyle bi yol izlenebilir kod yazarken programa önce 10. adresi sonra 20. adresi ve ardından 25. adresi kontrol et denilebilir ki bunu tahmin edemez çözmeye çalışan kişi.

Linkte video var 38 mb boyutu kota sorunu olanlar için.
https://www.dropbox.com/s/hzd9hn95fmiec9w/clip0008.avi

Cevap veren herkese ve @meftun arkadaşa çok teşekkür ederim.

Gökhan BEKEN

Alıntı yapılan: aliemremen - 14 Mayıs 2014, 11:44:21
Evet galiba mutlu sona ulaştık  :)

Cevap veren herkese ve @meftun arkadaşa çok teşekkür ederim.
Faydalı oluysak ne mutlu, tebrik ederim.
Özel mesaj okumuyorum, lütfen göndermeyin.

ahmets

Programınız değerliyse hiç bir şekilde hex (veya coff) olarak vermeyin. Eprom nasıl değiştiriliyorsa, hex içinde kontrol yapan yerler de öyle değiştirilebilir.

Aklıma gelen tek yol, TeamViewer benzeri bir programla sizin bilgisayarınızda çalışan Proteus'a uzaktan erişim verebilirsiniz.
Burada da sadece Proteus kullanmaktan fazlasına erişim izni vermemek ve bilgisayarın açıkları olmaması konusunda çok dikkatli olmak gerekir.

abstruse

Alıntı yapılan: ahmets - 14 Mayıs 2014, 16:05:17
Programınız değerliyse hiç bir şekilde hex (veya coff) olarak vermeyin. Eprom nasıl değiştiriliyorsa, hex içinde kontrol yapan yerler de öyle değiştirilebilir.

Aklıma gelen tek yol, TeamViewer benzeri bir programla sizin bilgisayarınızda çalışan Proteus'a uzaktan erişim verebilirsiniz.
Burada da sadece Proteus kullanmaktan fazlasına erişim izni vermemek ve bilgisayarın açıkları olmaması konusunda çok dikkatli olmak gerekir.

Yok okadar değerli değil :).
Lakin hex kodu üzerinden değişiklik yapan hiç rastlamadım iddalı bi yazılımcıya :/. Ama olmaz diye birşey yok elbette :)