Spec 2
Spec 2
Contents
1 General Remarks 2
2 High-Level Specification 2
2.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.1.1 Ethernet Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.2 MP3 Decoder/SD-Card . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.3 Potentiometer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.4 GLCD & Touchscreen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.5 2x16 LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.6 PS/2 interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.7 Compass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 Detailed Specification 5
3.1 TerrainGeneratorC (TerrainGenerator ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2 GamePadC (GamePad ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.3 PhysicsC (Physics) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.4 PS2C (PS2 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.5 VolumeAdcC (Read ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.6 HplVS1011eC (HplVS1011e) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.7 VS1011eC (MP3 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.8 SdcardC (Sdcard ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.9 TouchscreenC (Glcd, TouchScreen) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.10 TimerMilliC (Timer ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.11 BufferedLcdC (BufferedLcd ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.12 UdpC (UdpSend, UdpReceive) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.13 RandomAdcC (Read ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.14 RandomC (Random, ParameterInit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.15 ScoreC (Score, Init) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4 Theory Tasks 16
6 Grading 18
1
1 General Remarks
Before you start working on the application be sure that you are familiar with TinyOS.
We provide a TinyOS repository for this course in the TILAB , which you can clone with git clone
ssh://ssh.tilab.tuwien.ac.at/opt/mcvl/tinyos ss17.git. When you need to change files from the
TinyOS system, you need to copy them into your application directory and change them there. This
makes it a lot easier to apply future updates of TinyOS, if need be. It also makes submitting your
application much easier as you only have to submit one folder, which is also the only thing supported
by our Makefile. From time to time you should check for updates in the repository (when we release
bugfixes): Use git pull to update to the latest version. You will find the template for this application
located in the repository under the folder apps ecs/lunar lander.
No specification is complete! Design decisions have to be documented in the protocol.
Please note that if you want to receive bonus points for additional work, you have to state in the
protocol which parts you think are eligible for bonus points and why. Bonus points are awarded on a
case by case basis and there is no right for bonus points.
Please recall that bonus point only improve a positive grade and cannot help you pass the course.
Therefore, please add fancy stuff only after you have finished the basic assignment.
2 High-Level Specification
You have to implement a lunar lander clone, based on the TinyOS operating system. The gameplay has
to be controllable via an accelerometer located on the CompassClick add-on board. The player can set
their name via a PS/2 keyboard. Additionally, a network-based scoreboard has to be informed about
the achieved points of a player.
The mp3-board should be used to provide background music during gameplay, and may also play
sound effects. The volume of the music should be controllable via the potentiometer.
Over the ethernet board, your application has to respond correctly to ICMP Echo requests, and
properly refuse all other UDP packets (ICMP destination unreachable).
The PC has the static IP address 10.60.0.1 and the application should have the static IP address
10.60.0.10. The subnet mask is 255.255.255.0. On the PC, a scoreboard software, available on the course
homepage, can be run. This tool can be interacted with to have a highscore for the game.
2.1 Overview
The external interfaces of the lunar lander are shown in Figure 1. These are the “connections to the real
world” of the microcontroller application. They consist of the following elements:
Touchscreen
2
2.1.1 Ethernet Module
We are using the MikroElektronika Serial Ethernet Board [1] connected to the bigAVR6 development
board via SPI. This extension board features the Microchip ENC28j60 Ethernet controller [2] which
completely implements the physical, as well as the MAC layer, for a 10BASE-T Ethernet connection.
The wire connections between the extension board and the development board are shown in Table 1.
Note
You have to ensure that the dip switches for the on-board SD Card reader on SW15 are turned
off to correctly receive data from a module over SPI. You should always use the SD Card slot on
the SmartMP3 add-on board and disconnect the onboard slot via the according DIP switches on
SW15. The reason for this is that the onboard slot drives the MISO line even if the chip-select is
disabled and thus prevents all other communication on the bus.
Note
To allow for debugging of the network protocol, we have installed wireshark in the lab. You can
use it by running wireshark-p3p1.
Debugging via printf is also available, checkout the Printf and UartAndPrintf demo. In the lab
you can use, e.g., minicom by running minicom -o -D /dev/ttyS0 -b 115200. On some PCs
you may need to change the port to /dev/ttyS1! Note that printf uses UART1 which can be
connected to B Port on SW13.
SD Card
The SD Card stores a collection of sound files. You can choose to use one or more files in your application.
A detailed document with the list of sound files, and their alignment on the card, is available on the
course homepage [3]. The sounds are stored as raw data on the SD Card, i.e., there is no file system.
SD Card Block Access: (Read) Access to the SD Card is done in data blocks with a length of 32 bytes.
This part is provided as a component to you. While the component reads the card blockwise, it
expects the read offset as byte address. Despite this fact, all read access must be block-aligned.
The component also handles the initialization of the SD Card which has to be done at a lower
speed than the actual read access.
3
SmartMP3 bigAVR6
MISO PJ0
SPI MOSI PJ1
SCK PJ2
MMC CS PF4
SD Card
MMC CD PF5
BSYNC PF3
MP3 CS PF6
MP3
MP3 RST PF7
DREQ PJ3
VCC VCC
Power
GND GND
SPI: Low level access to the card is done via SPI, and is already implemented in TinyOS.
Pinout: The SD Card slot on the SmartMP3 extension should be attached to the bigAVR6 board using
the pins shown in Table 2.
Hint
While all students should use the same pinout, it is always a good idea to check the connections
when (re)starting to work in the lab. This can dramatically reduce the debugging needs of a
program which “worked the last time”.
MP3 Decoder
We use the VS1011e MP3 Audio Decoder on the MikroElektronika SmartMP3 add-on board [4] which has
a quite extensive datasheet [5]. We provide a component which handles the set-up and communication
with the decoder. You just have to implement a component which abstracts the data transmission and
access to the configuration of the module. The connection plan is shown in Table 2.
2.1.3 Potentiometer
The volume should be adjustable by turning the potentiometer P5 on the bigAVR6 board connected to
the ADC. When turning the potentiometer clockwise, the volume should increase. Use ADC Channel 2
as input and try to approximate a linear loudness scale.
Hint
The function 1 − (1 − x)4 , x ∈ [0, 1] is a good approximation and can be implemented using 16-bit
integer arithmetic (scale wisely).
Please also note that, when the volume is turned up very high, the SmartMP3 board can use more
power than certain USB ports can provide. Therefore, if you notice multiple resets of the controller while
music playback is active, it might help to reduce the volume (which your lab colleagues will favor) or to
use an external power supply.
4
height, and the landscape should be not higher than 3/4 of the screen in zoomed mode. Unzoomed at
least 80 m should be displayed on the screen.
The GLCD is connected via the designated mounting frame to the bigAVR6.
To enable the GLCD and the touchscreen you have to enable the dip switches 1–4 on SW13 as well
as dip switch 8 on SW15. The voltage reference jumper J18 should be set to VCC, and touchscreen
connector has to be placed into the corresponding connector CN22.
Note
Please do not remove the touchscreen’s cable from the connector. They are easy to yank off the
screen and if they are, the screen has to be replaced.
Signal Pin
CLK C7 (=PK7)
DATA D6 (=PK6)
2.1.7 Compass
Slightly contrary to its name, the Compass Click provides access to a accelerometer. The accelerometer
is used to control the lunar lander. To access the LSM303DLHC chip on this module, I2C/TWI is used.
As the LSM303DLHC works with 3.3 V, contrary to the 5 V the bigAVR6 uses, a level conversion is
required. Due to the bidirectional design of the I2C, a more elaborate solution as described in [6] has to
be used.1 We will setup the breadboards in the lab correctly and wire it to the EasyConnect. You only
have to ensure that the EasyConnect is connected to PORTD via an EasyTest.
3 Detailed Specification
A proposal for the TinyOS modules used in the application is shown in Figure 2. Square boxes mark
configurations/modules while elliptic nodes denote interfaces. The modules filled in orange have to be
implemented by you, while the white modules are already provided by us respectively included in TinyOS.
Note that the interface proposal is not complete as, depending on your implementation, you might need
additional modules and there might be other modules below the ones that are shown. In fact you will
have to alter some modules to implement the network functionality as requested by the specification.
You can also change some module dependencies if they are useful, e.g., integrating PS2 and GamePad
into a module GameInput might simplify things.
1 If this design would be used on the mp3- and the ethernet-board, they could share the same SPI bus.
5
LunarLanderAppC
ScoreC
RandomC GeneralIO PhysicsC VolumeAdcC
6
Read<uint16 t> Timer HplAtm1280GeneralIOC UdpReceive
GeneralIO ResourceConfigure
HplVS1011eC
TimerMilliC Read<uint16 t> Atm1280AdcConfig
UdpSend
RandomAdcC
AdcReadClientC
HplAtm1280GeneralIOC
GeneralIO ResourceConfigure
UdpC
AdcReadClientC
HplAtm1280GeneralIOC
Hint
The chip has an auto-increment functionality.
interface GamePad {
Listing 1: GamePad
7
Constant Value Description
m0 16 400 kg initial mass of the lander
fmax 8200 kg the initial amount of fuel of the lander
v0 (100, 0) m/s initial velocity of the lander
h0 (1,0) initial heading of the lander
p0 implementation dependent initial position of the lander.
Tmax 45 050 N maximum thrust the lander can produce
ṁ 208 kg/s mass flow rate of the lander’s engine.
g` 1.625 m/s2 lunar gravity
ω 0.125 rad/s maximal angular velocity
variable description
t the current simulation time.
α(t) rotation change at time t [−1, 1].
th(t) throttle position at time t, [0, 10 . . . 60]%
m mass of the lander
v velocity of the lander
a acceleration of the lander
h heading of the lander
o orientation vector of the lander
θ orientation of the lander in degree
t thrust vector of the lander
p position of the lander
Hint
It might be advantageous to develop and test the physic-related computations on a PC, where
debugging is much easier.
Plotting the output of your calculations can be quite useful, and fitting tool are installed in the
lab, e.g., gnuplot, or R.
Note
You a not required to implement the simulation as stated, but the general behavior has to be the
same. E.g., rearrange/optimize some calculations/constants to the improve performance.
Conditions for a safe landing Obviously, the lander has certain restrictions for a safe landing listed
below:
• The landing area has to be plane.
• The angle between the gravity vector and the orientation vector of the lander has to be 6 6◦ .
• The vertical velocity (towards the ground) has to be below 3.65 m/s.
• The horizontal velocity has to be below 1.82 m/s. If vertical velocity is below 1.52 m/s, a horizontal
velocity of 2.44 m/s is allowed.
8
m = m0 ;
v = v0 ;
h = h0 ;
p = p0 ;
t = 0;
while not (crashed or landed) do
wait ∆T ;
t = t + ∆T ;
t = −o;
ax = Tmax ·th(t)·t
m
x
;
Tmax ·th(t)·ty
ay = m + g` ;
v = v + ∆T · a;
p = p + ∆T · v;
m = m − ṁ · th(t);
θ = θ + α(t) · ω · ∆T ;
ox = ox · cos(θ) − oy · sin(θ);
oy = ox · sin(θ) + oy · cos(θ);
end
Algorithm 1: Simulation of the behavior of the lunar lander above the surface with a step size of ∆T .
/∗∗
∗ Init Pins, enable IRQ
∗/
command void init(void);
/∗∗
∗ Fired when a character has been entered on the keyboard
∗
∗ @param chr ASCII value of the character entered
∗/
async event void receivedChar(uint8 t chr);
Listing 2: PS2
9
and ResouceConfigure, to trigger the pin setup after the ADC access is granted. The pin access should
be done by using the interface GeneralIO provided by the module HplAtm1280GeneralIOC for all
pins.
Hint
All interfaces used by this module are defined by TinyOS. While hardware independent interfaces
usually can be found in “tos/interfaces” the hardware dependent interfaces (and their enum decla-
rations) usually can be found under a path resembling “tos/chips[ ecs]/theChip/[theFunction/]”.
Note that code can be inherited from other chips.
See “support/make/platforms/bigAVR6 1280.platform” for details about the code locations for our
platform.
/∗∗
∗ Init pins
∗/
command void init( void );
/∗∗
∗ Reset the VS1011e
∗/
command void reset( void );
/∗∗
∗ Set a VS1011e register to a given value
∗
∗ @param mp3Register Register to be written
∗ @param mp3Cmd Command to be written
∗
∗ @return SUCCESS if register write was requested successfully
∗/
command error t writeRegister( mp3 reg t mp3Register, uint16 t mp3Cmd );
/∗∗
∗ Notification that the register write completed
∗
∗ @param error SUCCESS if sending completed successfully
∗/
event void writeDone( error t error );
/∗∗
∗ Read a VS1011e register
∗
∗ @param mp3Register Register to be read
∗ @param value A point to a data buffer where the register content will be stored
∗
∗ @return SUCCESS if register read was requested successfully
∗/
command error t readRegister( mp3 reg t mp3Register, uint16 t ∗value );
/∗∗
∗ Notification that the register read completed
∗
10
∗ @param error SUCCESS if successfully
∗ @param value A point to a data buffer where the register content will be stored
∗/
event void readDone( error t error, uint16 t ∗value);
/∗∗
∗ Send data to the VS1011e
∗
∗ @param data A point to a data buffer where the data is stored. This
∗ buffer must be valid until sendDone gets signaled!
∗ @param len Length of the message to be sent − data must be at least as large as len
∗
∗ @return SUCCESS if request was granted and sending the data started
∗/
command error t sendData( uint8 t ∗data, uint8 t len );
/∗∗
∗ Notification that sending data completed
∗
∗ @param error SUCCESS if sending completed successfully
∗/
event void sendDone( error t error );
/∗∗
∗ Test if the VS1011e is ready to accept new data
∗
∗ @return FALSE if ready to accept new data
∗/
command bool isBusy( void );
}
Listing 3: HplVS1011e
/∗∗
∗ Start and stop sine test
∗
∗ @param on TRUE to start − FALSE to stop
∗
∗ @return SUCCESS if command was successfully sent over SPI
∗/
command error t sineTest( bool on );
/∗∗
∗ Set volume
∗
∗ @param volume Volume to be set
∗
∗ @return SUCCESS if command was successfully sent over SPI
∗/
command error t setVolume( uint8 t volume );
/∗∗
∗ Send data
∗
∗ @param data A point to a data buffer where the data is stored
11
∗ @param len Length of the message to be sent − data must be at least as large as len
∗
∗ @return SUCCESS if request was granted and sending the data started
∗/
command error t sendData( uint8 t ∗data, uint8 t len );
/∗∗
∗ Notification that sending data completed
∗
∗ @param error SUCCESS if sending completed successfully
∗/
event void sendDone( error t error );
/∗∗
∗ Check if VS1011e is ready to accept new data
∗
∗ @return FALSE if VS1011e is busy or sending of data is in progress − otherwise TRUE
∗/
command bool isBusy( void );
}
Listing 4: MP3
/∗∗
∗ Initializes the SD−Card
∗/
command error t init();
/∗∗
∗ Fired upon completion of init()
∗/
event void initDone(error t error);
/∗∗
∗ Start a read of a block from the specificed address to the given
∗ buffer.
∗/
command error t readBlock(uint32 t byteAddr, uint8 t ∗buffer);
/∗∗
∗ Fired upon completion of readBlock command.
∗/
event void readBlockDone(uint8 t ∗buffer, error t error);
/∗∗
∗ Check if a SD−Card is present.
∗
∗ @return FALSE if no SD−Card is present
∗/
command bool inserted();
}
Listing 5: Sdcard
12
The command getCoordinates requires a pointer to a place where the module can put the result.
Please note that the data is only valid after the event coordinatesReady was triggered. For type
definition of the variable type ts coordinates t have a look at the corresponding header file. There is also
a demo in apps ecs that demonstrates the use of the touchscreen module.
Note
The touchscreen needs to be calibrated. Please be aware that these two constants depend on the
board. If you choose to add touchscreen UI, ensure that the “sensitive” areas are large enough to
also work on another board.
interface TouchScreen{
/∗∗
∗ Sets calibration offsets for the touchscreen
∗ @return SUCCESS
∗/
command error t calibrate( int8 t x offset, int8 t y offset );
/∗∗
∗ Triggers request for touch coordinates
∗ @param pointer to buffer for coordinates
∗ @return SUCCESS if request was accepted
∗ EBUSY if another request is pending
∗/
command error t getCoordinates( ts coordinates t ∗xy );
/∗∗
∗ Notification that coordinates are ready
∗/
event void coordinatesReady( void );
}
Listing 6: TouchScreen
interface Glcd{
/∗∗
∗ Set pixel
∗ @param x−coordinate
∗ @param y−coordinate
∗ @return SUCCESS
∗/
command error t setPixel(const uint8 t x, const uint8 t y);
/∗∗
∗ Clear pixel
∗ @param x−coordinate
∗ @param y−coordinate
∗ @return SUCCESS
∗/
command error t clearPixel(const uint8 t x, const uint8 t y);
/∗∗
∗ Invert pixel
∗ @param x−coordinate
∗ @param y−coordinate
∗ @return SUCCESS
∗/
command error t invertPixel(const uint8 t x, const uint8 t y);
/∗∗
∗ Draw line
∗ @param first point x
∗ @param first point y
∗ @param second point x
∗ @param second point y
13
∗ @return SUCCESS
∗/
command error t drawLine(const uint8 t x1, const uint8 t y1,
const uint8 t x2, const uint8 t y2);
/∗∗
∗ Draw rectangle
∗ @param upper left x
∗ @param upper left y
∗ @param lower right x
∗ @param lower right y
∗ @return SUCCESS
∗/
command error t drawRect(const uint8 t x1,const uint8 t y1,
const uint8 t x2,const uint8 t y2);
...
/∗∗
∗ drawText
∗ @param text
∗ @param x−coordinate of lower left edge
∗ @param y−coordinate of lower left edge
∗ @return SUCCESS
∗/
command void drawText(const char ∗text,
const uint8 t x, const uint8 t y);
/∗∗
∗ drawTextPgm
∗ @param text stored in program memory
∗ @param x−coordinate of lower left edge
∗ @param y−coordinate of lower left edge
∗ @return SUCCESS
∗/
command void drawTextPgm(const char ∗text,
const uint8 t x, const uint8 t y);
}
Listing 7: GLCD
/∗∗
∗ @param period refresh period in ms,
∗ set to 0 to disable auto refresh
∗/
command void autoRefresh(uint32 t period);
command void clear();
command void write(char ∗string);
command void write P(prog char ∗string);
command void goTo(uint8 t line, uint8 t col);
command void forceRefresh();
14
Listing 8: BufferedLcd
Note
For implementing the additional functionality you have to dig a little into the network stack and
you have to know what to send when. However, the ratio between the points to get and the LOC
to write is quite high.
Important: When implementing the functions, recall the TinyOS programming hint about the
forwarding of pointers!
One last hint: the interface IpPacket is wired by purpose.
For getting an overview of the network stack you can use make bigAVR6 1280 docs or even
make bigAVR6 1280 appdoc.
15
Client Command Server Response
ping pong
start game ok: gameid id / err
set name id name ok/err
update score id score ok/err
end game id ok/err
get highscore 1: ... 2: ... 3: ... / end highscore
Table 6: List of the available commands for the communication with the scoreboard. Error responses
are separated from good responses by a “/”. Fields typeset in italic are variables.
Attention
It is not required to write the PRNG in assembler!
4 Theory Tasks
In the theory task we want you to develop argumentation skills that allow you to reason about the
problem you have to solve, and the solution you are designing. Clear presentation of ideas is crucial for
communication with team members, bosses, customers, etc. This time we want you to prove your answers
mathematically (e.g., by contradiction or induction). Points are solely awarded for proper mathematical
argumentation.
A fleet of n landers is orbiting moon at the equator. The landers constitute a logical ring that serves
as a communication network, and each participant may communicate exclusively by sending packets to
its right neighbor and receiving from its left neighbor. Each lander has a unique identifier, nodeID.
Moreover, it can check its remaining fuel.
The fleet should autonomously decide who lands first, depending on the remaining fuel. For that, we
assume that the lander with the most fuel serves as a controller.
The algorithm proceeds by sending packets that are lists of messages. We have two kinds of messages:
• (nodeID,fuel), where nodeID is the ID of a lander, and fuel represents the remaining fuel of a
lander.
• (nodeID,LAND), where LAND is a special symbol (indicating that the node with identifier nodeID
should land next).
The controller sends a packet containing a list (of length 1), that contains the message (nodeID,fuel),
to its right neighbor. Upon receiving a packet, a non-controller lander checks its local fuel, appends the
message (nodeID,fuel) to the received packet, and forwards it to its right neighbor. If the controller
node receives a packet, it checks for the lowest fuel and sends the packet (nodeID,LAND) with the
16
corresponding nodeID to its right neighbor (this packet contains one message). If a non-controller lander
receives (nodeID,LAND) from its left neighbor, it forwards it to its right neighbor. If, in addition, nodeID
matches its own nodeID, it lands. We say the algorithm is terminated when (nodeID,LAND) reaches the
controller.
Tasks
1. [2 Points] One landing: How many messages are sent globally (by all processes) until the algorithm
terminates? Prove by induction! (Note: if a packet contains ` messages, by appending a message,
one obtains a packet that contains ` + 1 messages. We are interested in the number of messages
sent).
2. [1 Points] Improvement: Give a distributed algorithm with better asymptotic message complexity!
As in the original algorithm, one of the landers with the least fuel should land. Provide instructions
(what packets to send, etc.) for the controller and the other landers. As in the original, the code
for the controller and the lander may be different. Prove that your algorithm is better!
3. [2 Points] Landing Fleet: Starting with a fleet of n landers, the above process is repeated n times.
How many messages are sent globally (by all processes) until the n iterations terminate? Prove for
the original algorithm and for your solution!
5.1 Checklist
• Write Application
• Check that the listings.tex in the Protocol folder includes all source files
• Generate a code archive via the provided Makefile target code
17
• Download submission from myTI and
1. verify that the submission compiles in the lab and
2. works on the target as intended.
6 Grading
Please note that the points below are upper bounds that are possible to reach. However, there is always
the possibility of point deduction.
Therefore, if you aim for 20 points you should not gamble on dropping all theory tasks. Also remember
the “Collaboration Policy” at the course web page which enacts 15 points deduction for cheating for
everyone involved. Discussion among students is encouraged, but this is no group task. All programming
and theory tasks have to be done on your own!
References
[1] MikroElektronika, Serial Ethernet Additional Board Manual. [Online]. Available: http://ti.tuwien.
ac.at/ecs/teaching/courses/mclu/manuals/extension-boards/serial ethernet manual v100.pdf/view
[2] Microchip, ENC28J60 Stand-Alone Ethernet Controller with SPI Interface. [Online]. Available:
http://ti.tuwien.ac.at/ecs/teaching/courses/mclu/manuals/extension-boards/ENC28J60.pdf/view
[5] VLSI Solutions, VS1011e - MP3 Audio Decoder. [Online]. Available: http://ti.tuwien.ac.at/ecs/
teaching/courses/mclu/manuals/extension-boards/vs1011e-mp3-audio-decoder/view
[6] NXP, “AN10441: Level shifting techniques in I2C-bus design.” [Online]. Available: http:
//www.nxp.com/documents/application note/AN10441.pdf
[7] STMicroelectronics, LSM303DLHC. [Online]. Available: https://ti.tuwien.ac.at/ecs/teaching/
courses/mclu/manuals/chip-datasheets/en-dm00027543.pdf/view
18
[8] W. F. Rogers, “Apollo Experience Report – Lunar Module Landing Gear Subsystem,” National
Aeronautics and Space Administration, Manned Spacecraft Center, Houston, Texas, Tech. Rep.
D-6850, 1972.
[9] Wikipedia, “Apollo lunar module — Wikipedia, the free encyclopedia,” 2017, [Online; accessed
12-May-2017]. [Online]. Available: https://en.wikipedia.org/w/index.php?title=Apollo Lunar
Module&oldid=775173836
[10] Atmel Corporation, “AVR313: Interfacing the PC AT Keyboard.” [Online]. Available:
http://www.atmel.com/Images/doc1235.pdf
19