Developing a bicycle speed-o-meter Part 2

Slides:



Advertisements
Similar presentations
Microprocessor or Microcontroller Not just a case of “you say tomarto and I say tomayto” M. Smith, ECE University of Calgary, Canada.
Advertisements

Embedded System Timers Details of independent timers build into the Blackfin Assignment 2-- Watchdog Timer can be used to prevent the OS system from locking.
Assignment Overview Thermal oscillator One of the ENCM415 Laboratory 2 items Oscillator out GND +5V.
Boot Issues Processor comparison TigerSHARC multi-processor system Blackfin single-core.
Daddy! -- Where do instructions come from? Program Sequencer controls program flow and provides the next instruction to be executed Straight line code,
This presentation will probably involve audience discussion, which will create action items. Use PowerPoint to keep track of these action items during.
The planned but unexpected Program Sequencer controls program flow and provides the next instruction to be executed Interrupt – causing and handling.
6/2/2015 Labs in ENCM415. Laboratory 2 PF control, Copyright M. Smith, ECE, University of Calgary, Canada 1 Temperature Sensor Laboratory 2 Part 2 – Developing.
Thermal arm-wrestling Design of a video game using two programmable flags (PF) interrupts Tutorial on handling 2 Hardware interrupts from an external device.
Building a simple loop using Blackfin assembly code M. Smith, Electrical and Computer Engineering, University of Calgary, Canada.
Specialized Video (8-bit) and Vector (16-bit) Instructions on the Blackfin There is always a “MAKE-UP-YOUR-QUESTION-AND-ANSWER-IT” Question on a Dr. Smith.
Developing a bicycle speed-o-meter Part 2 A comparison between the Analog Devices ADSP-BF533 (Blackfin) and Motorola MC68332.
Lab. 1 – Task 1 to 4 details 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.
Microprocessor or Microcontroller Not just a case of “you say tomarto and I say tomayto” M. Smith, ECE University of Calgary, Canada.
Core Timer Code Development How you could have done the Take- Home Quiz using a test driven development (TDD) approach.
Specialized Video (8-bit) and Vector (16-bit) Instructions on the Blackfin Expand on these ideas for Q9 question and answer on the final.
LCD programming Design and implementation details on the way to a valid SPI-LCD interface driver.
Developing a bicycle speed-o-meter A comparison between the Analog Devices ADSP-BF533 (Blackfin) and Motorola MC68332.
Timers and Timing Signals Tutorial. 6/18/2015 Timer Control Copyright M. Smith, ECE, University of Calgary, Canada 2 / 31 Temperature Sensor -- Lab 3.
Understanding the Blackfin ADSP-BF5XX Assembly Code Format
Microprocessor or Microcontroller Not just a case of “you say tomarto and I say tomayto” M. Smith, ECE University of Calgary, Canada.
Laboratory 1 – ENCM415 Familiarization with the Analog Devices’ VisualDSP++ Integrated Development Environment.
Microprocessor or Microcontroller Not just a case of “you say tomarto and I say tomayto” M. Smith, ECE University of Calgary, Canada.
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.
Developing a bicycle speed-o-meter Midterm 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.
Blackfin Timers Independent timers build into the processor Watchdog Timer is a major part of Lab. 2 (Code provided to you to use)
Moving Arrays -- 1 Completion of ideas needed for a general and complete program Final concepts needed for Final Review for Final – Loop efficiency.
Lab. 1 – Required Tasks. For more details – see the Lab. 1 web-site.
Handling multiple input signals Version #2 – co-operative scheduler Version #3 – pre-emptive scheduler.
Building a simple loop using Blackfin assembly code If you can handle the while-loop correctly in assembly code on any processor, then most of the other.
Lab. 1 – GPIO Pin control Using information ENEL353 and ENCM369 text books combined with Blackfin DATA manual.
Assignment 4 / Lab. 3 Convert C++ ISR to ASM AND GET IT TO WORK Doing Assignment 4 / Lab. 3 the Test Driven Development way.
C Calling Conventions parameters are passed on the run-time or system stack, SP (or A7) parameters pushed on stack in “right to left” order of call A6.
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.
Stack Frames Stack frame = block of memory located in the system stack that contains: return address input parameters (from calling program to subroutine)
Developing a bicycle speed-o-meter
Moving Arrays -- 1 Completion of ideas needed for a general and complete program Final concepts needed for Final Review for Final – Loop efficiency.
A Play Core Timer Interrupts
SPI Compatible Devices
Thermal arm-wrestling
DMA example Video image manipulation
The planned and expected
Passing Parameters Data passed to a subroutine is called a parameter.
* M. R. Smith, University of Calgary, Alberta,
Moving Arrays -- 1 Completion of ideas needed for a general and complete program Final concepts needed for Final Review for Final – Loop efficiency.
Moving Arrays -- 2 Completion of ideas needed for a general and complete program Final concepts needed for Final DMA.
Thermal arm-wrestling
Using Arrays Completion of ideas needed for a general and complete program Final concepts needed for Final.
Moving Arrays -- 2 Completion of ideas needed for a general and complete program Final concepts needed for Final DMA.
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.
Expand on these ideas for Q9 question and answer on the final
Thermal arm-wrestling
Concept of TDD Test Driven Development
Blackfin Timers Independent timers build into the Blackfin
Lab. 1 – GPIO Pin control Using information ENEL353 and ENCM369 text books combined with Blackfin DATA manual.
Independent timers build into the processor Basis for Lab. 2
Input Laboratory: GPIO Pin control needed to have the Blackfin accept your commands Re-uses information from ENEL353 and ENCM369 courses and text books.
DMA example Video image manipulation
Developing a bicycle speed-o-meter
Blackfin Timers Independent timers build into the processor
Independent timers build into the processor
Developing a bicycle speed-o-meter
Developing a bicycle speed-o-meter
Thermal arm-wrestling
Building a simple loop using Blackfin assembly code
Blackfin Syntax Moves and Adds
Blackfin Syntax Stores, Jumps, Calls and Conditional Jumps
ECE511: Digital System & Microprocessor
Presentation transcript:

