12F675 CCS YARDIM

Başlatan bulut_01, 14 Mart 2012, 17:55:00

bulut_01

Arkadaslar ccs yeni başladım pbp ugrasdım 1 seneye yakın ccs kücük bi deneme code yazdıgımda proteusda similasyon yapdıgımda

''indirect write off 0x00 to address 0x0080 is itself an indirect write'' hatasını alıyorum devre calısıyo neden bu hata verebilir ?. Bide 0 dan baslayıp 100 duty kadar çıkan pwm sinyali için kod yazdım oda calısmadı nerede eksikliğim var yardımcı olursanız sevinirim oda asagıdakı code da.

#include <12F675.h>
#use delay(clock=4000000)
#fuses INTRC_IO,NOWDT,NOCPD,NOPROTECT,NOMCLR,NOPUT

void main()
{
set_tris_a(0x00);
setup_adc_ports( NO_ANALOGS );
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

output_low(0x00) ;
basla:
output_high(pin_a0) ;
delay_ms(500) ;
output_low(pin_a0) ;
delay_ms(500) ;
goto basla;

}


#include <12F675.h>
#use delay(clock=4000000)
#fuses INTRC_IO,NOWDT,NOCPD,NOPROTECT,NOMCLR,NOPUT
int alcak ;
int i ;
int16 carpan ;

void main()
{
set_tris_a(0x00);
setup_adc_ports( NO_ANALOGS );
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
output_low(0x00) ;

for i=1 to 99 ;
output_high(pin_a1) ;
delay_us i*carpan ;
output_low(pin_a1) ;
delay_us alcak*carpan ;
alcak=100-i ;
output_high(pin_a1) ;
}
YENİLMEZ..

bulut_01

yok mu ? kimse yardım edecek.
YENİLMEZ..

skara1214

delay_us() şeklinde kullanılıyor .fuseslar delay clocktan önce gelmeli ve sadece fuses nowdt ve inrc_io kullanman deneme amacı için yeterli.ayrıca çarpım yaparken 12 f serisinden çok birşey bekleme int16 ile int i çarpmak yerine int ile int i çarpıp dene bence.
Herkes ölür ama herkes gerçekten yaşamaz

bulut_01

code şu şekilde düzeltım ama ccs derleme yapdıgım hata veriyor derlemiyor .

#include <12F675.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR 
#use delay(clock=4000000);

int alcak ;
int i ;
int carpan ;

void main()
{
set_tris_a(0x00);
setup_adc_ports( NO_ANALOGS );
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
output_low(0x00) ;

basla:
for i=1 to 99 ;
output_high(pin_a1) ;
delay_us i*carpan ;
output_low(pin_a1) ;
delay_us alcak*carpan ;
alcak=100-i ;
output_high(pin_a1) ;
goto basla ;
}
YENİLMEZ..

cemilkendir

for i=1 to 99 ; bu satır şöyle olmalı for(i=0;i<99;i++){/*bu arayada 99 kere yapılmasını istediğin şeyi yazacaksın*/     }
output_low(0x00) ;   bu satırda ne yapmak istediğini anlamadım ama parantez içerisine bir pin adı yazman lazım eğer a portunu komple sıfır yapmak istersen output_a(0x00); yazman lazım

delay_us(10); 10us bekleme yapar

yani bence  sen cca c ile ilgili bir kitap al yada netten yayınlanan dersleri takip et yazım şekli olarak pbp ,le c baya farklıdır



bulut_01

o zaman söyle söyleyeyim pbp yazdıgım şu algoritmayı ccs nasıl yazarım

pbp code bu;
alcak var byte
I var byte
carpan var word

pause 50
alcak=100
carpan=400

BASLA: 
for I=1 to 99 
GPIO.0=1 
PAUSEus I*CARPAN 
GPIO.0=0 
PAUSEus ALCAK*CARPAN 
ALCAK=(100-I) 
NEXT 
GPIO.0=1 
end


bu code işlevini yapacak ccs algoritma nasıl olmalıdır ?
YENİLMEZ..

Murat Mert

S.A.


