Display Interrupt Service Routine for cargo monitoring system - PowerPoint PPT Presentation

1 / 29
About This Presentation
Title:

Display Interrupt Service Routine for cargo monitoring system

Description:

Display Interrupt Service Routine for cargo monitoring system Overview of concepts demonstrated during Labs 3 and 4 * / 28 Cargo Monitoring System During transport ... – PowerPoint PPT presentation

Number of Views:63
Avg rating:3.0/5.0
Slides: 30
Provided by: enelUcalg
Category:

less

Transcript and Presenter's Notes

Title: Display Interrupt Service Routine for cargo monitoring system


1
Display Interrupt Service Routine for cargo
monitoring system
  • Overview of concepts demonstrated during Labs 3
    and 4

2
Cargo Monitoring System
  • During transport
  • Quick indication of health of product NOW
  • Acceleration in range accuracy of - 1 / 8 G
  • Temperature steady accuracy of - 1 / 32 C
  • On delivery
  • Display of ranges that cargo has experienced
  • Range of temperatures and accelerations
  • Other cargo information

3
Overall design
General Purpose Timercontrolling Display
asISR Temperature / Accelerationgraphic
(non-text) displayChanges, actual temperatures
main( )
Initialize stuff (C)
Calculate Temperature
Core temperatureISR clockused forTemperature /
Accelerationdetermination
Store temperature, calculate averages and ranges
Communications with LCDMOSI / MISO format --
ISR Temperature / AccelerationinformationText
format
Calculate Acceleration
Store acceleration, calculate averages and ranges
4
Develop first test -- Requirements
  • variable acceleration_changing is modified in
    main( ) depending on whether current acceleration
    is greater than, equal to, or less than the
    average acceleration
  • Display ISR uses this information to modify how
    the LED flash (flicker up, flicker down, steady)
  • Set_Acceleration_Mode( current_Acc, average_ACC)

5
DisplayISR( ) Development
  • This routine will be responsible for displaying
    both temperature and acceleration values
  • You develop the necessary ISR for handling the
    Temperature display in Lab. 3
  • Ill discuss the code for handling the
    Acceleration display in the lectures

6
Test that can call an ISR and return from the
interrupt without crashing system
  • Most of the notes from last Mondays lecture on
    the general purpose timer interrupt service
    routine cover the topics here
  • Need to test using Software interrupt
    generation using the raise( ) C code
  • Display under the control of interrupts from the
    general purpose timer 0

7
Test that can access and return from ISR
include ltsys\exception.hgtinclude
ltcdefBF533.hgtinclude ltccblkfn.hgtinclude
ltsysreg.hgtinclude ltsignal.hgtEX_INTERRUPT_HANDLE
R(Display_ISR_CPP) TEST(LinkToDisplayISR,
SMITH_TEST) register_handler(ik_ivg11,
Display_ISR_CPP) CHECK(true) register_handler(
ik_ivg11, Display_ISR_ASM) CHECK(true) register
_handler(ik_ivg11, EX_INT_IGNORE)
8
Recap -Minimum interrupt C stub for timer 0
  • EX_INTERRUPT_HANDLER(Display_ISR_CPP)
  • pTIMER_STATUS 1 // Clear TIMIL0 (WIC)
  • //
    See page 15 8
  • Make sure you understand why this particular bit
    needs clearing in the timer status register and
    what would happen if were using general purpose
    TIMER1 or TIMER2 instead of TIMER0!

9
Recap - Assembly language versionMinimum
interrupt stub for timer 0
  • . section program
  • .global _Display_ISR_ASM__FiN21 // Question
    why ISR name mangle __FiN21
  • _Display_ISR_ASM__FiN21 //
    when we cant pass it any parameters?
  • --SP ASTAT
  • --SP FP
  • --SP (R70, P50) // Gross
    over-kill
  • LINK 16 // Needs to refactored for speed
  • P0.L lo(TIMER_STATUS) // Clear the status
    bit TIMIL0 (W1C) p15-8
  • P0.H hi(TIMER_STATUS)
  • R0 1
  • WP0 R0
  • UNLINK
  • (R70, P50) SP
  • FP SP
  • ASTAT SP
  • _Display_ISR_ASM__FiN21.END
  • RTI

