16F877 de çalışıyor 18F452 de çalışmıyor

Başlatan serafetin, 05 Ağustos 2004, 11:42:35

serafetin

Arkadaşlar deliricem ya 16F877 ile  pic Ccs de çok uzun zamandır çalşıyorum. genelde sorunla krşılaşmıyordum. geçenlerde ram yetmediğinden 18F452 ye geçiş yapmak zorunda kaldım fakat başıma şöyle bir sorun geldi, 18F452 ye yazdığım prg çalışmadı. bende 16f877 ye yazdığım başka bir programı 18F için derleyip yukleyim dedim.

//#INCLUDE <16F877.h>
//#use delay(clock=20000000)
//#FUSES HS,NOWDT,NOPROTECT,NOLVP,noPUT, NOBROWNOUT

#include <18F452.h>
#use delay(clock=20000000) //when using national demo board
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOOSCSEN,NOBROWNOUT,NOSTVREN,NOPUT,NOEBTRB,NOEBTR,NOCPB,NOCPD,NOWRT,NOWRTD,NOWRTC,NOWRTB,NODEBUG


yaptım ve denedim..

#bit clk = 0xF83.0                  // PORTD bit 0 
 #bit Data = 0xF83.1                  // PORTD bit 1 
int read_bit(void); 


/* PROGRAM */ 
void main(void){ 


   int      i;   //i,k 
   unsigned char   d; 
   long int k; 
  
 init_ext_eeprom(); 

 SET_TRIS_d(0b00000010); 

while(1){ 

if (!input(pin_c7)){ 
output_high(pin_e2); 
/* 100bit continuation is carried out. That '1' comes It waits.  */ 
      i = 0; 
      while(i<100){ 
         if( read_bit() == 1) i++; 
         else i = 0; 
      } 

      /* '0' for 65 bits of continuation Detection*/ 
      i = 0; 
      while(i<65){ 
         if( read_bit() == 0) i++; 
         else i = 0; 
      } 

      /* The data for continuing 16 bits is disregarded. */ 
      for( i=0; i<16; i++ ){ 
         read_bit(); 
      } 
      /* From here to an image data acquisition start */ 
for( k=0; k < 96*72*2; k++){        // for( k=0; k < 96*72*2; k++){ 
         d = 0; 
         for (i=0; i<8; i++){ 
            d <<= 1; 
            if(read_bit()) 
               d |= 0x1; 
         } 
       write_ext_eeprom(k, d); 
      } 
output_low(pin_e2); 
   } 

else{ 
getc(); 

for( k=0; k < 96*72*2; k++){ 

putc(read_ext_eeprom(k)); 

} 
} 
}//while 
}   /* main */ 

int read_bit(){ 
   int i, a; 
clk=1; 
   a = data;      /* 1bit read-out 
clk=0; 
   if(a) 
      return 1; 
   else 
      return 0; 
}



bu program kameradan bilgi alıp eeproma kaydediyo. seri porttan bilgi gelirse seri porttan bilgisayara gönderiyo.

sorun şu 16F877 de süper çalışıyo ama 18F452 de
for( k=0; k < 96*72*2; k++){
olduğu döngü birtürlü sonlanmıyor. döngünün sonuna led koydum döngü bitince haber led sönmesi gerek fakat led sönmüyor. hiçbirşey anlamadım. ve ben seri porttan  bilgi yollamadan bana bilgileri yollamaya başlıyo getc çalışmıyo. o satırda bekleyip. bir karakter gelince devam etmesi lazım fakat çalışmıyo... 16f877 de ise kod düzgün çalışıyo..
16f877 de daha önce
for( k=0; k < 96*72*2; k++){  
burdaki k yı int tanımlamıştım. (96*72*2) bu sayı 8 bit olamayacağından program gene sonsuz dongüye giriyodu. ama değiştirdikten sonra sorun kalmamıştı. 18F serisinde tanımlamalr farklımı acaba. ben kameradan gelen bilgileri alıp görünen cismin (mesela kırmızı top) koordinatlarını çıkaracağım. programıda yazdım ama 18F te böle kıl sorun çıkarsa yandım. ICD falanda yok, karambole yazarım dururum. her türlü önerinize hazırım. şimdiden teşekkürler
bilgi paylaştıkça büyür.....

ahmetu

sanırım ben cevap yazana kadar yazını edit etmişsin yine de söyleyeyim port struct'ın şu şekil olmalıydı
struct portd_pin_map {
                       BOOLEAN clk;    //PORT_D.0
                       BOOLEAN data;   //PORT_D.1
                     } portd;

#byte portd = 0xF83


for( k=0; k < 96*72*2; k++) döngüsünü test ettim  bir sorun çıkmadı, genel anlamda kod üzerinde biraz düzeltme yaptım proteus'ta çalışıyor, proteus 56000 baud gibi bir değerle çalışmadığı için bunu 57600 yaptım gerekliyse değiştirirsin.

#include <18F452.h>
#use   delay(clock=20000000,RESTART_WDT)
#fuses HS,NOPUT,NOWDT,NOPROTECT,BROWNOUT,BORV42,NOLVP
#use   rs232(baud=57600, xmit=PIN_E0, rcv=PIN_E1)

#INCLUDE <24256.c>

struct portd_pin_map {
                       BOOLEAN clk;    //PORT_D.0
                       BOOLEAN data;   //PORT_D.1
                     } portd;

#byte portd = 0xF83

int1 read_bit() {
   int1 a;
   portd.clk=1;
   a = portd.data;   /* 1bit read-out processing DOUT is read in a */
   portd.clk=0;
   return a;
}

