Printf çalışmıyor?

Başlatan Nedenler, 09 Temmuz 2013, 11:57:22

Nedenler

Merhaba arkadaşlar.

Yazdığım programda RS232 ile PLC'den aldığım bir sayıya karşılık başka bir sayı değeri gönderiyorum. Daha önce sorunsuz çalışıyordu fakat yaptığım -alakasız- küçük bir değişiklik sonrasında program çalışmamaya başladı. PIC'den veriyi alıyorum fakat gönderemiyorum. PLC hiçbir şekilde okuma yapmıyor.

Kablonun 2. ve 3. uçlarını birbirine değdirdiğimde PLC gönderdiği sayıyı aynen okuyor. Yani PLC tarafında sorun yok.

Program proteusta da sıkıntısız çalışıyor. Bu durumda programda da sorun olmaması lazım?

Yaptığım tüm işlemleri kaldırıp en basit hale getirdim fakat yine de PLC'de hiç hareket yok.

#include <18F452.h>
#DEVICE ADC=10
#include <stdio.h>
#include <stdlib.h>     /* atoi */


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed osc with HW enabled 4X PLL
#FUSES NOPROTECT                  //Code protected from reads
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOCPD                    //No EE protection
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads


#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=N,stop=1,bits=8)


char ch[10];
int1 type_selected;
unsigned int8 type;


#int_RDA
void  RDA_isr() 
{
   disable_interrupts(int_rda);
   gets(ch);
   type = atoi (ch);
   type+=1;
   type_selected=1;
}


void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RDA); 


   while(1){
      
      enable_interrupts(INT_RDA);
      
      if(type_selected)
      {
         printf("%d\0",type);
         type_selected=0;
      }
      
   }



}


Program dosyaları: http://www.dosya.tc/server12/1Ek2EJ/Deneme.rar.html

Erol YILMAZ

printf ile gönderdiğin rakamları putch() ile göndermeyi dener misin ?

Nedenler

Denedim, hala aynı.
Datanın geldiğinden emin olmak için PLC'den data geldiğinde B0 pin çıkışını tersledim, sıkıntı yok, data da geliyor.

yldzelektronik

Ccs de gets fonksiyonu çok sancılı çalışır ki ben daha çalıştığına şahit olmadım.Gets fonksiyonunda çakılı kalıyor olabilir.Bir de yaptığın "alakasız" değişikliği de paylaşsan iyi olurdu.Debug yapmak için imkanın varsa printf(); i bir pc ye gönder.Orada veriyi görürsen sorunu başka yerde ara.Aklıma gelenler bunlar..
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

esensoy

gets de takılıyordur,
type ı 1 artırıyorsun, 1 byte geliyor sanırım, gets 0x0D gelene kadar bekler,
Kuvvetle muhtemel orada kalıyor,
En tehlikeli an "zafer" anıdır.

kimlenbu

#5
Daha önce başıma gelen şeyi söyleyeyim.

Kodumda zerre sıkıntı yokken, senin gibi ufak bir değişiklik yaptım ve iki işlemci arasındaki seri iletişim kafayı yedi. Kaynağını bulmak 1 haftamı aldı umarım sendeki sorun da aynısıdır.

Eğer dahili fonksiyonlar ile seri veri gönderiyorsan 0x0A değeri "Line Feed" 0x0D ise "Carriage Return" özel karakterleridir. Sen kazara 0x0A gönderirsen ve iletişimin karşılıklı veri al/gönder şeklindeyse senkron kayar, beklenmedik dallanmalar olur vs vs.

Bunun için printf, putchar vs artık ne kullanıyorsan modifiye etmen gerekiyor.

edit : keil c51 için modifiye edilmiş fonksiyon

http://www.keil.com/support/docs/3093.htm

Nedenler

Çok sağolun arkadaşlar. Sorunu çözdüm.
PIC'ten data alabildiğim için MAX232'nin arızalı olabileceğine hiç ihtimal vermiyordum. Fakat yeni bir entegre takınca canavar gibi çalıştı. Üstelik zarar verecek bir şey de yapmadım ama hayırlısı artık :)