10
Display Average Acceleration -- part of the GPT
ISR
  • Use WriteLEDASM( ) to display whether the average
    acceleration (calculated in main( )) is
    increasing, decreasing or staying the sameSort
    of acceleration dancing lights
  • If staying the same flash all lights on and off
  • If increasing race the lights to the
    left(0x00, 0x01, 0x02, 0x04, 0x08 etc)
  • If decreasing race the lights to the
    right(0x00, 0x20, 0x10, 0x08 etc)
  • Basically more practice with left and right shift

11
Design details added
main( )
define ACCELERATION_STEADY 1define
ACCELERATION_DECREASING 2define
ACCELERATION_INCREASING 3 variable
acceleration_changing
Initialize stuff (C)
Calculate Temperature
Communicationbetweenmain( )and ISR
Store temperature, calculate averages and ranges
General Purpose Timercontrolling Display
asISR Temperature / Accelerationgraphic
(non-text) displayChanges, actual temperatures
Calculate Acceleration
Store acceleration, calculate averages and ranges
12
Display Average Acceleration -- part of the GPT
ISR
  • Use WriteLEDASM( ) to display whether the average
    acceleration (calculated in main( )) is
    increasing, decreasing or staying the sameSort
    of acceleration dancing lights
  • If staying the same flash all lights on and off

13
Again write the Test Then write the code to
satisfy the test
TEST(StableAcceleration_ISR_CPP, DEVELOPER_TEST)
InitializeLEDInterfaceASM( ) ResetDisplay(
) register_handler(ik_ivg11, Display_ISR_CPP)
acceleration_changing 0 raise(SIGIVG11)
// SWI SoftWare Interrupt long int
display_value ReadLEDASM( ) CHECK(display_valu
e 0x00) // All lights off
raise(SIGIVG11) display_value ReadLEDASM(
) CHECK( display_value 0x3F) // All
lights on register_handler(ik_ivg1
1, EX_INT_IGNORE)
14
ResetDisplay( )
  • Why is this function call here?
  • No idea at the moment
  • But sounds like a good idea to be able to do
    this.
  • If we are going to run a series of tests and then
    check the display output, we will probably want
    to put the display into a known mode
  • If not needed then we will REFACTOR this
    function out of the code and the project.
  • Calling a do-nothing routine does not hurt at
    this stage in project development

15
Write the tests for 20 SWI activations and
display checking -- Max 10 lines of code
TEST(MultipleTests_StableAcceleration_ISR_CPP,
DEVELOPER_TEST)
16
Now write the code to satisfy the test
  • EX_INTERRUPT_HANDLER(Display_ISR_CPP)
  • pTIMER_STATUS 1 // Clear TIMIL0 (WIC)
  • //
    See page 15 8
  • DisplayAverageAcceleration( ) // This is a
    subroutine
    // called from inside
    // an ISR
  • // Perhaps later
  • // DisplayAverageTemperature( ) // This is
    a subroutine
    // called from inside
    //
    an ISR

17
Now write the code to satisfy the test
  • // This is a subroutine called from inside an ISR
  • // LATER will need to REFACTOR for speed,
    removing
  • // all unnecessary code
  • volatile long int acceleration_changing 0
  • void DisplayAverageAcceleration(void) static
    long int LEDdisplay_output 0 if
    (acceleration_changing 0)
    LEDdisplay_output 0x3F LEDdisplay_output
  • WriteLEDASM(LEDdisplay_output)

18
Display Average Acceleration -- part of the GPT
ISR
  • Use WriteLEDASM( ) to display whether the average
    acceleration (calculated in main( )) is
    increasing, decreasing or staying the sameSort
    of acceleration dancing lights
  • If increasing acceleration race the lights to
    the left(0x00, 0x01, 0x02, 0x04, 0x08 etc)

19
Again write the Test Then write the code to
satisfy the test
TEST(IncreasingAcceleration_ISR_CPP,
DEVELOPER_TEST) InitializeLEDInterfaceASM( )
ResetDisplay( ) register_handler(ik_ivg11,
Display_ISR_CPP) acceleration_changing
1 raise(SIGIVG11) // SWI
SoftWare Interrupt long int display_value
ReadLEDASM( ) CHECK(display_value 0x00)
// All lights off
raise(SIGIVG11) display_value ReadLEDASM(
) CHECK( display_value 0x01) // First
light on register_handler(ik_ivg11
, EX_INT_IGNORE)
20
Write the tests for 20 SWI activations and
display checking -- Max 10 lines of code
TEST(MultipleTests_IncreasingAcceleration_ISR_CPP,
DEVELOPER_TEST)
21
Now write the code to satisfy the test
22
Write the tests for decreasing acceleration,then
write the code
23
Cargo Monitoring System -- update
  • During transport
  • Quick indication of health of product NOW
  • Acceleration in range accuracy of - 1/8 G
  • Temperature steady accuracy of - 1 / 32 C

