Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

rda kesme hatası?

Başlatan forumsad, 09 Ekim 2010, 14:18:00

forumsad

arkadaşlar aşagıdaki kod ile rs232-rs485 çevirici kart ile bilğisayara
veri gönderiyorum...
fakat bilğisayardan veri almak için rda kesmesini kullandığımda rda kesmesinde
hata veriyor...
nedenini bir türlü çözemedim...

main.c
#include "E:\elektronik\ccs_pic\uygulamalar\seriiletisim\877_rs485_3\main.h"

//*****************************************************************************
//rs485 seri iletişim ayarlamaları
#include <RS485.c> 
#define RS485_ID deviceId  
#define RS485_RX_PIN PIN_C7  
#define RS485_TX_PIN PIN_C6   
#define RS485_USE_EXT_INT FALSE // Change to FALSE
 //defined but not using    
 #define RS485_ENABLE_PIN   PIN_E0    
 #define RS485_RX_ENABLE    PIN_E1     
 #define RS485_RX_BUFFER_SIZE  64 
 int8 msg[RS485_RX_BUFFER_SIZE]; 
 
//int8 RS485_IDd = 5; 
//#define RS485_IDd RS485_ID 
//******************************************************************************

#include <stdlib.h>


#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi (){
   disable_interrupts(int_rda); // int_rda kesmesini pasif yap
   
}




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!!
      rs485_init();               //rs485 aktif
      //clear_interrupt(int_rda);       
    enable_interrupts(int_rda);           //portb kesmelerine izin ver
    enable_interrupts(GLOBAL);
    
    
    while(1)   {   
   output_high(pin_d0);    //pic çalıştı
   
   output_high(pin_e0);   //'pic877 den max485'e veri gönderme izni verildi    
   output_low(pin_e1);    //'com dan max485'e veri gönderme izni iptal       
   printf("3");     //seri porta veri gönder 
   delay_ms(1000);        //bekle  
   
   
  
   
 }

}



main.h
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#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 )
//#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, stream=PC)


[IMG]http://pic1.resimupload.com/r4/thumb_622706576.jpg[/img]

SpeedyX

Derleyici söylüyor zaten: Duplicate interrupt function
RS485.C - satır 168

forumsad

#2
rda kesmesini başka nasıl tanımlayacağız..sanırım ikikere tanımlama olduğu için hata veriyor..
üstad  nasıl düzelteceğim konusunda fikriniz var mı?

[IMG]http://pic1.resimupload.com/r7/thumb_282899406.jpg[/img]

SpeedyX

Bir defa tanımlayarak...
Şu kısmı main.c den silersen düzelir:
#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi (){
   disable_interrupts(int_rda); // int_rda kesmesini pasif yap
}

forumsad

//#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi (){
   
   output_high(pin_d1);    //pic çalıştı
   
}
bu şekilde yapınca hata vermedi  ama pc'den veri gelince pin_d1 'e bağlı ledi hangi yöntemle yakacağız
veya pc'den veri geldiğini nasıl anlayıp işlem yapacağız...

teşekkürler

SpeedyX

Bu proje ile yapmak istediğin nedir?

forumsad

bilğisayardan veri gönderip portd.1 daki ledi yakmak istiyorum..

yanlız seri iletişim rs232 kartı ile değil rs232-485 çevirici kart ile yapılıyor...

pic'den pc'ye veri gönderiyorum sorun yok ama pc'den pic'e veri gönderip portd_1 e bağlı ledi yakamıyorum....

pc'den veri geldiği anda oluşan kesmeye işlem yaptırmaya çalışıyorum daha sonraki adımda ise gelen veriye göre işlem yapacağım..

saygılarumla..

kodun son hali;
#include "E:\elektronik\ccs_pic\uygulamalar\seriiletisim\877_rs485_3\main.h"

//*****************************************************************************
//rs485 seri iletişim ayarlamaları
#include <RS485.c> 
#define RS485_ID deviceId  
//#define RS485_ID           0x10        // The device's RS485 master address
#define RS485_RX_PIN PIN_C7  
#define RS485_TX_PIN PIN_C6   
#define RS485_USE_EXT_INT FALSE // Change to FALSE

 //defined but not using    
 #define RS485_ENABLE_PIN   PIN_E0    
 #define RS485_RX_ENABLE    PIN_E1     
 #define RS485_RX_BUFFER_SIZE  64 
 int8 msg[RS485_RX_BUFFER_SIZE]; 
 
//int8 RS485_IDd = 5; 
//#define RS485_IDd RS485_ID 
//******************************************************************************

#include <stdlib.h>


//#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi (){
   disable_interrupts(int_rda);
   output_high(pin_d1);    //pic çalıştı
   
}


int durum;
int i;
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!!
     rs485_init();               //rs485 aktif
      //clear_interrupt(int_rda);       
    enable_interrupts(int_rda);           //portb kesmelerine izin ver
    enable_interrupts(GLOBAL);
    durum=0;
    
    while(1)   {  
    output_high(pin_e1);   //'    
    output_low(pin_e0);    //'
            
            
    output_high(pin_d0);    //pic çalıştı
    if (durum==0) {  
      for(i=0;i<5;++i)      
         {        
            output_high(pin_e0);   //'pic877 den max485'e veri gönderme izni verildi    
            output_low(pin_e1);    //'com dan max485'e veri gönderme izni iptal       
            printf("3");     //seri porta veri gönder 
            delay_ms(1000);        //bekle  
            durum=1;  
         }
    }

   

   
   
  
   
 }

}


