Отговори на тема  [ 14 мнения ] 
pic16f84 и interrupts 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 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 :oops: :oops: :oops: :oops:


Сря Мар 15, 2006 12:45 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 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
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

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

_________________
Простотията е Божи дар, но човек не бива да парадира с подаръците си!


Сря Мар 15, 2006 1:05 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
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??

Ако може и някакво примерче.>


Сря Мар 15, 2006 1:39 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
ползвай 16F88, мен да питаш. Има си хардуерен RS. Даже май че е малко по-евтин


Сря Мар 15, 2006 1:51 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Прекъсването ти се активира от първия бит, който ще получиш по RS232 и който се губи за getch(), следващите битове ще се прочетат от getch(). Пусни още 1 бит в повече, т.е. ако си 8-битов char, направи го 9-битов, като първия бит ще ти е за да задействаш прекъсването, а останалите ще бъдат за getch().

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Сря Мар 15, 2006 2:28 pm
Профил WWW
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Пет Окт 21, 2005 8:45 am
Мнения: 499
Мнение 
Пирев ме изпревари, но освен това извади "enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL); " извън безкрайния цикъл. След като си ги
разрешил веднъж няма нужда постоянно да ги разрешаваш отново! И в
края на ISR нулирай флага на външното прекъсване! Иначе там ще си
останеш.

_________________
Простотията е Божи дар, но човек не бива да парадира с подаръците си!


Сря Мар 15, 2006 2:37 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Малка забележка, не е нужно 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
}
}


Сря Мар 15, 2006 2:42 pm
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Пет Окт 21, 2005 8:45 am
Мнения: 499
Мнение 
Е нямаше как да се сетя, че е CCS! Хай-тек и
майкрочипския не ги свалят автоматично тези флагове
та за това му казах. Не е лошо да се провери все пак де!
А пък прекъсването както си го намислил не е невъзможно,
но както каза Пирев, пусни си още един бит и трябва да
стане.

_________________
Простотията е Божи дар, но човек не бива да парадира с подаръците си!


Сря Мар 15, 2006 3:31 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
много ви благодаря ще пробвам това с допълнителния бит
Честно казано и на мен ми се въртеше нещо в главата ама .....мислех че има нещо стандартно и затова
не се решавах :)


Сря Мар 15, 2006 4:46 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Оф Може ли да ми пуснете едно малко сорсче че хептен се убатачих
Свалих скороста на порта до 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') да светне ламбата :) ама ...........


Чет Мар 16, 2006 11:14 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Я опитай първо да го подкараш без прекъсване тоя код :)


Чет Мар 16, 2006 12:31 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Predator_MF написа:
Я опитай първо да го подкараш без прекъсване тоя код :)


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

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


Чет Мар 16, 2006 1:39 pm
Профил ICQ
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Пет Окт 21, 2005 8:45 am
Мнения: 499
Мнение 
ТАЗИ част от кода си ти е наред. Най-вероятно проблема е в останалата част
или хардуерен. Още веднъж огледай установяването на пиновете, настройката
на прекъсванията и хардуерно нещата как са. На този етап едва ли някой може
да ти каже повече, а пример не може да ти се напише защото не сме наясно с
"желязото" ти.

_________________
Простотията е Божи дар, но човек не бива да парадира с подаръците си!


Чет Мар 16, 2006 3:01 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 14 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни