Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

ana programda sorun

Başlatan OptimusPrime, 03 Haziran 2009, 08:34:08

OptimusPrime

#include "main.h"

#define StepForOneRevolution  400         //Step for one revolution x2
#define Forward               1
#define Backward              0
#define EngineRpmOffset       500


unsigned int16 uiEngineRpm;
unsigned int16 uiRevolution=(unsigned int16)(1+StepForOneRevolution);
unsigned int8  bDirection=Forward;
unsigned int8  bStepperIsActive=False;


#int_TIMER2
void  TIMER2_isr(void) 
{

if(bDirection==Forward) output_low(PIN_A3);
   else output_high(PIN_A3);
   
if(uiRevolution<=(unsigned int16)(StepForOneRevolution)) { output_toggle(PIN_A2); uiRevolution++; bStepperIsActive=TRUE; }
   else bStepperIsActive=FALSE;
   
//output_d(uiRevolution);

enable_interrupts(INT_TIMER2);
return;
}

#int_EXT
void  EXT_isr(void) 
{
//external interrupt on rising edge
if(bStepperIsActive==FALSE) {
                              bDirection=Forward;
                              uiRevolution=(unsigned int16)(1); }
enable_interrupts(INT_EXT);
return;
}

#int_EXT1
void  EXT1_isr(void) 
{
//external interrupt on rising edge
if(bStepperIsActive==FALSE) {
                              bDirection=Backward;
                              uiRevolution=(unsigned int16)(1); }
enable_interrupts(INT_EXT1);
return;
}

#int_EXT2
void  EXT2_isr(void) 
{
//external interrupt on rising edge
//output_d(0x04);
//output_d((uiEngineRpm>>2));  //burası çalışıyor
enable_interrupts(INT_EXT2);
return;
}

#int_AD
void  AD_isr(void) 
{
unsigned int16 uiADC;
uiADC=read_adc(ADC_READ_ONLY); 
uiEngineRpm=(unsigned int16)(EngineRpmOffset)+uiADC;
//output_d((uiADC>>2));
read_adc(ADC_START_ONLY);
return;
}


void main(void)
{

   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_OFF);
   setup_timer_1(T1_DISABLED);
   output_low(PIN_A2);
   setup_timer_2(T2_DIV_BY_16,200,1); //setup_timer_2(T2_DIV_BY_16,4,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   enable_interrupts(INT_TIMER2);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_EXT1);
   enable_interrupts(INT_EXT2);
   enable_interrupts(INT_AD);
   enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!
  
   read_adc(ADC_START_ONLY);  //Start A/D conversion 

   while(1) output_d((uiEngineRpm>>2));

}


program yukarıdaki gibi.

ana program, while(1) sonsuz döngüsü içerisinde yer alan output_d((uiEngineRpm>>2)) fonksiyonu hiçbir zaman işlevini yerine getirmiyor fakat aynı fonsiyonu EXT_2 gibi bir interrupt içerisinde çağırdığımda ise sorunsuz çalışıyor.

daha sonra deneme amaçlı olarak, main de alt alta output_d(1) ve ardından output_d(2) yazdım fakat sadece output_d(1) fonksiyonunu gerçekleştirdi gerisini yapmadı. acaba output_d fonksiyonu main içerisinde sorun mu çıkarıyor düşüncesiyle main içersinde global değişkenlerden birinin içeriği ile oynadım ama yine sorun çıkardı.
kısacası main programda son tanımlama olan read_adc(ADC_START_ONLY);  //Start A/D conversion, dan sonra ne yazarsam yazayım çalışmıyor.
nedenini anlamadım?
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

MURSEL

selam  ana fonksiyonda kanal secimi yapmayı unutmusun  yada ben göremiyorum :)


set_adc_channel(0); //an0


kolay gelsin

OptimusPrime

ilk defa CCS kullanıyorum, kodları wizard hazırladı. dediğinizi ekledim fakat yine çalışmıyor. :cry:
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

MURSEL

main.h  de görebilirsem

OptimusPrime

tabi main.h da şöyle

#include <18F452.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOCPD                    //No EE protection
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads

#use delay(clock=20000000)


bir şey keşfettim. ana program da
read_adc(ADC_START_ONLY);
deyip adc yi başlattığım anda sorun çıkıyor. ve adc interruptından çıkarken yeniden enable tmek için enable_interrupts(INT_AD); bunu kullandığımda program adc interruptına bir daha girmiyor.
çıldıracam.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

gallavi

adc interrupt'a clear_interrupt(INT_AD); eklemenin faydası olabilir.Ben genelde adc içinde timer interrupt kullanıyorum.Sample alma aralıkları eşit olması için
DemirHan=gallavi;

OptimusPrime

enable AD interrupt da sonuç vermedi. compiler ın bug ına denk geldim sanırım. dediğiniz gibi AD sonucunu başka bir interrup içerisinde alsam iyi olacak.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

OptimusPrime

gallavi
interrupt içerisinde ADC kullnımına bir örnek verebilir misiniz. mümkünse çalışan olsun :lol:
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

gallavi

