Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

LPC2103 externe interrupt probleem

Pagina: 1
Acties:
  • 459 views sinds 30-01-2008
  • Reageer

  • wontcachme
  • Registratie: September 2005
  • Laatst online: 22:35

wontcachme

You catch me? No you wont

Topicstarter
Ik ben even helemaal de weg kwijt. Ik ben bezig met een ogenschijnlijk" simpel" programma voor de LPC2103. Deze maak ik op dit ontwikkelbord: iARM-2103 Board van Imagecraft. Ik ben hiermee begonnen omdat ik mezelf wat wilde leren met de LPC2103, maar het gaat nog niet zo simpel als ik hoopte.

Ik ben nu een tijd aan het code tikken en analyseren maar de problemen worden steeds vager. Eerst kreeg ik, wat ik ook deed in mijn code, een externe interrupt die "hoog" was (3.3 Volt) zonder er een signaal of iets op te zetten. Nu heb ik dat verholpen, echter welke output ik nu ook maar "hoog" maak, gebeurt er niks. Behalve bij de ledjes die erboven op zitten. Die werken wel goed

Ik probeer om 1 output pin hoog te maken en een andere als externe interrupt te laten werken. Als op de externe interrupt GEEN signaal komt van de hoge output, dan moet het groene ledje branden. Is er wel een externe interrupt, dan moet het groene ledje uitgaan en de rode led aan.

Mijn code:
C: MAIN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
 
#include <NXP/iolpc2103.h>
#include "arm_interrupt.h"


int main(void);
void init_devices (void);
void pll_init (void);
void power_init (void);
void mam_init (void);
void apb_init (void);
void port_init (void);
void ExtInt1_init (void);   
__irq __arm void ExtInt1_isr (void);


int main()
{
  init_devices ();     
    do                                                   
    {
     FIOCLR2_bit.P0_17 = 1; // Groene LED aan
     FIOSET2_bit.P0_18 = 1; // Rode LED uit
    } 
    while(1);               // Lege eindeloze lus
} 
 

void init_devices (void)
{
  pll_init();             //Standaard instellingen voor iARM-2103: ~60MHz   
  power_init();           //Alle functies uitschakelen
  mam_init();             //MAM volledig ingeschakelen
  apb_init();             //APB klok = PLL klok/4
  port_init();            //Standaard instellingen voor iARM-2103: LED's uit 
  ExtInt1_init ();        //Initialisatie's voor de externe interrupt EINT1
}


void pll_init (void)
{
  PLLCON = 0x01;        
  PLLCFG = 0x23;        
  PLLFEED = 0xAA;       
  PLLFEED = 0x55;       
  while (!(PLLSTAT&0x0400));
  PLLCON |= 0x02;        
  PLLFEED = 0xAA;
  PLLFEED = 0x55;
}


void power_init (void)
{
  PCONP = 0x00000000;                 
}


void mam_init (void)
{
  MAMTIM = 0x04;        
  MAMCR = 0x02;          
}


void apb_init (void)
{
  APBDIV = 0x00;        
}


void port_init (void)
{
  SCS_bit.GPIO0M = 1;             // highspeed GPIO

  FIODIR2_bit.P0_17 = 1;          // Groene LED als uitgang
  FIODIR2_bit.P0_18 = 1;          // Rode LED als uitgang
  FIODIR1_bit.P0_15 = 1;          // P0.15 als uitgang
   
  FIOSET2_bit.P0_17 = 1;          // Groene LED uit
  FIOSET2_bit.P0_18 = 1;          // Rode LED uit
  FIOCLR1_bit.P0_15 = 1;          // P0.15 HOOG maken (3.3 Volt)

  PINSEL0 = 0x20000000;           // P0.14 in de stand van EINT1 zetten
}

void ExtInt1_init (void)
{
  EXTMODE      = 1;                           // EINT1 in de "level" schakel modus
  EXTPOLAR     = 2;                           // EINT1 = positief bij opgaande flank van puls

  VICVectAddr1 = (unsigned long)ExtInt1_isr;
  VICVectCntl0 = 0x21 | 15;                   // VIC1 gebruiken voor EINT1 interrupt
  VICIntEnable = 1 << 15;                     // EINT1 interrupt inschakelen

}
 
 __irq __arm void ExtInt1_isr (void) 
{
  FIOSET2_bit.P0_17 = 1;        // Groene LED uit
  FIOCLR2_bit.P0_18 = 1;        // Rode LED aan

  EXTINT      = 2;              // EINT1 interrupt flag
  VICVectAddr = 0x00000000;     // Acknowledge Interrupt
}

 


