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

Slides:



Advertisements
Similar presentations
Week 3. Assembly Language Programming  Difficult when starting assembly programming  Have to work at low level  Use processor instructions >Requires.
Advertisements

Over-view of Lab. 1 For more details – see the Lab. 1 web-site There will be a 20 min prelab quiz (based on Assignment 1 and 2) at the start of the lab.
Blackfin BF533 EZ-KIT Control The O in I/O Activating a FLASH memory “output line” Part 2.
Help for Assignment 2. Topics Tackled Handling some “C++” keywords when programming assembly code –Programming “subroutines called by subroutines” –Programming.
Lab 3 Details. Lab 3 Develop a bio-feedback system based on a PWM (pulse width modulated) thermal sensor Use temperature setting to control the delays.
Assignment Overview Thermal oscillator One of the ENCM415 Laboratory 2 items Oscillator out GND +5V.
Blackfin BF533 EZ-KIT Control The O in I/O Activating a FLASH memory “output line” Part 2.
Thermal arm-wrestling Design of a video game using two programmable flags (PF) interrupts Tutorial on handling 2 Hardware interrupts from an external device.
Over-view of Lab. 1 For more details – see the Lab. 1 web-site There will be a 20 min prelab quiz (based on Assignment 1 and 2) at the start of the lab.
Lab. 2 – More details – Tasks 4 to 6 1. What concepts are you expected to understand after the Lab. 2 is finished? 2. How do you demonstrate that you have.
Calculating acceleration using ADXL213 – dual axis accelerometer.
A Play Core Timer Interrupts Acted by the Human Microcontroller Ensemble from ENCM415.
Over-view of Lab. 1 For more details – see the Lab. 1 web-site There will be a 20 min prelab quiz (based on Assignment 1 and 2) at the start of the lab.
Lab. 2 Overview 1. What concepts are you expected to understand after the Lab. 2 is finished? 2. How do you demonstrate that you have that knowledge?
Timers and Timing Signals Tutorial. 6/18/2015 Timer Control Copyright M. Smith, ECE, University of Calgary, Canada 2 / 31 Temperature Sensor -- Lab 3.
Development of cargo monitoring system for a rapid response team (disaster aid) Overview of concepts that you will demonstrate during Labs 3 and 4.
Development of cargo monitoring system for a rapid response team (disaster aid) Overview of concepts demonstrated during Labs 3 and 4.
Getting the O in I/O to work on a typical microcontroller Ideas of how to send output signals to the radio controlled car. The theory behind the LED controller.
Blackfin BF533 EZ-KIT Control The O in I/O Activating a FLASH memory “output line” Part 2.
Getting the O in I/O to work on a typical microcontroller Activating a FLASH memory “output line” Part 1 Main part of Laboratory 1 Also needed for “voice.
Later tasks of Lab. 1 For more details – see the Lab. 1 web-site There will be a 20 min prelab quiz (based on Assignment 1 and 2) at the start of the lab.
CS 106 Introduction to Computer Science I 10 / 16 / 2006 Instructor: Michael Eckmann.
Tutorial Essentially all the Blackfin instruction you need for all of ENCM511. The instructions are easy. Its knowing when to use them that is the difficult.
Peripherals and their Control An overview of industrially available “peripheral devices” that use “pulse-width modulation” for information passing. Review.
Input Laboratory: GPIO Pin control needed to have the Blackfin accept your commands Re-uses information from ENEL353 and ENCM369 courses and text books.
Nachos Phase 1 Code -Hints and Comments
© The McGraw-Hill Companies, 2006 Chapter 4 Implementing methods.
MCU: Interrupts and Timers Ganesh Pitchiah. What’s an MCU ?
Understanding the TigerSHARC ALU pipeline Determining the speed of one stage of IIR filter – Part 3 Understanding the memory pipeline issues.
Array Processing - 2. Objectives Demonstrate a swap. Demonstrate a linear search of an unsorted array Demonstrate how to search an array for a high value.
A Play Core Timer Interrupts Acted by the Human Microcontroller Ensemble from ENCM511.
Lab. 2 Overview Move the tasks you developed in Lab. 1 into the more controllable TTCOS operating system Manual control of RC car.
Timers and Interrupts Anurag Dwivedi. Let Us Revise.
Blackfin Array Handling Part 1 Making an array of Zeros void MakeZeroASM(int foo[ ], int N);
More on GLUT Programming Glenn G. Chappell U. of Alaska Fairbanks CS 381 Lecture Notes Monday, September 15, 2003.
CE Operating Systems Lecture 2 Low level hardware support for operating systems.
Calculating acceleration using ADXL213 – dual axis accelerometer Use equivalent idea in Lab. 3 with thermal sensor.
CE Operating Systems Lecture 2 Low level hardware support for operating systems.
Handling multiple input signals Version #2 – co-operative scheduler Version #3 – pre-emptive scheduler.
Searching CSE 103 Lecture 20 Wednesday, October 16, 2002 prepared by Doug Hogan.
MICROPROCESSOR DETAILS 1 Updated April 2011 ©Paul R. Godin prgodin gmail.com.
Lab. 1 – GPIO Pin control Using information ENEL353 and ENCM369 text books combined with Blackfin DATA manual.
Embedded Programming and Robotics Lesson 11 Arduino Interrupts 1.
A Play Core Timer Interrupts Acted by the Human Microcontroller Ensemble from ENCM415.
Assignment 4 / Lab. 3 Convert C++ ISR to ASM AND GET IT TO WORK Doing Assignment 4 / Lab. 3 the Test Driven Development way.
“Lab. 5” – Updating Lab. 3 to use DMA Test we understand DMA by using some simple memory to memory DMA Make life more interesting, since hardware is involved,
Developing Tasks to use with a co-operative scheduler Ideas for Assignment 2 Lab. 2, 3 and 4 Review for Midterm on Lab. 2 Ideas of defects, errors and.
Help for Lab. 1 Subroutines calling Subroutines
Software Development with uMPS
Lab. 2 Overview – Earlier Tasks Prelaboratory T1, T3, T4 and T5
A Play Core Timer Interrupts
Thermal arm-wrestling
Handling Arrays Completion of ideas needed for a general and complete program Final concepts needed for Final.
Coding Concepts (Sub- Programs)
Lab. 2 – More details – Later tasks
Thermal arm-wrestling
A Play Lab. 2 Task 8 Core Timer Interrupts
General purpose timers
Handling Arrays Completion of ideas needed for a general and complete program Final concepts needed for Final.
General purpose timers
Getting serious about “going fast” on the TigerSHARC
Thermal arm-wrestling
Explaining issues with DCremoval( )
Lab. 1 – GPIO Pin control Using information ENEL353 and ENCM369 text books combined with Blackfin DATA manual.
Input Laboratory: GPIO Pin control needed to have the Blackfin accept your commands Re-uses information from ENEL353 and ENCM369 courses and text books.
Handling Arrays Completion of ideas needed for a general and complete program Final concepts needed for Final.
Independent timers build into the processor
Lab. 2 Overview Move the tasks you developed in Lab. 1 into the more controllable TTCOS operating system.
Thermal arm-wrestling
Display Interrupt Service Routine for cargo monitoring system
Presentation transcript:

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

