mplab xc8 mod bus denemesi

Başlatan kosantospa, 03 Ağustos 2015, 15:20:33

kosantospa

merhabalar
16f887 yi slave pc de master programı kullanarak mod bus uygulaması yapmaya çalışıyorum fakat kodda bir sıkıntı var bulamadım.
bu kodun tamamı:
/*
* File:   main.c
* Author: stajyer r.s.s
*
*/

#include<xc.h>
#include<math.h>
#include<string.h>


//////////////////////Konfigurasyon-Ayarlari///
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF
#define _XTAL_FREQ 4000000
//////////////////////TANIMLAMALAR////////


#define true                1
#define false               0



unsigned char   GelenDataBuffer[20],
                GidenDataBuffer[20],
                CevapFonk[10]={1,2,3,4,5,6,7};

unsigned int    GelenDataIndex=0,
                GidenDataIndex=0,
                DatadanSonraGecenSure=0,
                StartingAddress=0,
                QuantityOfRegisters=0,
                GidenDataBufferUzunluk;


bit             VeriAlindiBiti,
                VeriGonderBiti,
                FonkTamamlandiBiti;




void ayarlar()
{
    ////////     Port Ayarlar? ///////

    TRISA=0b00011100;       // 0x14;//40;//     //A2 ve A4 giris secildi.
    ANSEL=0b11100000;       // E0,E1,E2 analog giris secildi.
    ANSELH=0b00000000;      // 0x00;
    PORTA=0x00;             // PORT A temizlendi.
    TRISB=0x00;             // PORT B c?k?s ayarland?
    PORTB=0x00;             // PORT B temizlendi.
    TRISC=0x00;             // PORT C c?k?s ayarland?
    PORTC=0x00;             // PORT C temizlendi.
    TRISD=0b00001111;     // Keypad icin D0,D1,D2,D3 giris secildi.
    PORTD=0x00;             // PORT D temizlendi.
    TRISE=0xFF;             // PORTE giris seciliyor.

//////      Timer0 Ayarlar? ////////

     TMR0=5;                       //Timer0 2 ms ayarlandi.
     OPTION_REGbits.T0CS=0;
     OPTION_REGbits.PSA=0;
     OPTION_REGbits.PS2=0;
     OPTION_REGbits.PS1=1;
     OPTION_REGbits.PS0=0;
     INTCONbits.TMR0IF=0;
     INTCONbits.TMR0IE=1;
     INTCONbits.GIE=1;






///// EUSART Ayarlari ///

     INTCONbits.PEIE=true;        //Cevresel kesmelere izin verildi.
     PIE1bits.RCIE=true;          //USART veri alindi kesmesi aktif edildi .
     PIR1bits.RCIF=false;         //USART veri alindi kesme flagi sifirlandi.

     //Baud ayarlari//
     BAUDCTLbits.BRG16=false;      //8 bit Baud rate generator seçildi
     TXSTAbits.BRGH=true;          // High speed seçildi.
     TXSTAbits.SYNC=false;         //Asenkron mod seçildi.
     SPBRG=25;                     // Baud rate 9600 için SPBRG=25
     RCSTAbits.SPEN=true;          //Seri port aktif edildi.
     RCSTAbits.CREN=true;          //Veri alma aktif edildi.
     TXSTAbits.TXEN=true;          //Veri g?nderme aktif edildi.






}

