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
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.
Bana mail adresi verseniz size gondersem cunku ben fotum kullanmayi.bilmiyorum onlari buraya ekliyim
yazdığın gibi, burayada yazacaksın. Hem Herşeyin Bir ilki var değilmi?
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.
Dogruyu soyluyorsunuz bende bunu yapmaya calisicam . Yardimci olursunuz degil mi cunku bitirme projemi c.tesi son teslim tarihi :/
elimden geleni yapmaya çalışırım
#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
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 =((
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
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.