www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

LPC2138 in prekinitve - ne gre in ne gre - rabim pomoč

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Slemi
Član
Član



Pridružen-a: Pet 29 Okt 2004 13:29
Prispevkov: 386
Aktiv.: 1.63
Kraj: Hrastnik

PrispevekObjavljeno: Sob Maj 24, 2008 11:06 am    Naslov sporočila:  LPC2138 in prekinitve - ne gre in ne gre - rabim pomoč Odgovori s citatom

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



Startup.S.txt
 Opis:

Download
 Ime datoteke:  Startup.S.txt
 Velikost datoteke:  18.78 KB
 Downloadano:  18 krat

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo AIM - AOL Instant - naslov MSN Messenger - naslov
ThePohorc
Član
Član



Pridružen-a: Sre 01 Nov 2006 13:40
Prispevkov: 41
Aktiv.: 0.18
Kraj: Maribor

PrispevekObjavljeno: Ned Maj 25, 2008 2:16 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
rudiP
Član
Član



Pridružen-a: Tor 07 Avg 2007 15:30
Prispevkov: 1234
Aktiv.: 5.67
Kraj: KOPER

PrispevekObjavljeno: Pon Jul 28, 2008 9:44 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
rudiP
Član
Član



Pridružen-a: Tor 07 Avg 2007 15:30
Prispevkov: 1234
Aktiv.: 5.67
Kraj: KOPER

PrispevekObjavljeno: Sre Jul 30, 2008 7:25 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
reno
Neznanec
Neznanec



Pridružen-a: Pet 07 Nov 2008 13:28
Prispevkov: 4
Aktiv.: 0.02

PrispevekObjavljeno: Pet Jul 03, 2009 4:48 pm    Naslov sporočila:   Odgovori s citatom

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 Smile. 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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Benjamin
Član
Član



Pridružen-a: Tor 10 Jul 2007 11:23
Prispevkov: 116
Aktiv.: 0.53
Kraj: Trebnje, Ljubljana

PrispevekObjavljeno: Sob Jul 04, 2009 9:20 am    Naslov sporočila:   Odgovori s citatom

Ž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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
reno
Neznanec
Neznanec



Pridružen-a: Pet 07 Nov 2008 13:28
Prispevkov: 4
Aktiv.: 0.02

PrispevekObjavljeno: Sob Jul 04, 2009 7:02 pm    Naslov sporočila:   Odgovori s citatom

Hvala sem ugotovil problem po 3 dneh! Občutek uspeha je fenomenalen Smile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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