2 / 28 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 / 28 Overall design Initialize stuff (C++) Calculate Temperature Store temperature, calculate averages and ranges Calculate Acceleration Store acceleration, calculate averages and ranges General Purpose Timer controlling Display as ISR Temperature / Acceleration graphic (non-text) display Changes, actual temperatures Core temperature ISR clock used for Temperature / Acceleration determination Communications with LCD MOSI / MISO format -- ISR Temperature / Acceleration information Text format main( )

4 / 28 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 / 28 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 I’ll discuss the code for handling the Acceleration display in the lectures

6 / 28 Test that can call an ISR and return from the interrupt without crashing system Most of the notes from last Monday’s 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 / 28 Test that can access and return from ISR #include #include #include #include #include EX_INTERRUPT_HANDLER(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 / 28 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 / 28 Recap - Assembly language version Minimum interrupt stub for timer 0. section program;.global _Display_ISR_ASM__FiN21; // Question – why ISR name mangle __FiN21 _Display_ISR_ASM__FiN21: // when we can’t pass it any parameters? [--SP] = ASTAT; [--SP] = FP; [--SP] = (R7:0, P5:0); // 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; W[P0] = R0; UNLINK; (R7:0, P5:0) = [SP++]; FP = [SP++]; ASTAT = [SP++]; _Display_ISR_ASM__FiN21.END: RTI;

10 / 28 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 same Sort 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 / 28 Design details added Initialize stuff (C++) Calculate Temperature Store temperature, calculate averages and ranges Calculate Acceleration Store acceleration, calculate averages and ranges General Purpose Timer controlling Display as ISR Temperature / Acceleration graphic (non-text) display Changes, actual temperatures #define ACCELERATION_STEADY 1 #define ACCELERATION_DECREASING 2 #define ACCELERATION_INCREASING 3 variable acceleration_changing Communication between main( ) and ISR main( )

12 / 28 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 same Sort of “acceleration dancing lights” If staying the same – flash all lights on and off

13 / 28 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_value == 0x00); // All lights off raise(SIGIVG11); display_value = ReadLEDASM( ); CHECK( display_value == 0x3F); // All lights on register_handler(ik_ivg11, EX_INT_IGNORE); }

14 / 28 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 / 28 Write the tests for 20 SWI activations and display checking -- Max 10 lines of code TEST(MultipleTests_StableAcceleration_ISR_CPP, DEVELOPER_TEST) { }

16 / 28 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 / 28 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 / 28 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 same Sort of “acceleration dancing lights” If increasing acceleration – race the lights to the left (0x00, 0x01, 0x02, 0x04, 0x08 etc)

19 / 28 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 / 28 Write the tests for 20 SWI activations and display checking -- Max 10 lines of code TEST(MultipleTests_IncreasingAcceleration_ISR_CPP, DEVELOPER_TEST) { }

21 / 28 Now write the code to satisfy the test

22 / 28 Write the tests for decreasing acceleration, then write the code

23 / 28 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 acceleration” Perhaps the switching will be caused by pressing SW3 on front panel

24 / 28 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(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_ivg11, EX_INT_IGNORE); }

25 / 28 Must go back and modify the test for displaying the “average acceleration” TEST(StableAcceleration_ISR_CPP, DEVELOPER_TEST) { InitializeLEDInterfaceASM( ); ResetDisplay( ); register_handler(ik_ivg11, Display_ISR_CPP); display_true_acceleration = false; acceleration_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_ivg11, EX_INT_IGNORE); }

26 / 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 == false) DisplayAverageAcceleration( ); // This is a subroutine // called from inside // an ISR // Perhaps later // DisplayAverageTemperature( ); // This is a subroutine // called from inside // an ISR }

27 / 28 Write a test for displaying acceleration Remember 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_value == 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 / 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 this else DisplayAverageAcceleration( ); // This is a subroutine // called from inside // an ISR // Perhaps later // DisplayAverageTemperature( ); // This is a subroutine // called from inside // an ISR }

29 / 28 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