Отговори на тема  [ 7 мнения ] 
Timer0, Timer2 && Delay_ms = problems 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 08, 2008 11:37 pm
Мнения: 59
Мнение 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% О_о


Чет Авг 11, 2011 12:38 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Сеп 24, 2005 2:00 pm
Мнения: 787
Мнение 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);


Чет Авг 11, 2011 1:06 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 08, 2008 11:37 pm
Мнения: 59
Мнение Re: Timer0, Timer2 && Delay_ms = problems
мерси ;) но пак същия резултат
зависва на delay_ms();.... аз затова исках да си напиша функция която да ползва таймер u_delay(), но пак същият ефект ,,,,


Чет Авг 11, 2011 6:04 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 08, 2008 11:37 pm
Мнения: 59
Мнение Re: Timer0, Timer2 && Delay_ms = problems
подкарах моята функция като добавих enable_interrupts(INT_RTCC) но изскочи пък сега друго,.... тази моя функция не работи точно ... и то до такава степен че го забелязвам с просто око на осцилоскопа (т.е. много е грешката)

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

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


Чет Авг 11, 2011 7:21 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Яну 31, 2006 11:11 pm
Мнения: 295
Местоположение: София
Мнение Re: Timer0, Timer2 && Delay_ms = problems
Това u_delay(1000) не е правилно като във функцията ти променливата е дефинирана като 8 битова
Код:
void u_delay(int i)


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


Чет Авг 11, 2011 10:19 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: Timer0, Timer2 && Delay_ms = problems
В С, int може да е колкото си искаш бита, стига да са повече или равни на 16.

_________________
Warriors of the Night, ASSEMBLER!!!


Последна промяна ike на Пет Авг 12, 2011 1:23 pm, променена общо 1 път



Чет Авг 11, 2011 10:50 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 08, 2008 11:37 pm
Мнения: 59
Мнение Re: Timer0, Timer2 && Delay_ms = problems
да това го забелязах и го оправих но не е там проблема .......


Пет Авг 12, 2011 12:37 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 7 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: Cekins и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни