Forum: Mikrocontroller und Digitale Elektronik Interrupt Atxmega 32 A4U


von Wule (Gast)


Angehängte Dateien:

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 :)

von Uwe S. (de0508)


Lesenswert?

Sorry, wo ist dein Programm?

von Oliver (Gast)


Lesenswert?

Programm als Bild, mal was ganz neues. Immerhin als .png ;)

Irgendwo fehlt da ein sei.

Oliver

von Wule (Gast)


Angehängte Dateien:

Lesenswert?

Nee, das "sei" steht da (4 Zeilen vor der main).
Oder muss noch irgendwo eins hin?

von Georg G. (df2au)


Lesenswert?

Verrätst du uns auch noch, woran du merkst, dass der Interrupt nicht 
ausgelöst wird?

von Wule (Gast)


Lesenswert?

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

von Wule (Gast)


Lesenswert?

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

von Wule (Gast)


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

von P.Kirchner (Gast)


Lesenswert?

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.

von Bassti (Gast)


Lesenswert?

Hast du den globalen Low Level Interrupt aktiviert? ASM is mir jetzt zu 
mühselig ;)

von afroman (Gast)


Lesenswert?

Hallo,
hat mittlerweile jemand eine Lösung für das Problem gefunden?

von afromann (Gast)


Lesenswert?

..........?..........

von Basti (Gast)


Lesenswert?

Es haben schon einige 1000 Leute vor dir geschafft... Schau dir mal 
anderen Quellcode an... es sollte wohl nicht so schwer werden...

von afroman (Gast)


Angehängte Dateien:

Lesenswert?

Das hab ich schon den ganzen gestrigen Tag versucht, aber nichts 
erreicht.

von Florian G. (stromflo)


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

: Bearbeitet durch User
von afroman (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Florian G. (stromflo)


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

: Bearbeitet durch User
von afroman (Gast)


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

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.