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

Pridružen-a: Pon 20 Mar 2006 21:20 Prispevkov: 16 Aktiv.: 0.07
|
Objavljeno: Ned Mar 26, 2006 8:56 pm Naslov sporočila: RTC interrupt problem |
|
|
Muci me naslednji problem. Nikakor mi ne uspe sproziti interrupna preko RTC-ja. RTC zenem z eksternim quarzom. RTC drugace deluje, vendar interrupta noce sproziti. Hocem interrupt vsako sekundo. Koda je naslednja:
Koda: |
void read_rtc(void) __attribute__ ((interrupt));
/* ------------------- Main -------------------- */
void main (void)
{
/* Initialize System */
Initialize();
/* Start RTC */
CCR = 0x11;
/* Disconnect pclk to RTC */
PCONP = 0x1815BE;
while (1)
{
}
}
/* --------------------- Initialize --------------------- */
void Initialize()
{
/* VPBDIV setting */
VPBDIV=0x0;
/* Intialize RTC */
CCR=0x2; // Reset the clock
ILR=0x3; // Enable both Tic and Alarm interrupt
CIIR = 0x1; // Interrupt every second
/* Initialize Vectored Interrupt Controller (VIC) */
VICIntSelect = 0x000; // asign to IRQ category
VICIntEnable = 0x2000; // enable RTC interrupt
VICVectCntl0 = 0x2d;
VICVectAddr0 = (unsigned long )read_rtc;
}
/* ----------------- RTC Interrupt Service Routine ----------------- */
void read_rtc(void)
{
/* Clearing Interrupt */
ILR=0x1;
// myCode
....
/* Updating VIC */
VICVectAddr=0xff;
}
|
Hvala za pomoc. |
|
Nazaj na vrh |
|
 |
bray Član


Pridružen-a: Sre 19 Jan 2005 23:53 Prispevkov: 327 Aktiv.: 1.38 Kraj: Vransko
|
Objavljeno: Ned Mar 26, 2006 9:25 pm Naslov sporočila: |
|
|
Samo preblisk...probaj ISR deklarirati se na ta dva nacina
Koda: |
void read_rtc(void) __attribute__((naked));
|
ali
Koda: |
void __attribute__ ((interrupt("IRQ"))) read_rtc(void);
|
probat ni greh  |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70656.54
|
Objavljeno: Ned Mar 26, 2006 11:07 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
blueH2O Član


Pridružen-a: Sob 30 Sep 2006 9:23 Prispevkov: 71 Aktiv.: 0.31
|
Objavljeno: Tor Okt 24, 2006 5:06 pm Naslov sporočila: |
|
|
Imam podobne težave kot AlesH - noče sprožiti prekinitev (ne glede na funkcijo). Kaj je narobe? Kolikor sem brskal po internetu, nisem našel pametnega odgovorova, čeprav takšen alogritem veliko uporabljajo.
Uporabljam LPC2138 in WinIDEA.
Koda: |
//program.c
#include "io.h"
#define IO0SEL (*((unsigned int *)0xe002c000))
#define PIN_EINT0 0x00004000 //EINT0
#define PIN_EINT1 0x00008000 //EINT1
#define PIN_EINT2 0x00010000 //EINT2
#define VICIntSelect (*((unsigned int *)0xFFFFF00C))
#define VICIntEnable (*((unsigned int *)0xFFFFF010))
#define VICVectAddr (*((unsigned int *)0xFFFFF030))
#define VICVectAddr0 (*((unsigned int *)0xFFFFF100))
#define VICVectCntl0 (*((unsigned int *)0xFFFFF200))
#define VICDefVectAddr (*((unsigned int *)0xFFFFF034))
//void __attribute__ (interrupt("IRQ")) Prekinitev(void);
void _InterruptInit();
void __attribute__((interrupt("IRQ"))) Prekinitev(void);
int main(void)
{
_LCDInit();
_KeyInit();
_InterruptInit();
_setcursortype(_NOCURSOR);
char chr;
clrscr();
printf("Welcome!\n\r");
//printf("Addr:%u", (unsigned long)Prekinitev);
while(1)
{
if(kbhit())
{
switch(getch())
{
case '0':
printf("Hello World!\n\r");
break;
case '1':
printf("ABC\n\r");
break;
}
}
}
return 0;
}
void _InterruptInit()
{
IO0SEL |= 0xC; //EINT0 enabled (P0.1)
VICIntSelect = 0; //0...IRQ, 1...FIQ
VICIntEnable = PIN_EINT0;
VICVectCntl0 = 0x2E;
VICVectAddr0 = (unsigned long)Prekinitev;
VICVectAddr = (unsigned long)Prekinitev;
VICDefVectAddr = (unsigned long)Prekinitev;
}
void __attribute__((interrupt("IRQ"))) Prekinitev(void)
{
clrscr();
printf("Prekinitev!\n\r");
while(!kbhit());
VICVectAddr = 0;
} |
|
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70656.54
|
Objavljeno: Tor Okt 24, 2006 6:58 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
blueH2O Član


