Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

rs232 veri alma sorunu

Başlatan eyupcalis, 17 Nisan 2010, 04:19:10

eyupcalis

arkadaşlar ben kablosuz sıcaklık ölçüm projesi yapmaya çalışıyorum.elimde iki tane pic var.bi devre verici bi devre alıcı olacak.lm35 ile yapıorum.vericide bulduğum sıcaklık değerini(10bit) rs232 ile alıcı devresine atıyorum sprintf fonksiyonuyla karakterlere çevirerek fakat alıcı da nasıl kod yazacağımı tam çözemedim daha doğrusu bi kaç şey yazdım ama alıcıya bağlı lcd de sonucu yazdıramadım yardımcı olursanız sevinirim.vericide de lcd bağlı doğruluk kntrolü açısından... aşağıda verici kodunu veriyorum bu kodum sizce doğru mu doğruysa alıcıda bu bilgiyi nasıl alıp lcd de gösterebilirim.. lütfen yardım edin

verici kodu:
#include <16f877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7)
#use fast_io(a)
#define use_portb_lcd TRUE
#include <lcd.c>
unsigned long int bilgi;
float voltaj,sicaklik;
int i;
//----------ANA PROGRAM------------
void main()
{
 unsigned char veri[5];
 setup_PSP(PSP_DISABLED);
 setup_timer_1(T1_DISABLED);
 SETUP_timer_2(T2_DISABLED,0,1);
 setup_CCP1(CCP_OFF);
 setup_CCP2(CCP_OFF);
 set_tris_a(0x01);
 setup_adc(adc_clock_div_32);
 setup_adc_ports(AN0);
 set_adc_channel(0);
 delay_us(20);
 lcd_init();
 printf(lcd_putc,"sicaklik=");
 while(1)
 {
   bilgi=read_adc();
   voltaj=(0.0048828125*bilgi)*1000;
   sicaklik=(voltaj/10)+2;
   printf(lcd_putc,"%5.1f'C",sicaklik);

   delay_ms(10);
   sprintf(veri,"%6.3f",sicaklik);
   for (i=0;i<5;i++)
   {
   putc(veri[i]);
   }
    delay_ms(10);

  }
 }

eyupcalis

arkadaşlar yardım edebilecek olan yok mu çok önemli

ahmet2004

#2

Alıcı pic programında kesme kullanman gerekiyor.

Alici:
#include <16f877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7)
#use fast_io(a)
#define use_portb_lcd TRUE
#include <lcd.c>

unsigned long int bilgi;
float voltaj;
char sicakliks[16];
int i;

#int_RDA 
void serial() 
{ 
   fgets(sicakliks); 
}

//----------ANA PROGRAM------------
void main()
{
 
 setup_PSP(PSP_DISABLED);
 setup_timer_1(T1_DISABLED);
 SETUP_timer_2(T2_DISABLED,0,1);
 setup_CCP1(CCP_OFF);
 setup_CCP2(CCP_OFF);

   enable_interrupts(int_RDA);
   enable_interrupts(global);
 
 delay_us(20);
 lcd_init();

  printf(lcd_putc,"\r\n");
  
  for(;;)
  {
   lcd_gotoxy(1,1);
   printf(lcd_putc,"Sicaklik: %sC",sicakliks);
  }
 }


Verici:
#include <16f877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7)
#use fast_io(a)
#define use_portb_lcd TRUE
#include <lcd.c>

unsigned long int bilgi;
float voltaj,sicakliks;
int i;

//----------ANA PROGRAM------------
void main()
{
 char veri[6];
 
 setup_PSP(PSP_DISABLED);
 setup_timer_1(T1_DISABLED);
 SETUP_timer_2(T2_DISABLED,0,1);
 setup_CCP1(CCP_OFF);
 setup_CCP2(CCP_OFF);
 //set_tris_a(0x01);
 setup_adc(adc_clock_div_32);
 setup_adc_ports(AN0);
 set_adc_channel(0);
 delay_us(20);
 lcd_init();

  printf(lcd_putc,"\r\n");
  
  for(;;)
  {
   bilgi=read_adc();
   voltaj=(0.0048828125*bilgi)*1000;
   sicakliks=(voltaj/10)+2;
   lcd_gotoxy(1,1);
   printf(lcd_putc,"Sicaklik: %2.2fC",sicakliks);

   delay_ms(10);
   sprintf(veri,"%2.2f",sicakliks);
   for (i=0;i<5;i++)
   {
      putc(veri[i]); 
   }
   putc(13);
   delay_ms(500);
  }
 }


Şema:

eyupcalis

ilk önce cevap veridiğin için teşekkür ediyorum.bende alıcı programımda kesme kullanarak biligiyi alıp lcd de göstermek istedim fakat alıcıdaki lcd de hiçbişey görünmedi senin kodlarını da yazdım ahmet hocam fakat yine lcd ler de hareket olmadı nerde hata yaptığımı anlayamıyorum bi türlü acaba benim proteustamı bişey var ney anlayamadım valla 3 gündür şu lcd ye sıcaklığı yazdıramadım.ahmet hocam müsade edersen sana mailden benim proteus şemasını ve yazdığım kodları da gönderiyim.bu işi çözmem lazım.yardım edersen sevinirim..

ahmet2004


eyupcalis

