-         
Ergebnis 1 bis 2 von 2

Thema: atmega168 / Interrupt-Vektoren eigenen Irq-Handler

  1. #1

    atmega168 / Interrupt-Vektoren eigenen Irq-Handler

    Anzeige

    Hallo,

    wie kann man seinen eigenen Interrupt-Handler an die entsprechende Interrupt-Adresse bringen, in assembler anstatt mit ISR- define (in C)?

    in meine Assembler Datei hab ich geschrieben:

    #include <avr/io.h>

    .text
    .section .vectors

    .extern IrqCounter_gu8

    .org 0x00B
    rjmp _my_tim_handler

    ...
    _my_tim_handler:
    ...
    reti

    //******************

    C-Datei:

    int main(void) {
    ....

    return 0;
    }

    Leider funktioniert das nicht, da mein Code ab Adresse 0x01A beginnt, und nicht bei 0x000B. Wie kann man seinen Code sozusagen dort hinschieben? Oder geht das bei den atmega nicht?

    Disassembly:
    00000000 RJMP PC+0x001A Relative jump
    00000001 RJMP PC+0x0034 Relative jump
    00000002 RJMP PC+0x0033 Relative jump
    00000003 RJMP PC+0x0032 Relative jump
    00000004 RJMP PC+0x0031 Relative jump
    00000005 RJMP PC+0x0030 Relative jump
    00000006 RJMP PC+0x002F Relative jump
    00000007 RJMP PC+0x002E Relative jump
    00000008 RJMP PC+0x002D Relative jump
    00000009 RJMP PC+0x002C Relative jump
    0000000A RJMP PC+0x002B Relative jump
    0000000B RJMP PC+0x002B Relative jump
    0000000C RJMP PC+0x0029 Relative jump

    Ich programmiere mit AtmelStudio 6.2 und es ist ein C-Projekt.
    Es ist kein konkretes Projekt, es geht mir ums lernen und wie man was machen kann..

    Kann diesbezüglich jemand weiterhelfen?

    Grüße
    Geändert von makro (09.06.2017 um 10:29 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.650
    Code:
    #  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,used)) __VA_ARGS__; \
        void vector (void)
    #endif
    kurz gesagt
    void VEKTORNAME(void) __attribute__ ((signal,used));
    mit dem Signal Attribut sagst du dem compiler dass es eine ISR ist und er entsprechend die sprünge planen soll bzw. dass er das stack-handling um ein paar register erweitern muss
    wenn du möchtest dass er die register nicht anfasst, weil du z.B. selber in assembler oder ähnlich sicherstellst NICHT die register zu benutzen, kannst du noch ein ,naked hinter ,used setzen, dann ist dir das stack sichern überlassen

    PS mit
    Code:
    asm("nop;")
    kannst du deinen assembler code inline schreiben falls nicht bekannt
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Ähnliche Themen

  1. Vektoren berechnen
    Von Ripper121 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 22.10.2012, 05:23
  2. Antworten: 1
    Letzter Beitrag: 23.02.2011, 14:17
  3. Antworten: 2
    Letzter Beitrag: 12.08.2010, 16:40
  4. Interrupt-Vektoren beim ATmega-168/ PCINT-Eingänge
    Von Nils Wenzler im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 04.10.2007, 13:53
  5. ATMega168 auf RN-MiniControl: Kein Interrupt
    Von rico65 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 16.05.2006, 22:36

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •