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 :)
Programm als Bild, mal was ganz neues. Immerhin als .png ;) Irgendwo fehlt da ein sei. Oliver
Nee, das "sei" steht da (4 Zeilen vor der main). Oder muss noch irgendwo eins hin?
Verrätst du uns auch noch, woran du merkst, dass der Interrupt nicht ausgelöst wird?
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.
Hast du den globalen Low Level Interrupt aktiviert? ASM is mir jetzt zu mühselig ;)
Es haben schon einige 1000 Leute vor dir geschafft... Schau dir mal anderen Quellcode an... es sollte wohl nicht so schwer werden...
Das hab ich schon den ganzen gestrigen Tag versucht, aber nichts erreicht.
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
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
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.