bu kodda pic 'e enerji verdiğimde döngü ile pc'ye 5 kere 3 gönderiyor 3 ler geliyor sorun yok
bir süre sonra pc 'den veri gönderdiğimde pic hiç bir işlem yapmıyor


SpeedyX

Yapmak istediğinden biraz uzaktasın gibi görünüyor, aşağıdaki kod ilk başta 3 tane "3" gönderiyor, sonra byte aldıkça D0 pininin konumunu değiştiriyor. Yalnız max485 in DE ve RE pinleri E0 a bağlamalısın, 2 pin kullanmana gerek yok zaten half duplex, sanırım şu an o pinlerden biri E1 e bağlı, onu da E0 a bağlaman gerekiyor.

#include <16F877.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ENABLE=PIN_E0, ERRORS) /* !!! */

#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi()
{
    output_toggle(pin_d0); /* !!! */
}

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);
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);
   
   printf("333");     //seri porta veri gonder
   
   for(;;);
}

forumsad

ben pic'den pc'ye veri gönderirken pic tarafındaki 485entegresinin (RE-DE bitişik) E0'a bağlı 1 yapıyorum  pc tarafındaki max485'in (RE-DE bitişik) değerini 0 yapıyorum böylece veri pic'den pc'ye gidiyor......
bu işlemi sadece pic'den pc'ye veri göndereceğim zaman yapıyorum....

normal konumda ise tam tersini uyguluyorum....yani pic'sürekli pc'den veri gelecekmiş gibi bekliyor veri gelince ise max485'lerde değşiklik yapıp veriyi gönderiyor sonra gene pc'den veri beklemeye başlıyor....

siz diyorsunuzki her iki max485 entegresinin RE-DE uçlarını kısa devre yapın ve ikisinide pic'in E0 ucuna bağlayın..dogru anlamış mıyım???

yazdığınız örnek kodda pic'in E0 ucuna hiç bir uygulama yapmamışsınız...hiç kullanmayacaksak niçin E0 ucuna bağlıyoruz?
veya pic'den veri gönderirken 1 yapıp normalde pulldown damı bekleyecek bu kısmı biraz açarsanız sevinirim


saygılarımla...


SpeedyX

Alıntı yapılan: forumsad - 09 Ekim 2010, 18:25:11siz diyorsunuzki her iki max485 entegresinin RE-DE uçlarını kısa devre yapın ve ikisinide pic'in E0 ucuna bağlayın..dogru anlamış mıyım???
Yanlış anlaşılmış, senin devrende ikinci bir max485 olmamalı, RS485-RS232 çeviricideki RE-DE pinlerini de sen pic ile kontrol etmemelisin, sadece tek bir max485 in RE-DE pinlerini E0 a bağlamalısın.

Ayrıca kodda E0 kullanılıyor.

Bence bundan önce temel olarak mikrokontrolör ve C konularını öğrenirsen daha iyi olur, şuanki seviyenle daha çok temel soru soracaksın sanırım.
İnternette konuyla ilgili yığınla ilgili kod ve şema mevcut, RS485 nedir önce onu öğrenmelisin.

forumsad

üstad bu devreyi ben proton ile yazdığım kod ile kullanıyorum devrede hata yok fakat ccs c ile yapmaya çalışıyorum....


bu mikro işlemci ve birinci max 485
[IMG]http://pic1.resimupload.com/r9/thumb_423245291.jpg[/img]


100 metre sonrasında ise
[IMG]http://pic1.resimupload.com/r5/thumb_675263718.jpg[/img]

bilğisayar için ikinci max485'i 232 ye çevirip bilğisayara bağlantı kartı mevcut


şimdi dediğim gibi protonda bu sistemi yaptım çalışıyor veri gönderiyorum veri alıyorum...
fahat pic programlamaya ccs c ile devam etmeye karar verdim ..

hobi olarak uğraştığım için ileri seviye bilğim yok ama işimi görecek kadar bir şeyler ögrenmeye çalışıyorum...

ilği ve yardımlarınızın devamı dileğiyle

saygılarımla

SpeedyX

Proje ile ilgili ekleyecek birşeyim yok.

Madem amaç C öğrenmek;
Önceden bir kitabın çevirisini yapmıştık, onu anlayana kadar birkaç defa okuyabilirsin, ayrıca burada bazı üyelerinde C ile ilgili bilgiler yayınladıkları web sayfaları var, onlardan yararlanabilirsin.
Kitap_CCS_V1_2007.rar - 0.97MB - Türkçe

Bu öyle birşey ki, hobi olarak uğraşıp az bilgiyle yapılamıyor malesef. Güzel sonuçlar için güzel bilgiler bilmek gerekiyor...
Başarılar.

forumsad

temel seviye için güzel kaynak faydalanacağım ama seri iletişim ile ilğili sorunumu çözeceğini sanmıyorum...

bu başlığı artık kapatalım biraz daha araştırma ve deneme yaptıktan sonra tekrar bir başlık açacağım

saygılarımla...

cevaplar için teşekkürler