Forum: Mikrocontroller und Digitale Elektronik ATMega328 Interrupt


von Alexander M. (a_lexander)


Lesenswert?

Hallo Zusammen,

Ich bin dabei mir den Timer des ATMega328 genauer anzuschauen, dort 
geht's dann natürlich auch schnell in Richtung Interrupts.

Zur Auswertung eines Interrupts gibt es ja z.B. die Funktion 
ISR(TIMER1_COMPA_vect) {...}

Die Frage, die ich mir stelle, ist:
Bei diesem uC gibt es ja zahlreiche Beispiele im WWW, wie so ein ISR 
behandelt werden kann bzw. welche Funktion dafür aufgerufen werden muss. 
Somit kann dafür dann viel von anderen Programmieren "abgeschaut" 
werden.

Wie geht ihr an die Sache heran bei weniger gebräuchlichen uCs und woher 
bekommt ihr die Info, mit welcher Funktion dann z.B. die ISR in diesem 
uC ausgewertet soll?

Wenn ich z. B. in der Toolchain von Atmel Studio suche, dann finde ich 
in der avr/interrupt.h das hier:
1
#if defined(__DOXYGEN__)
2
/** \def ISR(vector [, attributes])
3
    \ingroup avr_interrupts
4
5
    Introduces an interrupt handler function (interrupt service
6
    routine) that runs with global interrupts initially disabled
7
    by default with no attributes specified.
8
9
    The attributes are optional and alter the behaviour and resultant
10
    generated code of the interrupt routine. Multiple attributes may
11
    be used for a single function, with a space seperating each
12
    attribute.
13
14
    Valid attributes are ISR_BLOCK, ISR_NOBLOCK, ISR_NAKED and
15
    ISR_ALIASOF(vect).
16
17
    \c vector must be one of the interrupt vector names that are
18
    valid for the particular MCU type.
19
*/
20
#  define ISR(vector, [attributes])
21
#else  /* real code */
22
23
#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
24
#  define __INTR_ATTRS used, externally_visible
25
#else /* GCC < 4.1 */
26
#  define __INTR_ATTRS used
27
#endif
28
29
#ifdef __cplusplus
30
#  define ISR(vector, ...)            \
31
    extern "C" void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
32
    void vector (void)
33
#else
34
#  define ISR(vector, ...)            \
35
    void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
36
    void vector (void)
37
#endif
38
39
#endif /* DOXYGEN */

1. Muss ich erstmal "wissen", dass das die richtige Toolchain ist und
2. würde ich jetzt nicht auf Anhieb drauf kommen, dass diese Funktion 
entscheidend ist für die ISR...
Im Datenblatt steht ja auch nichts drin bezüglich Implementierung von 
ISR...

Also die Frage in Kürze nochmal:
Wie geht ihr bei neuen uCs vor solche Infos schnellst möglichst zu 
bekommen?

Danke ;)

Grüße

von Helmut -. (dc3yc)


Lesenswert?

Ich lese dazu das Datenblatt. Haben wir früher auch gemacht, als es noch 
kein Internet gabe. Jedenfalls sind im Datasheet die Informationen klar, 
im Gegensatz zum Internet, wo jede Menge Shit steht.

von HildeK (Gast)


Lesenswert?

Alexander M. schrieb:
> Wie geht ihr bei neuen uCs vor solche Infos schnellst möglichst zu
> bekommen?

Ich schaue im Datenblatt 😀.

In die *.h-Files muss ich erst dann hinein schauen, wenn mein 
ISR-Vektorname vom Compiler nicht akzeptiert wird - meist heißt er aber 
so, wie im DB steht.

von STK500-Besitzer (Gast)


Lesenswert?

Und wenn man gar keine Ahnung hat, guckt man sich Tutorien an.

von Stefan F. (Gast)


Lesenswert?

Du hast zwei Anlaufstellen:

