View previous topic :: View next topic |
Author |
Message |
MadAl
Joined: 26 Jul 2010 Posts: 48
|
Posted: Mon Mar 16, 2015 7:15 pm Post subject: Interrupt problem |
|
|
Hi,
I wrote a test program for a pin-change interrupt using a signal generated by an accelerometer sensor LIS331HH.
The program works fine.
Now I ported this bit of code into a bigger program and and the interrupt service routine (ISR) is not jumped to when the interrupt occurs.
Funny thing is if I run the ISR as a subroutine first, the interrupt works flawlessly:
This does not work:
Enable Interrupts
Do
nop
Loop
.......
Int1_launched:
Flight_phase = Launch
Call Beep(5 , 300 , 300)
Return
However this code does :
Gosub Int1_Launched ‘Note that the label of the IRQ is launched first to make the IRQ work.
Enable Interrupts
Do
nop
Loop
.....
Int1_launched:
Flight_phase = Launch
Call Beep(5 , 300 , 300)
Return
The interrupt is defined as follows:
Config Pind.1 = Input
Portd_pin1ctrl = &B00_000_010
Portd_int1mask = &B0000_0010
On Portd_int1 Int1_Launched
Enable Portd_int1 , Lo
Why do I have to run the ISR first in order for the IRQ to work?
Any suggestions appreciated!
(BASCOM-AVR version : 2.0.7.8 )
Last edited by MadAl on Tue Mar 17, 2015 1:19 pm; edited 1 time in total |
|
Back to top |
|
|
JC
Joined: 15 Dec 2007 Posts: 586 Location: Cleveland, OH
|
Posted: Tue Mar 17, 2015 1:31 am Post subject: |
|
|
You enable the interrupt on the pin within the interrupt.
When you run the interrupt first, you are initializing the interrupt hardware.
I would suggest moving all of the hardware setup to the main program, before the Do Loop.
JC |
|
Back to top |
|
|
MadAl
Joined: 26 Jul 2010 Posts: 48
|
Posted: Tue Mar 17, 2015 11:15 am Post subject: |
|
|
Hi,
thanks for the remark,
below I printed the run down of the INC files (*.BAS file). The definition of the interrupt hardware is in the QuadAnnt_config.inc file which is before the main program in the QuadAnt2015 file.
The Interrupt service routine (ISR) is at the end in the main program. It only sounds a beeper and changes a single variable, no interrupt is enabled within this ISR. So how does this initialize the interrupt hardware?
$include "QuadAnt_Variables.inc" 'Definition of variables and eeprom
$include "QuadAnt_CONFIG.inc" 'Configuration settings
$include "QuadAnt2015.inc" 'Main program
$include "Quadant_menu.inc" 'Menu for communication with Android device
$include "Acceleration.inc" 'Initialisation of accelerometer
thanks,
Allard |
|
Back to top |
|
|
MadAl
Joined: 26 Jul 2010 Posts: 48
|
Posted: Tue Mar 17, 2015 10:39 pm Post subject: |
|
|
I moved this to the main program:
On Portd_int1 Launched
Enable Portd_int1 , Lo
Enable Interrupts
Config Pind.1 = Input
Portd_pin1ctrl = &B00_011_010
Portd_int1mask = &B0000_0010
this doesn't work, no interrupt is performed.
However this does work and the interrupts are working just fine:
Gosub Launched
On Portd_int1 Launched
Enable Portd_int1 , Lo
Enable Interrupts
Config Pind.1 = Input
Portd_pin1ctrl = &B00_011_010
Portd_int1mask = &B0000_0010 |
|
Back to top |
|
|
|