ATMEGA328P: externer Interrupt INT0 funktioniert nicht

OP #6442089
Lesenswert?
• ▲
▼
Hallo miteinander;
kann mir jemand sagen warum ich nicht in die Interruptroutine komme wenn 
ich den Arduino Uno PIN 2 auf GND lege ?

.include "m328Pdef.inc"

.def temp = r16

rjmp start    ; 1     Reset
rjmp interrupt0          ; 2   External Interrupt Request 0   INT0_vect
reti      ; 3   External Interrupt Request 1   INT1_vect
reti      ; 4   Pin Change Interrupt Request 0   PCINT0_vect
reti      ; 5   Pin Change Interrupt Request 1   PCINT1_vect
reti      ; 6   Pin Change Interrupt Request 2   PCINT2_vect
reti      ; 7   Watchdog Time-out Interrupt   WDT_vect
reti      ; 8   Timer/Counter2 Compare Match A   TIMER2_COMPA_vect
reti      ; 9   Timer/Counter2 Compare Match B   TIMER2_COMPB_vect
reti      ; 10  Timer/Counter2 Overflow   TIMER2_OVF_vect
reti      ; 11  Timer/Counter1 Capture Event   TIMER1_CAPT_vect
reti      ; 12  Timer/Counter1 Compare Match A   TIMER1_COMPA_vect
reti      ; 13  Timer/Counter1 Compare Match B   TIMER1_COMPB_vect
reti      ; 14  Timer/Counter1 Overflow   TIMER1_OVF_vect
reti      ; 15  Timer/Counter0 Compare Match A   TIMER0_COMPA_vect
reti      ; 16  Timer/Counter0 Compare Match B   TIMER0_COMPB_vect
reti      ; 17  Timer/Counter0 Overflow   TIMER0_OVF_vect
reti      ; 18  SPI Serial Transfer Complete   SPI_STC_vect
reti      ; 19  USART Rx Complete   USART_RX_vect
reti      ; 20  USART Data Register Empty   USART_UDRE_vect
reti      ; 21  USART Tx Complete   USART_TX_vect
reti      ; 22  ADC Conversion Complete   ADC_vect
reti      ; 23  EEPROM Ready   EE_READY_vect
reti      ; 24  Analog Comparator   ANALOG_COMP_vect
reti      ; 25  Two-wire Serial Interface   TWI_vect
reti      ; 26  Store Program Memory Read   SPM_READY_vect

start:

ldi temp, high(RAMEND)
out SPH , temp
ldi temp, low(RAMEND)
out SPL , temp

ldi temp, 0b00000000
out DDRD, temp
ldi temp, 0b00100000
out DDRB, temp

ldi temp, 0
sts EICRA, temp

ldi temp, 1
out EIMSK, temp

sei

loop:
rjmp loop

interrupt0:
sbi  PORTB, 5
reti

Wenn ich das Pendant über die Arduino-IDE laufen lasse dann klappt es :

#include <avr/interrupt.h>
void setup()
{
pinMode(13, OUTPUT);

EICRA=0;
EIMSK=1;
sei();
}

void loop()
{
}

void blink()
{
Serial.println(millis());
}

ISR (INT0_vect)
{
digitalWrite(13, 1);
}
Gast #6442091
Lesenswert?
• ▲
▼
Ohne mir das Programm weiter angeschaut zu haben, aus dem def.inc:
1
; ***** INTERRUPT VECTORS ************************************************
2
.equ  INT0addr  = 0x0002  ; External Interrupt Request 0
3
.equ  INT1addr  = 0x0004  ; External Interrupt Request 1
4
.equ  PCI0addr  = 0x0006  ; Pin Change Interrupt Request 0
5
.equ  PCI1addr  = 0x0008  ; Pin Change Interrupt Request 0
Gast #6442119
Lesenswert?
• ▲
▼
Michael S. schrieb:

> Danke für den Hinweis, aber was genau muss ich damit machen ?

Assembler lernen. Was sonst?

Eine sinnvolle Deklaration eine Interruptvektors sieht z.B. so aus:

.ORG <Name des Vektors>
<Inhalt für den Vektor>

.ORG <Name eines anderen Vektors>
<Inhalt für eben diesen anderen Vektor>

Dann spielt schonmal die Reihenfolge keine Rolle, in der du die 
Interruptvektoren definierst. Es müssen dann auch nicht mehr alle 
Interruptvektoren definiert werden, sondern nur die tatsächlich benutzen 
(wobei du dafür verantwortlich bist, keinen zu erlauben, der nicht auf 
diese Art definiert wurde, sonst: sehr wahrscheinlich Crash)

Darüber hinaus spielt die Größe der Interruptvektoren "keine" Rolle 
mehr. Du kannst als <Inhalt für den Vektor> reinschreiben, was immer du 
willst, insbesondere auch rjmp in eine Vektortabelle für "große" AVR. 
Erst wenn du mit anderen Vektoren in Konflikt kommst, weil du mehr Code 
hier unterzubringen versuchst, als tatsächlich an dieser Stelle bei der 
gegenwärtigen Nutzung verfügbar ist, dann knallt's. Aber schon zur 
Assemblierzeit, da wird denn (sinngemaß) bemeckert, dass der Codespace 
schon belegt ist. Solange du aber als Code in der Vektordefinition nur 
die üblichen Varianten rjmp oder reti verwendest, sollte es dazu nicht 
kommen. Auf "großen" AVR kannst du bei diesem Ansatz aber auch 
problemlos jmp verwenden, wenn sonst der Sprung zum Ziel zu weit ist.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.