a) Das Datenblatt des Mikrocontrollers 
https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
und
b) Die Dokumentation der C-Bilbiothek 
https://www.nongnu.org/avr-libc/user-manual/modules.html

Dann solltest du noch zur Kenntnis nehmen, dass die Programmiersprache C 
von Interrupts keine Ahnung hat. Die tatsächliche Umsetzung ist daher 
stets spezifisch für einen bestimmten Compiler. In deinem Fall wohl der 
avr-gcc Compiler. Von dem findest du die nötige Doku in dem avr/*.h 
Dateien. Im konkreten Fall 
https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

Alexander M. schrieb:
> Wenn ich z. B. in der Toolchain von Atmel Studio suche, dann finde ich
> in der avr/interrupt.h das hier:

Guck lieber in die Offizielle Doku statt in den Quelltext, denn die ist 
besser lesbar.

von Alexander M. (a_lexander)


Lesenswert?

Alles klar, Danke ;)

So ungefähr wär ich wohl auch vorgegangen. Dann war ich da schon auf dem 
richtigen Weg :)

Grüße

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

mit dem 328 hast Du einen der größeren Vertreter dieser Familie 
ausgesucht, dessen umfangreiche Funktionalität so manchen Anfänger 
erschlagen kann. Normalerweise sucht man sich ein in der Muttersprache 
verfasstes Tutorial aus und übt anhand einer Versuchsschaltung die 
Beispiele durch. Dann ergibt sich der  Lernprozess von selbst. Wichtig 
ist im Datenblatt die Registerliste und die Befehlsliste.

Viellleicht findet sich hier noch interessantes:
https://s-huehn.de/

MfG

von Veit D. (devil-elec)


Lesenswert?

Hallo,

will ja nichts sagen. Nur als groß würde ich einen Atmega328(P) nicht 
bezeichnen. Der ist schon gut übersichtlich. Zum Vergleich. Ein 
ATtiny841 mag zwar kleiner sein, ist aber mit mehr an Optionen 
unübersichtlicher. Zudem ein Atmega328(P) weltweit bekannt ist und man 
dafür in jedem guten Forum Hilfe bekommt. Den kennt jeder. Der quasi 
Standard. Eine perfekte Wahl.

von MaWin (Gast)


Lesenswert?

Alexander M. schrieb:
> Wie geht ihr an die Sache heran bei weniger gebräuchlichen uCs und woher
> bekommt ihr die Info, mit welcher Funktion dann z.B. die ISR in diesem
> uC ausgewertet soll?

Dein Prozessor ist der ATMega328 , da musst du nicht woanders gucken.

Ja, bei anderen Prozessoren heissen die ISR Entrypoints anders, manche 
haben ganz anders aufgebaute Timer, und je nach Kompiler wird die 
Interrupt-Funktion auch noch unterschiedlich geschrieben.

Es bleibt dir nichts anderes übrig, als nachzugucken, FALLS du 
irgendwann mal den Prozessor oder Compiler wechseln solltest.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

die Schreibweise der ISR Handler schaue ich im Headerfile nach. Das 
stimmte seit ich AVR programmiere noch nie mit dem Manual überein. Alle 
anderen Registernamen kann man aus dem Manual 1:1 übernehmen. Warum das 
bei den ISR's nicht klappt weiß ich nicht.

von HildeK (Gast)


Lesenswert?

Veit D. schrieb:
> die Schreibweise der ISR Handler schaue ich im Headerfile nach. Das
> stimmte seit ich AVR programmiere noch nie mit dem Manual überein. Alle
> anderen Registernamen kann man aus dem Manual 1:1 übernehmen. Warum das
> bei den ISR's nicht klappt weiß ich nicht.

Mir ist bisher bei einem eine falsche Bezeichnung eines ISR-Handlers 
(Datenblatt <-> Headerfile) begegnet, aber auch einmal eine Differenz in 
der Benennung eines Registerbits.

Erst wenn der Compiler meckert schau ich in den Headerfile.

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.