Forum: Mikrocontroller und Digitale Elektronik Interrupts mit AT91SAM7x256 (Olimex Board SAM7-EX256)


von klaus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe das Olimex Board SAM7-EX256 aus dem Shop hier 
(http://shop.embedded-projects.net/product_info.php/info/p16_AT91SAM7X256---TFT--Ethernet--SAM7-EX256-.html). 
Als Mikrocontroller sitzt da ein AT91SAM7x256 drauf.


Ein kleines Beispielprojekt läuft auch schon. Nun möchte ich Interrupts 
verwenden und bin echt ratlos was ich falsch mache. Für den Anfang 
wollte ich mit SWI einen Software Interrupt auslösen und etwas in der 
Handler-Routine machen. Aber ich kann tun und lassen was ich will: Es 
funktioniert einfach nicht. Die SWI Anweisung scheint nicht 
zurückzukehren, aber der Sprungbefehl an Adresse 0x08 scheint auch nicht 
ausgeführt zu werden.


Den Code habe ich angehängt.


Hat jemand eine Idee?

von klaus (Gast)


Lesenswert?

... oder wenigstens ein funktionierendes Beispiel ?

von klaus (Gast)


Lesenswert?

Ich habe das ganze mal auf folgendes Minimalbeispiel runtergebrochen.

Die SWI Anweisung scheint einfach "durchzulaufen", d.h. die 
Ausgangsleitung PB21 wird auf 0 gesetzt. Erwartet hätte man, dass PA30 
auf 0 gezogen wird. Ich bin echt ratlos, warum funktioniert das nicht ?


1
.section .vectors
2
.arm
3
4
reset:
5
      ldr  pc, .Lvector_reset
6
      b exit
7
      ldr  pc, .Lvector_swi
8
      b exit
9
      b exit
10
      nop
11
      b exit
12
      b exit
13
14
.Lvector_reset:     .word  .Lstartup
15
.Lvector_undef:     .word  0
16
.Lvector_swi:       .word  .Lswi_isr
17
.Lvector_pref_abt:  .word  0
18
.Lvector_data_abt:  .word  0
19
                    .word  0
20
.Lvector_fiq:       .word  0
21
                    .word  0
22
23
24
.section .text
25
.arm
26
27
.equ  PSR_MODE_SVC,  0x13  /* (10011) Supervisor Mode (SVC) */
28
.equ  PSR_I_BIT,     0x80  /* IRQ disable bit */
29
.equ  PSR_F_BIT,     0x40  /* FIQ disable bit */
30
31
.Lstartup:
32
33
  /* switch to SVC mode and setup stack */
34
  msr cpsr_c, #(PSR_MODE_SVC|PSR_I_BIT|PSR_F_BIT)
35
36
  /* strange behavior */
37
  swi 0x80
38
39
  /* PIOB_PIO_PER = (1 << 21) */
40
  ldr r0, =0xFFFFF600
41
  mov r1, #(1 << 21)
42
  str r1, [r0]
43
  /* PIOB_PIO_OER = (1 << 21) */
44
  ldr r0, =0xFFFFF610
45
  mov r1, #(1 << 21)
46
  str r1, [r0]
47
  /* PIOB_PIO_CODR = (1 << 21) */
48
  ldr r0, =0xFFFFF634
49
  mov r1, #(1 << 21)
50
  str r1, [r0]
51
52
  b .Lexit
53
54
.Lswi_isr:
55
  /* PIOA_PIO_PER = (1 << 30) */
56
  ldr r0, =0xFFFFF400
57
  mov r1, #(1 << 30)
58
  str r1, [r0]
59
  /* PIOA_PIO_OER = (1 << 30) */
60
  ldr r0, =0xFFFFF410
61
  mov r1, #(1 << 30)
62
  str r1, [r0]
63
  /* PIOA_PIO_CODR = (1 << 30) */
64
  ldr r0, =0xFFFFF434
65
  mov r1, #(1 << 30)
66
  str r1, [r0]
67
68
exit:
69
.Lexit:  b .Lexit

von gerhard (Gast)


Lesenswert?

hallo klaus,
ich würde mir mal die beispiele von atmel ansehen:
http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4343

gruss
gerhard

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.