Developing a bicycle speed-o-meter Part 2 A comparison between the Analog Devices ADSP-BF533 (Blackfin) and Motorola MC68332

General Project concept Blackfin Programmable Flag (PF) Input Magnetic Sensor Signal Motorola Parallel Interface Timer (PIT) Input High speed clock signal 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Main function concept ulong DetermineSpeed(ulong wheelDiameter, ulong clockFrequency) #define ulong unsigned long int; extern “C” ulong CountClockASM(const int); // Assembly code interface extern “C” ulong CalculateSpeedASM(ulong, ulong, ulong); extern “C” void SetupInterface(void); ulong DetermineSpeed(ulong wheelDiameter, ulong clockFrequency) { // Get to known position on magnetic sensor signal unsigned long discard_count; unsigned long count_high, count_low; SetupInterface( ); discard_count = CountClockASM(while_MagneticSensorHigh); discard_count = CountClockASM(while_MagneticSensorLow); count_high = CountClockASM(while_MagneticSensorHigh); count_low = CountClockASM(while_MagneticSensorLow); return CalculateSpeedASM(count_high + count_low, wheelDiameter, clockFrequency); } 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Required Assembly Language extern “C” ulong CountClockASM(const int); // Assembly code interface extern “C” void SetupInterface(void); extern “C” ulong CalculateSpeedASM(ulong, ulong, ulong); ulong CountClockASM(const int high_low) { ulong clock_count = 0; while (magnetic_sensor = = high_low) { // if signal is unchanged from start // Must count just one clock signal low-to-high transition while (clock_signal = = high) /* wait */; while (clock_signal = = low) /* wait */; // Changes on low-to-high edge clock_count++; } return clock_count; 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Programming model MC68332 Blackfin Data Registers D0, D1 …. D7 R0, R1 …. R7 Address Registers A0, A1 …. A6 Pointer Registers P0, P1 … P5 Frame Buffer Use A4 or A6 FP Stack Pointer SP (A7) SP Special DSP I0-I3, B0-B3, M0-M3, L0-L3 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Register to Register Move reg1  reg 2 32 bit operations Syntax examples MC68332 Blackfin Register to Register Move reg1  reg 2 32 bit operations MOVE.L D2, D1 R1 = R2; Memory Moves MOVE.L #MEM1, A0 MOVE.L #MEM2, A1 MOVE.B (A0), (A1) (8-bits) P0.H = hi(MEM1); P0.L = lo(MEM1); P1.H = hi(MEM2); P1.L = lo(MEM2); R0 =W [P0]; W[P1] = R0; 16-bits Set the condition code register CMP.L D0, D1 CC = D1 == D0; CC = D1 < D0; CC = D1 <= D0; Conditional jump BEQ NEXT_INSTR (D1 == D0) BLT NEXT_INSTR (D1 < D0) BLE NEXT_INSTR (D1 <= D0) IF CC JUMP NEXT_INSTR 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Example loop code -- software loop C++ example Motorola Blackfin sum = 0; for (loop = 0; loop < 6; loop++) sum = sum + loop; Set D0 = sum , D1 = loop MOVE.L #0, D0 MOVE.L #0, D1 LOOP: CMP.L #6, D1 BGE PAST_LOOP ADD.L D1, D0 ADD.L #1, D1 BRA LOOP PAST_LOOP: Set R0 = sum , R1 = loop R0 = 0; R1 = 0; R2 = 6; LOOP: CC = R2 <= R1; IF !CC JUMP PAST_LOOP; R0 = R0 + R1; R1 += 1; JUMP LOOP 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Hardware test – wait while magnetic signal is “high” Motorola Blackfin Magnetic Signal Bit 1 of PADR register of PI/T interface Bit 10 of FIO_FLAG_D register of PF interface while (mag_signal == HIGH) /* wait */ ; MASK EQU 0x1 MOVE.L #PITBASE, A0 WHILE: MOVE.B PADR(A0), D0 AND.B #MASK, D0 CMP.B #MASK, D0 BEQ WHILE #define MASK 0x400 P0.H = hi(FIO_FLAG_D); P0.L = lo(FIO_FLAG_D); R1 = MASK; R0 = W[P0] (Z); R0 = R0 & R1; CC = R0 == R1; IF CC JUMP WHILE (BP); 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Required 68K Assembly Language _CountClockASM: MOVEA.L #0, A1 // Use as counter MOVEA.L #PITBASE, A0 MOVE.L 4(SP), D0 WHILE: MOVE.B PADR(A0), D1 AND.B #MASKMAG, D1 CMP.B D0, D1 BNE END_WHILE HIGH: MOVE.B PADR(A0), D1 AND.B #MASKCLK, D1 BNE HIGH LOW: MOVE.B PADR(A0), D1 AND.B #MASKCLK, D1 BEQ LOW ADDA.L #1, A1 BRA WHILE END_WHILE: MOVE.L A1, D0 RTS ulong CountClockASM(const int high_low) { ulong clock_count = 0; while (magnetic_sensor = = high_low) { // if signal is unchanged from start // Must count just one clock signal // low-to-high transition while (clock_signal = = high) /* wait */; while (clock_signal = = low) /* wait */; // Changes on low-to-high edge clock_count++; } return clock_count; 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Required BF533 Assembly Language _CountClockASM: R0 contains the INPAR R1 = 0; P0.H = hi(FIO_FLAG_D); P0.L = lo(FIO_FLAG_D); WHILE: R2 = W[P0] (Z); R3 = MASKMAG; R2 = R2 & R3; CC = R2 == R0; IF !CC JUMP ENDWHILE; R3 = MASKCLK; HIGH: R2 = W[P0] (Z); CC = R2 == R3 IF CC JUMP HIGH (BP); LOW : R2 = W[P0] (Z); CC = R2 < R3 IF CC JUMP LOW (BP); R1 += 1; JUMP WHILE END_WHILE: R0 = R1; RTS ulong CountClockASM(const int high_low) { ulong clock_count = 0; while (magnetic_sensor = = high_low) { // if signal is unchanged from start // Must count just one clock signal // low-to-high transition while (clock_signal = = high) /* wait */; while (clock_signal = = low) /* wait */; // Changes on low-to-high edge clock_count++; } return clock_count; 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Compare 68K and Blackfin 4/25/2019 _CountClockASM: R0 contains the INPAR R1 = 0; P0.H = hi(FIO_FLAG_D); P0.L = lo(FIO_FLAG_D); WHILE: R2 = W[P0] (Z); R3 = MASKMAG; R2 = R2 & R3; CC = R2 == R0; IF !CC JUMP ENDWHILE; R3 = MASKCLK; HIGH: R2 = W[P0] (Z); CC = R2 == R3 IF CC JUMP HIGH (BP); LOW : R2 = W[P0] (Z); CC = R2 < R3 IF CC JUMP LOW (BP); R1 += 1; JUMP WHILE END_WHILE: R0 = R1; RTS _CountClockASM: MOVEA.L #0, A1 // Use as counter MOVEA.L #PITBASE, A0 MOVE.L 4(SP), D0 WHILE: MOVE.B PADR(A0), D1 AND.B #MASKMAG, D1 CMP.B D0, D1 BNE END_WHILE HIGH: MOVE.B PADR(A0), D1 AND.B #MASKCLK, D1 BNE HIGH LOW: MOVE.B PADR(A0), D1 AND.B #MASKCLK, D1 BEQ LOW ADDA.L #1, A1 BRA WHILE END_WHILE: MOVE.L A1, D0 RTS 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Subroutine / Function calls Motorola Blackfin extern “C” int FooASM(int, int, int) C = FooASM(1,2,3) .IMPORT _FooASM FP EQU A6 LINK FP, -16 MOVE.L D4, 12(SP) MOVE.L #1, 0(SP) MOVE.L #2, 4(SP) MOVE.L #3, 8(SP) JSR _FooASM MOVE.L D0, D4 .. Other code MOVE.L 12(SP), D4 UNLINK RTS .extern _FooASM LINK 20; [SP + 16] = R4; R0 = 1; R1 = 2; R2 = 3; CALL _FooASM; R4 = R0; R4 = [SP + 16]; UNLINK; RTS; 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Code conventions for subroutines / functions Motorola -- SDS Blackfin -- VisualDSP Volatile registers D0, D1 A0, A1 R0, R1, R2, R3 P0, P1, P2 Non-volatile registers D2, D2, D4, D5, D6, D7 A2, A3, A4, A5, A6, A7 R4, R5, R6, R7 P3, P4, P5, FP, SP Subroutine return value is passed in D0 R0 Subroutine OUTPARS OUTPAR1  0(SP) OUTPAR2  4(SP) OUTPAR3  8(SP) OUTPAR4  12(SP) OUTPAR1  R0 OUTPAR2  R1 OUTPAR3  R2 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Main 68K function concept _DetermineSpeed: LINK A6, -16 MOVE.L D4, 12(SP) JSR _SetupInterface MOVE.L #MASKMAG, 0(SP) JSR _CountClockASM MOVE.L #0, 0(SP) JSR _CountClockASM MOVE.L #MASKMAG, 0(SP) JSR _CountClockASM MOVE.L D0, D4 ; count_high MOVE.L #0, 0(SP) JSR _CountClockASM ADD.L D0, D4 ; high + low. MOVE.L D4, 0(SP) MOVE.L 8(FP), 4(SP) MOVE.L 12(FP), 8(SP) JSR _CalculateSpeedASM ; Return in D0 MOVE.L 12(SP), D4 UNLINK A6 RTS ulong DetermineSpeed(ulong wheelDiameter, ulong clockFrequency) { // Get to known position on magnetic sensor signal unsigned long discard_count; unsigned long count_high, count_low; SetupInterface( ); discard_count = CountClockASM(while_MagneticSensorHigh); discard_count = CountClockASM(while_MagneticSensorLow); count_high = CountClockASM(while_MagneticSensorHigh); count_low = CountClockASM(while_MagneticSensorLow); return CalculateSpeedASM(count_high + count_low, wheelDiameter, clockFrequency); } 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Main Blackfin function concept _DetermineSpeed: LINK 20 [FP + 8] = R0; [FP + 12] = R1; // Save INPARS [SP + 16] = R4; CALL _SetupInterface; R0 = MASKMAG; CALL _CountClockASM; R0 = 0; CALL _CountClockASM R4 = R0; // count_high R0 = R0 + R4; // high + low. R1 = [FP + 8]; // old INPAR1 R2 = [FP + 12]; // old INPAR2 CALL _CalculateSpeedASM // Return in R0 [SP + 16] = R4; UNLINK RTS ulong DetermineSpeed(ulong wheelDiameter, ulong clockFrequency) { // Get to known position on magnetic sensor signal unsigned long discard_count; unsigned long count_high, count_low; SetupInterface( ); discard_count = CountClockASM(while_MagneticSensorHigh); discard_count = CountClockASM(while_MagneticSensorLow); count_high = CountClockASM(while_MagneticSensorHigh); count_low = CountClockASM(while_MagneticSensorLow); return CalculateSpeedASM(count_high + count_low, wheelDiameter, clockFrequency); } 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Compare 68K and Blackfin _DetermineSpeed: LINK 20 [FP + 8] = R0; [FP + 12] = R1; // Save INPARS [SP + 16] = R4; CALL _SetupInterface; R0 = MASKMAG; CALL _CountClockASM; R0 = 0; CALL _CountClockASM R4 = R0; // count_high R0 = R0 + R4; // high + low. R1 = [FP + 8]; // old INPAR1 R2 = [FP + 12]; // old INPAR2 CALL _CalculateSpeedASM // Return in R0 [SP + 16] = R4; UNLINK RTS _DetermineSpeed: LINK A6, -16 MOVE.L D4, 12(SP) JSR _SetupInterface MOVE.L #MASKMAG, 0(SP) JSR _CountClockASM MOVE.L #0, 0(SP) JSR _CountClockASM MOVE.L #MASKMAG, 0(SP) JSR _CountClockASM MOVE.L D0, D4 ; count_high MOVE.L #0, 0(SP) JSR _CountClockASM ADD.L D0, D4 ; high + low. MOVE.L D4, 0(SP) MOVE.L 8(FP), 4(SP) MOVE.L 12(FP), 8(SP) JSR _CalculateSpeedASM ; Return in D0 MOVE.L 12(SP), D4 UNLINK A6 RTS 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