Wie o wie kan me helpen, want ik begin nu totaal gek te worden. Heb inmiddels alle interrupt voorbeelden van de LPC2100 serie gezien en kom er nog niet uit.

GamePC (AMD Ryzen 5900x - Gigabyte RTX 3070 Gaming OC 8G - Gigabyte Aorus X570 ELITE - 32GB Corsair Vengeance 3600C18 - 1.5TB Samsung 970 EVO NVME - 500GB Samsung 950 EVO Sata - Fractal Design Define 7 - Corsair RM750x - 2x Asus VG27AQ 1440p@144hz)


  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 29-10 06:07

Sprite_tm

Semi-Chinees

Errm, je loopt nu continue je groene led aan en je rode led uit te zetten. Zodra de interrupt gebeurt word het voor een fractie van een us andersom gezet, maar zodra je je interruptroutine verlaat, knal je weer in je main-loop die de groene led aanzet en de rooie uitzet. Lijkt me niet de bedoeling?

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog


  • wontcachme
  • Registratie: September 2005
  • Laatst online: 22:35

wontcachme

You catch me? No you wont

Topicstarter
Sprite_tm schreef op maandag 17 december 2007 @ 19:46:
Errm, je loopt nu continue je groene led aan en je rode led uit te zetten. Zodra de interrupt gebeurt word het voor een fractie van een us andersom gezet, maar zodra je je interruptroutine verlaat, knal je weer in je main-loop die de groene led aanzet en de rooie uitzet. Lijkt me niet de bedoeling?
Om de externe interrupt(P0.14) hoog te krijgen verbind ik die met P0.15 die P0.14 hoog maakt dmv een jumper. Dus in principe zou de rode led gewoon moeten aanblijven omdat de verbinding gewoon blijft zitten. Wat jij zegt is eigenlijk wel de bedoeling. Ik wil visueel kunnen zien wanneer in welke stand de uController zich bevindt. De main loop is groene LED, de interrupt = rode LED

Maar met de code die er nu staat krijg ik inmiddels geen P0.15 meer "hoog" geen enkele poort behalve de ledjes zelfs.

[ Voor 10% gewijzigd door wontcachme op 17-12-2007 21:59 ]

GamePC (AMD Ryzen 5900x - Gigabyte RTX 3070 Gaming OC 8G - Gigabyte Aorus X570 ELITE - 32GB Corsair Vengeance 3600C18 - 1.5TB Samsung 970 EVO NVME - 500GB Samsung 950 EVO Sata - Fractal Design Define 7 - Corsair RM750x - 2x Asus VG27AQ 1440p@144hz)


  • Cassettebandje
  • Registratie: Juli 2002
  • Laatst online: 20:56

Cassettebandje

SA-C90 TDK

Wat sprite zegt idd: je mainloop doet dit:
C:
1
2
3
4
5
6
7
8
9
10
int main()
{
  init_devices ();     
    do                                                   
    {
     FIOCLR2_bit.P0_17 = 1; // Groene LED aan
     FIOSET2_bit.P0_18 = 1; // Rode LED uit
    } 
    while(1);               // Lege eindeloze lus
}  


Op een gegeven moment komt er een interrupt:
C:
1
2
3
4
5
6
7
8
 __irq __arm void ExtInt1_isr (void) 
{
  FIOSET2_bit.P0_17 = 1;        // Groene LED uit
  FIOCLR2_bit.P0_18 = 1;        // Rode LED aan

  EXTINT      = 2;              // EINT1 interrupt flag
  VICVectAddr = 0x00000000;     // Acknowledge Interrupt
}

Die interrupt zet je groene led uit en je rode aan. Leuk, maar als de interrupt afgelopen is wordt in regel 6 en 7 van stukje 1 alles weer zo gezet als het was.
Doe in je eens iets als:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
  init_devices ();     
    do                                                   
    {
     FIOCLR2_bit.P0_17 = 1; // Groene LED aan
    } 
    while(1);               // Lege eindeloze lus
}  

 __irq __arm void ExtInt1_isr (void) 
{
    // Of hoe je dat ook doet:
  P0_18 = !P0_18;        // Rode LED omzetten

  EXTINT      = 2;              // EINT1 interrupt flag
  VICVectAddr = 0x00000000;     // Acknowledge Interrupt
}

  • la_fusion
  • Registratie: Maart 2007
  • Laatst online: 21-11 13:18