If average acceleration staying the same flash
all lights on and off If average acceleration
increasing race the lights to the left(0x00,
0x01, 0x02, 0x04, 0x08 etc) If average
acceleration decreasing race the lights to the
right(0x00, 0x20, 0x10, 0x08 etc) Need a
mechanism to able to display current
acceleration as a value or display average
accelerationPerhaps the switching will be
caused by pressing SW3 on front panel
24
Must go back and modify the test
TEST(StableAcceleration_ISR_CPP, DEVELOPER_TEST)
InitializeLEDInterfaceASM( ) ResetDisplay(
) register_handler(ik_ivg11, Display_ISR_CPP)
acceleration_changing 0
display_true_acceleration false raise(SIGIVG1
1) // SWI SoftWare Interrupt long
int display_value ReadLEDASM(
) CHECK(display_value 0x00) // All lights
off raise(SIGIVG11) display_valu
e ReadLEDASM( ) CHECK( display_value
0x3F) // All lights on
register_handler(ik_ivg11, EX_INT_IGNORE)
25
Must go back and modify the test fordisplaying
the average acceleration
TEST(StableAcceleration_ISR_CPP, DEVELOPER_TEST)
InitializeLEDInterfaceASM( ) ResetDisplay(
) register_handler(ik_ivg11, Display_ISR_CPP)
display_true_acceleration false acceleratio
n_changing 0 raise(SIGIVG11) //
SWI SoftWare Interrupt long int display_value
ReadLEDASM( ) CHECK(display_value 0x00)
// All lights off
raise(SIGIVG11) display_value ReadLEDASM(
) CHECK( display_value 0x3F) // All
lights on register_handler(ik_ivg1
1, EX_INT_IGNORE)
26
Now write the code to satisfy the test
  • volatile bool display_true_acceleration false
  • EX_INTERRUPT_HANDLER(Display_ISR_CPP)
  • pTIMER_STATUS 1 // Clear TIMIL0 (WIC)
  • //
    See page 15 8
  • if (display_true_acceleration false)
    DisplayAverageAcceleration( ) // This is a
    subroutine
    // called from inside

    // an ISR
  • // Perhaps later
  • // DisplayAverageTemperature( ) // This is
    a subroutine
    // called from inside
    //
    an ISR

27
Write a test for displaying accelerationRemember
1 g is stored as 0x10000
TEST(TemperatureDisplay_ISR_CPP, DEVELOPER_TEST)
InitializeLEDInterfaceASM( ) ResetDisplay(
) register_handler(ik_ivg11, Display_ISR_CPP)
display_true_acceleration true
acceleration 0 raise(SIGIVG11)
// SWI SoftWare Interrupt long int
display_value ReadLEDASM( ) CHECK(display_valu
e 0x00) // All lights off
acceleration 1 ACCELERATION_SCALE_FACTOR
raise(SIGIVG11) display_value
ReadLEDASM( ) CHECK( display_value 0x10)
// represent 0x1.0 g
register_handler(ik_ivg11, EX_INT_IGNORE)
28
Now write the code to satisfy the test
  • volatile bool display_true_acceleration false
  • EX_INTERRUPT_HANDLER(Display_ISR_CPP)
  • pTIMER_STATUS 1 // Clear TIMIL0 (WIC)
  • //
    See page 15 8
  • if (display_true_acceleration true)
    // I prefer positive tests
    DisplayTrueAcceleration( ) //
    REFACTOR the code to match thiselse
    DisplayAverageAcceleration( ) // This is a
    subroutine
    // called from inside

    // an ISR
  • // Perhaps later
  • // DisplayAverageTemperature( ) // This is
    a subroutine
    // called from inside
    //
    an ISR

29
Only thing left in Cargo Monitoring System to do
is measure the acceleration
  • During transport
  • Quick indication of health of product NOW
  • Acceleration in range accuracy of - 1 / 8 G
  • Temperature steady accuracy of - 1 / 32 C
  • On delivery
  • Display of ranges that cargo has experienced
  • Range of temperatures and accelerations
  • Other cargo information
Write a Comment
User Comments (0)
About PowerShow.com