Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

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: deserteaglesayı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: F493arslan74'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