Forum: Mikrocontroller und Digitale Elektronik ATMega328 Interrupt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Alexander M. (a_lexander)


Bewertung
-1 lesenswert
nicht 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:
#if defined(__DOXYGEN__)
/** \def ISR(vector [, attributes])
    \ingroup avr_interrupts

    Introduces an interrupt handler function (interrupt service
    routine) that runs with global interrupts initially disabled
    by default with no attributes specified.

    The attributes are optional and alter the behaviour and resultant
    generated code of the interrupt routine. Multiple attributes may
    be used for a single function, with a space seperating each
    attribute.

    Valid attributes are ISR_BLOCK, ISR_NOBLOCK, ISR_NAKED and
    ISR_ALIASOF(vect).

    \c vector must be one of the interrupt vector names that are
    valid for the particular MCU type.
*/
#  define ISR(vector, [attributes])
#else  /* real code */

#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
#  define __INTR_ATTRS used, externally_visible
#else /* GCC < 4.1 */
#  define __INTR_ATTRS used
#endif

#ifdef __cplusplus
#  define ISR(vector, ...)            \
    extern "C" void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
    void vector (void)
#else
#  define ISR(vector, ...)            \
    void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
    void vector (void)
#endif

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


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht lesenswert
Und wenn man gar keine Ahnung hat, guckt man sich Tutorien an.

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht 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.

: Bearbeitet durch User
von Alexander M. (a_lexander)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.