seri port sorunu

Başlatan deserteagle, 08 Aralık 2007, 22:15:21

deserteagle

merhaba
aşağıdaki kodda seri porttan aldıgı karakterler dizi dizisine(biraz garip oldu :) ) atayıp sonra bunları lcd ekranda gösterecek bir kod var fakat bazı sorunlar var önce __config komutu picc18 de hata veriyor  derleyemiyorum vede codeprotect PROTECT olarakmı belirtiliyor.sorunu bulamadım.
veya bunun yerine başka nasıl bir kod olabilir.
şimdiden teşekkürler.


#include<pic18.h>
#include<delay.c>
#include<lcd.c>
__CONFIG(XT & WDTDIS );
void seri_hazirla(void);                  

void main(void)                                                
{                                                          
  unsigned short i;
  unsigned char dizi[20],c,*s;
  TRISA=0;
  TRISB=0;                              
  ADCON1 = 0X06;
  for(i=0;i<20;i++)
  dizi=0;                
  seri_hazirla();                                  
  i=0;
  while(c!='#'||i!=19)
  {dizi[i++]=RCREG;
     while(!RCIF);
  }   
   lcd_init();
   for(i=0;i<20;i++)
   dizi=*s++;
   lcd_puts(s);
   for(;;)
}
void seri_hazirla(void)
   {
      SPBRG = 25;  
      BRGH = 1;    
      SYNC = 0;  
      SPEN = 1;  
      CREN = 1;  
      SREN = 0;  
      TXIE = 0;  
      RCIE = 0;  
      TX9 =  0;    
      RX9 = 0;    
      TXEN = 0;  
      TXEN = 1;    
   }

arslan74

Merhaba,

Her microcontroller için bir tane Header (h) dosyası mevcut. Hangi PIC i secersen ona ait header dosyasınıda ilişkilendirmiş oluyorsun. Bu işlemi sen kendin elle yapmadığın için kullandığın IDE otomatik ilişkilendiriyor. Sen zaten kodunun başına

#include<pic18.h>


elkediğinde hangi PIC'i seçmiş isen onu kendisi ilişkilendirir.

Bu aradığın header dosyalarını

"c:\HTSOFT\PIC18\include\"

Klasörünün içinde bulablirsin.

Şimdi senin soruna gelince config ayarlarında kullandığın PIC in header dosyasını ac inçele orada ne yazman gerektiği yaziyor, oradan bakarak yazabilirsin.

Hangi pic kullandığını yazmadığın için, tam net cevab veremiyorum. Ama örneğin 18F452 için kullandığın da config ayarları yapmak için header dosyasında "pic18xx2.h"


/* Configuration bit values */

#define	OSCSEN		0xDFFF		/* oscillator system clock switch enable */
#define	OSCSDIS		0xFFFF

#define	RCIO		0xFFFF		/* oscillator types */
#define	HSPLL		0xFEFF
#define	ECIO		0xFDFF
#define	EC		0xFCFF
#define	RC		0xFBFF
#define	HS		0xFAFF
#define	XT		0xF9FF
#define	LP		0xF8FF

#define	UNPROTECT	0xFFFF		/* code protection */
#define	PROTECT		0xFF00

#define	WDTPS128	0xFFFF		/* watchdog timer postscale select */
#define	WDTPS64		0xFDFF
#define	WDTPS32		0xFBFF
#define	WDTPS16		0xF9FF
#define	WDTPS8		0xF7FF
#define	WDTPS4		0xF5FF
#define	WDTPS2		0xF3FF
#define	WDTPS1		0xF1FF

#define	WDTEN		0xFFFF		/* watchdog timer enable */
#define	WDTDIS		0xFEFF

#define	BORV25		0xFFFF		/* brown out reset voltage */
#define	BORV27		0xFFFB
#define	BORV42		0xFFF7
#define	BORV45		0xFFF3

#define	BOREN		0xFFFF		/* brown out reset enable */
#define	BORDIS		0xFFFD

#define	PWRTEN		0xFFFE		/* power-up timer enable */
#define	PWRTDIS		0xFFFF

#define	CCP2RC1		0xFFFF		/* CCP2 MUX bit */
#define	CCP2RB3		0xFEFF

#define	STVREN		0xFFFF		/* stack full/underflow reset enable */
#define	STVRDIS		0xFFFE


Bütün ayarlar için neler yazman gerektiğini acıklamalarıyla görmüş olacaksın?

