Picproje Elektronik Sitesi

DERLEYİCİLER => PIC C => Konuyu başlatan: raprap17 - 01 Nisan 2006, 20:52:27

Başlık: usart problemi
Gönderen: raprap17 - 01 Nisan 2006, 20:52:27
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
Başlık: usart problemi
Gönderen: arslan74 - 02 Nisan 2006, 01:45:27
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.
Başlık: usart problemi
Gönderen: raprap17 - 02 Nisan 2006, 15:30:17
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 (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.
Başlık: usart problemi
Gönderen: Ziya - 02 Nisan 2006, 17:13:49
döngüyü bir yerde kırmanız gerek.

data++;
if(*data==null) break; gibi
Başlık: usart problemi
Gönderen: arslan74 - 02 Nisan 2006, 17:15:32
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.
Başlık: usart problemi
Gönderen: arslan74 - 02 Nisan 2006, 17:20:44
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.
Başlık: usart problemi
Gönderen: arslan74 - 02 Nisan 2006, 17:23:43
Gönder kontrolnunu böyle dene.

void putrsUSART(const char *data){

while( *data ){

while(!TXIF )
   ;

TXREG = *data;

data++;
}

}
Başlık: usart problemi
Gönderen: raprap17 - 03 Nisan 2006, 01:22:23
@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);
}
Başlık: usart problemi
Gönderen: arslan74 - 03 Nisan 2006, 01:34:20
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.

}

Başlık: usart problemi
Gönderen: raprap17 - 03 Nisan 2006, 10:38:08
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ı (http://img162.imageshack.us/my.php?image=seri6fg.jpg)

void main() {
const  char a[]={"\rAT+CMGF=1"};
sci_Init();
putrsUSART(a);
while(1);
TXEN=0;
}
Başlık: usart problemi
Gönderen: arslan74 - 03 Nisan 2006, 12:51:29
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);
}
Başlık: usart problemi
Gönderen: raprap17 - 04 Nisan 2006, 12:42:19

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ı.