void main(void) {
   int8 i;
   char d;
   long k;

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);

   init_ext_eeprom();
   SET_TRIS_C(0b10000000);
   SET_TRIS_D(0b00000010);

   while(1)
   {
      if (!input(pin_c7))
      {
         output_high(pin_e2);

            i = 0;
            while(i<100)   // 100 bits continuation is carried out. That '1' comes It waits.
            {
               if(read_bit())
                  i++;
               else
                  i = 0;
            }


            i = 0;
            while(i<65)    // '0' for 65 bits of continuation Detection*/
            {
               if(!read_bit())
                  i++;
               else
                  i = 0;
            }

            /* The data for continuing 16 bits is disregarded. */
            for( i=0; i<16; i++ )
               read_bit();

         /* From here to an image data acquisition start */
         for( k=0; k < 96*72*2; k++)
         {
                  d = 0;
                  for (i=0; i<8; i++)
                  {
                     d <<= 1;
                     if(read_bit())
                        d |= 0x1;
                  }
               /* The acquired data is transmitted to PC. */
                write_ext_eeprom(k, d);
         }
         output_low(pin_e2);
      }
      else
      {
         while(!kbhit())
         {
            for( k=0; k < 96*72*2; k++)
               putc(read_ext_eeprom(k));
         }
      }
   }
}


aklıma şimdi geldi read_bit() fonksiyonunda clock sinyalini high yaptıktan sonra datayı almak için birkaç cycle beklemekte fayda var belki cihaz pic'in isteğine bu kadar hızlı cevap veremiyor olabilir gerçi senin haberleştiğin cihazın hızını bilmiyorum ama bu da bir olasılık.

int1 read_bit() {
   int1 a;
   portd.clk=1;
   delay_cycles(2); // daha bile fazla olabilir 4 gibi, test etmek gerekli.
   a = portd.data;   /* 1bit read-out processing DOUT is read in a */
   portd.clk=0;
   delay_cycles(1); // 1 cycle uygun olur kesin lazım.
   return a;
}

serafetin

Kodun son hali bu dediğim gibi 16F877 de süper çalışıyo.. fakat 18F için compile edince çalışmıyo. getc() gelmiş gibi kafasına göre output_high(pin_e2);  (bu pinde led var). led yanıp sönüyo. bazen yanıyo bazen sönüyo.. Bu bir kamera , japon bir arkadaşımdan aldım küçücük bişi..
data ve clk bacakları var. clk verip bilgi okuyorum 16f877 ile resim çekebiliyorum. ama resim işleme yapacağımdan yavaş kalıyor. bu sebepten 18F serisini kullnayım dedim. 40Mhz çalışmasından dolayı.
Birçok web sayfası yazmış 18f te 40 mhz kullanırken 10 mhz osc kullan  pllx4 kullan, bazıları diyo oyle kullanma sorun oluyo 40 mhz osc kullan.
Bu konuda beni bilgilendirirsen sevinirim...

