initialisatie met niels zn functies

Dependencies:   mbed

Committer:
rcwinder
Date:
Thu Jun 08 15:19:14 2017 +0000
Revision:
0:e206ee5c4d91
initialisatie met niels zn functies

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rcwinder 0:e206ee5c4d91 1 #include "mbed.h"
rcwinder 0:e206ee5c4d91 2 #include "MCP23017.h"
rcwinder 0:e206ee5c4d91 3
rcwinder 0:e206ee5c4d91 4 const unsigned __int64 FORWARD = 1;
rcwinder 0:e206ee5c4d91 5 const unsigned __int64 BACKWARD = 0;
rcwinder 0:e206ee5c4d91 6 const unsigned __int64 LIGHTON = 1;
rcwinder 0:e206ee5c4d91 7 const unsigned __int64 LIGHTOFF = 0;
rcwinder 0:e206ee5c4d91 8 const unsigned __int64 SLOW = 0x4; //0100 = step 5
rcwinder 0:e206ee5c4d91 9 const unsigned __int64 NORM = 0x9; //1001 = step 15
rcwinder 0:e206ee5c4d91 10 const unsigned __int64 FAST = 0xE; //1110 = step 25
rcwinder 0:e206ee5c4d91 11 const unsigned __int64 STOP = 0x1; //0001 = E-STOP
rcwinder 0:e206ee5c4d91 12
rcwinder 0:e206ee5c4d91 13 const unsigned __int64 train1 = 0x1;
rcwinder 0:e206ee5c4d91 14 const unsigned __int64 train3 = 0x3;
rcwinder 0:e206ee5c4d91 15 const unsigned __int64 def_repeat_count = 5;
rcwinder 0:e206ee5c4d91 16
rcwinder 0:e206ee5c4d91 17 const int addr0 = 0x20 << 1;
rcwinder 0:e206ee5c4d91 18
rcwinder 0:e206ee5c4d91 19 int interrupted = 0;
rcwinder 0:e206ee5c4d91 20
rcwinder 0:e206ee5c4d91 21 I2C i2c(p28, p27);
rcwinder 0:e206ee5c4d91 22
rcwinder 0:e206ee5c4d91 23 DigitalOut Track(p20);
rcwinder 0:e206ee5c4d91 24 DigitalOut led(LED1);
rcwinder 0:e206ee5c4d91 25 InterruptIn int0(p25);
rcwinder 0:e206ee5c4d91 26 //InterruptIn int1(p9);
rcwinder 0:e206ee5c4d91 27
rcwinder 0:e206ee5c4d91 28 /* Write a register on an I2C device */
rcwinder 0:e206ee5c4d91 29 void mcpWriteReg(uint8_t address, uint8_t reg, uint8_t data){
rcwinder 0:e206ee5c4d91 30 char cmd[2];
rcwinder 0:e206ee5c4d91 31 cmd[0] = reg;
rcwinder 0:e206ee5c4d91 32 cmd[1] = data;
rcwinder 0:e206ee5c4d91 33 i2c.write(address, cmd, 2); // Write 2 bytes to device on specified address
rcwinder 0:e206ee5c4d91 34 }
rcwinder 0:e206ee5c4d91 35
rcwinder 0:e206ee5c4d91 36 /* Read a register on a I2C device */
rcwinder 0:e206ee5c4d91 37 uint8_t mcpReadReg(uint8_t address, uint8_t reg){
rcwinder 0:e206ee5c4d91 38 char cmd[1];
rcwinder 0:e206ee5c4d91 39 cmd[0] = reg;
rcwinder 0:e206ee5c4d91 40 i2c.write(address, cmd, 1); // Write address
rcwinder 0:e206ee5c4d91 41 i2c.read(address, cmd, 1); // Read value (one byte)
rcwinder 0:e206ee5c4d91 42 return cmd[0]; // Return the read value
rcwinder 0:e206ee5c4d91 43 }
rcwinder 0:e206ee5c4d91 44
rcwinder 0:e206ee5c4d91 45 void interrupt_handler(){
rcwinder 0:e206ee5c4d91 46 interrupted = 1;
rcwinder 0:e206ee5c4d91 47 }
rcwinder 0:e206ee5c4d91 48
rcwinder 0:e206ee5c4d91 49 void initialize_mcp() {
rcwinder 0:e206ee5c4d91 50 /*
rcwinder 0:e206ee5c4d91 51 printf("%x\n", mcpReadReg(addr0, MCP_IODIRA));
rcwinder 0:e206ee5c4d91 52 printf("%x\n", mcpReadReg(addr0, MCP_IODIRB));
rcwinder 0:e206ee5c4d91 53 printf("%x\n", mcpReadReg(addr0, MCP_IPOLA));
rcwinder 0:e206ee5c4d91 54 printf("%x\n", mcpReadReg(addr0, MCP_IPOLB));
rcwinder 0:e206ee5c4d91 55 printf("%x\n", mcpReadReg(addr0, MCP_GPINTENA));
rcwinder 0:e206ee5c4d91 56 printf("%x\n", mcpReadReg(addr0, MCP_GPINTENB));
rcwinder 0:e206ee5c4d91 57 printf("%x\n", mcpReadReg(addr0, MCP_DEFVALA));
rcwinder 0:e206ee5c4d91 58 printf("%x\n", mcpReadReg(addr0, MCP_DEFVALB));
rcwinder 0:e206ee5c4d91 59 printf("%x\n", mcpReadReg(addr0, MCP_INTCONA));
rcwinder 0:e206ee5c4d91 60 printf("%x\n", mcpReadReg(addr0, MCP_INTCONB));
rcwinder 0:e206ee5c4d91 61 printf("%x\n", mcpReadReg(addr0, MCP_IOCON));
rcwinder 0:e206ee5c4d91 62 printf("%x\n", mcpReadReg(addr0, MCP_IOCON_MIRROR));
rcwinder 0:e206ee5c4d91 63 printf("%x\n", mcpReadReg(addr0, MCP_GPPUA));
rcwinder 0:e206ee5c4d91 64 printf("%x\n", mcpReadReg(addr0, MCP_GPPUB));
rcwinder 0:e206ee5c4d91 65 printf("%x\n", mcpReadReg(addr0, MCP_INTFA));
rcwinder 0:e206ee5c4d91 66 printf("%x\n", mcpReadReg(addr0, MCP_INTFB));
rcwinder 0:e206ee5c4d91 67 printf("%x\n", mcpReadReg(addr0, MCP_INTCAPA));
rcwinder 0:e206ee5c4d91 68 printf("%x\n", mcpReadReg(addr0, MCP_INTCAPB));
rcwinder 0:e206ee5c4d91 69 printf("%x\n", mcpReadReg(addr0, MCP_GPIOA));
rcwinder 0:e206ee5c4d91 70 printf("%x\n", mcpReadReg(addr0, MCP_GPIOB));
rcwinder 0:e206ee5c4d91 71 printf("%x\n", mcpReadReg(addr0, MCP_OLATA));
rcwinder 0:e206ee5c4d91 72 printf("%x\n", mcpReadReg(addr0, MCP_OLATB));
rcwinder 0:e206ee5c4d91 73 */
rcwinder 0:e206ee5c4d91 74
rcwinder 0:e206ee5c4d91 75 mcpWriteReg(addr0, MCP_IODIRA, 0xff); // All inputs
rcwinder 0:e206ee5c4d91 76 mcpWriteReg(addr0, MCP_IODIRB, 0xff); // All inputs
rcwinder 0:e206ee5c4d91 77 mcpWriteReg(addr0, MCP_GPINTENA, 0xff);
rcwinder 0:e206ee5c4d91 78 mcpWriteReg(addr0, MCP_GPINTENB, 0xff);
rcwinder 0:e206ee5c4d91 79 mcpWriteReg(addr0, MCP_INTCONA, 0xff);
rcwinder 0:e206ee5c4d91 80 mcpWriteReg(addr0, MCP_INTCONB, 0xff);
rcwinder 0:e206ee5c4d91 81 mcpWriteReg(addr0, MCP_DEFVALA, 0xff);
rcwinder 0:e206ee5c4d91 82 mcpWriteReg(addr0, MCP_DEFVALB, 0xff);
rcwinder 0:e206ee5c4d91 83 mcpWriteReg(addr0, MCP_GPIOA, 0x00);
rcwinder 0:e206ee5c4d91 84 mcpWriteReg(addr0, MCP_GPIOB, 0x00);
rcwinder 0:e206ee5c4d91 85
rcwinder 0:e206ee5c4d91 86 int0.fall(&interrupt_handler);
rcwinder 0:e206ee5c4d91 87 //int1.fall(&interrupt_handler);
rcwinder 0:e206ee5c4d91 88
rcwinder 0:e206ee5c4d91 89 }
rcwinder 0:e206ee5c4d91 90
rcwinder 0:e206ee5c4d91 91 void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count){
rcwinder 0:e206ee5c4d91 92 unsigned __int64 command = 0x0000000000000000; // this is a 64-bit integer type, due to the packet size
rcwinder 0:e206ee5c4d91 93 unsigned __int64 temp_command = 0x0000000000000000;
rcwinder 0:e206ee5c4d91 94 unsigned __int64 prefix = 0x3FFF; // 14 1 bits as in the preamble of the data packet
rcwinder 0:e206ee5c4d91 95 unsigned int error = 0x00; // error byte
rcwinder 0:e206ee5c4d91 96 //calculate error detection byte with xor
rcwinder 0:e206ee5c4d91 97 error = address ^ inst;
rcwinder 0:e206ee5c4d91 98 // combine packet bits in basic DCC format
rcwinder 0:e206ee5c4d91 99 command = (prefix<<28)|(address<<19)|(inst<<10)|((error)<<1)|0x01;
rcwinder 0:e206ee5c4d91 100
rcwinder 0:e206ee5c4d91 101 int i = 0;
rcwinder 0:e206ee5c4d91 102
rcwinder 0:e206ee5c4d91 103 // repeat DCC command lots of times
rcwinder 0:e206ee5c4d91 104 while(i < repeat_count) {
rcwinder 0:e206ee5c4d91 105 temp_command = command;
rcwinder 0:e206ee5c4d91 106
rcwinder 0:e206ee5c4d91 107 //loops throught packet bits enconding and sending out digital pulses for a DCC command
rcwinder 0:e206ee5c4d91 108 for (int j=0; j<64; j++) {
rcwinder 0:e206ee5c4d91 109 if((temp_command&0x8000000000000000)==0) { //test packet bit
rcwinder 0:e206ee5c4d91 110
rcwinder 0:e206ee5c4d91 111 Track=0;
rcwinder 0:e206ee5c4d91 112 wait_us(100);
rcwinder 0:e206ee5c4d91 113 Track=1;
rcwinder 0:e206ee5c4d91 114 wait_us(100);
rcwinder 0:e206ee5c4d91 115
rcwinder 0:e206ee5c4d91 116 } else {
rcwinder 0:e206ee5c4d91 117
rcwinder 0:e206ee5c4d91 118 Track=0;
rcwinder 0:e206ee5c4d91 119 wait_us(58);
rcwinder 0:e206ee5c4d91 120 Track=1;
rcwinder 0:e206ee5c4d91 121 wait_us(58);
rcwinder 0:e206ee5c4d91 122
rcwinder 0:e206ee5c4d91 123 }
rcwinder 0:e206ee5c4d91 124
rcwinder 0:e206ee5c4d91 125 temp_command = temp_command<<1;
rcwinder 0:e206ee5c4d91 126 }
rcwinder 0:e206ee5c4d91 127 i++;
rcwinder 0:e206ee5c4d91 128 }
rcwinder 0:e206ee5c4d91 129 }
rcwinder 0:e206ee5c4d91 130
rcwinder 0:e206ee5c4d91 131 unsigned __int64 create_instruction(){
rcwinder 0:e206ee5c4d91 132 unsigned __int64 instruction = 0x0;
rcwinder 0:e206ee5c4d91 133 unsigned __int64 direction = FORWARD;
rcwinder 0:e206ee5c4d91 134 unsigned __int64 lights = LIGHTON;
rcwinder 0:e206ee5c4d91 135 unsigned __int64 speed = NORM;
rcwinder 0:e206ee5c4d91 136
rcwinder 0:e206ee5c4d91 137 return instruction = (0x01<<6)|(direction<<5)|(lights<<4)|speed;
rcwinder 0:e206ee5c4d91 138 }
rcwinder 0:e206ee5c4d91 139
rcwinder 0:e206ee5c4d91 140 int main(){
rcwinder 0:e206ee5c4d91 141 initialize_mcp();
rcwinder 0:e206ee5c4d91 142 unsigned __int64 instruction = 0x0;
rcwinder 0:e206ee5c4d91 143
rcwinder 0:e206ee5c4d91 144 while(1){
rcwinder 0:e206ee5c4d91 145 if(interrupted){
rcwinder 0:e206ee5c4d91 146 uint16_t data = (mcpReadReg(addr0, MCP_GPIOB) << 8) | mcpReadReg(addr0, MCP_GPIOA);
rcwinder 0:e206ee5c4d91 147 //mcpReadReg(addr0, MCP_INTCAPA);
rcwinder 0:e206ee5c4d91 148 //mcpReadReg(addr0, MCP_INTCAPB);
rcwinder 0:e206ee5c4d91 149 //modify instructions
rcwinder 0:e206ee5c4d91 150 printf("%x interrupted\n", data);
rcwinder 0:e206ee5c4d91 151 interrupted = 0;
rcwinder 0:e206ee5c4d91 152 }
rcwinder 0:e206ee5c4d91 153
rcwinder 0:e206ee5c4d91 154 instruction = (0x01<<6)|(FORWARD<<5)|(LIGHTON<<4)|FAST;
rcwinder 0:e206ee5c4d91 155 DCC_send_command(train3, instruction, def_repeat_count);
rcwinder 0:e206ee5c4d91 156 }
rcwinder 0:e206ee5c4d91 157 }
rcwinder 0:e206ee5c4d91 158
rcwinder 0:e206ee5c4d91 159 /*
rcwinder 0:e206ee5c4d91 160 Interrupts
rcwinder 0:e206ee5c4d91 161 INT0 - pin 8
rcwinder 0:e206ee5c4d91 162
rcwinder 0:e206ee5c4d91 163 clock en data pins for I2C communication - data sync - hier lezen na een interrupt
rcwinder 0:e206ee5c4d91 164 SDA - pin 9
rcwinder 0:e206ee5c4d91 165 SCL - pin 10
rcwinder 0:e206ee5c4d91 166
rcwinder 0:e206ee5c4d91 167 Sending command signals to train tracks
rcwinder 0:e206ee5c4d91 168 DAT - pin 20
rcwinder 0:e206ee5c4d91 169 EN - VOUT
rcwinder 0:e206ee5c4d91 170
rcwinder 0:e206ee5c4d91 171
rcwinder 0:e206ee5c4d91 172 instruction = (0x01<<6)|(FORWARD<<5)|(LIGHTON<<4)|STOP;
rcwinder 0:e206ee5c4d91 173 DCC_send_command(train3, instruction, def_repeat_count);
rcwinder 0:e206ee5c4d91 174 */