Yazılan c programında tek sayılarda doğru sonuç göstermemesi ????

Başlatan yunus_1384, 09 Mayıs 2012, 00:27:30

yunus_1384

Merabalar ben Gaziantep Üniversitesinde Mekatronik  bölümü okuyorum.daha önceden tasarlanıp düzeltilen c yazılımı üzerinde bayagı düzeltildi . suanda ise devremizi çalıştırdığımızda çift sayılarda ve net sayılarda sorun çıkmıyor frekansı tek sayılar üzerine getirdiğimizde  hesapladığımız değer ile lcd çıkan değer bir değil c yazılımında bi sorun var sanırım çünkü tek sayılar hep eksik çıkıyor . proje ödevimizdir acil bi durumdur lütfen yardımcı olabilirmisiniz ?? devreyi herşeyiyle beraber mail atabilirim

muhittin_kaplan

Sanırım Yunus.
Yunus Ortada devre Yok, Kod Yok, Sorununu Anlamadım. Sana Yardım Etmemiz İçin Daha Açıklayıcı olmalısın.

yunus_1384

Bana mail adresi verseniz size gondersem  cunku ben fotum kullanmayi.bilmiyorum  onlari buraya ekliyim

muhittin_kaplan

yazdığın gibi, burayada yazacaksın. Hem Herşeyin Bir ilki var değilmi?

taso

2 sebebi olabilir.

1     printf(lcd_putc"deger=%02.1f",frekans);   gibi bi yazdırma yapıyorsanız  frekans değerinin içindeki değer float olmalı int16 yada int8 ise değeri  tam olarak göremezsiniz kusuratı hesaplamaz

2   yine kullandığınız işlemler sırasında integer değer kullandıysanız ve matematiksel işlemlerde bölme çarpma yaparken yine float kullanmanız gerekir aksı taktirde işlemci gerçel olan sayı değerlerini

sayma sayısı olarak kabul edecektır.

mesela     int16 i;    için     i=1 ile i=1,4 aynı sayıdır.
   

yunus_1384

Dogruyu soyluyorsunuz bende  bunu yapmaya calisicam . Yardimci olursunuz degil mi cunku bitirme projemi c.tesi son teslim tarihi :/

taso


yunus_1384

#include <pic.h>
#include "delay.h"
#include "lcd.h"
#include <stdio.h>

//Konfigurasyon ayarlari
__CONFIG(0XFF21);

// Optik algilayici RA0'a pinine bagli
#define SW RA0

// Global degiskenler
unsigned char kontrol=0;
unsigned char sonuc[]="                ";
unsigned int CX;
float P=2.0;
unsigned int a;

   float devir;
   unsigned int devir2=0,sayac=1;

//---- TIMER kesme alt programi -----------------------------------
static void interrupt
isr(void)
{
   if(T0IF)
   {
      sayac++;
      T0IF=0; // Bayragi temizle
      TMR0=0; // TIMER'i tekrar yukle
   }   
   
   if(TMR1IF)
   {

      if(++CX>=20)      //1 saniye
      {
         devir2=60*sayac*TMR0; // 1 saniyedeki devir sayisi ile 60 carp dakikadaki devir sayisini bul
         TMR0=0;
         sayac=1;
         kontrol=1;
         CX=0;
      }

      TMR1L=0xB0;
      TMR1H=0x3C;
      TMR1IF=0;
   }
   
   

}
//--------- LCD alt programi----------
void LCD_yaz(void)
{
   //lcd_clear(); // LCD'yi temizle
   
   if(devir2<1030)
      RA0=0;
   else
      RA0=1;

   lcd_goto(0x00);
   lcd_puts(" DEVIR SAYISI ");

   if(kontrol)
   {
         lcd_clear(); // LCD'yi temizle
      sprintf(sonuc+3,"%d d/d",devir2);
      lcd_goto(0x40);
      lcd_puts(sonuc);
      kontrol=0;
   }   

}

