Haberler:

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

Ana Menü

usart problemi

Başlatan raprap17, 01 Nisan 2006, 20:52:27

raprap17

pic16f877 kullanarak seri haberleşme yapmak istiyorum cep telefonu  ile
bunun için pic ten AT komutlarını göndermem gerekiyo
Fakat şöyle bi sorunum var.


void putrsUSART(const char *data)
{
do
{
while(!(TXSTA & 0x02));
TXREG = *data;
} while( *data++ );
}


böyle yapmakla gonderilen data sürekli ekrana yazıyor.
Misal: "ali" stringini parametre olarak gonderince çıktı şöyle oluyo.
alialialialialialialiali...
bunu birkez yazdırmanın yolu nedir?
örnek çıktı: ali
Neyi arıyorsan osun sen ! Hz. Mevlana

arslan74

Program hiç bir sorun gözükmüyor gibi.
Senin string dizinin sonunda "/Null" varmı?. Eğer "/NULL" yani sıfır değeri yoksa bu program düzgün çalışmaz.

void putrsUSART(const char *data){ 

while( *data ){

while(!(TXSTA & 0x02))
    ;

TXREG = *data; 

data++;
}

}


Birde böyle dene.

raprap17

dizi tanımım tam olarak şöye:
const char a[]="\rahmet";
Null karakterini kendimiz mi koymamız gerekiyor?
Eğer öyleyse null karakteri nedir? c de "\0" dı zannedersem

http://img130.imageshack.us/my.php?image=ads305z0bs.jpg

@arslan74
yazdığınız kodu denedim bi değişiklik olmadı.Virtual terminaldeki örnek çıktı
resimdeki gibi.
Neyi arıyorsan osun sen ! Hz. Mevlana

Ziya

döngüyü bir yerde kırmanız gerek.

data++;
if(*data==null) break; gibi
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

arslan74

Sana örnek kod yolluyorum.

char	text[21] = {"Hasan Arslan\0"};


veya;

conts char	text[] = {"Hasan Arslan"};


ikisinide dene ikiside olmalı. İlkkinde sona "\0" koymamın sebebi dizi uzunluğu belli olduğu için Mutlaka yazının sonuna Null koyması için yaptım. Böyle olunca ya sona Null koyacak yada taşma durumda Error verib derlemiyecek.

Selamlar.

arslan74

Alıntı Yapdöngüyü bir yerde kırmanız gerek.

data++;
if(*data==null) break; gibi

Bu zaten test ediliyor:

while( *data ){


Bu döngünün içinde içerik Null olmadığı sürece devam eder. Null oldumu Döngünden Cıkıp ana programa dönüyor.

arslan74

Gönder kontrolnunu böyle dene.

void putrsUSART(const char *data){ 

while( *data ){ 

while(!TXIF ) 
    ; 

TXREG = *data; 

data++; 
} 

}

raprap17

@arslan74
son gonderdiğiniz kodu da denedim fakat değişiklik olmadı.Acaba virtual terminal diyorum gonderileni sürekli mi yazıyo ?  :!:
Bir de tam olarak yapmak istediğimi yazayım.
Pic ile cep telefonunu biribirine bağlayıp seri haberleştirmek.
bunun için AT komutlarını pic ten telefona  gondermek gerekiyor. forumda daha önce verilmişti. "AT+CMGF=1" komutu mesaj formatını belirlemek için kullanılıyo. haliyle ben bu komutu bir kez yollamak durumundayım   ;)
kullandığım kod tam olarak şöyle :

#include <pic.h>
#include <stdlib.h>

void  sci_Init()
{
   BRGH=1;
   SPBRG =25;   

   SYNC = 0;
   SPEN = 1;   
   CREN = 0;   
   SREN = 0;   
   TXIE = 0;   
   RCIE = 0;
   TX9  = 0;   
   RX9  = 0;
   TXEN = 1;      
}

void putrsUSART(const char *data){

while( *data  ){

while(!TXIF );

TXREG = *data;

data++;
              }

}
void main() {

const  char a[]={"\rAT+CMGF=1"};
sci_Init();
putrsUSART(a);
}
Neyi arıyorsan osun sen ! Hz. Mevlana

arslan74

Alıntı YapTarih: Pts Nis 03, 2006 12:22 am    Mesaj konusu:  

--------------------------------------------------------------------------------

@arslan74
son gonderdiğiniz kodu da denedim fakat değişiklik olmadı.Acaba virtual terminal diyorum gonderileni sürekli mi yazıyo ?  
Bir de tam olarak yapmak istediğimi yazayım.
Pic ile cep telefonunu biribirine bağlayıp seri haberleştirmek.
bunun için AT komutlarını pic ten telefona gondermek gerekiyor. forumda daha önce verilmişti. "AT+CMGF=1" komutu mesaj formatını belirlemek için kullanılıyo. haliyle ben bu komutu bir kez yollamak durumundayım  
kullandığım kod tam olarak şöyle :

#include <pic.h>
#include <stdlib.h>

void sci_Init()
{
BRGH=1;
SPBRG =25;

SYNC = 0;
SPEN = 1;
CREN = 0;
SREN = 0;
TXIE = 0;
RCIE = 0;
TX9 = 0;
RX9 = 0;
TXEN = 1;
}

void putrsUSART(const char *data){

while( *data ){

while(!TXIF );

TXREG = *data;

data++;
}

}
void main() {

const char a[]={"\rAT+CMGF=1"};
sci_Init();
putrsUSART(a);
}


Kodunda gözden birşey kacırmış gibisin.

#include <pic.h> 
#include <stdlib.h> 

void sci_Init() 
{ 
BRGH=1; 
SPBRG =25; 

SYNC = 0; 
SPEN = 1; 
CREN = 0; 
SREN = 0; 
TXIE = 0; 
RCIE = 0; 
TX9 = 0; 
RX9 = 0; 
TXEN = 1; 
} 

void putrsUSART(const char *data){ 

while( *data ){ 

while(!TXIF ); 

TXREG = *data; 

data++; 
} 

} 
void main() { 

const char a[]={"\rAT+CMGF=1"}; 
sci_Init(); 
putrsUSART(a);      // gönderdikten sonra ne yapacak. sonrasını boş bırakmışsın.

while(1);  // burda beklet. o zaman sorunsuz calışır.

}

raprap17

ilginiz için teşekkür ederim
program "while" ile sonsuz döngüye girince de istediğim gibi çalışmadı.
Sonradan iletme iznini kaldırınca problem çözüldü.
Virtual terminal çıktısı

void main() {
const  char a[]={"\rAT+CMGF=1"};
sci_Init();
putrsUSART(a);
while(1);
TXEN=0;
}
Neyi arıyorsan osun sen ! Hz. Mevlana

arslan74

void main() { 
const char a[]={"\rAT+CMGF=1"}; 
sci_Init(); 
putrsUSART(a); 
while(1); 
TXEN=0; 
}


En son yazdığın kodu hiçbir zaman işlemezki Sonsuz döngüde kalır. ilerlemez.

while(1); 
TXEN=0; // Program bu kısmına hiç girmez.


Sonsuz döngüye girmeden Usartı kapatırsan daha mantıklı olur.

TXEN=0; 
while(1); 
}

raprap17

while(1); 
TXEN=0; // Program bu kısmına hiç girmez.


dediğiniz gibi ilk önce TXEN i sıfırlayıp sonra donguye sokmak en mantıklısı.
Neyi arıyorsan osun sen ! Hz. Mevlana