Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

UART прекъсване.
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=13935
Страница 1 от 1

Автор:  kalata23 [ Сря Юли 22, 2015 1:59 pm ]
Заглавие:  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;
     

    }
}

Автор:  ike [ Сря Юли 22, 2015 2:12 pm ]
Заглавие:  Re: UART прекъсване.

Така и така ползваш библиотеки да ти вършат работата вместо теб, за какво по дяволите са ти прекъсвания?

Автор:  ToHu [ Сря Юли 22, 2015 3:07 pm ]
Заглавие:  Re: UART прекъсване.

Еее не така, двете нямат общо. Но идеята да имаш while в прекъсване е безумна, това не се прави никога.

Автор:  ps66 [ Сря Юли 22, 2015 3:27 pm ]
Заглавие:  Re: UART прекъсване.

ToHu написа:
... Но идеята да имаш while в прекъсване е безумна, това не се прави никога.


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

Автор:  tolstolob [ Сря Юли 22, 2015 3:32 pm ]
Заглавие:  Re: UART прекъсване.

Код:
static char cnt = 0;
void interrupt()
{
    uart_rd[cnt] = UART1_Read();
    cnt++;

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


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

Автор:  Cekins [ Сря Юли 22, 2015 3:35 pm ]
Заглавие:  Re: UART прекъсване.

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

Автор:  kalata23 [ Сря Юли 22, 2015 3:49 pm ]
Заглавие:  Re: UART прекъсване.

Защото, това е само част от проекта, не мога да си позволя да проверявам непрекъснато дали имам заредени данни в буера.
Както и да е, намерих решение на проблема с прекъсването и сте прави, че няма нужда от while(). Благодаря за отзоваването :).

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

Автор:  Cekins [ Сря Юли 22, 2015 4:40 pm ]
Заглавие:  Re: UART прекъсване.

И аз ти видях грешката - обикновенно не вниквам много в кода на първо четене и не обърнах внимание отначало. В твоя код проверяваш RCIE а не RCIF. Макар, че в някой халф дуплекс конфигурации е хубаво и той да се проверява, за да не приемаш ехото ако го има и приемането е забранено. А нулирането на флага за прекъсване е безмислено начинание, както казах вече - той е readonly и се изчиства сам когато буфера се изпразни. Има и няколко флага в уарта, които не е зле да се проверяват от време на време - за препълване на буфера и фрейминг. Ако някой от тях по някаква причина се вдигне, ще приемаш ама някой друг път. Не е като да не се случва.

Автор:  ToHu [ Сря Юли 22, 2015 10:22 pm ]
Заглавие:  Re: UART прекъсване.

Остави грешката, идеята за while е мнго погрешна, като цяло while ако мо да се избягва е най-добре, винаги е свързан с възможна неопределеност, за да си сигурен трябва да си гарантираш изход извън условието което чакаш.
А за колегата ps66, какво общо има FIFO с while ? Като цяло в прекъсване се правят минимално необходимите неща и веднага излизаш, да имаш while е меко казано безумие. Имам купища код изписан специално за микриконтролери където единственият ми while е в този който върти мейна.
While може да си позволиш тогава, когато имаш процеси и диспечър на процесите и е сигурно че и с whileи без while няма да стоиш в този процес повече от допустимото, не че и това е много готино, но все пак е по-добре.
Изобщо лично според мен PC метода на писане е силно неоптимален за микроконтролери особенно от типа на PIC.

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