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