//////////   Ana Fonksiyon /////
int main()
{
    ayarlar();

   

    while(1)
    {

    while(FonkTamamlandiBiti)
    {
         GelenDataIndex=0;    // Fonk tamamland?g? için GelenDataIndex s?f?rland?

        if(GelenDataBuffer[0]==01) // adres kontrolu
        {
           if(GelenDataBuffer[1]==3)  // fonksiyon destek kontrolu
           {
//                        Fonk3();
               GidenDataBuffer[3]=06; // deneme kısmı sil
   
           }
            else
            {
                GidenDataBuffer[3]=07; // Fonksiyon Desteklenmiyor hatas?(01'e duzelt)
            }

        }
        else GidenDataBuffer[2]=02; // deneme kısmı, sil


       

       
        VeriGonderFonk();
        DatadanSonraGecenSure=0;
        FonkTamamlandiBiti=false;

    }

       

       
    }
}



       static  void interrupt kesme (void)             // High priority interrupt
{
///////  TIMER0 KESMESI    ///// 2ms
    if(INTCONbits.TMR0IF)
    {
        INTCONbits.TMR0IF=0;
        TMR0=5;
        DatadanSonraGecenSure=DatadanSonraGecenSure+1;
        if(DatadanSonraGecenSure>=5) FonkTamamlandiBiti=true;

       

     }

    //////   UART Kesmesi /////
    if(PIR1bits.RCIF)
    {
        PIR1bits.RCIF=false;       //USART veri alindi kesme flagi sifirlandi.
        GelenDataBuffer[GelenDataIndex]=RCREG;
        GelenDataIndex=GelenDataIndex+1;
        VeriAlindiBiti=true;
        DatadanSonraGecenSure=0;
    }

}


int Fonk3()
{
    StartingAddress=GelenDataBuffer[3];
    QuantityOfRegisters=GelenDataBuffer[5];

    if(1<=QuantityOfRegisters<=10)
    {
        if((StartingAddress+QuantityOfRegisters)<=10)
        {
            GidenDataIndex=StartingAddress;
            for(int i=2;i<QuantityOfRegisters;i+2)
            {
                GidenDataBuffer[i]=0; // iki bytel?k veri olamad?g? için direk 00
                GidenDataBuffer[i+1]=CevapFonk[GidenDataIndex];
                GidenDataIndex=GidenDataIndex+1;


                //giden data dolduruldu
            }


        }
        else
            {
                GidenDataBuffer[2]=00;
                GidenDataBuffer[3]=02; // ba?lama adresi ve register say?s? toplam? tasma hatas?
            }
    }

    else
    {
    GidenDataBuffer[2]=00;
    GidenDataBuffer[3]=03; // registers say?s? hatas?
    }


  }


int VeriGonderFonk()
{
    if(VeriAlindiBiti)
            {   
                GidenDataBuffer[0]=01; /// Slave Address
                GidenDataBuffer[1]=03; /// Fonksiyon 3

       
                GidenDataBufferUzunluk=2+(2*3);
               
                for(int j=0;j<GidenDataBufferUzunluk;j++)
                {
                   TXREG=GidenDataBuffer[j];
                   while(TXSTAbits.TRMT==0);
                }

                VeriAlindiBiti=false;
             }

   
   

}









burda da iç içe ifler anlayamadıgım bir şekilde hata veriyor
 if(GelenDataBuffer[0]==01) // adres kontrolu
        {
           if(GelenDataBuffer[1]==3)  // fonksiyon destek kontrolu
           {
                    //   Fonk3();
               GidenDataBuffer[3]=06; // deneme kısmı,sil
   
           }
            else
            {
                GidenDataBuffer[3]=07; // Fonksiyon Desteklenmiyor hatas?(01'e duzelt)
            }

        }
        else GidenDataBuffer[2]=02; // deneme kısmı, sil


ilk if deyiminde adresi eşleştirmiyorsa en sondaki else kısmına atlayıp  GidenDataBuffer[2]=02;   kısmını işlemesi gerekmiyor mu ?  kod hem o kısmı işliyor, hem de GidenDataBuffer[3]=06; satırını işliyor bu kısımlar normalde kodda yok hatayı cozmeye calışmak için ekledim.  Ayrıca Fonk3 fonksiyonunu çalıştırırsam pic hiç yanıt vermiyor. Sorun ya da sorunlar ne olabilir ?

Powered by EzPortal