Interrupt Atxmega 32 A4U

Gast #3229500
Lesenswert?

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 :)
Angehängte Dateien:
Gast #3231887
Lesenswert?

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
#3377448
Lesenswert?

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
#3377852
Lesenswert?

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
Gast #3379209
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren