putc() nin nasıl çalıştığını çözemedim?

Başlatan CaFFeiNe, 12 Ocak 2006, 18:59:13

mcan

rs232 için donanımı kurarken,
#USE RS232(BAUD=9600, XMIT=PIN_B2, RCV=PIN_B1, STREAM=COM_A)
yazmamız yani,donanımsal olan pinleri yazmamaız yetiyormu?şu komut kafamı karıştırdı (16f628 üzerinden konuşuyorum)setup_uart() bu komut ne işe yaradığını anlayamadım
setup_uart(9600);
veya
setup_uart(9600, rsOut);
şeklinde yazılabiliniyor,setup demesine bakarsam sanki donanımsal rs232 yi bu kuruyoır gibi ilk bakışda ama helpinde yazan ie sanki bu uart modülünü açıp kapamak için yapılmış bir komut gibi duruyor,doğrumu anladım bilemiyorum birde şu cümleyi pek anlamadım
Alıntı YapIf 1 is passed as a parameter, the UART is turned on, and if 0 is passed, UART is turned off.  If a BAUD rate is passed to it, the UART is also turned on, if not already on.
yani setup_uart(0, rsOut); yaparsak kapıyor ,setup_uart(1, rsOut); yazarsak açıyormu?setup_uart(9600, rsOut);yazarsak set_uart_speed (baud, [stream]) den bi farkı oluyormu?

SpeedyX

#USE RS232(BAUD=9600, XMIT=PIN_B2, RCV=PIN_B1, STREAM=COM_A)

bunu yapınca başlangıçta uart ı kuraruz yada yazılımsal uart oluştururuz.
setup_uart(9600);
veya
setup_uart(9600, rsOut);

bu ise bir fonksiyondur, bunu yapınca ise program içinde uart ayarlarıyla oynamış oluruz sanıyorum.
program içinde hız veya pinlerde değişiklik yapmaya hiç ihtiyacım olmadı ama ihtiyacım olsaydı bu olduğunu düşünürdüm. (?)

mcan

rs232 örneği bir deneme yaptım gerekli tüm dosyalarıda ekledim çalışıyor çalışmasına ama bi terslik var,indirip deneyen olursa orada şu durum var 1.picden yollanan ilk "online" satırı bozuk görünüyor ama sonradan gelen tek tek harfler rakamlar bozuk görünmüyor,"online" yazısını
fprintf(COM_B,"B Online");
komutu ile gönderip
c = fgetc(COM_b);
printf(lcd_putc,"%c",c);
komutları ile ekrana yazdırıyorum ,tek tek olanları ise
cz = fgetc(COM_A);

         fputc(cz, COM_B);}
kısmı ile yolluyorum acaba 2. pikin yazılımsal uart kullanmasından kaynaklanan bir hatamı var yoksa komutlarlamı alakalı bu hata?

SpeedyX

Selam,
Burada çalışanı var ama çok hata yapmışsın o kodun derlenmemesi gerekiyor aslında ama hex i vardı anlamadım pek :)

#include <16F628.h>
#fuses XT, NOWDT, PUT, NOPROTECT, NOBROWNOUT, MCLR, NOLVP, NOCPD
#use delay(clock=4000000)
#USE RS232(BAUD=9600, XMIT=PIN_B2, RCV=PIN_B1, STREAM=COM_A)
#USE RS232(BAUD=9600, XMIT=PIN_B4, RCV=PIN_B3, STREAM=COM_B)

#byte  PORTA = 5
#byte  PORTb = 6

#INT_RDA
al(){
  	char cz;
  	cz = fgetc(COM_A);
  	fputc(cz, COM_B);
}

main() {
	delay_ms(500);
	fprintf(COM_B,"B Online");
	fprintf(COM_A,"A Online");
	enable_interrupts(INT_RDA);
	enable_interrupts(GLOBAL);
	SET_TRIS_A(0);

	while(1)
	{
		output_high(PIN_B6);
		delay_ms(500);
		output_low(PIN_B6);
		delay_ms(500);
	}
}



mcan

Alıntı yapılan: "SpeedyX şöyle"Selam,
ama çok hata yapmışsın o kodun derlenmemesi gerekiyor aslında ama hex i vardı anlamadım pek :)
:D  :D  :lol:

