Отговори на тема  [ 9 мнения ] 
UART прекъсване. 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Дек 15, 2014 11:05 pm
Мнения: 332
Мнение UART прекъсване.
Здравейте, трябва ми малко помощ за една програма. Идеята е да се обработи прекъсване, при наличие на UART данни за четене. Използвам PIC16F887. В дейташийта видях, че има такова прекъсване, като сорсът, който съм написал до сега (на MikroC) е :
По UART се подава номера на RFID ключ, като проблемът е, че в началото съхранява UID-то на първия ключ, който подам на RFID четеца, но ако след това сложа друг ключ, в масива не се съхранява UID-то на втория ключ (т.е очаквам да се презапише масива).

Код:
unsigned char uart_rd[5];
char RFID[10];

void interrupt()
{
   int cnt;
   
   if (PIE1.RCIE == 1)
   {  cnt = 0;
      while(UART1_Data_Ready())
      {
         uart_rd[cnt] = UART1_Read();
         cnt++;
     
      }
   
     PIE1.RCIE = 0;
   }
}


void main() {
   ANSEL = ANSELH = 0;
   INTCON = 0b11000000;
   PIE1 = 0b01000000;
   PIR1.RCIE = 0;

   UART1_Init(9600);
   Delay_ms(100);



   while (1){

      asm nop;
     

    }
}


Сря Юли 22, 2015 1:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: UART прекъсване.
Така и така ползваш библиотеки да ти вършат работата вместо теб, за какво по дяволите са ти прекъсвания?

_________________
Warriors of the Night, ASSEMBLER!!!


Сря Юли 22, 2015 2:12 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: UART прекъсване.
Еее не така, двете нямат общо. Но идеята да имаш while в прекъсване е безумна, това не се прави никога.


Сря Юли 22, 2015 3:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: UART прекъсване.
ToHu написа:
... Но идеята да имаш while в прекъсване е безумна, това не се прави никога.


Без майтап !?
А ... как се чете ако има FIFO !?


Сря Юли 22, 2015 3:27 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: UART прекъсване.
Код:
static char cnt = 0;
void interrupt()
{
    uart_rd[cnt] = UART1_Read();
    cnt++;

    if (sizeof(uart_rd) == cnt)
    {
         cnt = 0;
    }
}


И RCIE флага да се сетва някъде отвън.


Сря Юли 22, 2015 3:32 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: UART прекъсване.
Специално за пиковете няма нужда от while - напрактика идеята е безумна :) в случая. RXIF флага се изчиства само когато FIFO буфера се изпразни а той се изпразва като се чете RXREG. Флага за прекъсване е readonly. С други думи самото прексъване представлява прочитане на регистъра и излизане. Ако има още нещо във фифо-то, веднага след като GIE се вдигне(след retfie), процесора пак ще влезе в прекъсване, тъй като RXIF все още е вдигнат заради наличието на байт в буфера. И така докато се изчетат всички байтове в буфера. Ако всичко е организирано както трябва, не трябва да се случва буфера да се напълни.


Сря Юли 22, 2015 3:35 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Дек 15, 2014 11:05 pm
Мнения: 332
Мнение Re: UART прекъсване.
Защото, това е само част от проекта, не мога да си позволя да проверявам непрекъснато дали имам заредени данни в буера.
Както и да е, намерих решение на проблема с прекъсването и сте прави, че няма нужда от while(). Благодаря за отзоваването :).

ПП: Като цяло грешката ми беше в регистрите и битовете.


Сря Юли 22, 2015 3:49 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: UART прекъсване.
И аз ти видях грешката - обикновенно не вниквам много в кода на първо четене и не обърнах внимание отначало. В твоя код проверяваш RCIE а не RCIF. Макар, че в някой халф дуплекс конфигурации е хубаво и той да се проверява, за да не приемаш ехото ако го има и приемането е забранено. А нулирането на флага за прекъсване е безмислено начинание, както казах вече - той е readonly и се изчиства сам когато буфера се изпразни. Има и няколко флага в уарта, които не е зле да се проверяват от време на време - за препълване на буфера и фрейминг. Ако някой от тях по някаква причина се вдигне, ще приемаш ама някой друг път. Не е като да не се случва.


Сря Юли 22, 2015 4:40 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: UART прекъсване.
Остави грешката, идеята за while е мнго погрешна, като цяло while ако мо да се избягва е най-добре, винаги е свързан с възможна неопределеност, за да си сигурен трябва да си гарантираш изход извън условието което чакаш.
А за колегата ps66, какво общо има FIFO с while ? Като цяло в прекъсване се правят минимално необходимите неща и веднага излизаш, да имаш while е меко казано безумие. Имам купища код изписан специално за микриконтролери където единственият ми while е в този който върти мейна.
While може да си позволиш тогава, когато имаш процеси и диспечър на процесите и е сигурно че и с whileи без while няма да стоиш в този процес повече от допустимото, не че и това е много готино, но все пак е по-добре.
Изобщо лично според мен PC метода на писане е силно неоптимален за микроконтролери особенно от типа на PIC.


Сря Юли 22, 2015 10:22 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 9 мнения ] 

Кой е на линия

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


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

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