bulduğum bir sitede bunun haricinde H8 diye Nec in bir imcu su var osc frekansını 4 e bölmüyo.. Atmelin AT90s serisini kullanmayı düşündüm. 90s lerde osc yi bölmüyo  ama izmirde bulamadım.

eğer pll x4 kullansam osc 10 mhz kullandığımda çalışma 40 mhz olacak. peki osc/ 4 olmayacakmı. 18f datasheetinde göremedim.

veya direk 40 hmz osi kullanırsam osc/4 olmayacakmı..

yapmak istediğim robotla ilgili bulduğum web sitesi

H8 versiyonu
http://www.excite.co.jp/world/english/web/body?wb_url=http://www.asahi-net.or.jp/~QX5K-ISKW/robot/ball.html&wb_lp=JAEN&wb_dis=2

Atmel versiyonu
http://www.excite.co.jp/world/english/web/body?wb_url=http%3A%2F%2Fwww.asahi-net.or.jp%2F%7EQX5K-ISKW%2Frobot%2Fdigiq.html&wb_lp=JAEN&wb_dis=2

Buda anne sayfası
http://www.excite.co.jp/world/english/web/body?wb_url=http%3A%2F%2Fwww.asahi-net.or.jp%2F%7EQX5K-ISKW%2Frobot%2Findex.html&wb_lp=JAEN&wb_dis=2

Anne sayfayı inceleyin eminim hoşunuza gidecektir.

işte ben bu adamın yaptığı h8 programını pice yazdım ve resim çekebiliyorum. ama dediğim gibi 18f te sorun çıkıyo.

