Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

HI-TECH ÇALIŞMA 2

Başlatan F493, 15 Aralık 2007, 12:27:45

F493

Arkadaşlar  buraya  kesme kullanarak seri veri alma ve gönderme programını ekliyorum,umarım ciddi anlamda faydalı olcaktır .

program tutarlı olarak çalıyor,(denendi)..

programın işleyişi:  program bilgisayardan (hyper terminal) gönderilen verileri alıyor, 0(sıfır)'a basılınca artık ona veri göndermicem ve verileri bana geri göndersin demek oluyor...sonlandırma bir nevii..

hata kontrolleri yapılıyor ,FEER= Framing Error ,OERR=Overrun Error

ve hata yok ise veri alınmaya başlanıyor..alınan veriler ayırılan buffer uzunluna göre degişir,tanımladıgım dizinin static olması gerekiyor,çünkü kesmeden çıktıgımda veriler silinmesin,,


bu programı kullanan arkadaş olursa ,yeni birşeyler ekleyip veya bu program ile başka uygulamalr yaparsa ,buraya yazmasını rica ediyorum,çünkü paylaşım olursa daha verimli sonuçlar ortaya çıkar..

lütfen bu işten anlayan ,ciddi olarak ilgilenen arkadaşlar bunu dikkate alsınlar birde yorumlarınız tabikii..


/////////////////////////////////////////////////////////////////////////
///F493 ::: KESME DENETİMLİ VER ALMA GÖNDERME
#include<htc.h>//18f452
#include<stdio.h>
//#include<string.h>
//#include<math.h>
#include"serial.h"
#include"lcd.h"
//////////////////////////////////////////////////////////////
///CONFIGIRASYON AYARLARI
   __CONFIG(1, XT);
   __CONFIG(2, BORDIS & PWRTEN & WDTDIS);
   __CONFIG(4, LVPDIS & STVREN);
   __CONFIG(5, UNPROTECT);
   __CONFIG(6, WRTEN);
   __CONFIG(7, TRU);



///////////////////////////////////////////////////////////////
//TÜR TANIMLAMALARI
typedef    unsigned char   _BYTE;   //unsigned char = 0 - 255..

///////////////////////////////////////////////////////////////
//SEMBOLİK SABİTLER

#define     _SIZE_BUF   50

/////////////////////////////////////////////////////////////////
//GLOBAL TANIMLAMALAR
    unsigned const char *str = "18F452 SERI HABERLESME TEST !! " ;

/////////////////////////////////////////////////////////////////
//FONKSİYON PROTOTİP BİLDİRİMLERİ
   void Startup(void);

///////////////////////////////////////////////////////////////////
//MAİN FONKSİYONU
void main(void)
{
   Startup();

             while(1)  ;
}






/////////////////////////////////////////////////////////
//PROGRAM INIT.
void Startup(void)
{
   ////////////////////////////////////////////////////////
   //portb setup
   PORTB = 0b11111111;
   TRISB = 0b00000011;
   RBPU = 0;   //pull-up's  ON

   ///////////////////////////////////////////////////////
   //seri port setup
   TXSTA = 0b00100110;//Asynchronous mode,,8-bit,,TXEN=1,,BRGH=1;
          //alma setup\\
   RCSTA = 0b10010000;//SPEN=1,,CREN=1,,8bit receiver
   SPBRG = 25;    //4mhz, 9600 BaudRate
   RCIE = 1;      //alma kesmesi açık
   PEIE = 1;      //çevresel kesmeler açık

   /////////////////////////////////////////////////////////
   //porta setup
   ADCON1 = 0x07;   // PORTA -> Digital I/O


   GIE = 1;      //tüm kemeler açık
}







//////////////////////////////////////////////////////////////////////
//KESME ALT PROGRAMI
void interrupt ISR(void)
{
   _BYTE  ch;
   static    _BYTE StrIdx ; //dizi index degişkeni
   _BYTE _dizi[_SIZE_BUF + 1];   // +1 sona null karakteri eklemek için

   ////////////////////////////////////
   //seri veri alma kesme alma
   if(RCIE && RCIF){

      if (OERR) {
            CREN = 0;   //seri alma kapatılıyor
            CREN = 1;   // seri alma açılıyor (RESET)
            StrIdx =0;   //dizi indisi başa alınıyor
         }
         else if (FERR) {   //hata
            ch = RCREG;      //RGREG buffer'i boşaltmak için okunuyor
            StrIdx =0;      // dizi başlangıç index'ine alınıyor
         }
         else {
         // artık veri  almaya başlıyoruz
         //buraya buffer doldugunda da işlemi bitir diyebiliriz.
            if((ch = RCREG)!= '0'){   //0'a basılmadıgı sürece al
               _dizi[StrIdx++] = ch;  // eger bir hata yoksa veri alınır
               }
                 else{    
                  _dizi[StrIdx] = '\0'; //alma işlemi bittiginde(sonlandırma karakteri geldiginde)
                                    //dizi sonuna NULL karakteri ekleniyor
                     Usart_Putstr(_dizi); // alınan veri ekrana basılıyor
                      StrIdx =0; //indis başa alınıyor.
                  }
            }
      }
}


iyi çalışmalar