Picproje Elektronik Sitesi

DERLEYİCİLER => Hi-Tech => Konuyu başlatan: LukeSkywalker - 26 Ağustos 2011, 13:31:28

Başlık: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: LukeSkywalker - 26 Ağustos 2011, 13:31:28
Ben şu an kadar CCS C ile başlayıp, MikroC ile devam eden , aynı zamanda da Microchip'in en yetkili 16 serisi C derleyicisi olarak belirttiği derleyici olan Hi-Tech'i de merak eden birisi olarak bunu soruyorum... Printf fonksiyonu nasıl çalışır? Otomatikmen her denetleyici de TX pinine veri basabiliyor gördüğüm kadarı ile hiç bir ayar yapmadan. Bunu nasıl yapıyor peki? 
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: Kadir Can(16F84) - 26 Ağustos 2011, 13:49:36
PIC C bilgim yok fakat Atmel C çalışmışlığım var.
Atmel'de böyle işler yapmak için ( Örneğin LCD'ye printf() ile veri göndermek için) akımları kullanıyordum.
Büyük ihtimalle PIC C'de de böyle bir seçenek vardır.Öntanımlı olarak TX pini seçilmiş olabilir.
NOT: Tamamen varsayımsal konuştum.Dediğim gibi PIC C ile hiç çalışmadım.
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: GreeN - 26 Ağustos 2011, 14:15:49
Bazı PIC'lerde UART yok . Dediğin gibi 16F84 'te bile uart ile haberleşme yapabiliyorsun.
CCS C'de yazılımsal olarak uart işini çözüyor.  Yazılımsal uart kullanmak istediğimizde TX ve RX pinlerini tanımlamamız lazım.

printf gönderilecek veri uzunluğunu tespit edip 8'er bitlik verileri rs232 protokolüne göre gönderiyor.
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: bymrz - 26 Ağustos 2011, 14:17:55
printf ile TX bacağına data basılmaz, UART modülüne erişilir ve modülün ilgili registerine gönderilecek veri yerleştirilir, daha sonra uart modülü kendisi TX bacağına ulaşır...

