Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Timer0, Timer2 && Delay_ms = problems
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=9262
Страница 1 от 1

Автор:  spas92 [ Чет Авг 11, 2011 12:38 pm ]
Заглавие:  Timer0, Timer2 && Delay_ms = problems

Здравейте,
сноши се опитах да си напиша една програмка която трябваше, ползвайки тимер2, да изработва един ШИМ с приблизителна честота от 2KHz но излезе проблем... Идеята ми бе таймера да изработва ШИМ-а а от main-a да променям запълването но нещо не ми се получава идеята ;Д

ето това е кода
Код:
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(internal=4M)

int pwm;
int progress=0;
int delay;

#INT_RTCC
void  RTCC_isr(void)
{
  if(delay>0)delay--;
}

#int_TIMER2
void  TIMER2_isr(void)
{
   if(pwm>progress)output_high(PIN_A6);
   else output_low(PIN_A6);
   if(progress==19)progress=0;
   else progress++;
}

void u_delay(int i)
{
   delay=i;
   do{}while(delay>0);
}

void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_1,24,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_TIMER2);
   
   do{
      pwm=10;
      u_delay(1000);
      pwm=0;
      u_delay(1000);
   }while(1);

}


до колкото разбрах delay_ms() i delay_us() не са свързани с никой таймер, и затова реших да си напиша моя u_delay(), която ползва таймер0

какъв е проблема
тук трябва да изработва(поне такава е идеята) ШИМ с 50% запълване за 1сек. после 1 секунда 0% и толкова но като го пусна на осцилоскопа си седи постоянно 50% О_о

Автор:  kiiid [ Чет Авг 11, 2011 1:06 pm ]
Заглавие:  Re: Timer0, Timer2 && Delay_ms = problems

Очевидно ползваш CCS. Функциите delay_us() и delay_ms() ползват XTAL_FREQ дефиницията за да си изчислят дължината на цикъла. В твоя код тая дефиниция липсва и съответно функцията излиза без да прави нищо. Затова получаваш само изхода от ШИМ-а без прекъсване.
Пробвай да сложиш в началото
#define XTAL_FREQ 4000000
(от кода ти допускам че на толкова ти бачка животното, ако не промени на съответната цифра в херци)
Освен това delay_ms(1000) може да генерира твърде голям цикъл. По-добре го замени с нещо като for (t=0; t<100; t++) delay_ms(10);

Автор:  spas92 [ Чет Авг 11, 2011 6:04 pm ]
Заглавие:  Re: Timer0, Timer2 && Delay_ms = problems

мерси ;) но пак същия резултат
зависва на delay_ms();.... аз затова исках да си напиша функция която да ползва таймер u_delay(), но пак същият ефект ,,,,

Автор:  spas92 [ Чет Авг 11, 2011 7:21 pm ]
Заглавие:  Re: Timer0, Timer2 && Delay_ms = problems

подкарах моята функция като добавих enable_interrupts(INT_RTCC) но изскочи пък сега друго,.... тази моя функция не работи точно ... и то до такава степен че го забелязвам с просто око на осцилоскопа (т.е. много е грешката)

не знам да не би двата таймера да се бъркат един друг :? а как г/д мога да преценя за колко микро сек. се изпълнява даден код? става въпрос за този при таймер2 да не би заради него да се забавя таймер0 :?

п.п.
а до колко може да окаже влияние това, че ползвам вградения RC осцилатор :?

Автор:  bobyper [ Чет Авг 11, 2011 10:19 pm ]
Заглавие:  Re: Timer0, Timer2 && Delay_ms = problems

Това u_delay(1000) не е правилно като във функцията ти променливата е дефинирана като 8 битова
Код:
void u_delay(int i)


За да предадеш числото 1000, трябва да се дефинира като int16

Автор:  ike [ Чет Авг 11, 2011 10:50 pm ]
Заглавие:  Re: Timer0, Timer2 && Delay_ms = problems

В С, int може да е колкото си искаш бита, стига да са повече или равни на 16.

Автор:  spas92 [ Пет Авг 12, 2011 12:37 am ]
Заглавие:  Re: Timer0, Timer2 && Delay_ms = problems

да това го забелязах и го оправих но не е там проблема .......

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/