Ayrıca delay.c ile lcd.c standart kütüphane dışında tutulmuştur. O yüzden onu
#include<delay.c> 
#include<lcd.c>


Şeklinde direkt ilişkilendiremesin. İlişkilendirmen için, o dosyalara bulunduğu klasörüde derleyiciye tanıtman gerek, yoksa hata verir.
Bir diğer yol ise bu dosyaları projenin olduğu klasöre kopyala ve yazarkende şöyle yaz.
#include "delay.c" 
#include "lcd.c"


O zaman en azında yazdığın koda gelmeden daha hata vermez. Bunları yaparsan. Sanırın diğer yazılım problemlerinide kendin çözebilirsin.


Selamlar

deserteagle

sayın arslan hocam bu delay ve lcd için bunları samples den includenin içerisine kopyalamıştım.ve önceki projelerimde delayı kullanmıştım.bu arada kullandığım koddan iyileştirmeler olarak ne görüyorsunuz.isiste hiçbir sonuç elde edemedim

arslan74

Alıntı yapılan: "deserteagle"sayın arslan hocam bu delay ve lcd için bunları samples den includenin içerisine kopyalamıştım.ve önceki projelerimde delayı kullanmıştım.bu arada kullandığım koddan iyileştirmeler olarak ne görüyorsunuz.isiste hiçbir sonuç elde edemedim

while(c!='#'||i!=19) 
{
dizi[i++]=RCREG; 

while(!RCIF); 

}



Bu kodda cok yanlışlar var.

c!='#'  bu sorguyu niye yapiyorsun ?

Diziye ilk değer atamada seriden alınmayan değeri yaziyorsun.

Önce bilgiyi al sonra diziye yaz.





while( i < 19 ) 
{

while(!RCIF); 

dizi[i++] = RCREG; 

}


veya


while( i < 19 ) 
{

while(!RCIF);

c = RCREG;

if ( c == '#')
  berak;
 
dizi[i++] = c; 

}


Selamlar

deserteagle

sayın hocam burada eğer göndereceğim veri 20 den az karakter içeriyorsa burada bırakmak için düşünmüştüm.
yanıtınızı hemen uyguluyorum.tekrar sağolun.

deserteagle

sayın arslan hocam dediğiniz yaptım fakat sonuç alamadım bende seri porttan bilgi alabiliyormuyum diye gelen harfin ascıı kodunu portd ye bağlı ledleri yakmak için kullanayım dedim fakat sonuç alamıyorum.sanırım püf noktasını kaçırdım
kod
#include<pic18.h>
#include<delay.c>
void seri_hazirla(void);                  
void bekle(unsigned short x);
void main(void)                                                
{                                                          
  unsigned short i;
  unsigned char dizi[20],c;
  TRISD=0;                              
  TRISC=1;
  PORTD=0;
  for(i=0;i<20;i++)
  dizi=0;                
  seri_hazirla();                                  
  i=0;
 while(1)
 {
    
    {
       while(!RCIF);
      c = RCREG;
      if ( c == '#')
      break;
      
      PORTD=c;
      bekle(1);
    }
 }

}




void seri_hazirla(void)
   {
      SPBRG = 25;  
      BRGH = 1;    
      SYNC = 0;  
      SPEN = 1;  
      CREN = 1;  
      SREN = 0;  
      TXIE = 0;  
      RCIE = 0;  
      TX9 =  0;    
      RX9 = 0;    
      TXEN = 0;  
      TXEN = 1;    
   }  
     
void bekle(unsigned short x)
{
   unsigned short i;
   for(i=4*x;i>=1;i--)
   DelayMs(250);
}


devre ise

arslan74

Merhaba,

Öncelikle verdiğin örnek kodları # ile gösterilen Code tagları içersinde göster. Normal yazı olarak gösterdiğinde kodlar bitişik cıkıyor anlaşılması cok zor oluyor.

Soruna gelince sana örnek kod veriyorum %100 çalışması gerek. Seri haberleşmede yapılması gereken ön ayarlar öncelikle RX bacağını giriş ve TX bacağınıda cıkış portu olarak ayarlamak. Bu sende yapılmamış.

TRISC = 0b10000000;


Sana 10Mhz de 9600bps hızında seri haberleşme hazır ayar kalıbını veriyorum.

/**********************************************************/
//	USART ayarları
/**********************************************************/

 	TXSTA = 0x24;
  	RCSTA = 0x90;
  	SPBRG = 64;
  	BRGH = 1 ;
  
