Единствената разлика е в fast IO, .h файла не се генерира автоматично, в него могат да се слагат доста други неща, в случая съм сложил деректива за fast IO, стандартно CCS бута трис регистър като имаш операция с изход, с тази команда не го прави, всъщност аз никъде не изпозлвам команди за работа с IO-то а го бутам директно но ...
Така все пак малко поогледах, не знам по горе как съм го дал,ама бях сложил малък делител на таймер 2 и PWM ти беше на 16 Khz и общо взето не беше много добре с оглед всички сметки които с еправят за софтуерен PWM та от там PWM не беше много равномерен. Добавих и една проверка за фронта така че да не чете всеки път таймер 2 и да го сравнява, което също подобрява линейността на PWM-а, по долу е корекцията
#include "D:\MyDocuments\Isdelia\LED Test\main.h"
#bit red=0x05.0
#bit green=0x05.1
#bit blue=0x05.2
char color;
int8 duty;
int8 state;
int1 direction;
int1 front;
struct state_type {
char color;
int1 red;
int1 green;
int1 blue;
int1 direction;}states[9];
// --------------- Timer 2 interrupt
#int_TIMER2
void TIMER2_isr(void)
{
front=true;
switch(color){ //----------- rising edge
case 'r': red=direction; break;
case 'g': green=direction; break;
case 'b': blue=direction; break;}
}
//---------------- Timer 1 interrupt
#int_TIMER1
void TIMER1_isr(void)
{
set_timer1(20500); // this parameter reflect on duty change speed
if(duty>249) {
duty=10;
if (state<8){
state++;}
else {
state=0;}
color=states[state].color;
red=states[state].red;
green=states[state].green;
blue=states[state].blue;
direction=states[state].direction;}
else{
duty+=5;}
}
// -------------------- main program
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_8);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DIV_BY_16,255,1);
setup_comparator(NC_NC_NC_NC);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
set_tris_a (0);
state=0;
duty=10;
color='r';
direction=1;
//------------------------------------ sate parameters
states[0].red=0, states[0].green=0 , states[0].blue=0 , states[0].direction=1, states[0].color='r';
states[1].red=1, states[1].green=0 , states[1].blue=0 , states[1].direction=1, states[1].color='g';
states[2].red=1, states[2].green=1 , states[2].blue=0 , states[2].direction=1, states[2].color='b';
states[3].red=1, states[3].green=1 , states[3].blue=1 , states[3].direction=0, states[3].color='r';
states[4].red=0, states[4].green=1 , states[4].blue=1 , states[4].direction=0, states[4].color='g';
states[5].red=0, states[5].green=0 , states[5].blue=1 , states[5].direction=0, states[5].color='b';
states[6].red=1, states[6].green=0 , states[6].blue=0 , states[6].direction=1, states[6].color='r';
states[7].red=1, states[7].green=0 , states[7].blue=0 , states[7].direction=1, states[7].color='r';
states[8].red=1, states[8].green=0 , states[8].blue=0 , states[8].direction=1, states[8].color='r';
//------------------------- main loop
while(1){
restart_wdt();
if(front && get_timer2()>duty){ // falling edge when achive needing duty
front=false;
switch(color){
case 'r': red=!direction; break;
case 'g': green=!direction; break;
case 'b': blue=!direction; break;}
}
}
}
давам я цялата за да не стане грешка, и картинка от протеуса, определено си личи по плавния ШИМ и то при по малка константа на филтъра.