(jarig!)
Gooi voor de grap eens een flinke wachtloop in je interrupt of vang het even af door een var een waarde mee te geven en deze pas weer te resetten als je opnieuw in de interrupt komt.

  • wontcachme
  • Registratie: September 2005
  • Laatst online: 22:35

wontcachme

You catch me? No you wont

Topicstarter
Ik zal dit bovenstaande asap proberen, maar ik heb nu ff geen tijd ervoor.

@Springuin
Die code die ik heb staan over de interrupt en die jij hebt staan komen toch op hetzelfde neer? Jij doet alleen de groene niet uit en je inverteerd P0.18. Dat is hetzelfde als FIOCLR2_bit.P0_18 = 1 volgens mij.

@la_fusion
Bedoel je gewoon dat de tijd van het rode ledje aan te snel gaat waardoor het niet te zien is en daarom een delay erin zetten?

Echter ben ik na vandaag nog steeds niet van een ander probleem af dat er mee samenhangt. Ik krijg behalve de ledjes geen enkele uitgang meer "Hoog" Dus ik kan nu niet eens een "hoog" op de externe interrupt zetten omdat de pin die ik ermee wil doorverbinden niet "Hoog" wordt. Dit terwijl de code wel gewoon klopt volgens mij. Aangezien het eerst wel werkte voordat ik met de interrupt settings en dergelijke begon.

GamePC (AMD Ryzen 5900x - Gigabyte RTX 3070 Gaming OC 8G - Gigabyte Aorus X570 ELITE - 32GB Corsair Vengeance 3600C18 - 1.5TB Samsung 970 EVO NVME - 500GB Samsung 950 EVO Sata - Fractal Design Define 7 - Corsair RM750x - 2x Asus VG27AQ 1440p@144hz)


  • la_fusion
  • Registratie: Maart 2007
  • Laatst online: 21-11 13:18
(jarig!)
Probeer eens
code:
1
2
IODIR0 = 0x???; //Poort waar die aanhangt.
IOSET0 = 0x???; //Poort waar die aanhangt.


Mocht dit niet werken plak je de volgende regel er nog bij:
code:
1
IOCLR0 = 0x????; //Poort waar die aanhangt.


Natuurlijk als ie op GPIO poort 1 hangt ipv IODIR0 etc IODIR1.

Het kan ook zijn dat je eerst de pinnen als output moet zetten. Dit doe je met PINSEL0/1/2; Even in de usermanual kijken daarvoor.

Ik bedoel inderdaad dat het te snel gaat. Een delay is een makkelijke for loop.

  • wontcachme
  • Registratie: September 2005
  • Laatst online: 22:35

wontcachme

You catch me? No you wont

Topicstarter
UPDATE:

Ik heb inmiddels jullie suggesties toegepast. De FOR loopt werkte niet dus heb ik de 2 regels voor de interruptledjes (FIOSET2_bit.P0_17 = 1; en FIOCLR2_bit.P0_18 = 1;) in een eeuwige loop gezet (while(1)). Hierbij kwam geen eens een de interrupt aangezien het groene ledje aanbleef. Ik kom dus tot de conclusie dat P0.15 niet hoog wordt (heb hem aan de oscilioscoop gehangen met pin nummer 15), die bleef rond de 32 mV hangen. Schakel ik de PINSEL code uit, dan komt hij tot 400mV maximaal.

De uitleg die staat in de onttwikkelbordje handleiding:

P0.14/DCD1/SCK1/EINT1 functions as GPIO, Data carrier detect input for UART-1, SPI-1 serial communications clock, or Active low external interrupt input 1. This pin is also required for device programming through the USB serial flash loader and is held low during reset, by setting DIP switch position 2 in the on/down position, to put the device into the flash-loading mode. This pin must be high upon board power-up for normal run operation to occur.

P0.15/RI1/EINT2 functions as GPIO, Ring indicator input for UART-1, or Active low external interrupt input 2.


De pinnetjes die ik heb gekozen zouden dus moeten werken in de gekozen functies (P0.14 als externe interrupt input en P0.15 als output)

Mijn code in het project nu:
C: MAIN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
 
