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

Pridružen-a: Pet 29 Okt 2004 13:29 Prispevkov: 386 Aktiv.: 1.63 Kraj: Hrastnik
|
Objavljeno: Sob Maj 24, 2008 11:06 am Naslov sporočila: LPC2138 in prekinitve - ne gre in ne gre - rabim pomoč |
|
|
Pozdravljeni!
Upam, da mi bo lahko kdo pomagal. Mučijo pa me prekinitve na LPC2138, kot je že v naslovu napisano. Rad bi imel prekinitev na pozitivno in negativno flanko vhodnega signala. Ker nisem našel druge rešitve sem vzel dva vhoda, enega za pozitivno drugega za negativno in tudi dve različni prekinitvi. Rabim jih pa za merjenje PWM signala iz RV naprave za model letala. Dodajam tudi kodo, če mi lahko morda kdo iz nje pove, kaj delam narobe. Delam pa z ARMGCC in Eclipse.
interrupts.c
Koda: |
#include "LPC214x.h"
#include "interrupts.h"
//EINT2 P0.15 positive edge FIQ
//EINT0 P0.16 negative edge IRQ
void setupInterrupts(void)
{
PINSEL0 = 0x10000000; //P0.15 as EINT2 FIQ
PINSEL1 = 0x00000001;//P0.16 as EINT0 vectored IRQ
VICIntSelect = 0x00010000; //Enable VIC channel as FIQ for EINT2
VICVectCntl0 = 0x0000002E; //bit 5 enables slot (14 for EINT0) for EINT0
EXTPOLAR = 0x00000004;
EXTMODE = 0x00000005;
VICVectAddr0 = (unsigned long)EINT0_routine;// Pass address of IRQ in to VIC slot
VICIntSelect = 0x00014000; //Enable EINT2 and EINT0 interrupts in VIC
VICIntEnable = 0x00014000; //Enable EINT2 and EINT0 interrupts in VIC
IOSET1 = 0x00800000;
}
void __attribute__ ((interrupt("IRQ"))) EINT0_routine(void)
{
EXTINT = 0x00000001; //Clear EINT0 interrupt flag
VICVectAddr = 0; //Dummy write to signal end of interrupt
IOSET1 = 0x00020000;
}
void __attribute__ ((interrupt("FIQ"))) EINT2_routine(void)
{
EXTINT = 0x00000004; //Clear EINT2 interrupt flag
IOSET1 = 0x00010000;
} |
Startup.S je v prilogi, ker je predolg za tule zraven.
Hvala že vnaprej!
LP
Gregor
Opis: |
|
 Download |
Ime datoteke: |
Startup.S.txt |
Velikost datoteke: |
18.78 KB |
Downloadano: |
18 krat |
|
|
Nazaj na vrh |
|
 |
ThePohorc Član


Pridružen-a: Sre 01 Nov 2006 13:40 Prispevkov: 41 Aktiv.: 0.18 Kraj: Maribor
|
Objavljeno: Ned Maj 25, 2008 2:16 pm Naslov sporočila: |
|
|
Zdravo!
Prilagam ti kodo prevedeno s KEIL prevajalnikom. Stestirano na MCB2130. Dela na gumb INT1 (P0.14).
Koda: |
#include <stdio.h> /* standard I/O .h-file */
#include <LPC213x.H> /* LPC213x definitions */
#define TRUE 1
__irq void TestMainISR(void)
{
EXTINT = 0x02; /* Clear interrupt flag */
VICVectAddr = 0; /* Acknowledge Interrupt */
}
/* Setup the Interrupt */
void InitInter (void)
{
PINSEL0 |= (1<<29); //Nastavim P.014 kot EINT1
EXTMODE = 0x02; //EINT1 je obcutljiv na fronto
EXTPOLAR = 0x02; //EINT1 je obcutljiv na "Vzhajajoco fronto" ( Prosim, za dober prevod... :)) )
VICIntSelect &=~(1<<15);
VICIntEnable |= 1<<15; //Omogocim samo EINT1 prekinitev
VICVectAddr0 = (unsigned long)TestMainISR; //Nastavim funkcijo, ki se odziva na prekinitev
VICVectCntl0 = 0x20 | 15; //Definiram EINT1
EXTINT = 0x02;
VICVectAddr = 0;
}
int main (void)
{
InitInter();
while(TRUE) /*Večna zanka...*/
{
}
}
|
Na koncu prilagam še svoj startup...
|
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 5.67 Kraj: KOPER
|
Objavljeno: Pon Jul 28, 2008 9:44 pm Naslov sporočila: |
|
|
Na plati MCB2130 sem uspel ločeno aktivirati EXTINT1 in RTC. Imam probleme pri
aktiviranju obeh istočasno. Kako to lahko rešim ?
_________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 5.67 Kraj: KOPER
|
Objavljeno: Sre Jul 30, 2008 7:25 am Naslov sporočila: |
|
|
Vaja dela mojstra !
Primer, kako se lahko definira več interaptov.
Koda: |
void Init_Inter()
{
PINSEL0 |= (1<<29); //Nastavim P.014 kot EINT1
EXTMODE = 0x02; //EINT1 je obcutljiv na fronto
EXTPOLAR = 0x00; //EINT1 je obcutljiv na "Padajočo fronto"
CCR = 0x10; // RTC disable
/* Inicializacija TIMER0 */
T0TCR = 0; // ustavimo timer
T0PR = 120000; // stejemo milisekunde; preipheral clock = 12MHz
T0TC = 0;
T0MCR = 0x00000003; // Vklopimo Interrupt za TIMER0; pri prekinitvi resetiramo TC (T0TC=0)
T0MR0 = 1; //hitrost; // Do prekinitve pride, ko je TC enak MR0, torej ko mine dolocen cas (hitrost)
EXTINT = 0x02;
//* VPBDIV setting */
VPBDIV = 0x0;
AMR = 0; // initialize interrupt mask register of RTC
CIIR = 0x01; // Enable interrupt every seconds
ILR = 0x3; // clear all interrupt of RTC
VICIntSelect = 0x00000000;
VICIntEnable = 0x0000A010; //Omogocim TIMER0 , RTC, EINT1 prekinitev
VICVectCntl0 = 0x20 + 4; //Definiram Timer0
VICVectCntl1 = 0x20 + RTC_NUM; //Definiram RTC
VICVectCntl2 = 0x20 + EINT_NUM; //Definiram EINT1
VICVectAddr0 = (unsigned)Timer0_ISR; //Nastavim funkcijo, ki se odziva na prekinitev
VICVectAddr1 = (unsigned int)RTC_isr; //Nastavim funkcijo, ki se odziva na prekinitev
VICVectAddr2 = (unsigned long)TestMainISR; //Nastavim funkcijo, ki se odziva na prekinitev
T0TCR = 1; // start timer
CCR = 0x11; // rtc enable
} |
_________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
reno Neznanec