önce yazdığınızı okudum,dedim nasıl yaw? ne hatası ne derlenmemesi sizin düzelttiğinize baktım dedimki kendi kendime eee 2. piki çıkarmış benim programı düzlemiş,çözümmü bu şimdi dedim,sonra düşündüm ne demek istiyor acaba diye gittim baktım kendi gönderdiğim dosyaya içinden çıkanları görünce sizin ne düşündüğünüzü merak ettim az bile demişsiniz derlenmemei gerekiyordu derken :lol: bilgisayarı hiç kapatmıyorum beklemeye alıyorum güç düğmesine basınca otomatik kaldığı yerden devam ediyor isis i de kapamıyorum onun için yaptığım değişiklik kayet mediğimden gönderdiğim dosyada yok,yani kısaca doğru soruyu orup yanlış örneğimi göndermişim gönderdiğimde lcd bile yok :lol:  doğrusu burada inşallah

kusura bakmayın vallaha dalgınlığıma gelmiş :roll:hakiki rs232

mcan

yaw bu yazmıyor yaw anca tek tek ve yavaş yazarsam çalışıyor yoksa bir cümle şeklinde gönderince ard arda sapıtıyor,tek tek gönderirken klavyede çok hızlı yazarsam ozamanda bozuluyor sanırım yazılımsal uart iş görmüyor nedersiniz?

kurumahmut

Sanırım problemi buldum sebeb şu 628 kodunda bir değişikliğe gittim...

B online yazısını 1 seferde değilde her seferde iki karakter olmak üzere 100us aralıklarla gönderince problem halloldu. 100us altında değer verince hata yapmaya başladı. Üstü değerler problem çıkarmıyor. Minumum 100us olsun...
delay_ms(50);
	fprintf(COM_B,"B ");
        delay_us(100);
	fprintf(COM_B,"on");
        delay_us(100);
	fprintf(COM_B,"li");
        delay_us(100);
	fprintf(COM_B,"ne");


Bir seferde üç karakter yolladığımda da hata yaptı... Uzmanlarından bu konuda yorum bekliyorum... 628 yollama problemimi çıkarıyor ya da 84A alma problemimi yaşıyor...

Ayrıca klavyede yazarken problem çıkmadı hiç.Ne yazarsam anında görüntü...

SpeedyX

Selamlar, soruyu yeni gördüm,
Sorun aradaki zaman uyuşmazlığından kaynaklanıyor, 628 veri yollarken 84 lcd ye yazıyor oluyor. Karakterleri tek tek geçikmeyle yollarsanız hiç sorun çıkmaz, yada el sıkışma protokolü kullanılacak yada interrupt yada buffer...

Bu şekilde çalışıyor:
#include <16F628.h>
#fuses XT, NOWDT, PUT, NOPROTECT, NOBROWNOUT, MCLR, NOLVP, NOCPD
#use delay(clock=4000000)
#USE RS232(BAUD=9600, XMIT=PIN_B2, RCV=PIN_B1, STREAM=COM_A)
#USE RS232(BAUD=9600, XMIT=PIN_A0, RCV=PIN_A1, STREAM=picarayuz)

#byte  PORTA = 5
#byte  PORTB = 6

#INT_RDA
void al() {
   char cz;
   cz = fgetc(COM_A);
   fputc(cz,picarayuz);
   fputc(cz,COM_A);
}

void picegonder(char data) {
   fputc(data,picarayuz);
   while(fgetc(picarayuz)!='*');
}

void main() {
   delay_ms(500);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   SET_TRIS_A(0);
	fprintf(COM_A,"A Online");

   printf(picegonder,"SpeedyX");

   while(1) {
      output_high(PIN_B6);
      delay_ms(500);
      output_low(PIN_B6);
      delay_ms(500);
    }
}


#include <16F84a.h>
#fuses XT, NOWDT, NOPUT, NOPROTECT//, NOBROWNOUT, MCLR, NOLVP, NOCPD
#use delay(clock=4000000)
#USE RS232(BAUD=9600, XMIT=PIN_A0, RCV=PIN_A1)

#byte  PORTA = 5
#byte  PORTB = 6

#define use_portb_lcd TRUE
#include <lcd.c>

char c=0;

void main() {
   SET_TRIS_A(0);
   lcd_init();
   delay_ms(100);
   printf(lcd_putc,"\fA Online");
   lcd_gotoxy(1,2);
   while(1) {
      c = getc();
      printf(lcd_putc,"%c",c);
      putc('*');  // artik mesgul değilim.
   }
}




Saygılar