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) ;
}
yok mu ? kimse yardım edecek.
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.
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 ;
}
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
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 ?
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) ;
}
}
}
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) ;
}
}
}
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.
Sanki SPWM (sinusoidal PWM)oluşturmaya çalışmış , öyleyse yanlış olmuş .
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) ;
}
}
}
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);
}
}
(http://s7.postimg.cc/ia4l2j7uf/S_S_DEVREM.jpg) (http://postimg.cc/image/ia4l2j7uf/)
(//)