#include <NXP/iolpc2103.h>
#include "arm_interrupt.h"

int main(void);
void init_devices (void);
void pll_init (void);
void power_init (void);
void mam_init (void);
void apb_init (void);
void port_init (void);
void ExtInt1_init (void);   

__irq __arm void ExtInt1_isr (void);

int main()
{
    
  init_devices ();     
    do                                                   
    {
     FIOCLR2_bit.P0_17 = 1; // Groene LED aan
     FIOSET2_bit.P0_18 = 1; // Rode LED uit
    } 
    while(1);               // Lege eindeloze lus
} 

void init_devices (void)
{
  pll_init();             //Standaard instellingen voor iARM-2103: ~60MHz   
  power_init();           //Alle functies uitschakelen
  mam_init();             //MAM volledig ingeschakelen
  apb_init();             //APB klok = PLL klok/4
  port_init();            //Standaard instellingen voor iARM-2103: LED's uit 
  ExtInt1_init ();        //Initialisatie's voor de externe interrupt EINT1
}

void pll_init (void)
{
  PLLCON = 0x01;        
  PLLCFG = 0x23;        
  PLLFEED = 0xAA;       
  PLLFEED = 0x55;       
  while (!(PLLSTAT&0x0400));
  PLLCON |= 0x02;        
  PLLFEED = 0xAA;
  PLLFEED = 0x55;
}

void power_init (void)
{
  PCONP = 0x00000000;                 
}

void mam_init (void)
{
  MAMTIM = 0x04;        
  MAMCR = 0x02;          
}

void apb_init (void)
{
  APBDIV = 0x00;        
}

void port_init (void)
{
  SCS_bit.GPIO0M = 1;             // highspeed GPIO
  PINSEL0 = 0x01000000;           // P0.15 in de stand van GPIO zetten
  PINSEL0 = 0x20000000;           // P0.14 in de stand van EINT1 zetten
  FIODIR2_bit.P0_17 = 1;          // Groene LED als uitgang
  FIODIR2_bit.P0_18 = 1;          // Rode LED als uitgang
  FIODIR1_bit.P0_15 = 1;          // P0.15 als uitgang
  FIODIR1_bit.P0_14 = 0;          // 
   
  FIOCLR2_bit.P0_17 = 1;          // Groene LED uit
  FIOSET2_bit.P0_18 = 1;          // Rode LED uit
  FIOCLR1_bit.P0_15 = 1;          // P0.15 HOOG maken (3.3 Volt)
}

void ExtInt1_init (void)
{
  EXTMODE      = 1;                           // EINT1 in de "level" schakel modus
  EXTPOLAR     = 2;                           // EINT1 = positief bij opgaande flank van puls

  VICVectAddr1 = (unsigned long)ExtInt1_isr;
  VICVectCntl0 = 0x21 | 15;                   // VIC1 gebruiken voor EINT1 interrupt
  VICIntEnable = 1 << 15;                     // EINT1 interrupt inschakelen
}
 __irq __arm void ExtInt1_isr (void) 
{
 
  FIOSET2_bit.P0_17 = 1;        // Groene LED uit
  FIOCLR2_bit.P0_18 = 1;        // Rode LED aan
    
  EXTINT      = 2;              // EINT1 interrupt flag
  VICVectAddr = 0x00000000;     // Acknowledge Interrupt
}


Ik heb inmiddels geen enkel idee meer wat het kan zijn. Heb alweer 2 dagen zitten stoeien ermee en mijn ideeën zijn nu op.

GamePC (AMD Ryzen 5900x - Gigabyte RTX 3070 Gaming OC 8G - Gigabyte Aorus X570 ELITE - 32GB Corsair Vengeance 3600C18 - 1.5TB Samsung 970 EVO NVME - 500GB Samsung 950 EVO Sata - Fractal Design Define 7 - Corsair RM750x - 2x Asus VG27AQ 1440p@144hz)


  • wontcachme
  • Registratie: September 2005
  • Laatst online: 22:35

wontcachme

You catch me? No you wont

Topicstarter
Subtiel kickje

GamePC (AMD Ryzen 5900x - Gigabyte RTX 3070 Gaming OC 8G - Gigabyte Aorus X570 ELITE - 32GB Corsair Vengeance 3600C18 - 1.5TB Samsung 970 EVO NVME - 500GB Samsung 950 EVO Sata - Fractal Design Define 7 - Corsair RM750x - 2x Asus VG27AQ 1440p@144hz)


  • wacco
  • Registratie: Augustus 2002
  • Laatst online: 21-03-2023

