| Автор |
Съобщение |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
 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 
|
| Сря Мар 15, 2006 12:45 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
В случая каква е идеята на това прекъсване? Щото прекъсването ти е от INT_EXT, няма как процесора да влезе в прекъсване като получи char по RS232 (след като 16F84 няма HW UART). Освен това getc() е написан така, че да зацикля докато не се получи char по UART (независимо HW или SW ти е приемника). Сиреч, в момента както е написано, трябва първо да влезеш в прекъсване (предполагам с бутон) и след това да пратиш нещо по UART, след като се изпълни getc(), би трябвало основната програма да изпрати приетия char (във вид unsigned long ако се не лъжа) през UART 
|
| Сря Мар 15, 2006 12:54 pm |
|
 |
|
evc
Ранг: Напреднал
Регистриран на: Пет Окт 21, 2005 8:45 am Мнения: 499
|
И освен това си задал хай спийд осцилатор а после в дилей дефиницията го задаваш 4МНz.
Ползваш външното прекъсване да започнеш приемането на байта по уарт, това ли е идеята?
Ако е така сигурно си настроил РБ0 като вход и си го свързал с пина, който ползваш за RX,
или директно него ползваш за RX?
_________________ Простотията е Божи дар, но човек не бива да парадира с подаръците си!
|
| Сря Мар 15, 2006 1:05 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Именно но ползван #use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=9)
и идеята ми е че ако постъпи нещо по RX да настъпи прекъсване и да прочета протокола и вече да прая кот ще правя
като основната програма е един while(1){...}
Въпроса ми е :Как да направя прекъсване в while(1){...} през RS232??
Ако може и някакво примерче.>
|
| Сря Мар 15, 2006 1:39 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
ползвай 16F88, мен да питаш. Има си хардуерен RS. Даже май че е малко по-евтин
|
| Сря Мар 15, 2006 1:51 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Прекъсването ти се активира от първия бит, който ще получиш по RS232 и който се губи за getch(), следващите битове ще се прочетат от getch(). Пусни още 1 бит в повече, т.е. ако си 8-битов char, направи го 9-битов, като първия бит ще ти е за да задействаш прекъсването, а останалите ще бъдат за getch().
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Сря Мар 15, 2006 2:28 pm |
|
 |
|
evc
Ранг: Напреднал
Регистриран на: Пет Окт 21, 2005 8:45 am Мнения: 499
|
Пирев ме изпревари, но освен това извади "enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL); " извън безкрайния цикъл. След като си ги
разрешил веднъж няма нужда постоянно да ги разрешаваш отново! И в
края на ISR нулирай флага на външното прекъсване! Иначе там ще си
останеш.
_________________ Простотията е Божи дар, но човек не бива да парадира с подаръците си!
|
| Сря Мар 15, 2006 2:37 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Малка забележка, не е нужно Enable/Disable interrupts да е извън цикъл, даже на места се налага следното:
... освен това нулирането на флага се извършва автоматично от CCS (вижда се нейде из листинга). Единственото място, на което може да зациклиш (в случая с този процесор) при прекъсване е, ако имаш прекъсване от RB4-RB7 и преди излизане от прекъсването не прочетеш състоянието на PortB PS на въпроса ти как да направиш прекъсване в While(1) {...}, прост пример:
|
| Сря Мар 15, 2006 2:42 pm |
|
 |
|
evc
Ранг: Напреднал
Регистриран на: Пет Окт 21, 2005 8:45 am Мнения: 499
|
Е нямаше как да се сетя, че е CCS! Хай-тек и
майкрочипския не ги свалят автоматично тези флагове
та за това му казах. Не е лошо да се провери все пак де!
А пък прекъсването както си го намислил не е невъзможно,
но както каза Пирев, пусни си още един бит и трябва да
стане.
_________________ Простотията е Божи дар, но човек не бива да парадира с подаръците си!
|
| Сря Мар 15, 2006 3:31 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
много ви благодаря ще пробвам това с допълнителния бит
Честно казано и на мен ми се въртеше нещо в главата ама .....мислех че има нещо стандартно и затова
не се решавах 
|
| Сря Мар 15, 2006 4:46 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Оф Може ли да ми пуснете едно малко сорсче че хептен се убатачих
Свалих скороста на порта до 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') да светне ламбата  ама ...........
|
| Чет Мар 16, 2006 11:14 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Я опитай първо да го подкараш без прекъсване тоя код 
|
| Чет Мар 16, 2006 12:31 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
в смисъл ??
вярно е че не съм постнал целия а само смисъла по който ми е въпроса
все пак съм в академия нали
всеки прави грешки
а ще ми посочите ли моята

|
| Чет Мар 16, 2006 1:39 pm |
|
 |
|
evc
Ранг: Напреднал
Регистриран на: Пет Окт 21, 2005 8:45 am Мнения: 499
|
ТАЗИ част от кода си ти е наред. Най-вероятно проблема е в останалата част
или хардуерен. Още веднъж огледай установяването на пиновете, настройката
на прекъсванията и хардуерно нещата как са. На този етап едва ли някой може
да ти каже повече, а пример не може да ти се напише защото не сме наясно с
"желязото" ти.
_________________ Простотията е Божи дар, но човек не бива да парадира с подаръците си!
|
| Чет Мар 16, 2006 3:01 pm |
|
|