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);
}
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 |
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'.
Danke für den Hinweis, aber was genau muss ich damit machen ? Wenn ich die Zeilen in mein Programm kopiere bekomme ich Fehlermeldungen.
rjmp belegt, wie auch reti, nur EIN Wort, vorgesehen sind ZWEI.
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
also einfach das r weg und jetzt funktionuckelt es ! Vielen vielen Dank
Damit Ihr nachher besser seht, Daß er nichts sagt, als was im Buche steht
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
