serial haberleşmede sıkıntılarım var

bunda haklısınız bunu kodu sadece rs 232 ıle calısabılırlıgını kontrol etmek ıcın yaptım bunu duzgun yapabılseydım esas kodum burada bunu denıcektım :
Kod:
#device PIC18F4680
#include <18f4680.h>
#fuses xt,nowdt,noprotect, nobrownout, nolvp, noput, nowrt, nocpd
#use delay (clock=4000000)
#use fast_io(b)
unsigned int16 sayac = 0, hedef_ileri = 0, hedef_geri=0, yon=1;
#int_timer1
void timer1_interrupts()
{

set_timer1(64923);

sayac++;
if(sayac==hedef_ileri)
{
yon=2;
output_low(pin_c1);// motor geri gidiyor
}
if(sayac<3200 || sayac>4000)
{
output_high(pin_c2);
delay_us(20);
output_low(pin_c2);
}
if(sayac==hedef_geri)
{
sayac=0;
yon=1;
output_high(pin_c1);// motor yönü belirlendi
//disable_interrupts(int_timer1);// motor calısıyor fakat pulse uretmıyor
}
}

void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);      //262 ms overflow      //65,5 ms overflow
setup_timer_2 (T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
set_tris_b(0x00);
output_b(0x00);
set_tris_c(0x00);
output_c(0x00);

enable_interrupts(INT_timer1);
enable_interrupts(GLOBAL);
output_high(pin_c3);// motor aktif
delay_ms(100);
output_high(pin_c1);// motor yönü belirlendi
yon=1;//ileri yon
delay_us(50);
hedef_ileri=3200;//400*8
hedef_geri=6400;
sayac=0;
set_timer1(64923);












   while(TRUE)
   {
      //TODO: User Code
   }

}
timer ile bu sekılde saydırdım . şimdi dedıgınız seyı yarın ıste deneyecegım hocam. ccs i tekrardan kuracagım bırde oyle bakacagım. bır sıkıntı var ama cozecem ınsallah.
 
pwm duty' yi set edip puls üretiyorsun tamam da portu high-low yapmaktan farklı değil ki uygulaman.
Döngü içindeki kodların kaç clock sürdüğü ile pwm frekansını, daha doğrusu peryodunu ne kadar senkron edebilirsin. Ne kadar sağlıklı olur. Şu an çalışşada 3 satır daha kod eklediğinde sorun çıkarır.
Olması gereken timer kesmesi içinde sayac' ı kontrol etmen. Normalde şart değil, main bloğu içinde döngü de olur, ama puls ları pwm ile üretiyorsan senkronizasyon için gerekli.

Ayrıca direkt çalışıyor diyordun ya. i değişkenine ön değer atamadığından oluyor sanırım.
int i = 0; şeklinde tanımlayıp bir dene.
denedim bu seferi i=0 oldugu ıcın pwm calısmıyor .
Kod:
#device PIC18F4680
#include <18f4680.h>
#fuses xt,nowdt,noprotect, nobrownout, nolvp, noput, nowrt, nocpd
#use delay (clock=4000000)
#include <stdio.h>
unsigned int16 sayac = 0, hedef = 0;

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,stream=deneme)
char islem;
void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
 setup_timer_2(T2_DIV_BY_16,155,1);      //16,0 us overflow, 16,0 us interrupt

 setup_ccp1(CCP_PWM);
  
set_tris_c(0x00);
output_c(0x00);
set_tris_b(0x00);
output_b(0x00);
while(1)
{

hedef=20; //400*8
sayac=0;
output_high(pin_b0);
 delay_ms(3000);
 output_low(pin_b0);
 delay_ms(1000);

printf("\n\rYapmak istediginiz islemi seciniz>");
 islem=getch();
   putc(islem);
if(islem=='r' || islem=='R')
{
do
{

output_high(pin_c3);// motor aktif
delay_ms(100);
output_high(pin_c1);// motor yönü belirlendi
delay_us(50);
sayac++;
set_pwm1_duty((int16)1);
}while(sayac<=hedef);


hedef=20; //400*8
sayac=0;
do
{


output_high(pin_c3);// motor aktif
delay_ms(100);
output_low(pin_c1);// motor yönü belirlendi
delay_us(50);
sayac++;
set_pwm1_duty((int16)1);
}while(sayac<=hedef);


set_pwm1_duty((int16)0);
}

} 
}
mesela burda direk calısıyo pwm ama while a giriyor lambayı bır kere acıp kapatıyo , yön ve motor enable pinle hıc aktıf olmuyor, zaten atadıgım r tusu da calısmıyor.
 

Forum istatistikleri

Konular
129,806
Mesajlar
930,280
Kullanıcılar
452,608
Son üye
murat620

Yeni konular

Geri
Üst