| Автор |
Съобщение |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: C - програма за pic16F84A - къде греша?
ОК благодаря! : И още един въпрос за WDT:
Ако въвеждам паузи с броене до някакво число и ако тези паузи са с времетраене примерно 5 сек.
Как се ползва WDT в този случай?
|
| Сря Май 14, 2014 10:27 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: C - програма за pic16F84A - къде греша?
трябва да ресетваш кучето за да не не ресетне то - толкова често, колкото пише в чаршафа. Ако пише 18 милисекунди - ресетвай го най-много на 16. В останалото време брой каквито искаш числа, до колкото искаш секунди.
|
| Сря Май 14, 2014 10:49 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: C - програма за pic16F84A - къде греша?
Продължавай с четенето.
Защо ти е да правиш паузи от по 5 секунди по този начин ? това е чиста загуба на енергия и процесорно време. Ако искаш да правиш паузи от по 5 секунди ще те насоча да четеш за таймерите и прекъсванията. Надявам се да ти стане ясно и да схванеш после какво трябва да се случи. Командата clrwdt трябва да се изпълнява достатъчно често. Естествено колко често зависи и дали има прескалер и на колко е сложен. А и има пикове дето имат уочдог в секунди. Другия номер, който при тебе може да стане с тази програма, е да си настроиш уочдога на около времето което ти трябва (прескалер 32 ще даде малко повече от половин секунда), след смяна на портовете просто пишеш sleep. Контролера ще заспи обаче като изтече уочдог-а няма да се рестартира а ще се събуди и ще продължи от там на сетне. И така нататък. В общи линии не е зле да изчетеш даташита на въшката. Обаче бих ти препоръчал някой по-съвременен чип, че на тоя даташита му е дърт а на новите са доста по-добре написани.
|
| Сря Май 14, 2014 10:53 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: C - програма за pic16F84A - къде греша?
Нещо ударих на камък с моите познания  Във връзка със следния код: #include <pic.h> #include<pic16f84a.h> unsigned int i; unsigned int k; void interrupt isr (void); void main(void) { TRISA0=0; TRISB0=1; if (RB0) { RA0=1; for(i=0; i<100; i++); } if(RA0 && RB0 ==0) { RA0=1; for(k=0; k<10000; k++); RA0=0; } else RA0=0; Това, което искам а не мога да постигна е, докато върви закъснението for(k=0; k<10000; k++); ако RB0 стане 0, закъснението да тръгне отначало. Мъчих с прекъсвания и какво ли не и не мога да се справя на този етап. Моля ви за насока, като за дилетант-прощапулник 
|
| Пет Май 30, 2014 6:20 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: C - програма за pic16F84A - къде греша?
Ами това void interrupt isr (void); за къв чеп седи там празно?
там трябва да си сложиш обработка на прекъсване от RB0, което в общи линии ще представлява изчистване на флага за прекъсване и нулиране на k.
Зависи обаче и компилатора как ще го приеме това нещо. Предполагам ще мине номера.
Обаче ако това RB0 ти е вързано на бутон ще имаш още един куп главоболия дето сега не ми се описват подробно...
|
| Пет Май 30, 2014 7:30 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: C - програма за pic16F84A - къде греша?
Пробвах с ISR функция, като зададох времезакъснението да се прави в нея, но пак нищо не се получи. За да се нулира "К" просто k=0; ли се пише? Ако е така и така не става. Просто стигнах до заключението, че докато се смята времезакъснението не мога да го стартирам отначало, независимо дали е в main или в ISR. Иначе накрая на ISR функцията нулирам флага с "INTCON=0"
RB0 не е на бутон а се влияе от постоянно напрежение на захранване. Идеята е като изчезне захранването да се пусне RA0.
|
| Пет Май 30, 2014 7:53 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: C - програма за pic16F84A - къде греша?
Ами то INTCON не е флаг а си е цял регистър - нулирайки го направо забраняваш тотално прекъсванията тъй като бит 7 е GIE (global interrupt enable) бита за прекъсванията. Трябва да нулираш само INTCON.INTF.
Цикъла ти трябва да си се върти в main. В прекъсването само нулираш k. А за да имаш прексъване, трябва RB0 да го направиш вход (TRISB.0=1) и да разрешиш прексъване INT0 (INTCON.INTE=1)
|
| Пет Май 30, 2014 8:00 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: C - програма за pic16F84A - къде греша?
Когато пробвах с прекъсването и накрая на ISR пишех INTCON=0 съзнавах, че нулирам цял регистър, но мислех, че не е фатално, защото в началото на main отново пускам прекъсванията с GIE=1; и INTE=1;, но вероятно подходът ми е грешен  Това, което не ми е ясно е как точно се отработва прекъсването. Примерно когато при зададен интервал за К (0 - 10000) ако в момента на прекъсването k=3000, след изпълняване на ISR и връщане към main откъде продължава цикъла?
|
| Пет Май 30, 2014 8:15 pm |
|
 |
|
amdatlon
Ранг: Почетен член
Регистриран на: Чет Мар 19, 2009 8:33 pm Мнения: 804
|
 Re: C - програма за pic16F84A - къде греша?
Един пример: Гледаш на компютъра филм и по средата на му ти звънят на вратата ( прекъсване). Какво правиш? Спираш филма на пауза, и отиваш да отвориш да видиш кой звъни  . Отсвирваш го след малко време и пак се връщаш на филма от където си спрял.
|
| Пет Май 30, 2014 8:26 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: C - програма за pic16F84A - къде греша?
Така си го представям и аз. Това означава, че ако в момента на прекъсване K=3000, след връщане в main, ще продължи от K=3001. Тогава как да нулирам K?
|
| Пет Май 30, 2014 8:34 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: C - програма за pic16F84A - къде греша?
Ако променливата К е обявена, като "volatile" то можеш в прекъсването да кажеш: K=0;
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Пет Май 30, 2014 8:47 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: C - програма за pic16F84A - къде греша?
Много ти благодаря! Утре ще пробвам 
|
| Пет Май 30, 2014 8:49 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: C - програма за pic16F84A - къде греша?
А ако не е обявена като volatile, компилатора няма ли да изреве?
|
| Пет Май 30, 2014 9:22 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: C - програма за pic16F84A - къде греша?
Не съм я обявил като volatile, пиша К=0; , компилаторът (XC8) не реве, но и не работи, както трябва.
|
| Пет Май 30, 2014 9:29 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: C - програма за pic16F84A - къде греша?
Ами не знам какво не ти се получава - искам само да ти кажа че това дето го искаш да стане, написано на асемблер ще е по-кратко поне 3 пъти като брой букви и поне 5 пъти като редове, от това дето си го постнал като код. Та не знам - може би първо е добре да си изясниш как точно работи прекъсването при този процесор.
|
| Пет Май 30, 2014 9:41 pm |
|
|