Микроконтролери и електроника
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 :oops: :oops: :oops: :oops:

Автор:  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 ]
Заглавие: 

evc написа:
И освен това си задал хай спийд осцилатор а после в дилей дефиницията го задаваш 4МНz.
Ползваш външното прекъсване да започнеш приемането на байта по уарт, това ли е идеята?
Ако е така сигурно си настроил РБ0 като вход и си го свързал с пина, който ползваш за RX,
или директно него ползваш за RX?



Именно но ползван #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 да е извън цикъл, даже на места се налага следното:
Код:
While (!GIE) GIE = 1;

... освен това нулирането на флага се извършва автоматично от CCS (вижда се нейде из листинга). Единственото място, на което може да зациклиш (в случая с този процесор) при прекъсване е, ако имаш прекъсване от RB4-RB7 и преди излизане от прекъсването не прочетеш състоянието на PortB 8)

PS на въпроса ти как да направиш прекъсване в While(1) {...}, прост пример:
Код:
#INT_EXT // дефинира следващата функция (процедура) за изпълнение при настъпване на External Interrupt
void External_Int()
{ //при прекъсване се изпълнява това
  beep_my_beeper(); // пискаме че сме в прекъсване...примерно
}

void main(){
.... // my Initiliazation code here
Enable_Interrupts(INT_EXT); //разрешаваме си прекъсването, което ще ползваме
Enable_Interrupts(Global);  // разрешаваме глобално прекъсванията в процесора
while(1){
blink_my_led(); // мигам си светодиода в main
}
}

Автор:  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)){.............}
......
}

и съм сигурен че не е правилно :oops:

а и така пак не става

#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 ]
Заглавие: 

Predator_MF написа:
Я опитай първо да го подкараш без прекъсване тоя код :)


в смисъл ??
вярно е че не съм постнал целия а само смисъла по който ми е въпроса

все пак съм в академия нали
всеки прави грешки
а ще ми посочите ли моята
:?

Автор:  evc [ Чет Мар 16, 2006 3:01 pm ]
Заглавие: 

ТАЗИ част от кода си ти е наред. Най-вероятно проблема е в останалата част
или хардуерен. Още веднъж огледай установяването на пиновете, настройката
на прекъсванията и хардуерно нещата как са. На този етап едва ли някой може
да ти каже повече, а пример не може да ти се напише защото не сме наясно с
"желязото" ти.

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