#include <12F675.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOBROWNOUT               //No brownout reset

#use delay(int=4000000)

int alcak ;
int i ;
int carpan ;

void main()
{

setup_adc_ports( NO_ANALOGS );
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
output_low(0x00) ;

while(true)
{
for(i=0; i<99; i++)
{
output_high(pin_a1) ;
delay_us(i*carpan) ;
output_low(pin_a1) ;
delay_us(alcak*carpan) ;
alcak=100-i ;
output_high(pin_a1) ;
}

}
}
mert07

bulut_01

Alıntı yapılan: mert07 - 15 Mart 2012, 09:32:11
S.A.


#include <12F675.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOBROWNOUT               //No brownout reset

#use delay(int=4000000)

int alcak ;
int i ;
int carpan ;

void main()
{

setup_adc_ports( NO_ANALOGS );
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
output_low(0x00) ;

while(true)
{
for(i=0; i<99; i++)
{
output_high(pin_a1) ;
delay_us(i*carpan) ;
output_low(pin_a1) ;
delay_us(alcak*carpan) ;
alcak=100-i ;
output_high(pin_a1) ;
}

}
}



öncelikle tsk ederım mert yanlız senın yazdıgın kodu derledım yanlız pwm sinyalını sabit alıyorum yan 0 dan baslayıp duty oranı 100 olacak sekılde calısan bu code pbp ccs de sabıt pwm sınyalı olarak calısıyo duty cycle oranı %50 sabıt sınyal alıyorum 0 dan 100 cıkmasını ıstedıgım pwm bu kodda da calısmadı :(

#include <12F675.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOBROWNOUT               //No brownout reset
#fuses nomclr
#use delay(int=4000000)

int alcak ;
int i ;
int carpan ;

void main()
{

setup_adc_ports( NO_ANALOGS );
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
output_low(0x00) ;

while(true)
{
for(i=0; i<99; i++)
{
output_high(pin_a1) ;
delay_ms(i*carpan) ;
output_low(pin_a1) ;
delay_ms(alcak*carpan) ;
alcak=100-i ;
output_high(pin_a1) ;
}

}
}
YENİLMEZ..

skara1214

birincisi device adc=16 yanlış onun üstünde 10 bitlik adc var yani device adc=10 olacak ayrıca zaten kullanmamıssınız adc yi o satıra hiç gerek yok bir başka konuda carpan isminde bir değişken var o değişken başlangıçta sadece tanımlanmış , birşey atanmamıs ve hiç değişmiyor kullanım amacı nedir?  ayrıca output_low(0x00) diye bir satır var buda yanlış  yani eğer dutyc cycle değişimi görmek istiyorsanıs ilk delay_ms(i)
ikinsi delay ms(100-i) yapın ve deneyin.
Herkes ölür ama herkes gerçekten yaşamaz

GreeN

Sanki SPWM (sinusoidal PWM)oluşturmaya çalışmış , öyleyse yanlış olmuş .
Terörü Lanetliyoruz.

bulut_01

evt arkadaslar kodlar uzerınde ufak değişiklerle code calıstırdım burdan bütün emeği gecen ve yardımcı olan arkadaslara cok cok tsk ederım askerden yenı geldıgım ıcın cogu seylerı unutmusum bıraz kendım bırazda sızın yardımlarınızla eskı halıme gelırım umarım saolun calısan kod bu;

#include <12F675.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOBROWNOUT               //No brownout reset
#fuses NOMCLR
#use delay(int=4000000)

int alcak= 100 ;
int16 i ;
int carpan= 400 ;

void main()
{
setup_adc_ports( NO_ANALOGS );
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
output_A(0x00) ;

while(i<1000)
{
for(i=0; i<1000; i++)
{

output_high(pin_a1) ;
delay_us(i) ;
output_low(pin_a1) ;
delay_us(1000-i) ;
output_high(pin_a1) ;
}
}
}
YENİLMEZ..

darkingofthelord

#11



arkadaşlar ben bu programı pıc16f877a ya yükledim devremde 5 adet cny70 sensörüm var herşey tamam programı derledim çalıştı devrede çalışıyor ama problem şu çizgi izleyen robotumdaki sensörler çizgiyi algıladıgında PİC çıkışları hiç bir işlev yapmıyor konuyla ilgili yardımcı olacak herkese şimdiden teşekkürler



#include <16F877A.h>
#device adc=10
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)

