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.