extern “C” void SetupInterface(void); Motorola Blackfin Direction register 0 = input, 1 = output PADDR 8-bits FIO_DIR 16-bits Interrupt control bits in PACR, PGCR control H1, H2 FIO_MASKA_D on any bit Enable input (Power save issue) FIO_INEN on any bit Polarity bits in PGCR control H1, H2 FIO_POLAR on any bit Edge / Level sensitivity FIO_EDGE FIO_BOTH on any bit Magnetic signal Clock signal Bit 0 MASKMAG 0x1 Bit 1 MASKCLK 0x2 Bit 10 MASKMAG 0x200 Bit 11 MASKCLK 0x400 4/25/2019 Motorola Blackfin Comparison Part 2 , Copyright M. Smith, ECE, University of Calgary, Canada

extern “C” void SetupInterface(void); SPECIFICS Motorola Blackfin Magnetic signal Clock signal Bit 0 MASKMAG 0x1 Bit 1 MASKCLK 0x2 Bit 10 MASKMAG 0x200 Bit 11 MASKCLK 0x400 Direction register 0 = input, 1 = output D0  PADDR MASK OFF BITS 1, 0 PADDR  D0 R0  FIO_DIR MASK OFF BITS 10, 11 FIO_DIR  R0 Interrupt control bits in PACR, PGCR control H1, H2 R0  FIO_MASKA_D MASK OFF BITS 10, 11 FIO_MASKA_D  R0 Enable input (Power save issue) R0  FIO_INEN OR BITS 10, 11 FIO_INEN  R0 Polarity bits in PGCR control H1, H2 R0  FIO_POLAR MASK OFF BITS 10, 11 FIO_POLAR  R0 Edge / Level sensitivity FIO_EDGE FIO_BOTH MASK OFF BITS 10, 11 4/25/2019 Motorola Blackfin Comparison Part 2 , Copyright M. Smith, ECE, University of Calgary, Canada

In class exercise – Write 68K code for extern “C” void SetupInterface(void); 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

In class exercise – Write Blackfin code for extern “C” void SetupInterface(void); 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada

Information taken from Analog Devices On-line Manuals with permission http://www.analog.com/processors/resources/technicalLibrary/manuals/ Information furnished by Analog Devices is believed to be accurate and reliable. However, Analog Devices assumes no responsibility for its use or for any infringement of any patent other rights of any third party which may result from its use. No license is granted by implication or otherwise under any patent or patent right of Analog Devices. Copyright  Analog Devices, Inc. All rights reserved. 4/25/2019 Motorola Blackfin Comparison Part 1 , Copyright M. Smith, ECE, University of Calgary, Canada