Pridružen-a: Sob 30 Sep 2006 9:23 Prispevkov: 71 Aktiv.: 0.31
|
Objavljeno: Čet Okt 26, 2006 5:04 pm Naslov sporočila: |
|
|
Hvala MarE69, pri RTC se prekinitev vsaj sproži. printf() sem že črtal . Prejšni odgovor sem površno napisal - želel sem zunanjo prekinitev (EINT0).
Še vedno pa obstaja problem, da se sistem obesi pri prekinitvi. Skoči na napačen naslov. Kako bi to popravil in kako bi se lahko vrnil nazaj (pred sprožitvijo prekinitve)?
Mimogrede, kako se pri VICVectCntl določi večje vrednosti (nad 0x2F)? |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70656.54
|
Objavljeno: Čet Okt 26, 2006 9:35 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
blueH2O Član


Pridružen-a: Sob 30 Sep 2006 9:23 Prispevkov: 71 Aktiv.: 0.31
|
Objavljeno: Sob Nov 18, 2006 8:56 pm Naslov sporočila: |
|
|
MareE69, hvala za nasvete, sem poskušal že marsikaj, datasheet (interrupt tema) sem nekajkrat prebral, pa imam še vedno težave pri skoku na pravi naslov. Dvomim, da napaka izvira iz C-ja. Vseeno, če bi si kdo vzel 5 minutk, da pregleda izvorno kodo. Porabil sem že več ur, bog ve koliko jih bom moral še, da najdem pravo rešitev.
Če še enkrat opišem problem:
RTC in EINT se sprožita, vendar izvajanje programa ne skoči na ISR (v mojem primeru Prekintev())... Namesto tega sistem zamrzne (irq_except). |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Pon Nov 20, 2006 4:15 pm Naslov sporočila: |
|
|
A delaš s šarm-om? V sourcu sem videl, da maš include-an io.h ...
Sicer ne vem zagotovo, ker mam šarma šele par dni, samo meni zgleda, da v tistih datotekah, ki pridejo zraven (io.h, io.c, crt0.s), isr-ji niso pravilno popedenani. Oz. mogoče moraš na roke popravljat kaj v assemblerju?
Interrupte sem samo na hitro preizkusil, pa mislim da je bil enak problem - izvajanje skače na neke čudne lokacije.
Mimogrede: pišem knjižnico za vse, kar je gor na šarmu, tako da če ima kdo kaj kode, ki bi jo lahko prispeval (gpl licenca), se priporočam. Trenutno sem komaj pri tipkah in ledicah ... |
|
Nazaj na vrh |
|
 |
blueH2O Član


