Title: Lab. 1
1Lab. 1 Required Tasks.
- For more details see the Lab. 1 web-site
2Laboratory 1 Tasks
- Download the C Talk-through program.
- Board check -- Check that you can hear the audio
output - Develop and test the code for initializing the
Flash Memory and writing to the LEDs - Use the provided tests to check your code
- Routine for initializing the PF GPIO lines
(programmable flags) - Use the provided tests to check your code
- Develop the ReadProgrammableFlagsASM( ) to read
the switches - Use the provided tests to check your code
- Develop the Read-and-Store switch values in C
and ASM use to drive the car
3Set up for Task 1
AUDIO-IN
AUDIO-OUT
4Task 1Download audio-talk-through program
- If you have not already done so, download and
expand ENCM511Directory.zip file so that you have
the correct directory. structure and test driven
development environment needed for Laboratory 1
and Assignments1. - Download and expand the files in
CPP_Talkthrough.zip into your AudioDemo
directory. - Build an AudioDemo Blackfin project in your
AudioDemo directory and add the (provided) files
into the project -- compile and link. - Download the executable (.dxe) file onto the
BF533 processor. - Hook up your CD or IPOD output to the CJ2 stereo
input. - Hook up your ear-phones to the CJ3 stereo output.
- Run the AudioDemo.dxe executable and check that
the talk through program is working. - This task demonstrated your ability to build VDSP
Blackfin projects and run the code.
5Question What is a talk-through program?
- Clear example of applying the first two rules of
assembly language programming - Rule 1 If you have a choice dont use
assembly code - It takes as much time (and SOST) to design,
code, review, test and maintain one line of C
code as it does assembly code, but one line of
C often can do more - Rule 2 If somebody has a working example,
cannibalize it for your own work (if legal)
6The talk through program (C)
Prepare to run C code (before you get to main(
))
Every1 / 44,000 s
Set up the EBIUExternal Bus Unit
Store A/D register value(DMA) into memory
Use EBIUto initialize A/D and D/A
Call ProcessDataCPP( )or ProcessDataASM( )
SET UP theA/D and D/A interrupts
Set messages and flagsto main( )
ACTIVATE the A/D and D/A interrupts
Load memory (DMA) into D/A register
while (1) / Wait for messages /
main( )
ISR -- Interrupt Service Routine
7main( )
The system prepares theprocessor to run C
code(before you get to main( ))
int main(void) sysreg_write(reg_SYSCFG,
0x32) //Initialize System
Configuration Register Init_EBIU() Init_Flash(
) Init1836() Init_Sport0() // Serial
PORT Init_DMA() Init_Sport_Interrupts() Enabl
e_DMA_Sport0() // Serial PORT
while (1) / /
Set up the EBIUExternal Bus Unit
Use EBIUto initialize A/D and D/A
SET UP theA/D and D/A interrupts
ACTIVATE the A/D and D/A interrupts
while (1) / Wait for messages /
8ProcessDataCPP( )
include "Talkthrough.h" extern volatile int
iChannel0LeftIn, iChannel0LeftOut void
Process_DataCPP(void) iChannel0LeftOut
iChannel0LeftIn iChannel0RightOut
iChannel0RightIn iChannel1LeftOut
iChannel1LeftIn iChannel1RightOut
iChannel1RightIn
TASK 1 Download the Talkthrough program and
check that it works Voice-activated
radio-controlled car works by modifying the
ProcessData( ) subroutine
9Building a voice activated radio controlled car
-- 4 Threads at least
SWITCHES ON FRONT PANELINPUT COMMANDS
LED LIGHTS ON FRONT PANELCONTROLSIGNALS TO RF
TRANS
PROGRAMMABLE FLAGS
LED-CONTROLREGISTER
FIO_FLAG_D Register
EBIU INTERFACE
YOUR PROGRAM RUNNING ON THE BLACKFIN
int ReadSwitches( )
void WriteLED(int )
ProcessDataASM( ) subroutine
D/A
EARPHONES
A/D
VOICE
A/D D/A Interrupt routine
10Set-up for Laboratory 1 interfacing.Make the
switches work
- De-activate Visual DSP
- Power down Blackfin
- Connect power to special Blackfin interface
connector - Connect 50-pin cable to logic-lab
- Connect 50-pin cable to Blackfin
- Power up logic lab. station
- Power up Blackfin
- Reactivate Visual DSP
- Check that station works using Lab. 1
test-executable
11Special power-connector for Blackfin interface
on logic lab. station
12Special power-connector for Blackfin interface
on logic lab. station
- Picture of the power connector taken with a
camera with a finger-print on the lens. Check
that has not been stolen. Extras in your lab. kit
is needed (perhaps)
13Connect 50-pin cable to Blackfin
14Connect 50-pin cable to logic lab
- Make sure that all 50-pin connections are secure
and proper. - Power up the logic lab. station and check that is
working toggle switches and LEDs
CHEK each lab. As fuses can just wear out
15Task Initialize the Programmable flag interface
16 I/O lines on the Blackfin
- Warning could burn out the Blackfin processor
if done incorrectly - You need to set (store a known value to) a number
of Blackfin internal registers - Most important ones
- FIO_DIR Data DIRection 0 for input
- FIO_INEN INterface ENable 1 for enabled
- FIO_FLAG_D Programmable FLAG Data register
16Why do you need to know how to do read (load)
and write (store) on internal registers?
- Flag Direction register (FIO_DIR)
- Used to determine if the PF bit is to be used for
input or output -- WARNING SMOKE POSSIBLE
ISSUE - Need to set pins PF11 to PF8 for input, leave all
other pins unchanged
17Making sure that the FIO_DIR is correct for LAB.
1 NOTE may need to change for later
labaoratories
Write the Blackfin assembly language
instruction(s) to load the address of the
internal programmable flag FIO_DIR register into
pointer register P1 then SET the Blackfin PF
lines to act as inputs
include ltdefsBF533.hgt include ltmacros.hgt P1.L lo (FIO_DIR) P1.H hi (FIO_DIR) // Check the requirements need to have all input // Manual says setting a line for input means setting FIO_DIR bit values to 0 R0 0 WP1 R0 // This changes All pins ssync // Force Blackfin to do the write (store) operation NOW not later
Design Error Changes all pins
18Setting FIO_DIR to zero for ONLY pins 8, 9, 10
and 11. Other pins unchanged
P1.L lo (FIO_DIR) // include ltdefsBF533.hgt knows FIO_DIR value P1.H hi (FIO_DIR) // R0 0 // DESIGN ERROR changes all pins to 0 // WP1 R0 // This changes All pins // Correct approach use an AND mask operation // Read the current value // Prepare the 32-bit mask with bits // 8 to 11 set to 1, other bits 0 // Complement operation // bits 8 to 11 are 0, other bits 1 // R3 bits 0 for bits 8 to 11 // R3 bits FIO_DIR bits otherwise // Restore FIO DIR with bits 8 to 11 set to 0, ssync // Force Blackfin to do the write (store) NOW not later
19Registers used to control PF pins
- Flag Input Enable Register
- Only activate the pins you want to use (saves
power in telecommunications situation) - Need to activate pins PF11 to PF8 for input,
leave all other pins unchanged
20Making sure that the FIO_INEN is correct for
enable of pins 8 to 11
Write the Blackfin assembly language
instruction(s) to load the address of the
internal programmable flag FIO_INEN register
into pointer register P1 then ENABLE the
Blackfin PF lines as inputs
include ltdefsBF533.hgt include ltmacros.hgt P1.L lo (FIO_?????) P1.H hi (FIO_?????) // Check the requirements need to have all input // Manual says setting a line for input means setting bit values to 0 R0 0x0F00 WP1 R0 // This changes All pins 8 to 11 ON (enable), others OFF ssync // Force Blackfin to do the write (store) NOW not later
Design Error Changes all pins
21Setting FIO_INEN to one for ONLY pins 8, 9, 10
and 11. Other pins unchanged
P1.L lo (FIO_???) // include ltdefsBF533.hgt knows FIO_INEN value P1.H hi (FIO_???) // R0 0x0F00 // DESIGN ERROR changes all pins // WP1 R0 // This changes All pins // Correct approach use an AND mask operation // Read the current value // Prepare the 32-bit mask with bits // 8 to 11 set to 1, other bits 0 // R3 bits 1 for bits 8 to 11 // R3 bits FIO_DIR bits otherwise // Restore FIO INEN with bits 8 to 11 set to 1, ssync // Force Blackfin to do the write (store) NOW not later
22Registers used to control PF pins
- Flag Data register (FIO_FLAG_D)
- Used to read the PF bits as an input -- (1 or
0) - Need to read pins PF11 to PF8, ignore all other
pins values
23Task Setting up the programmable flag interface
- Follow the instructions carefully
- FIO_DIR direction register write 0s to bits
8 to 11 - FIO_INEN input enable register write 1s to
bits 8, 9, 10, 11 - Other registers bits leave unchanged
- There are 6 registers in total
- To provide a screen dump of the test result to
show your code works - Use PRT-SCR button and then paste in .doc file.
24int ReadBlackfinGPIOFlagsASM( )
include ltdefsBF533.hgt include ltmacros.hgt .global _ReadBlackfinGPIOFlags__Fv _ReadBlackfinGPIOFlags__Fv LINK 16 P1.L lo (FIO_FLAG_D) // could be P0 P1.H hi (FIO_FLAG_D) R0 WP1 (Z) P0 FP 4 UNLINK _ReadPBlackfinGPIOFlags__Fv JUMP (P0) Must use W since the manual shows that FIO_FLAG_D register is 16-bits Must use WP1 (Z) zero-extend as this adds 16 zeros to the 16 bits from FIO_FLAG_D register to make 32-bits to place into R0
25How to use int ReadBlackFinGPIOFlagsASM( )
- int GPIO_setting ReadBlackfinGPIOFlags
ASM( )
(FIO_POLAR register 0) All switches
unpressed Binary Pattern in FIO_FLAG_D register B
????0000???????? All switches pressed Binary
Pattern in FIO_FLAG_D register B ????1111????????
SWITCHES ON FRONT PANEL
PROGRAMMABLE FLAGS
FIO_FLAG_D Register
int ReadSwitches( )
Binary ? Means we dont know what the answer is
26How to use int ReadBlackfinGPIOFlagsASM( )
- int GPIO_setting ReadBlackfinGPIOFlagsAS
M( )
(FIO_POLAR register 0) All switches
unpressed Binary Pattern in FIO_FLAG_D register B
XXXX0000XXXXXXXX All switches pressed Binary
Pattern in FIO_FLAG_D register B XXXX1111XXXXXXXX
SWITCHES ON FRONT PANEL
PROGRAMMABLE FLAGS
FIO_FLAG_D Register
int ReadSwitches( )
Binary X Means we dont know what the answer is
and dont care
27Echoing the switches to the LEDCode in main( )
written in C
int main( ) InitializeGPIOInterface( ) //
Check Lab. 1 for exact name needed InitializeFl
ashLEDInterface( ) // Check Lab. 1 for exact
name needed define SWITCHBITS 0x0F00
// Look in MIPs notes about
//
using a mask and the
// AND
bit-wise operation //
to select desired bits while
(1) // Forever loop
int GPIO_value ReadBlackfinGPIOFlagsASM ( )
int desired_bits GPIO_value
SWITCHBITS int
LED_light_values desired_bits gtgt 8 // Bits
in wrong position
WriteFlashLEDLights(LED_light_values) // to
display on LEDS
28Avoid this common mistake
- Many seem to think that the switch routine
returns 1 if SW1 is pressed, 2 if SW2 is pressed,
3 if SW3 is pressed. - This is NOT correct as the switch routine has to
be able to return 16 different values - Value meaning SW1 pressed, SW2, SW3, SW4 not
pressed (0x0100) - Value meaning SW1 and SW4 pressed with SW2 and
SW3 not pressed (0x0900)
29Practice example -- Rewrite the code so that loop
stops if all the switches are pressed at the same
time
int main( ) InitializeSwitchInterface( )
// Check Lab. 1 for exact name
needed InitializeLEDInterface( )
???? define SWITCHBITS 0x0F00 //
Looking in MIPs notes about MASKS
while (???? ) //
conditional loop int
GPIO_value Read ReadBlackfinGPIOFlagsASM ( )
int desired_bits GPIO_value
SWITCHBITS int
LED_light_values desired_bits gtgt 8 // Bits
in wrong position
WriteFlashLEDLightsASM(LED_light_values)
????
30Laboratory 1 Tasks
- Download the C Talk-through program.
- Board check -- Check that you can hear the audio
output - Develop and test the code for initializing the
Flash Memory and writing to the LEDs - Use the provided tests to check your code
- Routine for initializing the PF GPIO lines
(programmable flags) - Use the provided tests to check your code
- Develop the ReadProgrammableFlagsASM( ) to read
the switches - Use the provided tests to check your code
- Develop the Morse code program in C and ASM