getc yerine if(!input(pin_C7)){ kullanıyorum buda çalışmadı bu kodu hiç iplemiyo.. pull up direnci var butona basınca - alıp kodu işlemesi lazım butona basmadan işliyo.. delirecem ya :cry:  :cry:  :cry:

//#INCLUDE <16F877.h>
#include <18F452.h>
#use delay(clock=20000000)
#FUSES HS,NOWDT,NOPROTECT,NOLVP,noPUT, NOBROWNOUT

#use rs232(baud=19200, xmit=PIN_E0, rcv=PIN_E1) 

#use fast_io(d)

int read_bit(void);


/* PROGRAM */
void main(void){

   int		i;   //i,k
   unsigned char	d;
   long int k;
 
 SET_TRIS_d(0b00000010);



while(1){

getc();
output_high(pin_e2);
		/* 100bit continuation is carried out. That '1' comes It waits.  */
		i = 0;
		while(i<100){
			if( read_bit() == 1) i++;
			else i = 0;
		}

		/* '0' for 65 bits of continuation Detection*/
		i = 0;
		while(i<65){
			if( read_bit() == 0) i++;
			else i = 0;
		}

		/* The data for continuing 16 bits is disregarded. */
		for( i=0; i<16; i++ ){
			read_bit();
      }
		/* From here to an image data acquisition start */
		for( k=0; k < 96*72*2; k++){        // for( k=0; k < 96*72*2; k++){
			d = 0;
			for (i=0; i<8; i++){
				d <<= 1;
				if(read_bit())
					d |= 0x1;
			}
			/* The acquired data is transmitted to PC. */
//			sci_outch(d);
         putc(d);
      }
output_low(pin_e2);
   
}//while
}	/* main */

int read_bit(){
	int i, a;
output_high(pin_d0)
   a = input(pin_d1)/* 1bit read-out processing DOUT is read in a */

output_low(pin_d0);
	if(a)
		return 1;
	else
		return 0;
}


:cry:  :cry:
bilgi paylaştıkça büyür.....

serafetin

Bu programdada  aynı sorun var. 16F877 karakter bekliyo karakter gelince "onur" yazısını yolluyo..

gel gelelim 18f452 de hiçbişi beklemeden "onur" yolluyo..
kıl oldum ya.
Bir yanlışımmı va bilmiyorum?

#INCLUDE <18F452.h> 
//#INCLUDE <16F877.h> 
#use delay(clock=20000000) 
#FUSES HS,NOWDT,NOPROTECT,NOLVP,NOPUT, NOBROWNOUT,NOOSCSEN,NOSTVREN,NODEBUG,NOWRT,NOWRTD,NOWRTB,NOWRTC,NOCPD,NOCPB,NOEBTR,NOEBTRB 
//#FUSES HS,NOWDT,NOPROTECT,NOLVP,noPUT, NOBROWNOUT 

#use rs232(baud=9600, xmit=PIN_E0, rcv=PIN_E1) 

void main(){ 

while(1){ 
if (kbhit()){ 
puts("onur"); 
delay_ms(500); 
} 
} 
}
bilgi paylaştıkça büyür.....

serafetin

Al işte bitane daha
bu hali ile sürekli "onur" yollaması lazım..
doğru gerçekten yolluyo..
#INCLUDE <18F452.h>
#use delay(clock=20000000)
#FUSES HS,NOWDT,NOPROTECT,NOLVP,noPUT, NOBROWNOUT
#use rs232(baud=9600, xmit=PIN_E0, rcv=PIN_E1)
void main(){

while(1){
puts("onur");
delay_ms(500);
}
}


getc() ekledim ama hiçbirşey değişmedi. nasıl oluyor anlamıyorum. nerde yanlış yapıyorum bilemedim
:cry:  :cry:  :cry:
#INCLUDE <18F452.h>
#use delay(clock=20000000)
#FUSES HS,NOWDT,NOPROTECT,NOLVP,noPUT, NOBROWNOUT
#use rs232(baud=9600, xmit=PIN_E0, rcv=PIN_E1)
void main(){

while(1){
getc();
puts("onur");
delay_ms(500);
}
}
bilgi paylaştıkça büyür.....

ahmetu

mail adresini yazarsan sana proteus simulasyonunu göndereyim kodda bir sıkıntı yok

40 mhz kristal kullanamazsın 10 mhz kullanıp pll seçiyorsun şöyleki;

#fuses H4,NOPUT,NOWDT,NOPROTECT,BROWNOUT,BORV27,NOLVP
#use   delay(clock=40000000,RESTART_WDT)


HS yerine H4
clock = 40000000

serafetin

Abi peki bende neden çalışmıyo herşey aynı kullandığım deney bordu aynı
sadece entegre değiştiriyorum.
belki bendeki compilerda sorun vardır..

bendeki
3.203

keşke yanımda olsanda göstersem. söylediğim sorunlar çıkıyo.
bilgi paylaştıkça büyür.....

ahmetu

gönderdim, mail'ini bir kontrol et.

Kolay gelsin.

Erkan Gench

serafettin hocam bi bakarmısın işlemci getc ile ne tür bilgiler alıyor belki birşey çıkartabiliriz.

a=getc();
printf("%x",a);
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

serafetin

Ahmetu mail için teşekkürler. deneyeceğim.

Erkan Hocam tam olarak ne demek istediğinizi pek anlayamadım . Konuyu biraz açarmısınız.
bilgi paylaştıkça büyür.....

DumrulBey

Alıntı yapılan: "serafetin"... Bu bir kamera , japon bir arkadaşımdan aldım küçücük bişi..
data ve clk bacakları var. clk verip bilgi okuyorum 16f877 ile resim çekebiliyorum. ama resim işleme yapacağımdan yavaş kalıyor. bu sebepten 18F serisini kullnayım dedim. 40Mhz çalışmasından dolayı.
...
Herhalde CMUCam kullanmıyorsun? Bildiğim kadarıyla bu tip modülerde TW komutunu gönderip cismi takip etmesi sağlanabiliyor. Hatta servo motor çıkışı varmış. O yüzden bu kadar hızlı mikrodenetleyici gereksiz kaçabilir. Bahsettiğim kameralar yaklaşık 110$ ve yurtdışından temin edilebiliyor.

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

serafetin

Bahsettiğim kamerayı verdiğim linklerden görebilirsiniz. bu kamera cep telefonu kamerası. kyocera cep telefonun için. benim okuduğum dökümanlara göre bu kameradan sadece resim alabiliyorum.
Bu kameranın yaklaşık fiyatı 25-30 milyon civarında
bilgi paylaştıkça büyür.....

DumrulBey

Hmm,

İnceliyorum... Top takibi falan da var. Peki fiyatı nedir? Açıkcası önerdiğim 109 dolarlık kamera çok iyidir ama çok da pahalı. Bir üniversite geliştirmiş ve şimdi yeni versiyonu yolda. Bilgi almak için http://www-2.cs.cmu.edu/~cmucam adresini ziyaret edin. Resimi ve satış bilgileri için ise aşağıdaki resme tıklayabilirsiniz.


http://www.robotstore.com/catalog/display.asp?pid=381
(Satın almak için)

Kolay gelsin...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

ahmetu

bu 25-30 milyonluk kamera benimde ilgimi çekti, 109 USD'lik bir hayli pahalı geldi, serafetin bu kamerayı incelemek isterim ama ben link falan göremedim fiyatı, dökümanı vesaire sen bunu yurtdışından mı aldın?

serafetin

Bu linkleri yahoo.co.jp den arattırdım ve buldum. altavistadan tercume edecektim birçoğunu tercume etmedi bende başka bi site buldum ordan tercume ettim.

eski yazdığım linklerin haricinde bunlarada bakın.
o eski yolladıklarımda adam wireless ethernet için devre yapmış oha dedim. adam süper. birde bluetooth var ona söyleyecek söz bulamadım

bu linkten bu cihazın nasıl çalıştığını öğrenebilirsiniz
http://www.paken.org/aaf/treva/index.html

Burdada ingilizcesi.
http://www.excite.co.jp/world/english/web/body?wb_url=http://www.paken.org/aaf/treva/index.html&wb_lp=JAEN&wb_dis=2

dediğim gibi bu kamera Kyocera firmasının ürettiği bir ürün


Treva HC-D01


internetten satış..
http://www.excite.co.jp/world/english/web/body?wb_url=http://www.tmtele.com/webshop/kisyu-3.htm&wb_lp=JAEN&wb_dis=2

cihaz özellikleri..
http://www.excite.co.jp/world/english/web/body?wb_url=http%3A%2F%2Fwww.ddipocket.co.jp%2Fp_s%2Fproducts%2Fcontent%2Ftreva.html&wb_lp=JAEN&wb_dis=2

Arkadaşlar size bişi dicem.. eskiden image processing i kafamda çok büyütüyordum. aslında tek ihtiyacınız olan bir kamera. normal bir web cam kullanarak bile bunu yapabilirsiniz..

daha önce yazdığım linkleri bir inceleyin.

unutmuşum bu kamera CMOS image sensor diye geçiyodu..

DumrulBey sizin söylemiş olduğunuz kamerayı bi kitapta görmüştüm. dediğiniz gibi çok pahallı..

bu arada ben öğrenciyim yani bunu hobi olarak yapıyorum.
yani 100$ gibi rakamlar benim için çoook.

şu 18f452 ile ilgili sorunu çözebilsem robot yapacam. verdiğim sitelerde vardı. küçücük arabanın üzerine koymuşlar. ununla sarı topu takip ediyo. süper bilşi ya.

daha önce dediğim gibi H8 diye bir işlemci var onun içine yazmışlar programı (C de) bede o programı 16f877 için yazdım ve resim çekiyorum şimdi. sonra bu resmi işleyip x y buldurmam lazım ama At90s serisi izmirde yok. 18F te yoktu ankaradan getirttim.

birde istanbuldan veya ankaradan parça getirtebileceğim yerler biliyomusunuz. mesela USBN9603 onu bulamıyom. bir ara sislerle embeded sistemler hakkında konuşalım. linux unix entegreye gömme. süper şeyler ya..



Ahmetu H4 pllx4 seçtim peki  osc frekansı kaç çalışıyo yani
1 cycle süresi ? eğer söylemiş olduğun gibi osc=40.000.000 seçiyor isek

1/40.000.000 = 0.025 us  yani 25ns mi oluyo abi inanasım gelmiyo. eğer bu frekansta çalışıyo ise manyak bişi ya...

1/(1/4 * 40.000.000) =0.1 us böyle olsa bile çok iyi.

entegre daha yeni programlayıcı P16pro IC prog kullanıyom.
doğrulama yapıyorum entegreye doğru yazıyo. neyse çözecem o işi..

Aklıma Ram kullanmak geldi. eski bir Printerdan söktüm. bakalım ne yapcaz. herkeze kolay gelsin..
bilgi paylaştıkça büyür.....