Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 3:b9cecf3e2496, committed 2011-09-30
- Comitter:
- igor_m
- Date:
- Fri Sep 30 00:15:10 2011 +0000
- Parent:
- 2:b38d6345dd14
- Child:
- 4:fee2d61ad6bc
- Commit message:
- GC
Changed in this revision
| SimpleIOMacros.lib | Show diff for this revision Revisions of this file |
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/SimpleIOMacros.lib Sun Sep 25 17:34:08 2011 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/AjK/libraries/SimpleIOMacros/lrskgz \ No newline at end of file
--- a/main.cpp Sun Sep 25 17:34:08 2011 +0000
+++ b/main.cpp Fri Sep 30 00:15:10 2011 +0000
@@ -48,7 +48,7 @@
#include "mbed.h"
#include "stdint.h"
#include "usbhid.h"
-#include "IOMacros.h"
+
USBJoystick joystick;
@@ -118,49 +118,13 @@
DigitalInOut inout(p14); // Connect controller here
// using 220 ohm pull-up
Serial pc(USBTX, USBRX);
-DigitalOut led(LED1);
+
uint8_t x, y;
-volatile char bit_count;
union controls { /* A definition and a declaration */
uint8_t array[4];
uint32_t result_32;
} controls;
-/** EINT3_IRQHandler
- */
- void delay (unsigned int);
-void ISR(void);
-extern "C" void EINT3_IRQHandler(void) {
-
- // The "event" is connected to pin p10 which is LPC1768 P0_1
- // so lets trap that and ignore all other GPIO interrupts.
- // Test for IRQ on Port0.
-
- // if (LPC_GPIOINT->IntStatus & 0x1) {
- // If P0_16/p14 rises, call atint()
- if (LPC_GPIOINT->IO0IntStatF & (1 << 16)) {
- delay(30);
- if (inout.read()) controls.result_32 |= (1UL<< bit_count);
- else controls.result_32 &= ~(1UL << bit_count);
- bit_count++;
- }
- //}
- // Clear this and all other possible GPIO generated interrupts as they don't concern us.
- LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF);
- LPC_GPIOINT->IO0IntClr = (LPC_GPIOINT->IO0IntStatR | LPC_GPIOINT->IO0IntStatF);
-
-}
-
-void event_irq_init(void) {
- // Use macro to set p10 as an input.
- //p10_AS_INPUT;
- // Enable P0_16/p14 for falling edge interrupt generation.
- LPC_GPIOINT->IO0IntEnF |= (1UL << 16);
- // Enable the interrupt.
- //NVIC_EnableIRQ(EINT3_IRQn);
-}
-
-
// Temp array for controller data
/* void delay(unsigned int n) is used as a short delay to
@@ -172,13 +136,6 @@
;
}
-void ISR() {
- wait_us(2);
- if (inout.read()) controls.result_32 |= (1UL<< bit_count);
- else controls.result_32 &= ~(1UL << bit_count);
- bit_count++;
-}
-
/* int receive(char *data_array, unsigned char n) is used to
receive a bit stream of bits into an array of n bytes coming
from the controller. This must be called immediately after
@@ -186,29 +143,47 @@
*/
int receive(uint8_t *data_array, unsigned char n) {
-
+ unsigned char sample, previous_sample;
+ unsigned char bit, byte;
int i;
- bit_count=0;
- //inout.write(1);
- NVIC_EnableIRQ(EINT3_IRQn);
+
+
+ //inout.input(); // Not sure about this..
- wait_us(500);
- //led=1;
- NVIC_DisableIRQ(EINT3_IRQn);
+ sample = inout.read();
+ for (i=0;i < n ;i++) {
+ byte = 0;
+ bit = 0;
+ while (bit<8) {
+ previous_sample = sample;
+ sample = inout.read();
+ if ((previous_sample ^ sample) & previous_sample) {
- x=y=0;
- for (i=0; i<=7; i++) {
- if (controls.array[2] & (1 << i))
- x=x | (1 << (7-i));
- if (controls.array[3] & (1 << i))
- y=y | (1 << (7-i));
+ delay(60);
+ sample=inout.read();
+ if (sample)
+ byte = byte | (1<<bit);
+ bit++;
+ }
+
+ data_array[i]= byte;
+ }
+
}
- data_array[2]=x;
- data_array[3]=y;
+ /* The for loop here is used to reverse the bits for the x and y values retured
+ by the controller. I am not entirely sure of the format. I'm missing a bit
+ somewhere.. Values don't range from -127..128. */
+ x=y=0;
+ for (i=0;i<=7;i++) {
+ if (controls.array[2] & (1 << i))
+ x=x | (1 << (7-i));
+ if (controls.array[3] & (1 << i))
+ y=y | (1 << (7-i));
+ }
+ data_array[2]=x;
+ data_array[3]=y;
return n;
}
-
-
/* void send_byte(unsigned char byte) is used to send a single
byte to the controller.
*/
@@ -241,22 +216,22 @@
int main() {
inout.mode(OpenDrain); // Must use open-drain for N64 Controller!
- event_irq_init();
- uint32_t previous_result=0; // Used for the bit-shifting for x and y values
- //send_byte(RESET_CONTROLLER);
- wait_ms(10);
+
+ uint32_t i, previous_result=0; // Used for the bit-shifting for x and y values
+ send_byte(RESET_CONTROLLER);
+ wait_ms(10);
while (1) {
wait_ms(10);
previous_result=controls.result_32;
send_byte(1); // Send the request byte
receive(controls.array, 4); // Start receiving bit stream
- pc.printf("bitcount: %d\n",bit_count);
+
if (controls.result_32==previous_result) continue;
-
-
- // pc.printf("%3d %3d %d %d\n ", controls.array[0], controls.array[1], (int8_t)controls.array[2], (int8_t)controls.array[3]);
+
+
+ //pc.printf("%3d %3d %d %d\n ", controls.array[0], controls.array[1], (int8_t)controls.array[2], (int8_t)controls.array[3]);
//pc.printf("%d\n",controls.result_32);
-//joystick.joystick(controls.array[0],controls.array[1], controls.array[2], controls.array[3]);
+joystick.joystick(controls.array[0],controls.array[1], controls.array[2], controls.array[3]);
}
}
\ No newline at end of file