//----------- ANA PROGRAM ------------
main(void)
{
   TRISA=0x01; // Port A'nin ilk pini giris 
   TRISB=0x00; // PortB'nin hepsi cikis
   CMCON=0x07; // PortA sayisal giris
   PORTA=0; // Baslangic durumu ayarlari
   PORTB=0; 

   // LCD islemleri
   //DelayMs(250);
   lcd_init();
   lcd_clear();
   lcd_write(0x0C); //imleci gizle
   lcd_goto(0x00);
   lcd_puts(" DEVIR SAYISI ");

   T0CS=1; // Dahili clock
   PSA=0; // Prescaler TMR0 icin ayarli
   PS0=0; PS1=0; PS2=0; // Oran 1:8
   T0IF=0; // Bayrak temizle
   TMR1IF=0;
   T0IE=1; // TIMER baslat
   TMR0=0; // 125 sayim (256-131=125)
   TMR1IE=1;
   PEIE=1;
   ei(); // Butun kesmeler etkin

   TMR1L=0xB0;
   TMR1H=0x3C;
   T1CON=1;


   // Devir olcum islemleri
   for(;;)
   {
      
      LCD_yaz(); // LCD alt programina git
      
      
   } // islemleri tekrarla
} // Programin sonu


yunus_1384

ben c yazmayı bilmiyorum aynı zamanda okumayıda bana başka biri yardımcı oldu sağolsun bir çok sorunu halletti fakat suanda devreyi çalıştırdığımda sinya jeneratöründen frekansı tek sayıların üzerine getirdiğimde lcd de çıkan rakamlar yaniş gösteriyor kullandığım formul(   60*p/2    ) p frekans oluyor . AMAÇIM tek fazlı ASM için bir deney seti : .. bu deney setinde tek fazlı ASM nin normalde içinde bulunması gereken merkez kaç anahtarı bulunmamaktadır merkez kaç anahtarı motor nominal devrinin yüzde 75 ine geldiğinde motora bağlı kapasiteyi devre dışı bırakmaktadır . merkez kaç anahtarı olmadığı için bunu pic ile yapmaya çalışıyorum . takometre yerine .. motorun noinal hızı 1364 d/d yüzde 75'i 1034 devir sayısı optik algılayıcı ile ölçecem motorun miline yansıtıcı bağlıyarak optik çiftten ölçecem ... işte ben derme çatma bişiler yapmıştım internetten bulduklarımla sonra sürekli hatalar içersindeydim ve foruma üye oldum yardım aldım bi kullanıcıdan sağolsun çoğu şeyi halletti fakat tek sayılardaki sorunu bi türlü haledemedik YARDIMCI oluranız çok seviirim çünkü bu projenin en son c.tesi teslim edilmesi lazım ve benim yaptığım hiç bişe yok daha optik çifiti balıyorum devreye o bile çalışmıyor =((

taso

simdi biraz cımbızlayalım

1) devir2   sayac     neden int olarak tanımladın ? sanırım o sayı 255 den buyuk :)     int 16 yada int 32 olarak tanımlarsan kolaylık olur en azından devir kacırmazsın

2)       sprintf(sonuc+3,"%d d/d",devir2);         
      lcd_goto(0x40);
      lcd_puts(sonuc); 
 
yerine birde nasıl bir lütüphane kullanıyorsun bilmiyorum ancak lcd_goto  1,1 ile baslar genelde   printf(lcd_putc,"%04ld d/d ",devir2)  kullanmak daha kolay olacaktır.

not: interruptı nasıl çağırdığını anlamadım kusura bakma

justice_for_all

Alıntı yapılan: taso - 11 Mayıs 2012, 10:09:44
simdi biraz cımbızlayalım

1) devir2   sayac     neden int olarak tanımladın ? sanırım o sayı 255 den buyuk :)     int 16 yada int 32 olarak tanımlarsan kolaylık olur en azından devir kacırmazsın

2)       sprintf(sonuc+3,"%d d/d",devir2);         
      lcd_goto(0x40);
      lcd_puts(sonuc); 
 
yerine birde nasıl bir lütüphane kullanıyorsun bilmiyorum ancak lcd_goto  1,1 ile baslar genelde   printf(lcd_putc,"%04ld d/d ",devir2)  kullanmak daha kolay olacaktır.

not: interruptı nasıl çağırdığını anlamadım kusura bakma

sen dili ccs ile karistirdin sanirim ccs degil o hi-tech. hi-tech de unsigned int dedigin zaman 16 bit degisken tanimlamis olursun.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay