keilde printf komutu kullanımı.

Başlatan blacklogic, 29 Eylül 2013, 15:44:08

blacklogic

Merhaba lcdye printf komutu ile veri göndermek istiyorum ama beceremedim. Normal bir şekilde yazıyorum ama printf ile yapmak istiyorum.
int a = 0xf;
printf("%d",a);  bu şekilde a yı basmak isyiyorum.

aşağıdaki kodumda lcd_metin() fonksiyonu içerisin lcd_yaz ile bunu yapıyorum. lcd_yazın bir benzerini putch diye yaptım ama printf ile basamadım.
#include <stdio.h> da çağırdım.
void putch(unsigned int c)
{

	GPIOA->BRR=0xFFFFFFFF;
	RS |= 0x2;                       // RS pini "1" yapilir.

	E |= 0x8;
	LCD |= (c & 0xF0);
	delaylcd();
	GPIOA->BRR = 0x8;
	GPIOA->BRR=0x00F0;
	//porttemizle
	E |= 0x8;
	LCD |= (c & 0x0F)<<4;
	delaylcd();
	GPIOA->BRR = 0x8;
	GPIOA->BRR=0x00F0;
	
}

mistek

boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

blacklogic

Alıntı yapılan: mistek - 29 Eylül 2013, 15:53:06
Daha önce CCS mi kullandınız ?

hayır onu hiç kullanmadım ama forumda görmüştüm bu şekilde olduğunu anlatıyorlardı. printf putch kullanır diye. keildeki stdio.h içerisine baktım ama pek bişey anlamadım.

mistek

CCS deki kullanım yanılgısına düşmüştüm o yüzden sordum.

Şuraya bir gözatın https://www.picproje.org/index.php/topic,35122.0.html
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

blacklogic

Alıntı yapılan: mistek - 29 Eylül 2013, 16:18:05
CCS deki kullanım yanılgısına düşmüştüm o yüzden sordum.

Şuraya bir gözatın https://www.picproje.org/index.php/topic,35122.0.html

keilde putchar olarak geçtiği söylenmiş fakat putchar şeklinde bir fonksiyon yapamıyorum, izin vermiyor.
özetle becremedim :)

Burak B

#5
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */


Önce bu tanımlamayı ekleyin. Sonrada alttaki fonksiyonu tanımlayın.
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData (USART1, (uint8_t) ch);

  /* Loop until the end of transmission */
  while (USART_GetFlagStatus (USART1, USART_FLAG_TC) == RESET)
  {}

  return ch;
}


PUTCHAR_PROTOTYPE içerisine ne yazacağınız size kalmış. Çıkış birimi olarak ne kullanmak istiyorsanız ona göre bir kod ekleyin.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

blacklogic

Alıntı yapılan: ByteMaster - 29 Eylül 2013, 22:37:41
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */


Önce bu tanımlamayı ekleyin. Sonrada alttaki fonksiyonu tanımlayın.
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData (USART1, (uint8_t) ch);

  /* Loop until the end of transmission */
  while (USART_GetFlagStatus (USART1, USART_FLAG_TC) == RESET)
  {}

  return ch;
}


PUTCHAR_PROTOTYPE içerisine ne yazacağınız size kalmış. Çıkış birimi olarak ne kullanmak istiyorsanız ona göre bir kod ekleyin.

teşekkürler, hocam peki burada printf("deneme") dediğimde ch ve f ya nasıl bir değer koyuyor?

Burak B

"deneme" stringinin her karakteri için PUTCHAR_PROTOTYPE çağrılır. Senin f ile bir işin yok. Ancak onu da kullanmak istiyorum diyorsan f basitçe çıkış birimi için sana bir değer veriyor. Yani 1 ise UART, 2 ise LCD, 3 ise USB v.s. gibi. bu değerleri belirleyecek olan yine sensin. FILE veritipini daha iyi anlayabilmek için stdio.h kütüphanesini inceleyebilirsin.

Daha detaylı bir açıklama için KEIL + fprintf
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

blacklogic

Alıntı yapılan: ByteMaster - 30 Eylül 2013, 11:23:25
"deneme" stringinin her karakteri için PUTCHAR_PROTOTYPE çağrılır. Senin f ile bir işin yok. Ancak onu da kullanmak istiyorum diyorsan f basitçe çıkış birimi için sana bir değer veriyor. Yani 1 ise UART, 2 ise LCD, 3 ise USB v.s. gibi. bu değerleri belirleyecek olan yine sensin. FILE veritipini daha iyi anlayabilmek için stdio.h kütüphanesini inceleyebilirsin.

Daha detaylı bir açıklama için KEIL + fprintf
Hocam teşekkür ederim açıklama için, ilk fırsatta deneyeceğim.

blacklogic

Yok çalıştıramadım, aynısını xc ile picde yaptım çalıştı printf("sayi=",say1) diyerek sayi=15 yazdırdım ama keilde olmuyor.

Burak B

Alıntı yapılan: blacklogic - 05 Ekim 2013, 00:46:10
Yok çalıştıramadım, aynısını xc ile picde yaptım çalıştı printf("sayi=",say1) diyerek sayi=15 yazdırdım ama keilde olmuyor.

printf("Sayi=%d\n",say1);
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

blacklogic

Alıntı yapılan: ByteMaster - 05 Ekim 2013, 01:42:12
printf("Sayi=%d\n",say1);

fark yapmadı kendim IntToAsciiDec diye bir fonksiyon yazacağım en son çare

denediğim kod:
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

PUTCHAR_PROTOTYPE
{

	GPIOA->BRR=0xFFFFFFFF;
	RS |= 0x2;                       // RS pini "1" yapilir.

	E |= 0x8;
	LCD |= ((uint8_t)ch & 0xF0);
	delaylcd();
	GPIOA->BRR = 0x8;
	GPIOA->BRR=0x00F0;
	//porttemizle
	E |= 0x8;
	LCD |= ((uint8_t)ch & 0x0F)<<4;
	delaylcd();
	GPIOA->BRR = 0x8;
	GPIOA->BRR=0x00F0;
	return ch;
}