ccs c ile seri iletişim

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

radres

RS485 haberleşmesini kullanmadım ama, RS232 fonksiyonunnu RS485 yapmayacaksın. RS485.c dosyası sana yazılımsal olarak 485 iletişimi sağlayan bir dosya. Bu dosyanın başında sana hazır olarak sunulan fonksiyonları görebilirsin. Dosyanın içine bakarsan da RS232 haberleşme ayarlarını görürsün. Yani bu dosya RS232 haberleşmesi üzerinden RS485 haberleşmesi yapıyor. Senin yapacağın bu dosyayı programına eklemek ve bu dosya içindeki RS232 ayarlarını (hız vb.) kendi iletişim ayarları ile değiştirmek. İstersen bu dosyayı RS485_benim.c adı altında yeni dosyaya kopyala. DEğişikliklerini bunda yap. Böylece orjinal dosyayı bozmamış olursun.

forumsad

kart 485 sanırım o nedenle bozuk veri gönderiyor
485 konusunda bir şeyler yapabilirmiyiz...

radres

RS485 iletişimi hiç yapmadım kardeş. Ama en son gönderdiğim mesajda yazdığım gibi bir denersen olur sanırım. PROTEUS'da RS485 olsa deneme yapardım ama malesef yok.

forumsad

çok teşekkürler zaman ayırdınız rs485 konusunda yeni bir başlık açayım bakalım bilen çıkacakmı ?

tekrar teşekkürler...

radres


tayyar

Hocam tx/rx i invert etmenizde gerekebilir.

pic ten direk virtual terminale veri dönderirken problemyoktu proteusta ama araya max232 atınca veriler ekrana sizinde dediğiniz gibi gelmeye başladı sonra farkettimki invert etmem gerekiyormuş. İnvert edince herşey düzeldi.
--EGEMENLİK KAYITSIZ ŞARTSIZ MİLLETİNDİR--

forumsad

invert derken delphidemi invert edeceğiz
veya nasııl invert edeceğiz..

tayyar

[IMG]http://i34.tinypic.com/2zovimx.png[/img]

buradaki durumdan bahsediyorum

picten direk virtual terminale veri gönderince invert etmenize gerek yok ancak pic->max232->virtual terminal yapacaksanız tx rx polarity yi invert etmeniz gerekiyor
--EGEMENLİK KAYITSIZ ŞARTSIZ MİLLETİNDİR--

forumsad

sonunda bir gelişme kaydettim...

main.c
#include "E:\elektronik\ccs_pic\uygulamalar\seriiletisim\3_452_rs232\main.h"

#include <RS485.c>




 #define RS485_ID deviceId 
 #define RS485_RX_PIN PIN_C7 
 #define RS485_TX_PIN PIN_C6 

   //defined but not using 
   //#define RS485_ENABLE_PIN   PIN_B7 
   //#define RS485_RX_ENABLE    PIN_B6  

   //#define RS485_RX_BUFFER_SIZE  2 

   //int8 msg[RS485_RX_BUFFER_SIZE]; 
   
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!!
 

    
  

   rs485_init(); 

   

    

   
  while(1)
   {
   output_low(pin_d0);    //veri aktarımı yok
   output_high(pin_e0);   //'pic452 den max485'e veri gönderme izni iptal
   output_low(pin_e1);    //'com dan max485'e veri gönderme izni verildi
   delay_ms(1000);        //bekle
   
   
   
  
    

    output_high(pin_e0);   //'pic452 den max485'e veri gönderme izni verildi
    output_low(pin_e1);    //'com dan max485'e veri gönderme izni iptal
   
   output_high(pin_d0);     //veri aktarımı var
   printf("Merhaba");     //seri porta veri gönder
   delay_ms(1000);          //bekle
   }

}


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                       //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 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)



bu şekilde rs485 ile veriyi temiz bir şekilde göndermeyi başardım.....

şimdi şimdi bilğisayardan gelen veriyi almayı deneyeceğiz...

yabancı forumlardan bir şeyler bularak karıştırdım bir şeyler yaptık ama nizami mi bilmiyorum yorumlarınızı ve düzeltmelerinizi bekliyorum

KIRIKDR

tx rx i ters bağlayıp denemelisin

