|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 12:50 am
C - програма за pic16F84A - къде греша?
| Автор |
Съобщение |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: C - програма за pic16F84A - къде греша?
Кодът сега изглежда така: #include <pic.h> #include<pic16f84a.h> unsigned int i; volatile 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; GIE=1; INTE=1; for(k=0; k<10000; k++); RA0=0; } else RA0=0; } void interrupt isr (void) { k=0; INTE=0; } Нещата пак не работят, както искам, предполагам поради следната причина: 1 - В main се изпълнява for(k=0; k<10000; k++); 2 - RB0 се променя и прекъсването се отработва 3 - В ISR K става 0 и флагът за прекъсването се нулира 4 - Връщаме се в main и закъснението тръгва отначало 5 - Докато нараства k този път прекъсване от RB0 е забранено поради това при нова промяна на RB0 закъснението не тръгва отначало. Аз искам да се получи така, че винаги докато се изпълнява (k=0; k<10000; k++); всеки път, когато RB0 се промени закъснението да тръгне отначало. Изобщо, как мога да укажа преход към точно определен ред от програмата? Примерно след прекъсването програмата да продължи от реда if(RA0 && RB0 ==0). PS: Разбрах си грешката: Нулирането на флага за прекъсване трябва да се прави с INTF=0; вместо с INTE=0; Като го коригирах всичко работи, както трябва. Благодаря на всички, за което  Остава въпросът за прехода: Как се указва преход към точно определен ред от кода?
|
| Съб Май 31, 2014 10:48 am |
|
 |
|
amdatlon
Ранг: Почетен член
Регистриран на: Чет Мар 19, 2009 8:33 pm Мнения: 804
|
 Re: C - програма за pic16F84A - къде греша?
Потърси оператор 'goto' безусловен преход. Но общото мнение е че, не е добре да се ползва този оператор 
|
| Съб Май 31, 2014 8:50 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: C - програма за pic16F84A - къде греша?
А това дето след прекъсване да отиде в началото пък съвсем не е добре. Не че не може, ама още в прекъсването трябва да pop-неш ретърн адреса и на негово място да push-неш адреса от където искаш да продължиш - в смисъл точно това нещо дето искаш да го направиш, това е май най-правилния начин. Напрактика можеш на края на прекъсването да напишеш goto на някъде си, обаче шанса да се омаже всичко доста бързичко е огромен. Освен това, както кода ти е написан в момента, ти гарантирам, че при всяко натискане на бутона се изпълняват поне 50-60 прекъсвания.
|
| Нед Юни 01, 2014 3:11 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: C - програма за pic16F84A - къде греша?
Разбирам идеята ти, но не съм наясно, как да направя това. Ако дадеш един пример, ще ми е от полза  Това за многото прекъсвания, които се генерират при натискането на бутона вероятно става заради момент на неопределеност на входното състояние на RB0. С това мисля, че мога да се справя. Според дейташита RB0 e с тригер на Шмид. Един външен кондензатор би трябвало да свърши работа.
|
| Нед Юни 01, 2014 4:17 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: C - програма за pic16F84A - къде греша?
Ами не е задължително да стане с кондензатор. И проблема не е заради неопределеност ами защото контактка на бутона прави едни механични трептения и контактува неизвестен брой пъти, докато се установеи в състояние. Още по зле е при отпускане на бутона. В общия случай кондезатора може и да реши проблема. По неприятното в твоя случай е, че при натискане ще сработи, ама и при пускане съшо ще сработи.
Това с пушването и попването - ми няма нищо загадъчно - пише го в даташита на контролера как се прави, защо се прави и кога се прави. Не ти препоръчвам да го правиш все пак.
|
| Нед Юни 01, 2014 8:14 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: C - програма за pic16F84A - къде греша?
Намери сайт с туториали и почни от мигането на светодиоди, постепенно всичко ще ти стане ясно. Сега все едно си скочил на реактивен изтребител и казваш дайте пример, как се приземява човек на самолетоносач.
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Нед Юни 01, 2014 9:31 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: C - програма за pic16F84A - къде греша?
Не ти трябва преход от прекъсването нанякъде, такова нещо се прави за много специални случаи. Нулирането на брояча К извън цикъла for си е също за много специални случаи. Приеми ,че и двете неща все още не са за тебе и ги заобиколи.
Ако PB0 не е бутон - състоянието му можеш да проверяваш в цикъла for. По коректно е да ползваш цикъл while.
Aко PB0 e вид бутон - с всичките механични трептения - проверяваш състоянието на някаква променлива - butonPB0pressed, ако имаш 1 бутон. За много бутони проверяваш дали има somebuttonispressed, и дали numberofpressedbuton ==butonPB0const.
Всичките тези неща ,написани с латиница, се палят и зареждат в ISR за обработка на бутоните. По принцип това е в прекъсване по таймер - на всеки 10..20 милисекунди. В това същото прекъсване се търкаля и системното "време" -може да е до 10 секунди, може да е до часове и години - както е в компютъра (абстрахирай се че има отделен чип часовник) . Тогава вместо да ползваш цикли for за светването на един светодиод - палиш светодиода , и ползваш "тиковете" на ISR , за да отброяваш време. Функциите извън ISR се грижат да проследяват , угасят и разтоварват променливите ,"запалени" от ISR.
Сигурно обяснявам лошо , но това е начинът .
|
| Нед Юни 01, 2014 9:32 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: C - програма за pic16F84A - къде греша?
Абе аз не ги правя така бутоните ама то всеки сигурно си има нящо измислено дето си му харесва. Това дето аз ползвам не се обработва в прекъсване а в главната част при всяко минаване. Самата процедура по проверка е достатъчно бърза като ползва два брояча и няколко допълнителни променливи за състояния. Пр натискане, "бутона" сработва веднага обаче само един път. След това пък си сработва и при задържане с различни времена след първото сработване и след задържане... Със времето съм я изфинил дотолкова че ни кондензатори трябват ни тригери на шмит.
|
| Нед Юни 01, 2014 10:52 pm |
|
 |
|
bobihot
Ранг: Форумен бог
Регистриран на: Сря Фев 13, 2013 3:35 pm Мнения: 1803
|
 Re: C - програма за pic16F84A - къде греша?
Да- бутони се обработват с пулване при таймера. Така няма нужда от шмигери и кондензатори и дълги проверки. И няма непрекъснат цикъл, който товари процесора- може да спи през останалото време. Сега питаха за аларма- тя беше с прекъсване от клавиатурата, но идеята беше при батерийно захранване процесора да спи и натискането на клавиш да го събуди.
|
| Чет Юни 05, 2014 3:46 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|