Forum: Mikrocontroller und Digitale Elektronik ATMEGA328P: externer Interrupt INT0 funktioniert nicht


von Michael S. (misax)


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);
}

von S. Landolt (Gast)


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

von S. Landolt (Gast)


Lesenswert?

PS:
Etwas deutlicher: im gezeigten Programm liegt auf der (Wort-)Adresse 
0x0002 für INT0addr das 'reti  ; 3 ...'.
  Beim ATmega328 sind in der Vektortabelle 'jmp' vorgesehen, nicht 
'rjmp'.

von Michael S. (misax)


Lesenswert?

Danke für den Hinweis, aber was genau muss ich damit machen ?
Wenn ich die Zeilen in mein Programm kopiere bekomme ich 
Fehlermeldungen.

von S. Landolt (Gast)


Lesenswert?

rjmp belegt, wie auch reti, nur EIN Wort, vorgesehen sind ZWEI.

von Ozvald K. (Gast)


Lesenswert?

noch deutlicher:

statt
rjmp start    ; 1     Reset
rjmp interrupt0          ; 2   External Interrupt Request 0   INT0_vect

einfach

jmp start    ; 1     Reset
jmp interrupt0          ; 2   External Interrupt Request 0   INT0_vect

von Michael S. (misax)


Lesenswert?

also einfach das r weg und jetzt funktionuckelt es !
Vielen vielen Dank

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

Steht übrigens genau so im Datenblatt.

von S. Landolt (Gast)


Lesenswert?

Damit Ihr nachher besser seht,
Daß er nichts sagt, als was im Buche steht

von c-hater (Gast)


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.

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.