| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| pic16f84 и interrupts http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=2002 |
Страница 1 от 1 |
| Автор: | valioman [ Сря Мар 15, 2006 12:45 pm ] |
| Заглавие: | pic16f84 и interrupts |
Абе да му се невиди и пикльото пак ми се опъва.Искам да направя едно фрагментче с прекъсване.то ест той да си врътка цикъла и когато постъпи команда (чрез протокол ) да настъпи прекъсването ,да прочете протокола и да продължи цикъла но с новите параметри които съма задал през RS232-то и естествено пикльото тряяд а се издъни а може би аз съм заспал .И за проба направих това #include <16F84.h> #FUSES NOWDT //No Watch Dog Timer #FUSES HS //High speed Osc (> 4mhz) #FUSES NOPUT //No Power Up Timer #FUSES NOPROTECT //Code not protected from reading #use delay(clock=4000000) #use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=9) int a=0; #int_EXT EXT_isr() {if (getc()){ a=getc();} } void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // enable_interrupts(INT_EXT); //enable_interrupts(GLOBAL); while(1) { enable_interrupts(INT_EXT); enable_interrupts(GLOBAL); printf("%u\n\r",a); delay_ms(200); } } ама........... и само д акажа че не съм си играл много с прекъсванията ........ Help pleaseeee |
|
| Автор: | Predator_MF [ Сря Мар 15, 2006 12:54 pm ] |
| Заглавие: | |
В случая каква е идеята на това прекъсване? Щото прекъсването ти е от INT_EXT, няма как процесора да влезе в прекъсване като получи char по RS232 (след като 16F84 няма HW UART). Освен това getc() е написан така, че да зацикля докато не се получи char по UART (независимо HW или SW ти е приемника). Сиреч, в момента както е написано, трябва първо да влезеш в прекъсване (предполагам с бутон) и след това да пратиш нещо по UART, след като се изпълни getc(), би трябвало основната програма да изпрати приетия char (във вид unsigned long ако се не лъжа) през UART |
|
| Автор: | evc [ Сря Мар 15, 2006 1:05 pm ] |
| Заглавие: | |
И освен това си задал хай спийд осцилатор а после в дилей дефиницията го задаваш 4МНz. Ползваш външното прекъсване да започнеш приемането на байта по уарт, това ли е идеята? Ако е така сигурно си настроил РБ0 като вход и си го свързал с пина, който ползваш за RX, или директно него ползваш за RX? |
|
| Автор: | valioman [ Сря Мар 15, 2006 1:39 pm ] | |||||||||
| Заглавие: | ||||||||||
Именно но ползван #use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=9) и идеята ми е че ако постъпи нещо по RX да настъпи прекъсване и да прочета протокола и вече да прая кот ще правя като основната програма е един while(1){...} Въпроса ми е :Как да направя прекъсване в while(1){...} през RS232?? Ако може и някакво примерче.> |
||||||||||
| Автор: | setoy [ Сря Мар 15, 2006 1:51 pm ] |
| Заглавие: | |
ползвай 16F88, мен да питаш. Има си хардуерен RS. Даже май че е малко по-евтин |
|
| Автор: | ¶ [ Сря Мар 15, 2006 2:28 pm ] |
| Заглавие: | |
Прекъсването ти се активира от първия бит, който ще получиш по RS232 и който се губи за getch(), следващите битове ще се прочетат от getch(). Пусни още 1 бит в повече, т.е. ако си 8-битов char, направи го 9-битов, като първия бит ще ти е за да задействаш прекъсването, а останалите ще бъдат за getch(). |
|
| Автор: | evc [ Сря Мар 15, 2006 2:37 pm ] |
| Заглавие: | |
Пирев ме изпревари, но освен това извади "enable_interrupts(INT_EXT); enable_interrupts(GLOBAL); " извън безкрайния цикъл. След като си ги разрешил веднъж няма нужда постоянно да ги разрешаваш отново! И в края на ISR нулирай флага на външното прекъсване! Иначе там ще си останеш. |
|
| Автор: | Predator_MF [ Сря Мар 15, 2006 2:42 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Малка забележка, не е нужно Enable/Disable interrupts да е извън цикъл, даже на места се налага следното:
... освен това нулирането на флага се извършва автоматично от CCS (вижда се нейде из листинга). Единственото място, на което може да зациклиш (в случая с този процесор) при прекъсване е, ако имаш прекъсване от RB4-RB7 и преди излизане от прекъсването не прочетеш състоянието на PortB PS на въпроса ти как да направиш прекъсване в While(1) {...}, прост пример:
|
|||||||||||||||||||
| Автор: | evc [ Сря Мар 15, 2006 3:31 pm ] |
| Заглавие: | |
Е нямаше как да се сетя, че е CCS! Хай-тек и майкрочипския не ги свалят автоматично тези флагове та за това му казах. Не е лошо да се провери все пак де! А пък прекъсването както си го намислил не е невъзможно, но както каза Пирев, пусни си още един бит и трябва да стане. |
|
| Автор: | valioman [ Сря Мар 15, 2006 4:46 pm ] |
| Заглавие: | |
много ви благодаря ще пробвам това с допълнителния бит Честно казано и на мен ми се въртеше нещо в главата ама .....мислех че има нещо стандартно и затова не се решавах |
|
| Автор: | valioman [ Чет Мар 16, 2006 11:14 am ] |
| Заглавие: | |
Оф Може ли да ми пуснете едно малко сорсче че хептен се убатачих Свалих скороста на порта до 1200 и прекъсването си става когато му скимне. Как поточно да му кажа че когато има бит да прекъсне.Аз го правя... #use rs232(baud=1200,xmit=PIN_A0,rcv=PIN_A1) .. while(1){ if (!input(pin_a1)){.............} ...... } и съм сигурен че не е правилно а и така пак не става #use rs232(baud=1200,xmit=PIN_A0,rcv=PIN_A1) #int_ext ext_irs() { if(getc()==49) { output_high(pin_b7); delay_ms(3000); output_low(pin_b7); } } void main(){ enable_interrupts(int_EXT); enable_interrupts(Global); while(1){ output_low(pin_b7); } } според мен би трябвало при подаване на 49 ('1') да светне ламбата |
|
| Автор: | Predator_MF [ Чет Мар 16, 2006 12:31 pm ] |
| Заглавие: | |
Я опитай първо да го подкараш без прекъсване тоя код |
|
| Автор: | valioman [ Чет Мар 16, 2006 1:39 pm ] | |||||||||
| Заглавие: | ||||||||||
в смисъл ?? вярно е че не съм постнал целия а само смисъла по който ми е въпроса все пак съм в академия нали всеки прави грешки а ще ми посочите ли моята |
||||||||||
| Автор: | evc [ Чет Мар 16, 2006 3:01 pm ] |
| Заглавие: | |
ТАЗИ част от кода си ти е наред. Най-вероятно проблема е в останалата част или хардуерен. Още веднъж огледай установяването на пиновете, настройката на прекъсванията и хардуерно нещата как са. На този етап едва ли някой може да ти каже повече, а пример не може да ти се напише защото не сме наясно с "желязото" ти. |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|