liebe mitµCler, ich bin absolute anfängerin und schlage mich seit tagen mit quälenden fragen zum thema interrupts herum. ich habe ein board mit einem at90can128 sicherungen und leds und versuche, ein programm in assmebler code zu schreiben, welches eine led zu leuchten veranlassen soll, sobald sich die spannung an einer der sicherungen ändert. dazu wollte ich einen externen interrupt benutzen. die led will und will jedoch nicht leuchten und ich frage mich (und hiermit euch :P) folgende dinge: 1.in div. interrupt-code-beispielen online habe ich gelesen, man müsse die interrupts in GIMSK oder GICR aktivieren. weder das eine noch das andere kommt in der at90can128-doku vor, weshalb ich den verdacht hege, ich muss EIMSK benutzen. ist das wirklich das gleiche?? 2. ähnliches gilt für MCUCR und EICRA...kann und muss ich die beiden gegeneinander austuaschen? MCUCR gibt es bei diesem controller ja auch, aber er hat ganz andere bitbezeichnungen. EICRA sieht dem, was ich bei den besipielen gesehen hab ähnlicher. vielen lieben dank im voraus für eure antworten! herzliche grüße, malvina
oh, und noch eine frage... wie kann man denn definieren, an welchem pin auf einen interrupt gewartet werden soll? es reicht doch wohl nicht aus, den port, an dem sich der betreffende pin befindet auf 'input' zu setzen, oder?! danke nochmals :)
Hi Wie wäre es denn mal im Datenblatt unter '10. External Interrupts' nachzusehen. Dort sind die beteiligten Register genau erläutert. MfG Spess
lieber spess, das war natürlich meine erste anlaufstelle. leider bin ich, wie gesagt, absolute anfängerin. das datenblatt ist recht knapp formuliert und für jemanden, der keine ahnung hat, etwas schwer zugänglich. deswegen hab ich mich an das forum gewandt, in der hoffnung, jemand könnte mir etwas einfacher die unterschiede erklären und mir sagen, wie ich den richtigen pin aktiviere. vielleicht bringt es ja mehr, wenn ich den code mal paste: die fehlerausgabe meiner sicherung müsste auf PG1 ankommen, die lampe ist auf PA4.
1 | .include"can128def.inc" ;include file |
2 | |
3 | rjmp reset ; Reset Handler |
4 | reti ;interrupt0routine ; IRQ0 Handler |
5 | rjmp interrupt1routine ; IRQ1 Handler |
6 | reti ; IRQ2 Handler |
7 | reti ; IRQ3 Handler |
8 | reti ; IRQ4 Handler |
9 | reti ; IRQ5 Handler |
10 | reti ; IRQ6 Handler |
11 | reti; IRQ7 Handler |
12 | reti ; Reset Handler |
13 | reti; IRQ0 Handler |
14 | reti; IRQ1 Handler |
15 | reti; IRQ2 Handler |
16 | reti ; IRQ3 Handler |
17 | reti ; IRQ4 Handler |
18 | reti ; IRQ5 Handler |
19 | reti ; IRQ6 Handler |
20 | reti ; IRQ7 Handler |
21 | reti ; Timer2 Compare Handler |
22 | reti ; Timer2 Overflow Handler |
23 | reti ; Timer1 Capture Handler |
24 | reti; Timer1 CompareA Handler |
25 | reti; Timer1 CompareB Handler |
26 | reti; Timer1 CompareC Handler |
27 | reti; Timer1 Overflow Handler |
28 | reti; Timer0 Compare Handler |
29 | reti; Timer0 Overflow Handler |
30 | reti; CAN Handler |
31 | reti; CAN Timer Overflow Handler |
32 | reti ; SPI Transfer Complete Handler |
33 | reti; USART0 RX Complete Handler |
34 | reti; USART0,UDR Empty Handler |
35 | reti; USART0 TX Complete Handler |
36 | reti; Analog Comparator Handler |
37 | reti; ADC Conversion Complete Handler |
38 | reti; EEPROM Ready Handler |
39 | reti; Timer3 Capture Handler |
40 | reti; Timer3 CompareA Handler |
41 | reti; Timer3 CompareB Handler |
42 | reti; Timer3 CompareC Handler |
43 | reti; Timer3 Overflow Handler |
44 | reti; USART1 RX Complete Handler |
45 | reti; USART1,UDR Empty Handler |
46 | reti; USART1 TX Complete Handler |
47 | reti ; TWI Interrupt Handler |
48 | reti ; SPM Ready Handler |
49 | |
50 | reset: ;start here after reset |
51 | |
52 | ldi r16, LOW(RAMEND) ;set up stack |
53 | out SPL, r16 ; " |
54 | ldi r16, HIGH(RAMEND) ; " |
55 | out SPH, r16 ; " |
56 | |
57 | ldi r16, 0xff ; set PORT A to output |
58 | out DDRA, r16 ; |
59 | ldi r16, 0x00 ; set all lights of PORT A to off |
60 | out PORTA, r16 ; |
61 | |
62 | ldi r16, (0<<DDG1) ; load r16 with instruction to set pin PG1 to 0 (==input) |
63 | out DDRG, r16 ; write content of r16 to PORTG |
64 | |
65 | ldi r16, (1<<ISC10) |
66 | sts EICRA, r16 |
67 | |
68 | ldi r16,(1<<INT1) |
69 | out EIMSK, r16 |
70 | |
71 | sei ; set enable all interrupts |
72 | |
73 | end: ; never endening end |
74 | rjmp end |
75 | |
76 | interrupt1routine: |
77 | in r15, SREG |
78 | sbi PORTA, 4 |
79 | out SREG, r15 |
80 | reti |
ist das alles superfalsch??? :/ ich würde mich auch sehr freuen, wenn mir jemand erklären könnte, wie es sich mit dem INT1-pin verhält. muss ich den explizit auf input schalten oder wird das irgendwie automatisch gemacht, indem ich ihn in der EIMSK aktiviere? oder sind das vollkommen verschiedene dinge, die nichts miteinander zu tun haben? danke :)
> das datenblatt ist recht knapp 'knapp'? Du beliebst zu scherzen! > jemand könnte mir etwas einfacher die unterschiede erklären > und mir sagen, wie ich den richtigen pin aktiviere. Du wirst auf Daueer nicht darum herumkommen, das Datenblatt zu verstehen. Nimm dir aus den Tutorien die grundsätzliche Vorgehensweise und eine Art 'Checkliste' mit, was es konzeptionell zu tun gibt. Und mit diesem konzeptionellen Wissen, findest du dann in deinem Datenblatt die Dinge wieder. Du musst: * festlegen, worauf genau der Interrupt Pin reagieren soll * den spezifischen Interrupt freigeben * die generelle Interrupt Freigabe mittels sei machen * in die Interrupt Vektor Tabelle an die richtige Stelle einen Sprung in deine behandelnde FUnktion einfügen. Das ist das 'Kochrezept' aus den Tutorien. Jetzt geht es darum, sich spezifisch für den at90can128 die Dinge im Datenblatt zu suchen. Wenn dir an manchen Stellen im verwendeten Tutorium nicht klar ist, was ein bestimmtes Bit in einem bestimmten Register IM Tutorium bewirkt, dann musst du eben nachsehen welcher Prozessor da im Tutorium benutzt wurde, dir das zugehörige Datenblatt dazu holen und dort nachlesen. Mit dem Wissen kannst du dann in deinem Datenblatt die gleichwertige Funktionalität auswählen. Sorry. Aber so geht das nun mal. Und auch den Hinweis auf Anfänger lass ich da nicht gelten. Wir waren alle Anfänger. Aus dem Status sind wir rausgekommen, indem wir genau solche Prozedere akzeptiert und durchgeführt haben.
Zum Pin. Der entsprechende Abschnitt im Datenblatt, das Kapitel 10, fängt so an
1 | The External Interrupts are triggered by the INT7:0 pins. |
Aha. Da steht es also. Die Pins für die externen Interrupts heissen INT7 bis INT0. Also in der Pinübersicht am Anfang des Datenblatts (in der Grafik) nachsehen, bei welchen Pins INT7, INT6, ..., INT0 dabei steht. Damit weißt du welche Pins das überhaupt sind und auch wie sie den Interrupts zugeordnet sind. Am Pin 6, mit der Bezeichnung PE4, steht zb in Klammer INT4 dabei. Das ist also der externe Interrupt 4 und er hängt am Bit 4 vom Port E.
1 | Observe that, if enabled, the interrupts will trigger even if the |
2 | INT7:0 pins are configured as outputs. |
Ist ja interessant. Hier wird angedeutet, dass der Pins sowohl als Eingangs als auch als Ausgang konfiguriert werden kann - in beiden Fällen löst der Interrupt anhand der eingestellten Kriterien aus. Daraus würde ich mal schlussfolgern: Du wirst dich wohl um die Konfiguration des Pins selber kümmern müssen.
Hallo, ich würde auch erst einmal grundsätzlich feststellen, ob der Controller überhaupt läuft indem ich z. B. eine LED einschalte. Dann würde ich kontrollieren, ob mein Eingangssignal überhaupt am Interrupteingang ankommt, indem ich bei Vorhandensein des gewünschten Pegels eine zweite LED einschalte. Otto
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.