selimmeric

şimdi şunu söyleyebilirimki donanım bilgisi eksikliginden kaynaklanıyor bu sorun.. benimde başıma geldi bulana kadar biraz tırmaladım..
yanlızca basit bir bilgi gönderme kodu yazdım..

#include "18F4550.h"
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#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 IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12                     //Divide By 12(48MHz oscillator input)
//  yukarıdaki pll12 yanlış o ayarı degiştirmek gerekiyor ..  nedenini aşagıda yazacagım ..
#FUSES CPUDIV4                  //System Clock by 4
#FUSES USBDIV                   //USB clock source comes from PLL divide by 2
#FUSES VREGEN                   //USB voltage regulator enabled
#FUSES ICPRT                    //ICPRT enabled
#use delay (clock=48M, crystal=20M)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,enable=PIN_C5,errors)
#include "exlcd.c"

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);

   lcd_init();
   delay_ms(250);
   set_tris_a(0x0);
   output_high(pin_c5);
   while(1) {
         printf("Test\n");
         printf(lcd_putc,"\f       gitti",);
         delay_ms(100);
      }
}


18f4520 ve 20mhz kristal ile çalışıyor sistem ama 18f4550 ve 20mhz ile çalışmıyordu .. sonra anladım ki programda bir hata yapıyormuşum .. pic USB ve seri iletişim için clock için pll devresi barındırıyor ve mesela usb için 48 mhz ye ihtiyaç duyuyor o nedenle pll ayarları ile oynayarak bunları düzenlemek gerekiyor .. şimdi söyle söyleyeyim ben burda 20mhz kristal kullanıyorum ama picin pll girişini 4mhz ye göre ayarlamak gerekiyor ( 20 / 5 = 4mhz bunun içinde pll5 " 5 burda 20mhz kristali 4 mhz ye ayarlamak için bölen oluyor .." 48 mhz lik kristal kullansa idim pll12 yazmam gerekiyordu yada 4mhz lik bir kristal kullansa idim pll1 yazmak yeterli idi )   yani pic in iç yapısını inceleyip seri iletişim için kullandıgı ( usb yada rs ) frekansı dogru ayarlamak gerekiyor .. sorunun düzelecek .. ayrıca #use delay (clock=48M, crystal=20M)  kod ile 20mhz lik bir crystal ile 48mhz lik bir pll hızı elde edebilirsin .. neyse biraz karışık oldu ve geç oldu ama bilgiyi paylaşmak istedim sonuçta bilgi paylaştıkca güzel ..

Ksenon

Arkadaşlar merhaba benimde benzer bi konuda sorunum var
ivme sensöründen okuduğum bilgileri bilgisayara aktarıp kullanmam gerekiyor .
Kullandığım ivme sensörü  H48C3 ..
Sorun şu ki 3 eksende okuduğum bilgiler , 123 123 126 şeklinde geliyor bilgisayara.
Halbuki sonuncusu yani Z ekseninin sürekli G ye maruz kaldığını düşünürsek aralarında yüksek farklar olmalı . Bu arada PC'ye gönderirken aynı zamanda 3 farklı led'i de g değerlerini gözlemleyebileyim diye yakıp söndürüyorum . Oradan çıkan sonuç z eksenin 1g civarlarında olduğu.
Şimdi h48c3 'ün driver kodlarını koyuyorum.
/* H48C 3-Axis Accelerometer
     +----------+
 CLK | o*     o | Vdd (+5v)                Onboard MCP3204 12-bit ADC is used
     |   +--+   |                          to read the VRef,X-,Y-, and Z-axis
 DIO [ o |  | o | CS\                      outputs from H48C. Ref. volt. from
     |   +--+   |                          from H48C is 1.65 V (3.3/2).
 Vss | o      o | 0G (free-fall indicate)  1) read ref. volt.
     +----------+                          2) then then output ch.
3) g-force for the channel is calculated with this formula:
   G =[(axis - vref)/4095] * (3.3/0.3663) or G = (axis - vref) x 0.0022

 To allow the display of fractional g-force in the integer system we multiply
 0.0022 by 100 -- this will allow us work with g-force in 0.01g units.
 In order to simplify BS1 program design and optimize code space, g-force is
 "bumped" to 1000ths for display with the Print_Val subroutine. */

