Printf komutu nasıl TX pinini otomatik olarak bulup, veri basıyor?

Başlatan LukeSkywalker, 26 Ağustos 2011, 13:31:28

LukeSkywalker

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? 

Kadir Can(16F84)

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.

GreeN

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.
Terörü Lanetliyoruz.

bymrz

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...

LukeSkywalker

Bende öyle düşünüyordum. Peki "printf" sadece usart için mi kullanılıyor?

bayelektronik

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.

ahfxg

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.
Erkeklerin dünyasına başkaldıran bayan mühendis..

LukeSkywalker

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.

LukeSkywalker

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...

LukeSkywalker

Bir sorum daha var. Peki Hı-Tech'de Printf fonksiyonunu hem usart, hem lcd için aynı projede kullanabilir miyiz?

mistek

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 ?

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

fgokcegoz

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ış.
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

mistek

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.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

fgokcegoz

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...
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

kantirici

@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ı.