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

C - програма за pic16F84A - къде греша?
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=12917
Страница 1 от 3

Автор:  lcr [ Вто Май 13, 2014 12:26 am ]
Заглавие:  C - програма за pic16F84A - къде греша?

Здравейте специалисти!

Нов съм във форума, защото отскоро направих и първите си стъпки свързани с MК.

Като начало се въоръжих с MPLAB X, XC8 компилатор, програматор Pickit-3........и
Оттук - оттам скалъпих и първия си код за PIC16F84A:

void pause(unsigned char k, unsigned char l) /* pause routine */
{
unsigned char i,j;
for(i=0;i<=k;i++)
for(j=0;j<=l;j++);
}

void main()
{

TRISB = 0;/* Set port B as output */

while(1)

{
RB0=1;
RB1=0;
pause(50,50);
RB0=0;
RB1=1;
pause(50,50);
...........................................................................
RB0=0;
RB1=0;
pause(50,50);
RB0=1;
RB1=1;
pause(50,50);
}

}


Ето го и въпроса ми на лаик в областта:


Светодиодите на двата изхода си мигат в противотакт, т.е - програмата се изпълнява успешно само до отбелязания ред.

Моля да ме светнете, защо се получава така, че от много четене и информация на този етап не разбирам грешката си.

Предварително благодаря!

Автор:  E1 [ Вто Май 13, 2014 1:33 am ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

А какво трябва да прави?
С този код, след чертата:
1. изгасват и двата диода;(всъщност диод 0 е вече изгаснал и няма смисъл да се пише отново за него)
2. светват двата диода;
3. изгасва RB1
4. светва RB1 и изгасва RB0
5. пак чертата....

Автор:  lcr [ Вто Май 13, 2014 2:03 am ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

Точно това е замислената последователност.

Наистина RB0=0 след чертата е излишно. Ще го махна, но това едва ли ще промени нещо.

Въпросът е защо реално цикълът стига до чертата и започва отначало.

Автор:  lcr [ Вто Май 13, 2014 2:04 am ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

.

Автор:  Edesign [ Вто Май 13, 2014 6:53 am ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

разбери дали не се ресетва например Watch Dog Timer?

Автор:  Cekins [ Вто Май 13, 2014 8:39 am ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

А ти откъде си сигурен че стига до чертата само и тръгва отначало? Предполагам че пикчето е на 4MHz. Имаш два цикъла по 50, които най вероятно са около 150-200 инструкции(цикъла) общо всеки, което е да кажем 400-500 за двата. това разделено на 500 цикъла * 2 за двете паузи ще даде честота 1kHz - повервай ми - при тая честота не можеш да видиш мигането на диодите...

Автор:  lcr [ Вто Май 13, 2014 11:26 am ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

Ползвам RC осцилатора с R=47 kOhm и C=180 pF, което би трябвало да даде тактова честота около 80 kHz.
Мигането в противотакт на светодиодите се вижда отчетливо. Всеки един от тях мига с период около 1 сек.

Как да разбера дали не се ресетва WDT ?

Автор:  CarBeta [ Вто Май 13, 2014 11:55 am ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

Лесния начин е да дадеш цялата конфигурация и да се види къде какво го караш да прави тоя процесор.
Иначе проба-грешка. Сложи паузи, всяка с различно време. Или след всяка пауза сетвай различен изход да видиш до кой ще стигне.

Автор:  lcr [ Вто Май 13, 2014 4:29 pm ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

Това, което установих по метода проба-грешка е, че кодът се изпълнява винаги до определен ред или по-скоро до заемане на определен обем памет, след което програмата започва отначало а командите след въпросния ред просто се игнорират.
Според IDE интерфейса програмната памет е заета на 10% а тази за данни - на 12%

Автор:  lcr [ Сря Май 14, 2014 3:16 pm ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

Благодарение на насоката, която даде колегата Edesign проблемът е решен.

Все още съм много бос на тема програмиране на МК, но докато правих разни практически експерименти ми направи впечатление, че нещата не работят поради това, че сякаш изтича някакъв таймаут.
Тогава пробвах да изключа WDTE и О-чудо - всичко проработи!

Накратко - открих топлата вода :)

Благодаря на всички за помощта.

Автор:  didofen [ Сря Май 14, 2014 4:20 pm ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

Кучето е направено да се разлае, ако не го укротяваш периодично, а не да го отвържеш и да го дадеш на комшиите

Автор:  lcr [ Сря Май 14, 2014 9:56 pm ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

didofen написа:
Кучето е направено да се разлае, ако не го укротяваш периодично, а не да го отвържеш и да го дадеш на комшиите


Разбирам това и доколкото схващам периодичното укротяване става с изпълнение на командите:

MOV TA,#0AAh ;Execute the Timed Access Protection
MOV TA,#55h ;code to open the Timed Access window
SETB RWT ;Reset the watchdog timer by setting the RWT bit

Тези команди имат ли аналог в "C" или трябва да се превключва на асемблер?

Автор:  michev [ Сря Май 14, 2014 10:05 pm ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

Код:
CLRWDT()
за XC8 .. или
Код:
asm("clrwdt")

Или още в конфигурацията го изключваш :)

Автор:  Cekins [ Сря Май 14, 2014 10:06 pm ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

Ъъъъ ... Обърка чипа нещо - тия команди не са за пик въобще. Тоя сикуънс също не е за пик. Ресетването при пиковете става с простата командичка CLRWDT.

Автор:  michev [ Сря Май 14, 2014 10:23 pm ]
Заглавие:  Re: C - програма за pic16F84A - къде греша?

Абе вярно е че веднъж в годината бутвам пик, ама.. чак пък толкоз :)
От менюъла на XC8
Цитат:
CLRWDT
Synopsis
#include <xc.h>
CLRWDT();
Description
This macro is used to clear the device’s internal watchdog timer.

Инструкцията я погледах в книгата - има си я

Едит: Ох, чак сега фокусирах какво точно си написал и по - точно за кого :)

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