Bu registerların ne olduğunu nerden biliyor dersen, proje dosyası oluşturulurken kullanacağım işlemciyi seçiyosun, ya da projenin içerisine ilgili işlemcinin bu registerların tanımlı olduğu header(#include "16f628A.h") dosyasını ekliyorsun...
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: LukeSkywalker - 26 Ağustos 2011, 14:45:55
Bende öyle düşünüyordum. Peki "printf" sadece usart için mi kullanılıyor?
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: bayelektronik - 26 Ağustos 2011, 21:40:38
ccs c de printf() fonksiyonu çok amaçlı sıralı bilgi gönderme işini yürütür.

#include <18F2520.h>
#device adc=10
#FUSES NOWDT, intrc_io, NOPROTECT, noBROWNOUT, NOPUT, NOCPD, noSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, IESO, FCMEN, PBADEN, NOWRTC, NOWRTB, NOEBTR, NOEBTRB, NOCPB, LPT1OSC, NOMCLR
#use delay(clock=32000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=seri1)


yukarda bi başlık dosyası,sigorta ayarları vs. tanımlamalar var.
eğer #user rs232  içinde pin tanımlamalarına donanım dışı seri iletişim pini yazarsan yazılımsal olarak; donanımsal pinleri yazarsan donanımsal olarak iş görür bunu yapmasınıda ccs c kendisi sağlar.(printf() fonksiyon yapısını bulamadığım için gösteremiyorum:D)

ayrıca dediğim gibi sadece seri iletişimde kullanılmaz bu fonksiyon lcd ye yazı yazdırırken veya herhangi bi düzen ve sıralı işlem yaptırmakta da kullanılır.mesala ben 74hc595 e veri göndermek için yazdığım fonksiyonu bile printf() ile çağırabilirim.
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: ahfxg - 26 Ağustos 2011, 21:48:04
printf öncelikle putch fonksiyonunu arıyor. Siz putch fonksiyonunu uart'a tek byte veri gönder olarak düzenlemişseniz uart'a, lcd'ye tek karakter düzenlemişseniz lcd'ye string gönderiyor.
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: LukeSkywalker - 27 Ağustos 2011, 00:53:09
Alıntı yapılan: ahfxg - 26 Ağustos 2011, 21:48:04
printf öncelikle putch fonksiyonunu arıyor. Siz putch fonksiyonunu uart'a tek byte veri gönder olarak düzenlemişseniz uart'a, lcd'ye tek karakter düzenlemişseniz lcd'ye string gönderiyor.
Peki putch() fonksiyonu zaten tanımlı değil mi derleyicide? Bir de bazı yerlerde direkt kullanmışlar, usart kütüphanesi oluştrmadan.
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: LukeSkywalker - 27 Ağustos 2011, 01:03:22
http://www.htsoft.com/support/faqs.php#faq92
Burada anlatmış. Printf() fonksiyonu ahfxg'nin söylediği gibi putch() ile yürütüyor işini...
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: LukeSkywalker - 27 Ağustos 2011, 01:14:02
Bir sorum daha var. Peki Hı-Tech'de Printf fonksiyonunu hem usart, hem lcd için aynı projede kullanabilir miyiz?
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: mistek - 26 Ağustos 2013, 22:46:16
Alıntı yapılan: LukeSkywalker - 27 Ağustos 2011, 01:14:02
Bir sorum daha var. Peki Hı-Tech'de Printf fonksiyonunu hem usart, hem lcd için aynı projede kullanabilir miyiz?

Hocam bunu denediniz mi?

CCS printf() fonksiyonunu kendisine göre düzenlemiş kafam karıştı.
LCD ye data göndermek için printf(lcd_putc,"falan%.2f %5",abc,5); yazınca lcd_putc fonksiyonuna dataları geçiriyor. Ama nasıl? Bir fonksiyona veya diziye değer geçirme işini sprintf() yapmayacak mıydı?

CCS in yaptığı bu işi ANSI C uyumlu başka derleyici üzerinde nasıl yapabilirim ?

Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: fgokcegoz - 26 Ağustos 2013, 23:02:53
printf fonksiyonu formatlı olarak karakter dizisi basma işine yarıyor. Standart C de, putch fonksiyonu bulunmaktadır. Eğer siz yazılımınızda, putch fonksiyonunuzu yazmışsanız, printf fonksiyonu derleyicinin değil, sizin putch fonksiyonunuzu kullanır. Farz edelimki, siz bu fonksiyonu usart tan bir byte veri gönderecek şekilde yazdınız. O zaman derleyici sizin printf içine yazdığınız karakter dizisini istenilen formatta düzenledikten sonra, sizin putch fonksiyonunuzu kullanarak gönderir ve siz usart tan formatlı olarak data göndermiş olursunuz. Eğer siz usart değilde, lcd ye bir karakter basmak için putch fonksiyonunuzu düzenlerseniz, printf fonksiyonu karakter dizisini istenilen formatta düzenledikten sonra,  lcd birer birer sizin putch fonksiyonunuz ile karakterleri gönderir. Putch fonksiyonun içini doldurmak size kalmış yani.

Birde sprintf fonksiyonu var. Örn., " sprintf(str,"merhaba dunya\n"); " gibi kullanılır. printf gibi tırnak içine yazılanları istenilen formata getirip, sonrasında fonksiyona gönderilen ilk argüman olan karakter dizisi değişkenine atar. Sizde o karakter dizisini istediğiniz gibi gönderirsiniz. ister putch fonksiyonuyla isterse sizin isimlendirdiğiniz bir fonksiyon ile. Orası size kalmış.
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: mistek - 26 Ağustos 2013, 23:13:40
Alıntı yapılan: fgokcegoz - 26 Ağustos 2013, 23:02:53
printf fonksiyonu formatlı olarak karakter dizisi basma işine yarıyor. Standart C de, putch fonksiyonu bulunmaktadır. Eğer siz yazılımınızda, putch fonksiyonunuzu yazmışsanız, printf fonksiyonu derleyicinin değil, sizin putch fonksiyonunuzu kullanır. Farz edelimki, siz bu fonksiyonu usart tan bir byte veri gönderecek şekilde yazdınız. O zaman derleyici sizin printf içine yazdığınız karakter dizisini istenilen formatta düzenledikten sonra, sizin putch fonksiyonunuzu kullanarak gönderir ve siz usart tan formatlı olarak data göndermiş olursunuz. Eğer siz usart değilde, lcd ye bir karakter basmak için putch fonksiyonunuzu düzenlerseniz, printf fonksiyonu karakter dizisini istenilen formatta düzenledikten sonra,  lcd birer birer sizin putch fonksiyonunuz ile karakterleri gönderir. Putch fonksiyonun içini doldurmak size kalmış yani.

Birde sprintf fonksiyonu var. Örn., " sprintf(str,"merhaba dunya\n"); " gibi kullanılır. printf gibi tırnak içine yazılanları istenilen formata getirip, sonrasında fonksiyona gönderilen ilk argüman olan karakter dizisi değişkenine atar. Sizde o karakter dizisini istediğiniz gibi gönderirsiniz. ister putch fonksiyonuyla isterse sizin isimlendirdiğiniz bir fonksiyon ile. Orası size kalmış.

Hocam cevabınız için teşekkürler printfle uarttan daha göndermek için daha önce fonksiyonları yazmıştım orada sorun yok.
Ama format şu şekildeydi: printf("datalar%d",a);
CCS de ise bunu printf(lcd_putc,"datalar%d",a); şeklinde yapmış. printf fonksiyon parametresi olarak lcd_putc alabiliyor mu? Az önce denedim hata veriyor.
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: fgokcegoz - 26 Ağustos 2013, 23:46:10
standart c de ki printf fonksiyonunu, CCS C deki gibi kullanamazsınız. CCS C kendine göre modifiye etmiş o fonksiyonu. Bence PIC mcu için, artık CCS C derleyicisi kullanmaktan vazgeçmelisiniz. ANSI C uyumlu bir derleyicide, çok daha rahat edeceksiniz, emin olun...
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: kantirici - 27 Ağustos 2013, 11:34:47
@mistek, @gerbay hocanın bu konu hakkında açıklamları vardı eski konularda.Ona bakmanızı tavsye ederim.Printf fonksyonun nasıl manipüle edilecegini anlatmıştı.
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: kimlenbu - 27 Ağustos 2013, 12:10:15
Ek bilgi :

Keil için konuşmak gerekirse örneğin putchar fonksiyonu tanımlıdır, direkt kullanabilirsin. Ama şöyle bir şey yapmış adamlar, sen bu fonksiyonu tekrar tanımlayabiliyorsun. Senin yazdığın putchar fonksiyonunun önceliği var.

Niye tekrar yazmak gerekir dersen de bu hazır fonksiyonlarda süre aşımı kontrolü yok, eğer beklediğin değer gelmezse programın çakılır kalır, bu yüzden seri iletişimde gelen veriye göre dallanma yapıyorsan nolur nolmaz süre aşımı kontrolü koyman gerekiyor.

Putchar ve Getchar fonksiyonlarını kullanıyorsan 0x0A ve 0x0D gibi özel anlamları olan karakterler gönderirsen de "beklemediğin" sonuçlarla karşılaşırsın.

Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: cicjoe - 27 Ağustos 2013, 12:52:50
Baze derleyicilerde de soyle bir durum var. printf kullandiginizda, putchar fonksiyonu bulunamadi diyor. Yani kimse yazmamis, sizden bekliyor. Bazi derleyicilerde de printf IDE'nin debug penceresine yonlendirilmis, baya kullanisli.

Ayrica printf fonksiyonu biraz maliyetli deniyor. Yani ufak MCU'larda printf yerine kendi formatlayicinizi yazin deniyor. Gene bazi derleyiciler 1'den fazla printf secenegi sunabiliyor.
Ornegin IAR'da:
(http://s21.postimg.cc/hod1q41iv/printf.png)
Başlık: Ynt: Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?
Gönderen: yamak - 27 Ağustos 2013, 15:42:05
https://www.picproje.org/index.php/topic,45043.0.html (https://www.picproje.org/index.php/topic,45043.0.html)