wacco

cli, hlt.

Je hebt in de code die je gisteren hebt geplaatst nog steeds staan dat de groene led aan moet, in je main loop. Hierdoor zet je interrupt deze misschien wel uit, binnen een paar microseconden wordt deze weer aan gezet door de main loop welke nadat de interrupt is afgelopen vrolijk verder gaat. In andere woorden; veel te snel om voor je ogen door te hebben.

Dus wijzig:
C: MAIN
1
2
3
4
5
6
7
8
9
 
int main() {
  init_devices ();     
    FIOCLR2_bit.P0_17 = 1; // Groene LED eenmaal aan, niet in de while loop
    do {
     FIOSET2_bit.P0_18 = 1; // Rode LED uit
    } 
    while(1);               // eindeloze lus
} 

Zoals een paar anderen ook al eerder zeiden. ;)

Spolap: Interactive webcomic


  • wontcachme
  • Registratie: September 2005
  • Laatst online: 22:35

wontcachme

You catch me? No you wont

Topicstarter
Zal er morgen nog eens naar kijken.

Ik meende namelijk dat als ik in de interrupt terecht kom, dat die dan daar in bleef totdat de spanning van pin 14 wordt gezet. /maar wat jullie zeggen is eigenlijk gaat hij de interrupt in, doorloopt hem en gaat weer naar groen toe en dan weer interrupt in. Echter als ik dat lees denk ik dat hij net zolang in de main hangt dan in de interrupt, dus zou je ze beide moeten zien.

Vanavond tijdens het testen weer wat nieuws. Maak ik p0.15 hoog, dan wordt die niet 2.4 volt over hoger, wat een "hoog" is, maar 0.4 Volt, wat de maximum "laag" stand is.

GamePC (AMD Ryzen 5900x - Gigabyte RTX 3070 Gaming OC 8G - Gigabyte Aorus X570 ELITE - 32GB Corsair Vengeance 3600C18 - 1.5TB Samsung 970 EVO NVME - 500GB Samsung 950 EVO Sata - Fractal Design Define 7 - Corsair RM750x - 2x Asus VG27AQ 1440p@144hz)


  • jerbro
  • Registratie: September 2001
  • Niet online
Je hebt in je code:
EXTMODE = 1;
Volgens mij maak je hiermee:
EINT0 : 1, dus level sensitive,
EINT1 : 0, dus edge sensitive
EINT2 : 0, dus edge sensitive


Oeps, ik keek verkeerd in de datasheet, je maakt EINT1 dus wel level sensitive.

[ Voor 31% gewijzigd door jerbro op 04-01-2008 23:21 . Reden: Verkeerd datasheet gelezen ]


  • lemming_nl
  • Registratie: Juli 2004
  • Niet online
Ik weet niet hoe dat bij dat bordje zit maar het idee van een interrupt is toch dat hij reageert op een flank? Zodra hij hoog wordt wordt de interrupt dus 1x uitgevoerd en daarna niet meer ook al blijft de pin hoog.

Hmm @ hierboven, heb de handleiding niet doorgelezen maar hij lijkt mij erg apart als hij continue die interrupt in en uit blijft gaan.

[ Voor 24% gewijzigd door lemming_nl op 04-01-2008 23:36 ]

Geluk is een weerloos oud vrouwtje, alleen op straat met een bom geld


  • skr
  • Registratie: Juli 2003
  • Laatst online: 03-09 21:04

skr

Je moet wat zorgvuldiger proggen. Kijk eens naar onderstaande. Regel 2 maakt (de foute en onnodige) regel 1 ongedaan.

C: MAIN
1
2
3
4
5
6
7
PINSEL0 = 0x01000000;           // P0.15 in de stand van GPIO zetten
PINSEL0 = 0x20000000;           // P0.14 in de stand van EINT1 zetten

// Gebruik met dit soort registers altijd OR functie...

PINSEL0 |= 0x01000000;           // Dit is dus niet P0.15 in GPIO zetten! Deze regel kan je dus weglaten (lees datasheet!) 
PINSEL0 |= 0x20000000;           // P0.14 in de stand van EINT1 zetten


Daarbij moet je interupts anders aanpakken. Begin eens bij edge trigered

