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?
... oder wenigstens ein funktionierendes Beispiel ?
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 |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.