wesulkrk
Üye
- Katılım
- 16 May 2012
- Mesajlar
- 127
- Puanları
- 1
arkadaşlar aşağıdaki kodu proteusta denerken cpu load hatası alıyorum ve 18f5650 ile denedim yine aynı
sorun yazılımda ama çözemedim. 0,1,3 nolu analog girişlerden sinyal alıyorum bunları karşılaştırma islemine tabi tutup pwm e dönüstürüp ekranada yazıyorum proteusda denerken pwm sinyalinde donmalar oluyor cpu %60-80 oluyor.proteus dosyasını yüklemek istedim ama siteye yükleyemedim.
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#device ADC=10 //10 bitlik ADC kullanılacağı belirtiliyor.
#include <lcd.c>//lcd kütüphanesi çağırıldı
#define use_portd_lcd TRUE // LCD d portuna bağlı
#define frq 100
int16 sen1,sen2,sen3;
float volt1,volt2,volt3,volt4,pwm;
//-------------------------------ekran fonksiyonu-------------------------------
void ekran (float a, float b, float c, float d)
{
lcd_gotoxy(1,1);//1. satır 1. sutuna git
printf(lcd_putc,"s1=%1.2f s2=%1.2f",a,b);
lcd_gotoxy(1,2);
printf(lcd_putc,"s3=%1.2f pwm=%3.1f",c,d);
}
//-------------------------------pwm fonksiyonu-------------------------------
float pwmvalue(float i)
{
int sonuc=0;
sonuc=(i*frq)/5;
return sonuc;
}
//-------------------------------karsılastırma fonksiyonu-------------------------------
float karsilastir(float x,float y,float z)
{
float sonuc=0;
sonuc=(x+y+z)/3;
return sonuc;
}
//-------------------------------ana fonksiyon-------------------------------
void main()
{
lcd_init();// lcd'i hazırla
setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_div_32);
//setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //65,5 ms overflow
setup_timer_2(T2_DIV_BY_16,frq,1); //4,0 ms overflow, 4,0 ms interrupt
//setup_adc_ports(an0_an1_an2_an3_an4); // yazılan AN girişleri analog
setup_adc(adc_clock_div_32); // ADC clock frekansı fosc/32
setup_ccp1(CCP_PWM);//ccp1 modülü pwm e atandı
set_tris_a(255);
set_tris_d(0x00);
set_tris_c(255);
set_tris_b(0x00);
output_a(0x00);
output_b(0x00);
output_c(0x00);
output_d(0x00);
while(TRUE)
{
set_adc_channel(0);//an0 girisini oku
delay_us(100);//adc okuması için 20 mikro saniye zaman ver
sen1=read_adc();//an0 adc degerini alıyoruz
volt1=0.0048828125*sen1;
set_adc_channel(1);//an1 girisini oku
delay_us(100);//adc okuması için 20 mikro saniye zaman ver
sen2=read_adc();//an1 adc degerini alıyoruz
volt2=0.0048828125*sen2;
set_adc_channel(3);//an2 girisini oku
delay_us(100);//adc okuması için 20 mikro saniye zaman ver
sen3=read_adc();//an2 adc degerini alıyoruz
volt3=0.0048828125*sen3;
pwm=karsilastir(volt1,volt2,volt3);//fonksiyonda degerler karsılastırılıp pwm e deger dönuyor
volt4=pwmvalue(pwm);
set_pwm1_duty(volt4);//pwm çıkışı değişkene göre frekans değeri alar.
ekran (volt1,volt2,volt3,volt4);//ekran fonksiyonuna değer yolla
}
}
sorun yazılımda ama çözemedim. 0,1,3 nolu analog girişlerden sinyal alıyorum bunları karşılaştırma islemine tabi tutup pwm e dönüstürüp ekranada yazıyorum proteusda denerken pwm sinyalinde donmalar oluyor cpu %60-80 oluyor.proteus dosyasını yüklemek istedim ama siteye yükleyemedim.
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#device ADC=10 //10 bitlik ADC kullanılacağı belirtiliyor.
#include <lcd.c>//lcd kütüphanesi çağırıldı
#define use_portd_lcd TRUE // LCD d portuna bağlı
#define frq 100
int16 sen1,sen2,sen3;
float volt1,volt2,volt3,volt4,pwm;
//-------------------------------ekran fonksiyonu-------------------------------
void ekran (float a, float b, float c, float d)
{
lcd_gotoxy(1,1);//1. satır 1. sutuna git
printf(lcd_putc,"s1=%1.2f s2=%1.2f",a,b);
lcd_gotoxy(1,2);
printf(lcd_putc,"s3=%1.2f pwm=%3.1f",c,d);
}
//-------------------------------pwm fonksiyonu-------------------------------
float pwmvalue(float i)
{
int sonuc=0;
sonuc=(i*frq)/5;
return sonuc;
}
//-------------------------------karsılastırma fonksiyonu-------------------------------
float karsilastir(float x,float y,float z)
{
float sonuc=0;
sonuc=(x+y+z)/3;
return sonuc;
}
//-------------------------------ana fonksiyon-------------------------------
void main()
{
lcd_init();// lcd'i hazırla
setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_div_32);
//setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //65,5 ms overflow
setup_timer_2(T2_DIV_BY_16,frq,1); //4,0 ms overflow, 4,0 ms interrupt
//setup_adc_ports(an0_an1_an2_an3_an4); // yazılan AN girişleri analog
setup_adc(adc_clock_div_32); // ADC clock frekansı fosc/32
setup_ccp1(CCP_PWM);//ccp1 modülü pwm e atandı
set_tris_a(255);
set_tris_d(0x00);
set_tris_c(255);
set_tris_b(0x00);
output_a(0x00);
output_b(0x00);
output_c(0x00);
output_d(0x00);
while(TRUE)
{
set_adc_channel(0);//an0 girisini oku
delay_us(100);//adc okuması için 20 mikro saniye zaman ver
sen1=read_adc();//an0 adc degerini alıyoruz
volt1=0.0048828125*sen1;
set_adc_channel(1);//an1 girisini oku
delay_us(100);//adc okuması için 20 mikro saniye zaman ver
sen2=read_adc();//an1 adc degerini alıyoruz
volt2=0.0048828125*sen2;
set_adc_channel(3);//an2 girisini oku
delay_us(100);//adc okuması için 20 mikro saniye zaman ver
sen3=read_adc();//an2 adc degerini alıyoruz
volt3=0.0048828125*sen3;
pwm=karsilastir(volt1,volt2,volt3);//fonksiyonda degerler karsılastırılıp pwm e deger dönuyor
volt4=pwmvalue(pwm);
set_pwm1_duty(volt4);//pwm çıkışı değişkene göre frekans değeri alar.
ekran (volt1,volt2,volt3,volt4);//ekran fonksiyonuna değer yolla
}
}