 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4769 Aktiv.: 20.12 Kraj: Kobarid
|
Objavljeno: Sob Okt 17, 2009 2:15 pm Naslov sporočila: ARM UART irq |
|
|
Tokrat prvič uporabljam prekinitve za sprejem podatkov preko UART. Zadeva dela super. Problem je edino, ko ne vem, kdaj je konec prejetega sporočila. Nisem zasledil zastavice o KONČANEM prenosu? Namreč želim da mi kazalec na sporocilo zopet postavi na 0. Prikazani primer ne dela OK. Namreč prejete besedila (več bytov) mi lepi enega za drugim.... Besede so ločene z <CR>
Prilagam primer
Koda: |
void uart_i (void) __irq
{
IOSET0 = izh1; //mi prižge lučko
sporocilo[stevec]= U1RBR;
stevec++;
if (U1LSR == 0x0D)
{
stevec=0;
}
VICVectAddr = 0; /* acknowledge interrupt */
}
|
_________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3362 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sob Okt 17, 2009 4:22 pm Naslov sporočila: Nisem |
|
|
Nisem sicer močan v C-u, toda videti je, da prekinitvena rutina analizira, ali je sprejeti bajt 0D
in na osnovi le tega se postavi indeks na začetek
in tukaj je še dodati zastavico, en bit, ki ga je potrebno seveda definirati in tukaj postaviti na 1,
v glavnem programu pa testirati, ali je ta bit na 1 in če je obdelati sporočilo in postaviti bit spet na 0. _________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4769 Aktiv.: 20.12 Kraj: Kobarid
|
Objavljeno: Sob Okt 17, 2009 4:46 pm Naslov sporočila: |
|
|
Vilko hvala za odgovor
Težava je v tem, da sploh ne pride do tega, da postavi števen na 0.
Skoraj zagotovo bi moral biti kje kak bit v registru, ki sporoča, da je konec sprejema ali pa tudi ne ???? _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Sob Okt 17, 2009 5:55 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
PeterC Član

Pridružen-a: Tor 14 Dec 2004 20:22 Prispevkov: 204 Aktiv.: 0.86
|
Objavljeno: Sob Okt 17, 2009 5:56 pm Naslov sporočila: |
|
|
Hm... zakaj pa v U1LSR čakaš na CR (ASCII vrednost 0x0D)? U1LSR govori o statusu komunikacije, o napakah in podobno.
Preveri zadnjo brano vrednost
Koda: |
if (sporocilo[stevec] == 0x0D)
... |
_________________ Time is like a fuse, short and burning fast |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.04 Kraj: Novo mesto
|
Objavljeno: Sob Okt 17, 2009 6:26 pm Naslov sporočila: |
|
|
Pravilen odgovor je dal PeterC, Krokotov pa je povsem napačen.
Primer za LPC210x:
Koda: |
void uartInterrupt(void) __irq
{
U32 iir;
static U32 rxIdx;
volatile U32 dummy;
iir = U1IIR & 0x0E; //beremo interupt register
/* Rx Data Available */
if(iir == 0x04)
{
rxBuf[rxIdx] = U1RBR; //znak porinemo v rx buffer
if(rxBuf[rxIdx++] == 0x0D) rxIdx = 0; //če je znak 0x0D brišemo index
if(rxIdx == rxBufSize) rxIdx = 0; //če indeks preseže velikost bufferja
}
/* Receive Line Status */
else if(iir & 0x06){
dummy = U1LSR;
}
/* Char Time-out Indicator */
else if(iir == 0x0C){
dummy = U1RBR;
}
VICVectAddr = 0; //Acknowledge
}
|
Močno priporočljivo je, da implementiraš branje za vse možne primere, ki se utegnejo zgoditi, tudi če jih ne uporabljaš. Lahko se zgodi, da se ti sistem obesi, pa ne boš vedel zakaj. |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4769 Aktiv.: 20.12 Kraj: Kobarid
|
Objavljeno: Sob Okt 17, 2009 8:36 pm Naslov sporočila: |
|
|
Umnik hvala za kodo.
Sicer sem opazil, da sem imel tudi sam ene neumnosti v main. Sedaj dela kot je treba _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Sob Okt 17, 2009 9:36 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 497 dni
Powered by phpBB © 2001, 2005 phpBB Group
|