profilindeki maile yolladım abi

bulutbey_ney

arkadaşlar madem herkes özel maillerle anlaşıcak bu forumlar neden açılıyor, lütfen forumların amacına göre davranın.. ???
yukarıdaki sorunun aynısı bende de var ve düzeltilmiş halini paylaşırsanız sevinirim.

polilies

arkadaşlar bu konuyu çözdünüz mü? bende aynı sıkıntıyı yaşıyorum. farklı piclerle de denedim ama olmadı. uzun zamandır ugrasıyorum ve pes dedirtti artık bana :)
   çok basit bir kod yazdığım halde sadece gönderme yapabiliyorum. Advance Serial Port Monitor ile portu dinliyorum ve printf ile picden gönderdiğim yazıları alıyorum ancak pic'e gönderdiklerim ulaşmıyor.
#include "C:\Users\Alican\Desktop\RS232\rs232.h"
#include <stdio.h>
char digit[20];

#int_rda
void serial_interrups(){
   disable_interrupts(int_rda);
   gets(digit);
   delay_ms(100);
   puts(digit);
   delay_ms(100);
   printf("working\r");
}

void main(void)
{  
   set_tris_c(0b10111111);
   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);
   enable_interrupts(GLOBAL);
   // TODO: USER CODE!!
   printf("This is a test program\r");
   while(1);{
      enable_interrupts(int_rda);
      
      
   }
    

}
 
bunlarda  *.*.h dosyasına ait kodlar
#include <16F877a.h>
#device adc=8
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


arkadaşlar gerçekten yavaştan sıyırıyorum. yardımcı olursanız cok sevinirim.

ferdem

while(1) in sonuna noktalı virgül koyarsanız program o satırda kalır. Yani program while in içine hiç girmiyor, CCS C nin orda hata vermemesi de bana ilginç geldi. enable_interrupts(int_rda); satırı bir kere çalışırsa yeter, disable_interrupts(int_rda); yazmanıza da gerek yok(yapmak istediğinizi yanlış anlamadıysam)... Bunlar bu forumda çok konuşuldu. Kesme içinde delay fonksiyonu kullanmamakta fayda var. Aşağıdaki linkte örnek kullanım var, onu bir inceleyin:
https://www.picproje.org/index.php/topic,25051.msg168025.html#msg168025
İyi çalışmalar.


SpeedyX

#9
Alıntı yapılan: ferdem - 20 Temmuz 2010, 23:31:47CCS C nin orda hata vermemesi de bana ilginç geldi.
CCS nin hata vermemesi gayet normal, hiç bir derleyici bu durumda hata vermez.
Ama kesin "program enable_interrupts(int_rda); satırına hiç gitmiyor" şeklinde bir uyarı veriyordur.
En azından "condition always true" uyarısı görünüyordur.

muhittin_kaplan

Aynen,
Çünki Orada Mantık Hatası Var Syntax Değil,Belki Kullancı O Satırda Sonsuz Döngü İstiyordur.

polilies

      Arkadaşlar zaman ayırdıgınız ve beni cevapladıgınız için öncelikle teşekkür ederim. ferdem hocam dediklerinizi program üzerinde ve bircok farklı seyi de beraberinde denedim
ama yinede interrupt içine girmedi program. while döngüsüne giriyor ancak veriyi aldıgına dair kesmeye girmiyor. Picdem2 plus deney bordu üzerinde deniyorum programı ve sadece max232 entegresi kaldı test etmediğim. harici bir max232 ile onuda deniyecegim artık.son olarak denediğim kodu ekliyorum.
#include "C:\Users\Alican\Desktop\RS232\rs232.h"
#include <stdio.h>
char digit[20];
int1 infere = 0;

#int_RDA
void serial_interrups(void){  
   infere = 1;
   printf("kesme ici\r");
   fgets(digit);     
}
void main(void)
{     
   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);
   enable_interrupts(GLOBAL);
   enable_interrupts(int_RDA);
   
   // TODO: USER CODE!!
   
   printf("This is a test program\r");
   while(1){
   delay_ms(1000);
   printf("while'a girdi\r");
      if(infere){
         printf("kesmeye girdi\r");
         infere = 0;
      }      
   }
}

ve  *.h dosyası
#include <16F877.h>
#device adc=8
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

   rs232yi 8N1 olarak kullanıyorum ve portu rx'i tx'ine baglı bir soketlede denedim oda sorunsuz gönderdigi datayı geri alıyor.
include etmem gereken extra bir driver varmı yada bir benzeri.?

JKramer

Interrupt içindeki printf'i kaldırıp dener misiniz? Kaldırınca Proteus'ta çalışıyor.

polilies

JKramer teşekkür ederim! Proteusda çalışıpda deney setinde çalışmaması cok tuhaf. eve gittiğimde proteusda da deniyeceğim.

polilies

   Merhaba arkadaşlar; yeni bir 232 devresi kurdum ve denedim ancak yine çalışmadı sanırım problem picdem'den yada donanımsal değil dahası. Sonradan aklıma ccs'in

örneklerini incelemek geldi. o örneklerde gelen datayı tek tek bir buffera alıyor. bende denedim ve oldu. evet kesinlikle tek tek alıyor "rda" kesmesi ve "bkhbit" kullanılarak.

herkese teşekkür ederim. iyi günler.