ccs c ile seri iletişim

Başlatan forumsad, 19 Ağustos 2010, 08:33:39

forumsad

pic18f452 ile seri iletişim yapmam lazım veriyi bilğisayara gönderecek..

kod aşağıdaki gibi;
#include "E:\elektronik\ccs_pic\uygulamalar\seriiletisim\2_452\main.h"

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7, stop=1, parity=N)  
//#use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7, stop=1, parity=N,STREAM=seri1 )  

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_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!
   //_____________________________________________________________-
   set_tris_d(0x00);    //portd çıkış
   set_tris_c(0x00);    //portc çıkış
   output_d(0x00);     //portu temizle
   output_c(0x00);     //portu temizle
   
  
   //____________________________________________________________________________
   //basla
   
      while(1)
      {
       output_high(PIN_D0);
       delay_ms(200);
       output_low(PIN_D0);
       delay_ms(200);
       
       //putc ('1'); // bu $ekildede bilgi yollayabilirsin...
       putc (49); // bu $ekildede bilgi yollayabilirsin...
       delay_ms(200);
      

      }
     


delphi ile yazdığım programda 49'un karşılığı olarak 1 almaktayım fakat çok düzensiz bazen geliyor bazen gelmiyor bir kere geliyor başka gelmiyor
ayrıca döngü 4-5 tane sonra gönderme yapmıyor bilğisayara veri gelmiyor...oysa koda göre dogru veya yanlış veriyi sürekli bilğisayara göndermesi gerekiyor

yardımlarınızı bekliyorum teşekkürler..

radres

Yaptığın programı PROTEUS-ISIS'de sanal seri iletişim penceresi ekleyerek denediniz mi? Böyle yaparsan en azından sorunun DELPHI programından mı yoksa denetleyici programından mı olduğu anlaşılır.

forumsad

delphi sağlam test için proton ile programlanmış pic16f877 var onu takdığım zaman her şey düzgün çalışıyor delphide düzgün çalışıyor rs485 seri iletişm  kartıda
düzgün çalışıyor....

ben ccs c ile pic18f452 ile bu işlemi yapmaya çalışıyorum ..

   //basla
   while(1){
       output_high(PIN_D0);
       delay_ms(200);
       output_low(PIN_D0);
       delay_ms(200);
       printf("Merhaba\n\r");
       
       
   }


mesela üsdeki koda delphide şu şekilde devam ediyor
=
MerhabaII
MerhabaII
MerhabaII
m
Ö
:IIIı
E
O
vb karmaşık karakterler göndermeye devam ediyor...
teşekkürler


radres

CCS C programında ki Seri iletişim hızını 9600'den örneğin 2400 gibi daha yavaş bir hızda deneyebilirmisin bir?

forumsad

x€xxx€xøxxxxxx€xxx€xøxxxxxx€xxx€xøxxxxxøøø€x€xøøx|x€ø€x€øøø€x€xøøø€x€ø€x€øøø€x€øøøø€x€ø€x€øøø€x€øøøø€x€ø€x€øøø€x€øøøø€x€ø€x€øøø€x€øøøø€x€ø€x€øøø€x€øøøø€x€ø€x€€øøøø€x€ø€€x€øøøø€€x€ø€x€€ø€x€øøø€x€ø€øø€x€øø€€€x€€ø€üø€ø€ø€

denedim gelen veriler üsdeki gibi...

fprintf(seri1,"Merhaba\n");  //veri gönderme kodu...


#include "E:\elektronik\ccs_pic\uygulamalar\seriiletisim\2_452\main.h"
#include "stdio.h"

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use rs232 (baud=2400, xmit=PIN_C6, rcv=PIN_C7, stop=1, parity=N)  
#use rs232 (baud=2400, xmit=PIN_C6, rcv=PIN_C7, stop=1, parity=N,STREAM=seri1 )  

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_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!
   //_____________________________________________________________-
   set_tris_d(0x00);    //portd çıkış
   set_tris_c(0x00);    //portc çıkış
   output_d(0x00);     //portu temizle
   output_c(0x00);     //portu temizle
   
  
   //____________________________________________________________________________
   //basla
   while(1){
       output_high(PIN_D0);
       delay_ms(200);
       output_low(PIN_D0);
       delay_ms(200);
       //putc (49); // bu $ekildede bilgi yollayabilirsin...
       //printf("Merhaba\n\r");  
       fprintf(seri1,"Merhaba\n");
       
       
       
       
   }
    
      
      
}


üst kısımdaki pic fuses  tanımlamalarında bir yanlışlık olabilir mi?

JKramer

Son gödnerdiğiniz örnekte software rs-232 kullanmışsınız. Bence önce rs-232'yi donanımsal mı yazılımsal mı kullanacağınıza karar vermelisiniz. Bir de main.h içinde neler var?

forumsad

main.h
#include <18F452.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES RC_IO                    //Resistor/Capacitor Osc
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES NOBROWNOUT               //No brownout reset
#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                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#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)