//-----[ I/O Definitions ]-------------------------------------------------
#define Dio       PIN_C4
#define Clk       PIN_C3
#define CS        PIN_C5

//-----[ Constants ]-------------------------------------------------------
#define  XAxis    0               //adc channels
#define  YAxis    1
#define  ZAxis    2
#define  VRef     3

//#define  Cnt2Mv   0xCE4C       //12 bit count to millivolts 0.80586 with **
#define Cnt2Mv 0.80586
//#define GfCnv     0x3852      // 12 bit count to mG-force 0.22 with **
#define GfCnv     0.22

/*
//-----[ Variables ]-------------------------------------------------------
mVolts   VAR Word    ' temp variable for milli-volts
gForce   VAR Word    ' temp variable for acceleration
*/

signed int16 rvCount;  // Reference voltage counter - 12bit ADC result

int16 Get_H48C(char axis);

int16 Get_H48C(char axis)
{
int i;
signed int16 fark;
int   h48c_cmd;
int16 h48c_data;

h48c_cmd=0b11011000;   //vref command
//printf("%d %d \n",h48c_cmd.code,h48c_command.addr);

output_low(Clk);

output_low(CS);
for(i=0;i<5;i++) {
output_bit(Dio,shift_left(&h48c_cmd,1,0));
output_bit(Clk,1);
delay_us(5);
output_bit(Clk,0);
delay_us(5);
}

h48c_data=0;
/* reads 16 bits from pin A1, each bit is read on a low to high on pin A2 */
for(i=0; i<13; i++) {
output_bit(Clk,1);
delay_us(5);
output_bit(Clk,0);
shift_left(&h48c_data,2,input(Dio));
}
output_high(CS);
rvCount=h48c_data;

if (axis==XAxis) h48c_cmd=0b11000000; //x axis command
if (axis==YAxis) h48c_cmd=0b11001000; //y axis command
if (axis==ZAxis) h48c_cmd=0b11010000; //z axis command

output_low(CS);
for(i=0;i<5;i++) {
output_bit(Dio,shift_left(&h48c_cmd,1,0));
output_bit(Clk,1);
delay_us(5);
output_bit(Clk,0);
delay_us(5);
}

h48c_data=0;
for(i=0; i<13; i++) {
output_bit(Clk,1);
delay_us(5);
output_bit(Clk,0);
shift_left(&h48c_data,2,input(Dio));
}
output_high(CS);
//axCount=h48c_data;

fark=h48c_data-rvCount;

return(fark);
}


Ana program:
#include "C:\accelerometer\son.h"
#include <H48C3.c>
int16 x_fark,y_fark,Z_fark;
int x_gForce,y_gForce,z_gForce;
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!

while(1)
   { 
   
x_fark=Get_H48C(0);y_fark=Get_H48C(1);z_fark=Get_H48C(2);
if (x_fark>32767) x_gForce=-1*((65536-x_fark)*.0022);
else x_gForce= x_fark*.0022;

if (y_fark>32767) y_gForce=-1*((65536-y_fark)*.0022);
else y_gForce=y_fark*.0022;

if (z_fark>32767) z_gForce=-1*((65536-z_fark)*.0022);
else z_gForce= z_fark*.0022;

putc(x_gForce);
delay_ms(800);
putc(y_gForce);
delay_ms(800);
putc(z_gForce);
delay_ms(800);

if (x_gForce>0.2) 
{output_high(pin_B7);
delay_ms(200);
}
else output_low(pin_B7);

if (y_gForce>0.2) 
{output_high(pin_B6);
 delay_ms(200);
}
else output_low(pin_B6);

if (1,1>z_gForce>0.9) 
{output_high(pin_B5);
 delay_ms(200);
}
else output_low(pin_B5);
}

}


Acaba nerede yanlışlık yapıyorum eksenlerden gelen bilgileri nasıl sağlıklı okuyabilirim???
Teşekkürler

a.ygt

Merhaba hocalarım,bu konuyla ilgili çalışan projelerinizi paylaşabilirmisiniz.ısıs+CCS C kodu hex falan teşekkürler...