Pridružen-a: Pet 07 Nov 2008 13:28 Prispevkov: 4 Aktiv.: 0.02
|
Objavljeno: Pet Jul 03, 2009 4:48 pm Naslov sporočila: |
|
|
Pozdravljeni!
Trudim in trudim se in mi nikakor ne uspe usposobiti prekinitev. Imam popolnoma enak primer. S tipko bi rad izvedel prekinitev. Kot vidim je koda ThePohorc-a na las podobna moji kodi prav tako so vrednosti registrov enake in ne razumem zakaj stvar ne deluje. Prebral sem že vse možne dokumentacije, vodiče in forume programske kode so povsod popolnoma enake. Verjetno je res nekaj v zvezi s startup programi, ki pa po pravici povedano ne razumem točno kako je v povezavi s kodo, ki jo sam napišem v C jeziku. Vem, da mora startup koda vsebovati vektorske tabele, da deluje in moja startup koda to vsebuje vendar še vedno ne deluje kaj pa vem. Trudim se že par dni in ni napredka počasi se me loteva obup . Ko program zaženem se željene vrednosti v register zapišeju tukaj ni problema. Nakoncu se mi program vrti v neskončni zanki in bi v primeru, če bi delovalo bi se s pritiskom na tipko sprožila prekinitev. V startup dadoteki se mi zacikla na tem ukazu, ki pa ne vem kaj pomeni. "irq_except b irq_except".
|
|
Nazaj na vrh |
|
 |
Benjamin Član

Pridružen-a: Tor 10 Jul 2007 11:23 Prispevkov: 116 Aktiv.: 0.53 Kraj: Trebnje, Ljubljana
|
Objavljeno: Sob Jul 04, 2009 9:20 am Naslov sporočila: |
|
|
Živjo!
V startup datoteki moraš zamenjati naslov interrupt vektorja.
Koda: |
b _start /* reset - _start */
ldr pc, _undf /* undefined - _undf */
ldr pc, _swi /* SWI - _swi */
ldr pc, _pabt /* program abort - _pabt */
ldr pc, _dabt /* data abort - _dabt */
nop /* reserved */
ldr pc, [pc,#-0xFF0] /* IRQ - read the VIC */
ldr pc, _fiq /* FIQ - _fiq */
|
Poglej si predzadnjo vrstico!
_________________ Cessna 152: "Flight Level Three Thousand, Seven Hundred"
Controller: "Roger, contact Houston Space Center" |
|
Nazaj na vrh |
|
 |
reno Neznanec

Pridružen-a: Pet 07 Nov 2008 13:28 Prispevkov: 4 Aktiv.: 0.02
|
Objavljeno: Sob Jul 04, 2009 7:02 pm Naslov sporočila: |
|
|
Hvala sem ugotovil problem po 3 dneh! Občutek uspeha je fenomenalen .
|
|
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: 496 dni
Powered by phpBB © 2001, 2005 phpBB Group
|