elimdeki kart rs485 ona göre yapmaya çalışıyorum...pic18f452 bilğiyi önce ilk 485 entegresine ginderiyor oda  ikinci485 entegresine  oda rs232 ye gönderiyor sonra com'a giriyor
elimdeki kartın sağlamlığından eminim ama dediğiniz gibi rs232 şeklinde değil rs485 şeklinde seri iletişim yapmaya çalışıyorum acaba rs485 de ccs c de seri iletişm komutları farklı mı?

radres

PIC sigorta ayarlarında yanlışlık yok. PIC programında hızı 2400 yaptın, peki delphi programında da bu ayarı yaptın mı? Birde dediğim gibi bu işi PROTEUS'ta denesek.

radres

CCS C kütüphane dosyalarında RS485.c dosyası var. Yazılımsal olarak RS485 iletişimi için. Bir incele istersen. İçinde hazır fonksiyonlar var.

forumsad

dogru diyosun delphideki hızı değiştirmeyi unuttuk hemen deniyorum...bu arada rs485.c olayını biraz araştırayım.....
hemen dönüyorum..

radres

Birde gönderdiğiniz main.h dosyasında sigorta ayarlarını ve seri iletişim ayar fonksiyonu var. Ana dosyaya  bunu ekledikten sonra tekrar sigorta ayarları ve seri iletişim ayar fonksiyonu yazmışsınız. Bu arada main dosyasında osilatör tipi RC osilatör seçilmiş. Gerçi en son yazdığınız (en son XT yazmışsınız) geçerli olur ama gene iki tane olması karışıklık gibi.

forumsad

#11
main.h
#include <18F452.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES XT                      //Resistor/Capacitor Osc
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES NOBROWNOUT               //No brownout reset
#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                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#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=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use rs232 (baud=2400, xmit=PIN_C6, rcv=PIN_C7, stop=1, parity=N,STREAM=seri1 )


main.c
#include "E:\elektronik\ccs_pic\uygulamalar\seriiletisim\2_452\main.h"
#include "stdio.h"
#include "rs485.c"


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_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!
   //_____________________________________________________________-
   set_tris_d(0x00);    //portd çıkış
   set_tris_c(0x00);    //portc çıkış
   output_d(0x00);     //portu temizle
   output_c(0x00);     //portu temizle
   
  
   //____________________________________________________________________________
   //basla
   while(1){
       output_high(PIN_D0);
       delay_ms(200);
       output_low(PIN_D0);
       delay_ms(200);
       //putc (49); // bu $ekildede bilgi yollayabilirsin...
       //fputc("Merhaba\n" , seri1);  //hata veriyor
      printf("Merhaba\n\r");  
       //fprintf(seri1,"Merhaba\n");
       
       
       
       
   }
    
      
      
}



üsdeki şekilde düzelttim
bu arada hızı her ikisinide 2400 baud yapıp denedim değişen bir şey olmadı veri bozuk geliyor..

gelen veri;
ÿì–¡–¨MeXük·ımÖşöşÛÖ·ŸşşÛÖÿÛÖÛşÛÖÛşşßÖÿşŸşûşÿşÿŸşûşşÿÛşşŸûŸşÛşûÍÿÛşÿîÿûÿ

radres

main.h dosyasında ilk önce NOWDT demişsiniz sonra WDT128 demişsiniz. #FUSES WDT128  satırını silin.

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale

Birde dosyanıza RS485.c dosyasını eklemişsiniz. Ama bunu kullanmayacaksınız herhalde. Çünkü programınızda RS-232'ye göre işlem yapıyorsunuz. Rs-485'i deneyim bir diyorsanız RS485.c dosyası içindeki fonksiyonlar ile veri gönderin ve bu dosyadaki iletişim ayarlarına göre karşı programı kurun veya bu dosyadaki iletişim ayarlarını kendi istediğiniz şekilde değiştirin.

Bu arada zaman bulursam birazdan programınızı PROTEUS'ta bir deneyeceğim.

forumsad

kafamda oturmaya başladı aslında ben rs232 değil rs485 protokolu ile haberleşmem lazım zira kartım rs485 ...

başından hata yapmışız ben şimdi rs485 ile seri iletişim nasıl yapılır araştırmalıyım..bu dogrultuda tecrübeniz varsa paylaşırsanız sevinirim

saygıalrımla


main.h
#include <18F452.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                      //Resistor/Capacitor Osc
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES NOBROWNOUT               //No brownout reset
#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                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#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
#FUSES PUT                       //???BİLİNMİYOR

#use delay(clock=4000000)
#use rs485(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use rs485 (baud=2400, xmit=PIN_C6, rcv=PIN_C7, stop=1, parity=N,STREAM=seri1 )


bu arada rs232 leri rs485 yaptığımda hata veriyor
rs485 ile haberleşme konusunda bir örnek bulmaya çalışayım bakalım

radres

@forumsad

Programını PROTEUS'da denedim. Normal şekilde çalıştı. Ekrana hep "Merhaba" yazıyor. Acaba bu senin kartın dediğin gibi RS232'mi yoksa RS485 mi? Yoksa kartta dikkat edeceğimiz başka bir özellik var mı? Birde TX, RX uçlarını denemek için ters bağladım. Ters bağlayınca senin aldığın gibi garip karakterler geldi. Belki senin kartta da böyle birşey vardır. TX ve RX uçlarını bir de ters çevir dene.