16F877 seri iletişim problemi

Başlatan savvase, 20 Temmuz 2007, 02:05:12

savvase

Arkadaşlar yardımcı olabilir misiniz?
Bilgisayarda C ile yazdığım programdan seri yolla(9600 8N1) pice veri göndermesini istedim. Veri şu:
char sCmd[4]={'0', '5' ,'0' ,'\0'};
Bilgisayardan max232 nin TTL çıkışlarına kadar veri doğru geliyor. Şöyle ki TTL çıkışlarının (pic tarafındaki) uçlarını kısa devre yapıp seri portu okuduğum zaman 050 sayısı tekrar geliyor.
Fakat aşşağıdaki programda picden sev[4] ü okumasını istediğimde inrterrupt ile pic duruyor. Kod şu;
Alıntı Yap
#include <16F877.h>

#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

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

char sev[4];

#int_RDA
void serial_int()
{
gets(sev);

}

#include <stdlib.h>

void main()
{
  long k,sl_time;
  char deg_K[4];
  sev[0]='0';
  sev[1]='1';
  sev[2]='0';
  sev[3]='\0';
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_psp(PSP_DISABLED);
  setup_spi(FALSE);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  enable_interrupts(INT_RDA);
  enable_interrupts(GLOBAL);
 
  printf("oldu mu ");
 
  while(1)
     {
     
     k=atol(sev);
     k=k/2;
     
     sl_time=k*10;
     output_high(PIN_D2);
     output_high(PIN_B5);
     delay_ms(sl_time);
     output_low(PIN_D2);
     output_low(PIN_B5);
     delay_ms(sl_time);
     
     itoa(k,10,deg_K);
     printf(deg_K);
     }
}
 
 

Programın yapması gereken D2 ve B5 ucuna bağlı ledlerin yanıp sönme süresini  seri yoldan gelecek bilgiye göre ayarlamak.
Önce default değerde yanıp sönüyor fakat seri bilgi gelince duruyor(led yanıksa yanık kalıyor -sönükse sönük kalıyor).

Program başladığı zaman "oldu mu" diye bir yazı göndermesi ve belli aralıklarla yanıp sönme süresini seri yoldan göndermesi gerekiyor fakat ISISde çalışıyor görünmesine rağmen devre üzerindeyken anlattıklarım oluyor.

Hyperterminalde seri ne geliyor diye baktığım zaman boş ekran görünüyor. CCS nin seri port monitöründe ise şöyle şeyler geliyor görünüyor;
Alıntı Yapüüøü8üp8ü~ÇpøàğàŽüğàğàŽüğàğàŽüğàğàŽüğàğàŽüğàğàŽüğàğàŽüğàğàŽüğàğàŽüğàğàŽüğàğàŽüğàğàŽüğàğàŽüğàğàŽüğ

Acaba nerede yanlış yapıyorum yardımcı olabilir misiniz?

zafzaf82

#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)

kaynaklanıyor olabilir. Çünkü programda herhangi bir problem yok gibi
Mikroişlemci bi araçtır, amaç değil.....

savvase

Alıntı yapılan: "zafzaf82"#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)

kaynaklanıyor olabilir. Çünkü programda herhangi bir problem yok gibi

Bu tabiri kaldırıyım mı peki?

zafzaf82

#FUSES NOLVP

yapıp bi dene istersen.
Mikroişlemci bi araçtır, amaç değil.....

savvase

Alıntı yapılan: "zafzaf82"#FUSES NOLVP

yapıp bi dene istersen.

Denedim serial port monitörde yine o anlamsız şeyler geliyor olarak görünüyor..

zafzaf82

pc de bauldrate hızı dogru ayarlımı, işlemcini kristali 20hmz mi???
Mikroişlemci bi araçtır, amaç değil.....

savvase

Alıntı yapılan: "zafzaf82"pc de bauldrate hızı dogru ayarlımı, işlemcini kristali 20hmz mi???

Evet ikiside.. Yani pcdeki rate ayarları doğru kristalinde üzeinde 20000 yazıyor. (Elektronikçi vermişti)

zafzaf82

kullandıgın pic üstünde -I/P veya 20P ibaresi varmı.
Mikroişlemci bi araçtır, amaç değil.....

savvase

Alıntı yapılan: "zafzaf82"kullandıgın pic üstünde -I/P veya 20P ibaresi varmı.
16F877 04/P yazıyor

zafzaf82

Alıntı Yap16F877 04/P yazıyor

o zaman sen o işlemciyi 20Mhz de çalıştıramazsın. sorun kaynagı o. 20mhz kristal yerine 4 mhz kullan ve programda gerekli değişiklikleri yap sorun kalmayacaktır.
Mikroişlemci bi araçtır, amaç değil.....

savvase

Evet bende kistali değiştirip tekrar denedim.. 16Mhz ile şimdi hyperterminalden veri alıp gönderirken sorun yaşamıyorum. Teşekkürler. Bir de birşey daha soracaktım. 4p 4Mhz ile çalışır mı demek? Çünkü 16Mhz ile çalıştı?

zafzaf82

4p 4mhz sorunsuz çalışabilir demek, ama daha yüksek frekanslarda çalışabilir. Ancak firma onun garantisi vermiyor.
Mikroişlemci bi araçtır, amaç değil.....

savvase

çok teşekkürler ilgilendiğin için gecenin bu saatinde.. İyi geceler

zafzaf82

önemli değil yardımcı olabildiysem ne mutlu bana.

Ayrıca hazır seri portla ugraşırken bootloader olayını bi dene derim. tekrar tekrar programlayıcı ile ugraşmak zor olsa gerek.

http://picproje.org/index.php/topic,15814

burayı bi incele istersen.
Mikroişlemci bi araçtır, amaç değil.....

savvase

Teşekkürler önerini inceledim. En yakın zamanda bende böyle bir yapı ile rahat ederim. Şu anda programlarımı linux ile derliyorum o yüzden biraz daha zamanı var.
Bu arada programı yazdım.. Seri port monitör ile sorunsuz kullanıyorum fakat kendi yazdığım programda (linuxda çalışıyor) kullanamıyorum.Aslında şöyle; programım stringi oluşturan karakterleri teker teker gönderiyor-3 karakter- sonra da bir tane 0x0D gönderiyor.(enter ın asciisi). Bunları arka arkaya gönderdiğim zaman yine kitleniyor pic sanırım interrupta sıkışıyor. Fakat göndermeler arasına biraz boşluk koyarsam usleep(10000) kadar program sorunsuz çalışıyor. Bunun nedeni nedir acaba?
EDIT:
Arkadaşlar hallettim.. Bir protokol yazdım böylece her byte ın çok önemli olduğu programımda güvenli bir şekilde veri transferi yapabiliyorum sorunsuz bir şekilde..
İlgilenen arkadaşlar,teşekkürler..