PIC interupt

Zuffa Jan ZuffaJ na cgc.sk
Čtvrtek Červenec 24 21:55:32 CEST 2014


1/ ano, tu som chybu nehladal
2/ ano
3/ Sofistikovanejsia logika tam este len bude aj ked v preruseni by malo byt kodu co najmenej.
Zbytocne by som sa na nou zamyslal ked mi nefugnovali zakladne zatazove testy :(
4/ ano
5/ Pretecenie bufferu a zahodenie dat nie je problem pretoze vo vysledku
to bude aj tak fungovat stylom prijmem paket a posielam odpoved na paket ktory som spracoval
tak aby aplikacia vedela ktora poziadavka bola spracovana.

PICKIT ani ICD nemam a tato verzia PIC ICD ani nepodporuje :)

Ako som uz odpisal na predosly prispevok vycitanie RCREG pomohlo pri priznaku OERR

V podstate to stylom dotaz odpoved normalne fungovalo (aj ked mozno dokedy :) )
nemohol som sa ale zmierit s tym, ze par paketov navyse to dokaze rozhodit :)

Dakujem vsetkym za pomoc, dnes je moj stastny den :) (vlastne uz vecer)


j.

-----Original Message-----
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Miroslav Draxal
Sent: Thursday, July 24, 2014 8:23 PM
To: 'HW-news'
Subject: RE: PIC interupt

1/ PIC16F648 podle dts. Nuluje příznakové bity automaticky při prázdném registru RCREG a TXREG.

2/ zapnutí a vypnutí (vynulování errorů usartu) mě funguje CREN=0; CREN=1; I když pro tento typ jsem nic nedělal

3/  if (RxRecv >= RX_BUFF_SIZE)
 Tady bych udělal né jenom vyčítání RCREG, ale hledal bych konec paketu 0x0d a pak bych to začal načítat nový paket, abych o nový zbytečně nepřišel

4/ framing error (break?), tady bych udělal 
		Pom = RCREG;
		Pom = RCREG;
		Pom = RCREG; // Nekolikrat dle hloubky UART bufru 

5/ nejprve bych načetl přijaty byt do pomocné proměné, pak zkontroloval přetečení buferu a až potom vyhodnocoval 0x0d

PICKIT nebo ICD není? Aby se do toho dalo podívat?

Míra   

-----Original Message-----
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Milan Kratochvíl
Sent: Thursday, July 24, 2014 8:02 PM
To: HW-news
Subject: Re: PIC interupt

Zdravím.
Sice pro Pic píši jen v Asm, ale asi to bude stejné. V přerušení nevidím, že byste mazal příznak RCIF nebo TXIF.
Milan

Dne 24.7.2014 16:35, Zuffa Jan napsal(a):
> Zdravim,
>
> piatok sa blizi tak by som rad nacrtol problem s ktorym uz par vecerov 
> zapasim a neviem ho vyriesit. Ide o PIC16F648 a UART v asynchronnom 
> mode. Data zo serioveho portu sa citaju v interupte a spracovavaju v 
> hlavnej slucke Vsetko funguje ako ma, pokial nezahltim UART vacsim 
> poctom paketov (trebars 10 bez prestavky prejde, vacsi pocet uz nie.
> Velkost RxBuff je 16 bajtov a v interupte je osetrene pretecenie.
>
> Pakety su velke 4-5 bajtov velke zakoncene 0x0D V hlavnej slucke sa 
> dookola cita RxBuff pokial dojde k naplneniu (RxDone == 1)
>
> Pre jednoduchost som hlavnu slucku minimalizoval takze vypada nejak 
> takto
>
> while (1)
> {
> 	BYTE bBuffer[RX_BUFF_SIZE];
>
> 	UART_ RecvData (bBuffer);
> 	__delay_ms(300);
> 	CLRWDT()  // nastaveny na 2.5 sekundy }
>
> Pokusmi som zistil, ze sa program zacykli v interupte, pravdepodobne 
> kazdym hodinovym cyklom sa opatovne vyvola interupt co nedovoluje 
> hlavnej
slucke pokracovat v spracovani.
> Skratka program sa zasekne a WatchDog resetuje procesor. Ked dam
> CLRWDT() do interuptu procesor sa nezresetuje ale hlavna slucka sa
nevykonava.
>
> Otazka je, ako sa dostat z tohto stavu? Detekovat v interupte ze sa 
> nespracovavaju prijate data je jednoduche, nic co som vyskusal ale 
> nezabralo
>
> Tu je rutina interuptu:
> (Tx sa pouzije iba pri starte procesora aby som videl ze doslo k
> resetu)
>
> void interrupt trx_int(void) {
>
> // RECEIVE BUFFER
>      if ((RCIF == TRUE) && (RCIE == TRUE))
// PIR1 register
>      {
>              if (OERR == TRUE)
>              {
// overrun, reset UART
>                  CREN = FALSE;
// disable UART
>                  CREN = TRUE;
// re-enable UART
>                  RxRecv = 0;
>              }
>              else
>              if (FERR == TRUE)
// framing error (break?)
>              {
>                  RxRecv = 0;
>              }
>              else
>              {
>                  RxBuffer[RxRecv] = RCREG;		//global variable
>                  if(RxBuffer[RxRecv] == 0x0D)
>                  {
>                     RCIE = 0;
>                     RxDone = 1;
>                  }
>
>                  RxRecv++;
>                  
>                  if (RxRecv >= RX_BUFF_SIZE)
// beyond buffer boundary  wrap to begin
>                  {
>                      RxRecv = 0;
>                      RCIE = 1;
>                      RxDone = 0;
>                  }
>              }
>      }
> // TRANSMIT BUFFER UNTIL EMPTY
>      if ((TXIF == TRUE) && (TXIE == TRUE))
// PIR1 register
>      {
>          if(TxSent < TxXmit)
>          {
>              bX = TxBuffer[TxSent];
>              TxSent++;
>              if (TxSent >= TxXmit)
//last byte sent, disable interrupt from TX
>              {
>                  TXIE = 0;
>                  TxXmit = 0;
>                  TxSent = 0;
>              }
>              TXREG = bX;
>          }
>      }
> }
> BYTE UART_RecvData(BYTE *bData)
> {
>      BYTE bCnt;
>      BYTE bX;
>
>      if(RxDone == 1)
>      {
>          for(bCnt = 0; bCnt < RxRecv; bCnt++)
>          {
>              bData[bCnt] = RxBuffer[bCnt];
>          }
>          bX = RxRecv;
>          RxRecv = 0;
>          RxDone = 0;
>          RCIE = 1;
>          
>          return bX;
>      }
>      else
>      {
>          return 0;
>      }
> }
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz 
> http://list.hw.cz/mailman/listinfo/hw-list
>

_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz http://list.hw.cz/mailman/listinfo/hw-list

_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list