Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: armsistem - 12 Şubat 2012, 23:30:31

Başlık: C code help !
Gönderen: armsistem - 12 Şubat 2012, 23:30:31
Arkadaşlar merhaba , aşağıdaki kodları anlayamadım yardımlarınızı bekliyorum.


- Usart_Oku başında ünlem fonksiyonu değilliyormu ? Mantığını çözemedim.
- Usart_Oku fonk. bana uarttan okunan veri döndürmesi gerekiyor bu satırın anlamı nedir.Usart_Oku(&veri,PortNum));

Açıkçası aşağıdakileri küllüm anlamadım.

main.c


uint8_t veri;

while(1){
while(!Usart_Oku(&veri,PortNum));
  lcd_gotoxy(2,1);
lcd_yaz("                ");
  lcd_gotoxy(2,1);
veri_yolla(veri);
while(Usart_Oku(&veri,PortNum))
veri_yolla(veri);
}





uart.c
uint8_t Usart_Oku(uint8_t *veri,uint8_t PortNum)
{
uint32_t say;

if( PortNum == 0 ) {

while(UART0Count==UART0CountOku){
say++;
if(say==5000)return( FALSE );
}
*veri=UART0Buffer[UART0CountOku];
if(UART0CountOku == BUFSIZE)UART0CountOku=0;
UART0CountOku++;

return (TRUE);
}
else if( PortNum == 1 ){

while(UART1Count==UART1CountOku){
say++;
if(say==5000)return( FALSE );
}
*veri=UART1Buffer[UART1CountOku];
if(UART1CountOku == BUFSIZE)UART1CountOku=0;
UART1CountOku++;

return (TRUE);
}
else if( PortNum == 3 ){

while(UART3Count==UART3CountOku){
say++;
if(say==5000)return( FALSE );
}
*veri=UART3Buffer[UART3CountOku];
if(UART3CountOku == BUFSIZE)UART3CountOku=0;
UART3CountOku++;

return (TRUE);
}
return ( FALSE );
}
}
Başlık: Ynt: C code help !
Gönderen: justice_for_all - 12 Şubat 2012, 23:45:00
Usart_Oku(&veri,PortNum));

burda fonksiyon sana true or false deger donduruyo yani  deger okunduysa true okunmadiysa false deger donduruyor.


unlemin anlami ise gelen veri true false hangisi oldugunu kontrol ediyor.yani unlem varsa false geldiyse demek unlem yoksa true geldiyse demek.
Başlık: Ynt: C code help !
Gönderen: armsistem - 13 Şubat 2012, 08:09:58
Hocam yanıt için sağol , normalde program uarttan veriyi okuyup lcdye yazması gereken bir programdır diye fikir yürütüyorum.while(!Usart_Oku(&veri,PortNum)); Doğrumudur doğruysa mantığı nedir.
Başlık: Ynt: C code help !
Gönderen: justice_for_all - 13 Şubat 2012, 08:31:35
verdigin satırda parantez ici dogru olana kadar bekle diyo yani uarttan veri okuyana kadar bekle diyor.
Başlık: Ynt: C code help !
Gönderen: armsistem - 13 Şubat 2012, 08:48:04
O satırı anladımda aşağıdaki satırlara inceleyebilirmiyiz.
while(1){
    while(!Usart_Oku(&veri,PortNum));// veri true olana kadar bekle
  lcd_gotoxy(2,1);  //lcd satıra git
    lcd_yaz("                ");//boş yaz
  lcd_gotoxy(2,1);//lcd satıra git
    veri_yolla(veri);// işte burasını anlamıyorum  veri değişkenini nereden çekiyor
    while(Usart_Oku(&veri,PortNum)) // ve burası veri değişkeni main satırında unsigned int 8 olrak tanımlı nasıl pointer muamelesi görüyor.
    veri_yolla(veri);
    }
Başlık: Ynt: C code help !
Gönderen: justice_for_all - 13 Şubat 2012, 08:58:10
Usart_Oku(&veri,PortNum) bu fonksiyonda zaten usarttan gelen veriyi veri degişkenine yazıyor.sonra usarttan gelen veriyi tekrar usarttan gonderiyor.

veri pointer mumalesi gormuyor usartoku fonksiyonunda verinin adresini yollanıyor usart oku fonksiyonunda pointer o adrese usarttan gelen veriyi yazıyor olay bu
Başlık: Ynt: C code help !
Gönderen: armsistem - 14 Şubat 2012, 17:15:34
justice_for_all arkadaşım , veri değişkenin başındaki and işareti anlamı nedir.

Usart_Oku(&veri,PortNum));
Başlık: Ynt: C code help !
Gönderen: M_B - 14 Şubat 2012, 17:25:56
Alıntı yapılan: armsistem - 14 Şubat 2012, 17:15:34
justice_for_all arkadaşım , veri değişkenin başındaki and işareti anlamı nedir.

Usart_Oku(&veri,PortNum));

Veri değişkenin adresini gösterir.
Hocam pointer kavramını inceleyin.
Başlık: Ynt: C code help !
Gönderen: elektronikhobi - 14 Şubat 2012, 18:41:56
Alıntı yapılan: armsistem - 14 Şubat 2012, 17:15:34
veri değişkenin başındaki and işareti anlamı nedir.

Usart_Oku(&veri,PortNum));

veri'nin adresi.

uint8_t Usart_Oku(uint8_t *veri,uint8_t PortNum)

işlevine baktığımız zaman bir uint8_t döndürüyor. İlk parametresi bir gösterge. Nasıl bir gösterge?
uint8_t tipindeki bir değişken için gösterge.  Büyük ihtimal bu uint8_t işaretsiz 8 bitlik bir tamsayıdır. Yani 0 - 255 arasında değer alabilir.

Göstergeler değişkenin adresini tutarlar. Bu yüzden gösterge istenen bir yerde direkt olarak değişkenin adresini de gönderebilirim. Aynı şey.

Gene bir dizinin ismi o dizinin adresini tutar.


    char harfler[10];
    char * gosterge = harfler;


Göstergeler de adres gösterdiğine göre bir dizinin ismini bir göstergeye atayabiliriz. O zaman göstergemiz harfler'in ilk elemanını gösteriyor.

Peki neden gösterge kullanmaya ihtiyaç duyarız? Bunun nedeni eğer işlevin değişkenler üzerinde değişiklik yapmasını istiyorsak, işleve göndereceğimiz parametreleri gösterge olarak seçeriz. Örneğin:


#include <stdio.h>

void yerDegistir(int * a, int * b)
{
    int gecici = *a;
    *a = *b;
    *b = gecici;
}


int main()
{
    int a = 4,  b = 1;
    printf("sayilar degismeden önce a : %d b : %d\n", a, b);

    yerDegistir(&a, &b);
    printf("sayilar yerdegistirdikten sonra a : %d b : %d\n", a, b);

}


Şimdi eğer yukarıdaki yerDegistir işlevinde gösterge kullanmasaydık bu a ve b değişkenlerinin değerini değiştiremeyecektik. Programı gösterge kullanmadan deneyiniz ve aradaki farkı görün.
Başlık: Ynt: C code help !
Gönderen: armsistem - 14 Şubat 2012, 21:51:55
teşekkürler yanıtlar için.