/**********************************************************/


Ayrıca simulasyon işleminde kullandığım terminal programı ile PIC arasındaki Max232 yi iptal et. PIC'e direkt bağlantı kur ve öyle dene.

Selamlar

deserteagle

arslan hocam dediğinizi yaptım yinede sonuç alamadım.aklıma bir şey geldi yanılıyorsam affedin.acaba bu18f452 nin seri iletişim protokolünde belirtmem gereken bazı ek komutlarmı var.usart kalsörüne falan baktım fakat bulamadım.varsa siz çalışan bir kod versenizde incelesem.benim kodlarım çalışmamakta ediyorda.
tekrar sağolun.

arslan74

Merhaba,

Yaptığın çalışmayı buraya aktar.
Bu şekilde cevab vermek zor, cünkü ben bu şekilde kullanıyorum ve hiç bir sorunla karşılaşmıyorum.

Çalışmanı görürsek o zaman belli olur.

deserteagle

arslan hocam amacım artık seri porttan ledleri yakamaya kadar düştü.önce basitten başlayayım bari.program bilgisayarın seri portundan aldığı karakterleri önce c değişkenine atıyor sonra bunu portd ye aktarıyor ve burada c nin ascıı kodu ledlerde görülüyor. burada amacım seri porttan veri alıyormuyum denemekti.sonra lcd falan ekleyeyim dedim.
#include<pic18.h>
#include<delay.c>                 
void bekle(unsigned short x);
void main(void)                                                 
{                                                          
   unsigned short i;
   unsigned char c;
   TRISD=0;                              
   TRISC=0b10000000;
   PORTD=0;
   TXSTA = 0x24; 
   RCSTA = 0x90; 
   SPBRG = 64; 
   BRGH = 1 ;                            
   i=0;
   while(1)
  {
  	PORTD=1;
  	bekle(1);
  	PORTD=0;
                while(!RCIF); 
	c = RCREG; 
                break; 
                RCIF=0;
	PORTD=c;	
	bekle(1);
  } 
 }
   
 void bekle(unsigned short x)
 {
 	unsigned short i;
 	for(i=4*x;i>=1;i--)
 	DelayMs(250);
 }

buraya upload ettim.virtual terminali dediğiniz gibi bağladım.
http://rapidshare.com/files/75669206/Yeni_Klasoer.rar.html

arslan74

Merhaba,

Fonksiyondaki "break;" komutunun amacı nedir acaba. Zira o komut tüm programı bozuyor. Bu komutu kullanmaz isen kesin çalışması gerek.

Birde programın başına sigorta ayarlarını yap.

__IDLOC(120123);
__CONFIG(1, HS & OSCSEN );
__CONFIG(2, WDTDIS & PWRTEN & BOREN );
//__CONFIG(3, );
__CONFIG(4, LVPDIS & DEBUGDIS & STVREN );
//__CONFIG(5, CPALL);
//__CONFIG(6, WRTEN);
//__CONFIG(7, TRU & SWDTDIS );


__EEPROM_DATA( 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 );


Bu sefer çalışmaz ise senin derdine deva yok. Daha boş yere sorman gerekmez.

Selamlar

deserteagle

sayın arslan hocam çok sağolun break nereden geldi bilmiyorum ama onu silince çalıştı.işte çalışmıyor diye şartlanınca böyle boşuna uğraşıp duruyormuşum.yardımlarınız için çok sağolun.
tekrar saygılarımla.

F493

arslan74'arkadaşım.

aslında benim sorum konuyla alakalı değil ancak dikkatimi çekti,
necati hocanın kitaplarından ve dernegin sitesinden bahsettiniz ,sanırım orada egitim aldınız yada alıyosunuz.

Ben oradayım ,belki karşılaşırız diye düşündüm birde aldıgınız egitimler nedir,yada aldınızmı (dernekte).


 Bir sorayım dedim.

arslan74

Alıntı yapılan: "F493"arslan74'arkadaşım.

aslında benim sorum konuyla alakalı değil ancak dikkatimi çekti,
necati hocanın kitaplarından ve dernegin sitesinden bahsettiniz ,sanırım orada egitim aldınız yada alıyosunuz.

Ben oradayım ,belki karşılaşırız diye düşündüm birde aldıgınız egitimler nedir,yada aldınızmı (dernekte).


 Bir sorayım dedim.


Size bu konuda Ö.M. attım.

Selamlar