Je ISR wordt dan zoiets

C: MAIN
1
2
3
4
5
6
7
 __irq __arm void ExtInt1_isr (void) 
{ 
    FIO0PIN ^= (1<<18); // dit toggled je led op pin 0.18 dmv XOR functie

 // .... Clear interupt dingen hier

}


Je main loop

C: MAIN
1
2
3
4
5
6
7
8
int main()
{
    
  init_devices ();   
  while(1); // Die doet dus ff lekker niets (niet nodig ook voor led flash)

  return 0;  // Dit punt kunnen we toch nooit bereiken..
}

  • wontcachme
  • Registratie: September 2005
  • Laatst online: 22:35

wontcachme

You catch me? No you wont

Topicstarter
Ik heb inmiddels jullie oplossingen getest en erin gezet. De code is nu dit:

C: MAIN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
 
#include <NXP/iolpc2103.h>
#include "arm_interrupt.h"

int main(void);
void init_devices (void);
void pll_init (void);
void power_init (void);
void mam_init (void);
void apb_init (void);
void port_init (void);
void ExtInt1_init (void);   

__irq __arm void ExtInt1_isr (void);


int main()
{
  
  init_devices (); 
  
  FIOCLR2_bit.P0_17 = 1; // Groene LED aan

  do                                                   
    {
    FIOSET2_bit.P0_18 = 1; // Rode LED uit
    } 
    while(1);               // eindeloze lus
} 
 
void init_devices (void)
{
  pll_init();             //Standaard instellingen voor iARM-2103: ~60MHz   
  power_init();           //Alle functies uitschakelen
  mam_init();             //MAM volledig ingeschakelen
  apb_init();             //APB klok = PLL klok/4
  port_init();            //Standaard instellingen voor iARM-2103: LED's uit 
  ExtInt1_init ();        //Initialisatie's voor de externe interrupt EINT1
}

void pll_init (void)
{
  PLLCON = 0x01;        
  PLLCFG = 0x23;        
  PLLFEED = 0xAA;       
  PLLFEED = 0x55;       
  while (!(PLLSTAT&0x0400));
  PLLCON |= 0x02;        
  PLLFEED = 0xAA;
  PLLFEED = 0x55;
}

void power_init (void)
{
  PCONP = 0x00000000;                 
}

void mam_init (void)
{
  MAMTIM = 0x04;        
  MAMCR = 0x02;          
}

void apb_init (void)
{
  APBDIV = 0x00;        
}

void port_init (void)
{
  SCS_bit.GPIO0M = 1;             // highspeed GPIO
  PINSEL0 |= 0x20000000;           // P0.14 in de stand van EINT1 zetten
  FIODIR2_bit.P0_17 = 1;          // Groene LED als uitgang
  FIODIR2_bit.P0_18 = 1;          // Rode LED als uitgang
  FIODIR1_bit.P0_15 = 1;          // P0.15 als uitgang
   
  FIOCLR2_bit.P0_17 = 1;          // Groene LED uit
  FIOSET2_bit.P0_18 = 1;          // Rode LED uit
  FIOCLR1_bit.P0_15 = 1;          // P0.15 HOOG maken (3.3 Volt)
}

void ExtInt1_init (void)
{
  EXTMODE      = 1;                           // EINT1 in de "level" schakel modus
  EXTPOLAR     = 2;                           // EINT1 = positief bij opgaande flank van puls

  VICVectAddr1 = (unsigned long)ExtInt1_isr;
  VICVectCntl0 = 0x21 | 14;                   // VIC1 gebruiken voor EINT1 interrupt
  VICIntEnable = 1 << 14;                     // EINT1 interrupt inschakelen
}

 __irq __arm void ExtInt1_isr (void) 
{
  FIOPIN ^= (1<<18);  // dit toggled je led op pin 0.18 dmv XOR functie
    
  EXTINT      = 2;              // EINT1 interrupt flag
  VICVectAddr = 0x00000000;     // Acknowledge Interrupt
}


Gewijzigd:
- FIOPIN ^= (1<<18); toegevoegd
- FIODIR1_bit.P0_14 = 0; verwijderd. Niet nodig lijkt mij aangezien de externe interrupt al een input is standaard.
- FIOCLR2_bit.P0_17 = 1; uit de main gehaald en ervoor gezet.
- PINSEL0 |= 0x01000000; verwijderd. Niet nodig
- PINSEL0 |= 0x20000000; aangepast.
- VICVectCntl0 = 0x21 | 14; Stond eerst VICVectCntl0 = 0x21 | 15; echter pin 14 = externe interrupt dus 15 moest 14 zijn.
- VICIntEnable = 1 << 14; Stond eerst VICIntEnable = 1 << 15; echter pin 14 = externe interrupt dus 15 moest 14 zijn.