//#use delay(clock=20000000)   ' gecikme fonksiyonu için kullanılan osilatör frekansı

#use fast_io(a)
#use fast_io(c)
unsigned int8 sensorler=0,solpwm=0,sagpwm=0;

void main()
{
   setup_timer_2(T2_DIV_BY_1,249,1); //50.0 us overflow, 50.0 us interrupt  ' timer2 ayarı yapılıyor periyot degeri=1249
   setup_ccp1(CCP_PWM); // ccp1 ucu pwm çıkışı olarak ayarlandı pwm modunuaç
   setup_ccp2(CCP_PWM); // ccp2 ucu pwm çıkışı olarak ayarlandı

   set_tris_a(0xFF); // a portunu giriş olarak ayarla
   set_tris_c(0xF0);



while(true) //sonsuz döngü
   {
      if(input(pin_a0)==0 & input(pin_a1)==1 & input(pin_a2)==1 & input(pin_a3)==1 & input(pin_a5)==1)
      {
         output_c(0x0a); // Sağ geri sol ileri

      }
      if(input(pin_a1)==0 & input(pin_a0)==1 & input(pin_a2)==1 & input(pin_a3)==1 & input(pin_a5)==1)
      {
         output_c(0x02); // Sağ duruyor sol ileri
      }
      if(input(pin_a2)==0 & input(pin_a0)==1 & input(pin_a1)==1 & input(pin_a3)==1 & input(pin_a5)==1)
      {
         output_c(0x06); // Sağ ileri sol ileri
      }
      if(input(pin_a3)==0 & input(pin_a0)==1 & input(pin_a1)==1 & input(pin_a2)==1 & input(pin_a5)==1)
      {
         output_c(0x04); // Sağ ileri sol duruyor
      }
      if(input(pin_a5)==0 & input(pin_a0)==1 & input(pin_a1)==1 & input(pin_a2)==1 & input(pin_a3)==1)
      {
         output_c(0x05); // Sağ ileri sol geri
      }



       sensorler = input_a(); // A porundaki tüm pinleri oku
       sensorler = sensorler * 0b00101111; // Sensörden gelen değerleri maskeleyerek al

       // birinci ifade beyaz zemin üzeri siyah çizgi için
       // ikinci ifade siyah zemin üzerine beyaz çizgi için
       //Düz git
       if(sensorler==0b00101011 || sensorler==0b00000100)
       {
           solpwm=990;
           sagpwm=990;
       }
       //sola dön vites1
       if(sensorler==0b00101001 || sensorler==0b00000110)
       {
           solpwm=700;
           sagpwm=990;
       }
       //saga dön vites1
       if(sensorler==0b00100011 || sensorler==0b00001100)
       {
           solpwm=990;
           sagpwm=700;
       }
       //sola dön vites2
       if(sensorler==0b00101101 || sensorler==0b00000010)
       {
           solpwm=500;
           sagpwm=990;
       }
       //saga dön vites2
       if(sensorler==0b00100111 || sensorler==0b00001000)
       {
           solpwm=990;
           sagpwm=500;
       }
       //sola dön vites3
       if(sensorler==0b00101100 || sensorler==0b00000011)
       {
           solpwm=300;
           sagpwm=990;
       }
       //saga dön vites3
       if(sensorler==0b00000111 || sensorler==0b00101000)
       {
           solpwm=990;
           sagpwm=300;
       }
       //sola dön vites4
       if(sensorler==0b00001111 || sensorler==0b00100000)
       {
           solpwm=0;
           sagpwm=990;
       }
       //saga dön vites4
       if(sensorler==0b00101110 || sensorler==0b00010001)
       {
           solpwm=990;
           sagpwm=0;
       }
       set_pwm1_duty(solpwm);
       set_pwm2_duty(sagpwm);

    }
}