Hallo,
ich habe hier mal ein kleines Programm, welches einfach einen interrupt
an PortC Pin6 auslösen soll. Ich bekomme den Interrupt aber einfach
nicht zum laufen. Könnt ihr mir sagen, was ich falsch mache bzw.
vergessen habe?
Vielen Dank schonmal :)
Ich habe das mit dem AVR Simulator getestet, dabei wird das Intflag zwar
gesetzt, aber der Sprung zu
.org PORTC_INT0_vect
jmp rcsig
wird leider nicht ausgelöst...
MFG Fabian
Hat keiner eine Idee? Ich bin gerade am verzweifeln, warum das nicht
geht... (und das bei so einer einfachen Sache)
Oder kann man den Interrupt im AVR Simulator nicht sehen?
MFG Fabian
Ich habe den Interrupt jetzt mal auf einem Testboard getestet, auch da
leider ohne erfolg.
Es kann also nicht an dem AVR-Simulator liegen.
Hat denn evtl. jemand ein kleines Assembler Programm für den Atxmega mit
einem Pin Interrupt? (funktionstüchtig)
Dann könnte ich mir da mal was abgucken...
MFG Fabian
Hi,
ich habe zwar kein Assembler-Programm und noch nicht genug Zeit gehabt
um mich mit dem AtxMega 32 zu beschäftigen,
aber auf der Seite von Kampis Elektroecke
http://kampis-elektroecke.de/?page_id=1209
ist ne Anleitung unter C.
Hallo zusammen,
programmiere eigentlich überhaupt nicht in Assembler. Aber habe mir nun
mal gedacht ich nehme mich der Sache mal an. Habe mir jetzt mal den
weiter oben angehängten Code angeschaut. (Interrupt_PortC_Pin6.asm).
Der kann so auch nicht wirklich funktionieren. Im Prinzip habe ich einen
gravierenden Fehler entdeckt.
Falsch, hier wird nicht PIN 6 von PORTC konfiguriert:
PORTC_PIN1CTRL, temp ;PORTC PIN6 Pull-Up und Interrupt bei fallender
Flanke
Hier wird ganz klar bei PIN1 und damit PORTC PIN1 der Pullup und
Interrupt bei fallender Flanke gesetzt. Richtig wäre aber den
PORTC_PIN6CTRL hier zu konfigurieren.
Richtig wäre:
sts PORTC_PIN6CTRL, temp ;PORTC PIN6 Pull-Up und Interrupt bei
fallender Flanke
Habe in den Beispielcode einfach mal PORTD als Ausgänge noch zusätzlich
konfiguriert um zu sehen, dass der Interrupt funktioniert. Mit jedem
Auslösen des Interrupts an PIN6 von PORTC wird nun der PORTD getoggelt.
1
.org 0
2
jmp reset
3
4
.org PORTC_INT0_vect
5
jmp rcsig
6
7
8
9
reset: ;reset: 00012c e50f ldi temp,low(RAMEND)
10
ldi temp,low(RAMEND)
11
out CPU_SPL,temp
12
13
ldi temp,high(RAMEND)
14
out CPU_SPH,temp ;init Stack Pointer
15
16
.def temp= r16
17
.def temp1= r17
18
.def max= r18
19
.def zaehler= r19
20
.def temp2= r20
21
22
ldi temp2, 0xFF
23
sts PORTD_DIRSET, temp2
24
25
;PortC Interrupt config
26
ldi temp, 0x00
27
sts PORTC_DIRSET, temp ;PortC als Eingang
28
ldi temp, 0b00111000
29
sts PORTC_PIN6CTRL, temp ;PORTC PIN6 Pull-Up und Interrupt bei fallender Flanke
30
ldi temp, PORT_INT0LVL_LO_gc
31
sts PORTC_INTCTRL, temp ;Interrupt Level (low)
32
ldi temp, 0b01000000
33
sts PORTC_INT0MASK, temp ;PORTC PIN6 auf INT0
34
35
sei
36
37
ldi temp, 0b00000111
38
sts PMIC_CTRL, temp
39
40
ldi max, 0xff
41
42
main:
43
inc zaehler
44
cpse zaehler, max
45
jmp main
46
clr zaehler
47
jmp main
48
49
50
51
52
rcsig:
53
ldi temp1, 0xff
54
sts PORTD_OUTTGL, temp1
55
reti
Hoffe damit schon mal geholfen zu haben. Bei dem Testprogramm (
test_xmega_interrupt.asm) ist auch eine Timerkonfiguration mit drin.
Sehe aber jetzt nicht auf anhieb, was das ganze Programm genau machen
soll. Hier wäre erstmal noch eine genaue Erläuterung notwendig.
Gruß Flo
Danke für die Antwort doch das hilft mir leider noch nicht weiter. Ich
habe mal eine Testdate angehangen die nicht funktioniert. Wenn ich das
Programm simuliere wird das Interrupt Flag gesetzt, aber es wird aus
irgend einen Grund kein Interrupt ausgeführt.
Du hast in deinem Code ja auch noch einen Timer konfiguriert. Für was
nimmst du den genau? Komme nicht aus der Assembler Ecke.....
Hast du das von mir korrigierte Beispiel, welches lediglich einen
Interrupt auslöst schon mal probiert?
Hier müsstest du ja lediglich die Einstellung Steigendene Flanke ändern
und die Pullup-Konfiguration weglassen. Sowie den PORT bzw. PIN auf
deine verwendeten abändern....
Vielleicht kannst du ja in ein paar Worten auch mal noch erklären, was
du mit deinem Programm genau machen möchtest... ( So in der Art:
Einlesen eines Signals am PORTD PIN0 ....)
Und noch ein paar Kommentare zu deinem Code:
// Timer Einstellung
ldi temp1, 0b00000001 ; Setze Prescaler Timer_D0 auf 0
sts TCD0_CTRLA, temp1
Prescaler 0 wäre mir neu, dass es das gibt... Eher Prescaler auf 1.
Was ich in deinem Code beim Timer auch nirgendwo gesehen habe ist eine
Wertezuweisung für das Register TCD0_PER....
Würde an deiner Stelle den Timer erstmal ganz draußen lassen und erstmal
den Interrupt über den PORTD PIN0 realisieren.
Gruß Florian
Vielen Dank für die Hilfe, hab das Problem jetzt lokalisiert.
Es Liegt (bei mir ?) anscheinend ein Fehler im AVR Studio 6 vor, sobald
ich das Debugging beende funktioniert der Interrupt. Ich war schon am
verzweifeln xD