Nu ik dit heb aangepast werkt het nog niet. De spanning op pin 15 met deze code is 0Volt. Verander ik de CLR in SET in die regel, dan is het 0.4Volt (VOL --> maximum output voltage laag signaal = 0.4 Volt). En aangezien p0.15 "hoog" (~5volt) moet zijn om de externe interrupt "hoog" te krijgen, werkt dit dus nog niet. Ik neem tenminste aan dat de redenatie van "hoog" op de interrupt (dus 5 volt) ervoor zorgt dat de code de externe interrupt in gaat.

GamePC (AMD Ryzen 5900x - Gigabyte RTX 3070 Gaming OC 8G - Gigabyte Aorus X570 ELITE - 32GB Corsair Vengeance 3600C18 - 1.5TB Samsung 970 EVO NVME - 500GB Samsung 950 EVO Sata - Fractal Design Define 7 - Corsair RM750x - 2x Asus VG27AQ 1440p@144hz)


  • skr
  • Registratie: Juli 2003
  • Laatst online: 03-09 21:04

skr

Gebruik eens een schakelaar om die interupt te triggeren. Via een IO gaat het echt niet werken als je nog niet goed weet waar je mee bezig bent. En maak die loop eens leeg zoals in mijn voorbeeld.

Heb je de interupts eigenlijk wel enabled dmv het CPSR register? (in je crt assembly)

[ Voor 18% gewijzigd door skr op 06-01-2008 13:36 ]


  • wontcachme
  • Registratie: September 2005
  • Laatst online: 22:35

wontcachme

You catch me? No you wont

Topicstarter
skr schreef op zondag 06 januari 2008 @ 13:31:
Gebruik eens een schakelaar om die interupt te triggeren. Via een IO gaat het echt niet werken als je nog niet goed weet waar je mee bezig bent. En maak die loop eens leeg zoals in mijn voorbeeld.

Heb je de interupts eigenlijk wel enabled dmv het CPSR register? (in je crt assembly)
Een schakelaar heb ik zo niet voorhanden. Bijna geen enkele electronica spul heb ik hier. Ik heb alleen de Uc, oscilloscoop, pc en jumper. Maar via de IO zou het toch moeten lukken? Wat is er anders als ik 5Volt uitstuur via een IO of een schakelaar? Het enigste wat nog niet wil lukken bij de output is de 5 volt. Die komt maar tot 0.4Volt. Dit terwijl een ledje aansturen zonder problemen lukt.

CPSR register? Het enigste in mijn code met cpsr staat in mijn startup.s bestand. De code die erin staat over cpsr is:
Mode, correspords to bits 0-5 in CPSR

MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR

USR_MODE DEFINE 0x10 ; User mode
FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode
IRQ_MODE DEFINE 0x12 ; Interrupt Request mode
SVC_MODE DEFINE 0x13 ; Supervisor mode
ABT_MODE DEFINE 0x17 ; Abort mode
UND_MODE DEFINE 0x1B ; Undefined Instruction mode
SYS_MODE DEFINE 0x1F ; System mode


MRS r0, cpsr ; Original PSR value

;; Set up the interrupt stack pointer.

BIC r0, r0, #MODE_MSK ; Clear the mode bits
ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits
MSR cpsr_c, r0 ; Change the mode
LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK

;; Set up the fast interrupt stack pointer.

BIC r0, r0, #MODE_MSK ; Clear the mode bits
ORR r0, r0, #FIQ_MODE ; Set FIR mode bits
MSR cpsr_c, r0 ; Change the mode
LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK

;; Set up the normal stack pointer.

BIC r0 ,r0, #MODE_MSK ; Clear the mode bits
ORR r0 ,r0, #SYS_MODE ; Set System mode bits
MSR cpsr_c, r0 ; Change the mode
LDR sp, =SFE(CSTACK) ; End of CSTACK

