Forum: Mikrocontroller und Digitale Elektronik Probleme mit externen Interrupts at90can128


von malvina (Gast)


Lesenswert?

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

von malvina (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Wie wäre es denn mal im Datenblatt unter '10. External Interrupts' 
nachzusehen. Dort sind die beteiligten Register genau erläutert.

MfG Spess

von malvina (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.