Çalışan kodlarımın içinde daha önce verdiğim örneklerden çok da farklı birşey yok bazı cihaza özel kodlar var onlarda kafanızı karıştırmakdan başka birşeye yaramaz benim yaptığım örneğin adc_tara tarzında bi fonksyon yazıp aşşağıdaki gibi
void adc_tara()
{
adc=READ_ADC(ADC_READ_ONLY);

if(ch==0){akim1=adc;set_adc_channel(1);}
if(ch==1){akim2=adc;set_adc_channel(2);}
if(ch==2){akim3=adc;set_adc_channel(3);}
if(ch==3){gerilim1=adc;set_adc_channel(4);}
if(ch==4){gerilim2=adc;set_adc_channel(5);}
if(ch==5){gerilim3=adc;set_adc_channel(0);}
ch++;if(ch>5){ch=0;}
READ_ADC(ADC_START_ONLY);
}
bu fonksyonu timer interrupt da çağırmak
sizin external interruptlarınız açık eğer o pinlere birşeyler bağlı değilse işlemci sürekli interrupt yiyecektir çalışmaması normal bunu bi kontrol edin bence
DemirHan=gallavi;

MURSEL

ad kesmesine ihtiyacın varmı ?
kücük bir örnek
#include <18f452.h>
#device ADC=10
#use delay(clock=4000000)
#FUSES XT,NOWDT
#include <lcd.c>

long x,m,n,k,sicaklik,nem;
main()
{

setup_adc_ports(AN0);
setup_adc(adc_clock_div_8);
set_adc_channel(0);
delay_ms(20);
lcd_init();
delay_ms(200);

while(1)
{
n=read_adc();
printf(lcd_putc,"\fadc=%lu",n);
delay_ms(1000);
}
}

OptimusPrime

gallavi
ext int pinleri floating değil onları toprağa çektim.
ad çevirimini dediğiniz gibi timer interruptının içinde tanımladım şuan herhangi bir sorunum yok fakat neden ad interruptını bağımsız çalıştıramıyorum anlamadım.

MURSEL
evet ad kesmesi lazım onun çevirimini bekleyemem.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

ahmet2004

#include "main.h" 

#define StepForOneRevolution  400         //Step for one revolution x2 
#define Forward               1 
#define Backward              0 
#define EngineRpmOffset       500 

#use fast_io(a) 
#use fast_io(b) 
#use fast_io(c) 
#use fast_io(d) 
#use fast_io(e)

unsigned int16 uiEngineRpm; 
unsigned int16 uiRevolution=(unsigned int16)(1+StepForOneRevolution); 
unsigned int8  bDirection=Forward; 
unsigned int8  bStepperIsActive=False; 


#int_TIMER2 
void  TIMER2_isr(void) 
{ 

if(bDirection==Forward) output_low(PIN_A3); 
   else output_high(PIN_A3); 
    
if(uiRevolution<=(unsigned int16)(StepForOneRevolution)) { output_toggle(PIN_A2); uiRevolution++; bStepperIsActive=TRUE; } 
   else bStepperIsActive=FALSE; 
    
//output_d(uiRevolution); 

enable_interrupts(INT_TIMER2); 
return; 
} 

#int_EXT 
void  EXT_isr(void) 
{ 
//external interrupt on rising edge 
if(bStepperIsActive==FALSE) { 
                              bDirection=Forward; 
                              uiRevolution=(unsigned int16)(1); } 
enable_interrupts(INT_EXT); 
return; 
} 

#int_EXT1 
void  EXT1_isr(void) 
{ 
//external interrupt on rising edge 
if(bStepperIsActive==FALSE) { 
                              bDirection=Backward; 
                              uiRevolution=(unsigned int16)(1); } 
enable_interrupts(INT_EXT1); 
return; 
} 

#int_EXT2 
void  EXT2_isr(void) 
{ 
//external interrupt on rising edge 
//output_d(0x04); 
//output_d((uiEngineRpm>>2));  //burasi çalisiyor 
enable_interrupts(INT_EXT2); 
return; 
} 

#int_AD 
void  AD_isr(void) 
{ 
unsigned int16 uiADC; 
uiADC=read_adc(ADC_READ_ONLY); 
uiEngineRpm=(unsigned int16)(EngineRpmOffset)+uiADC; 
//output_d((uiADC>>2)); 
read_adc(ADC_START_ONLY); 
return; 
} 

void main(void) 
{
   setup_adc_ports(AN0); 
   setup_adc(ADC_CLOCK_DIV_32); 
   setup_psp(PSP_DISABLED); 
   setup_spi(SPI_SS_DISABLED); 
   setup_wdt(WDT_OFF); 
   setup_timer_0(RTCC_OFF); 
   setup_timer_1(T1_DISABLED); 
   output_low(PIN_A2); 
   setup_timer_2(T2_DIV_BY_16,200,1); //setup_timer_2(T2_DIV_BY_16,4,1); 
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1); 
   enable_interrupts(INT_TIMER2); 
   enable_interrupts(INT_EXT); 
   enable_interrupts(INT_EXT1); 
   enable_interrupts(INT_EXT2); 
   enable_interrupts(INT_AD); 
   enable_interrupts(GLOBAL);
  
   set_tris_a(0b11111111); 
   set_tris_b(0b00000000); 
   set_tris_c(0b10000000); 
   set_tris_d(0b00000000); 
   set_tris_e(0b00000000);

   output_b(0x00);
   output_c(0x00);
   output_d(0x00);
   output_e(0x00);

   read_adc(ADC_START_ONLY); 

   while(1) output_d((uiEngineRpm>>2));
}

OptimusPrime

ahmet2004
bu şekilde de çalışmıyor.  :(
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

ahmet2004

Unuttuğumuz nokta ADC saat bölme oran değeri

40Mhz çalışmada ADC_CLOCK_DIV_64  olacak.(PDF)

setup_adc(ADC_CLOCK_DIV_64);

OptimusPrime

20MHz xtal ile çalışıyorum. tek istediğim adc kesmesi.  :lol:
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||