GamePC (AMD Ryzen 5900x - Gigabyte RTX 3070 Gaming OC 8G - Gigabyte Aorus X570 ELITE - 32GB Corsair Vengeance 3600C18 - 1.5TB Samsung 970 EVO NVME - 500GB Samsung 950 EVO Sata - Fractal Design Define 7 - Corsair RM750x - 2x Asus VG27AQ 1440p@144hz)


  • skr
  • Registratie: Juli 2003
  • Laatst online: 03-09 21:04

skr

wontcachme schreef op zondag 06 januari 2008 @ 13:52:
[...]


Een schakelaar heb ik zo niet voorhanden. Bijna geen enkele electronica spul heb ik hier. Ik heb alleen de Uc, oscilloscoop, pc en jumper.
Jumper kan je ook als prehistorische schakelaar gebruiken, wel een pull-up cq pulldown gebruiken
Maar via de IO zou het toch moeten lukken? Wat is er anders als ik 5Volt uitstuur via een IO of een schakelaar?
Mischien heb je al lang beide pinnen gesloopt door bv beide als output te zetten met beide andere waarden. (geen id waar de mishandel drempel ligt bij een lpc)

Daarbij, je hebt zoal interupt als input/output nog niet onder controle. Je moet gewoon dingen uitsluiten en simpel beginnen.
Het enigste wat nog niet wil lukken bij de output is de 5 volt. Die komt maar tot 0.4Volt. Dit terwijl een ledje aansturen zonder problemen lukt.
Daarom eerst je output loshalen van je eint en kijken hoe hij het dan nog doet. Overigens kan je FastIO beter gewoon direkt aansturen via FIO0PIN ipv de FIO_SET en FIO_CLR (die er alleen voor compatability inzitten)
CPSR register? Het enigste in mijn code met cpsr staat in mijn startup.s bestand. De code die erin staat over cpsr is: [...]
Toevallig moet ik op mn werk zeer binnenkort beginnen met een nieuw project op de 2101/2/3. Ik wil je wel een basis toesturen waarmee je mischien een goed begin kan krijgen. Met o.a. een timer interupt, uart debug enz. waneer ik die af heb.

  • wontcachme
  • Registratie: September 2005
  • Laatst online: 22:35

wontcachme

You catch me? No you wont

Topicstarter
Graag. Ik dacht dat programmeren leuk was, maar nu wordt dat toch minder als iets steeds niet lukt.

Ik heb net een testje gedaan door een andere poort hoog te maken, maar die komt ook maar tot de 500mV. Dus p0.15 werkt nog.

Bedankt voor de hulp tot nu toe. Langzaam aan leer ik er steeds meer van, maar het is toch vrij complex nog.

GamePC (AMD Ryzen 5900x - Gigabyte RTX 3070 Gaming OC 8G - Gigabyte Aorus X570 ELITE - 32GB Corsair Vengeance 3600C18 - 1.5TB Samsung 970 EVO NVME - 500GB Samsung 950 EVO Sata - Fractal Design Define 7 - Corsair RM750x - 2x Asus VG27AQ 1440p@144hz)


  • wontcachme
  • Registratie: September 2005
  • Laatst online: 22:35

wontcachme

You catch me? No you wont

Topicstarter
Update

Ik heb na lang prutsen en nog meer voorbeelden zoeken eindelijk de boel werkend. Dat de output maar tot 0.4 Volt kwam snap ik nog niet. Aan de osciloscoop was het maximaal 0.4Volt. Ik besloot later om ook ff de multimeter te pakken, en je raad het al: 3.3 Volt. Dus dat werkte de hele tijd gewoon goed 8)7 8)7 :X

Het enigste wat ik nu nog werkend wil krijgen is dat hij nog uit de interrupt loop gaat. Dit gebeurt nog niet. Mijn code voor die regel is nu: EXTINT_bit.EINT1 = 1; en VICVectAddr = 0; echter werkt dit niet helemaal :(. Als ik dit eenmaal werkend heb ga ik beginnen om mijn code nog te verbeteren. Het werkt altijd makkelijker met een goed voorbeeld.

GamePC (AMD Ryzen 5900x - Gigabyte RTX 3070 Gaming OC 8G - Gigabyte Aorus X570 ELITE - 32GB Corsair Vengeance 3600C18 - 1.5TB Samsung 970 EVO NVME - 500GB Samsung 950 EVO Sata - Fractal Design Define 7 - Corsair RM750x - 2x Asus VG27AQ 1440p@144hz)

Pagina: 1