Pridružen-a: Sob 30 Sep 2006 9:23 Prispevkov: 71 Aktiv.: 0.31
|
Objavljeno: Sre Nov 22, 2006 4:28 pm Naslov sporočila: |
|
|
Res je potrebno modificirati crt0.s (za moj primer: "irq_addr: .long Prekinitev"), kar pa se mi ne zdi pošteno do C programerja ter tudi do ostalih začetnikov s Š-ARMom.
Citiram: |
Od kje je "priletel" lahko zelo enostavno ugotoviš. Nastavi prekinitev in poglej vrednost R14 (LR- link registra), ter odštej 4. |
Kako konkretno naredim to? Kako se vrnem na lokacijo pred prekinitvijo? |
|
Nazaj na vrh |
|
 |
BluPhenix Član

Pridružen-a: Pet 05 Mar 2004 12:54 Prispevkov: 1018 Aktiv.: 4.29 Kraj: Sežana
|
Objavljeno: Pet Mar 09, 2007 5:34 pm Naslov sporočila: |
|
|
Jaz imam enake probleme z delovanjem IRQ. Vse je tako, da bi moralo vstopiti v ISR, ampak ne vstopi. Sem poizkusil tudi z modificiranjem ctr0.s, tak okot si predlagal BlueH2O, vendar ne pomaga.
Pri tem pristopu mi je čudno tudi to, kako to rešiš, če imaš več IRQjev?
ŠE nekaj. Ko naložite ponovno program ali pa resetirate šarma, kakšne vrednosti imate v registrih ki nadzirajo VIC, meni namreč WinIDEA kaže, da so ostale prejšnje vrednosti. |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Sob Mar 10, 2007 9:43 pm Naslov sporočila: |
|
|
Hmmmm
Zakaj meni vedno napise napako, ko prevajam
error: #130: expected a "{"
Koda je sledeca:
Koda: |
void prekinitev (void) __fiq //prekinitvena rutina
{
IOSET0 = led_n;
EXTINT = 0x00000001; // tu brisemo zastavico inetupta !
}
|
V primiru, s kjer sem prepisal to, pa prevede normalno  _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
BluPhenix Član

Pridružen-a: Pet 05 Mar 2004 12:54 Prispevkov: 1018 Aktiv.: 4.29 Kraj: Sežana
|
Objavljeno: Ned Mar 11, 2007 3:25 am Naslov sporočila: |
|
|
Si prav deklariral funkcijo.
Predvidevam, da gre za Keil C. Spet pa ne more biti toliko drugače kot v gccju. V gccju, dodajaš besede (se trenutno ne spomnem, kako se jim reče ), samo v prototipu funkcije, ne v deklaraciji.
Poizkusi na način:
Koda: |
void prekinitev (void) __fiq; //prekinitvena rutina
void prekinitev(void)
{
IOSET0 = led_n;
EXTINT = 0x00000001; // tu brisemo zastavico inetupta !
}
|
Izgleda da parser v deklaraciji funkcije takoj za zaklepajem ne sprejema drugega kot {, torej ga moti tisti _fiq |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Ned Mar 11, 2007 10:53 am Naslov sporočila: |
|
|
Ja za KEIL gre
Tudi to ne pomaga
V tem primiru pa izpise napako
error: #247: function "prekinitev" has already been defined
Cudi me to, ker sem popolnoma isto stvar skopiral iz primira in tam je delovalo normalno. Ocitno je v startup.s en stos. Samo bog si ga vedi kateri, ker ce skopiram oni startup.s v moj projekt, mi izmece miljon napak
aja pa se to. Ce namesto __fiq uporabim __irq zadevo prevede normalno. Samo jaz bii zelel uporabljaji fast interrupte..... _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Ned Mar 11, 2007 1:13 pm Naslov sporočila: |
|
|
BlueH2O
Tako informativno.
Poiskusi postaviti prekinitveno rutino NAD rutino, kjer definiras VICdefVecAddr
Ne vem zakaj je tako, ampak pri meni tako dela! _________________ Lep dan
Simon |
|
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: 6 dni
Powered by phpBB © 2001, 2005 phpBB Group
|