Jasmine Karlsson
/
train_rail
New project
main.cpp@12:75aab2bdb3a1, 2018-06-05 (annotated)
- Committer:
- KwamsC
- Date:
- Tue Jun 05 14:21:47 2018 +0000
- Revision:
- 12:75aab2bdb3a1
- Parent:
- 10:cda57976225f
- Parent:
- 9:01263bd18141
- Child:
- 13:78a2481fd65b
merge notes
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jasminealice | 0:57cbecaac770 | 1 | #include "mbed.h" |
Kwame |
2:9bb410612929 | 2 | #include "TextLCD.h" |
jasminealice | 4:4b62680f91b5 | 3 | #include <string> |
jasminealice | 4:4b62680f91b5 | 4 | #include <iostream> |
KwamsC | 10:cda57976225f | 5 | #include "mcp23017.h" |
jasminealice | 0:57cbecaac770 | 6 | |
KwamsC | 10:cda57976225f | 7 | |
KwamsC | 10:cda57976225f | 8 | //board 1 |
KwamsC | 10:cda57976225f | 9 | |
KwamsC | 10:cda57976225f | 10 | I2C i2c(p28, p27); // sda, scl pins (you can also use the other I2C port pins: 9,10) |
KwamsC | 10:cda57976225f | 11 | |
KwamsC | 10:cda57976225f | 12 | const int addr0 = 0x20 << 1; // 7-bit base address of the MCP23017 + address bits (which are 000 for the first one), shifted 1 place to the right (see top header) |
KwamsC | 10:cda57976225f | 13 | |
KwamsC | 10:cda57976225f | 14 | DigitalOut myled(LED1); // |
KwamsC | 10:cda57976225f | 15 | DigitalOut myled2(LED2); // led |
KwamsC | 10:cda57976225f | 16 | DigitalOut myled3(LED3); // |
KwamsC | 10:cda57976225f | 17 | DigitalOut myled4(LED4); // |
KwamsC | 10:cda57976225f | 18 | AnalogIn Ain(p20); // pot. met. |
KwamsC | 10:cda57976225f | 19 | |
KwamsC | 10:cda57976225f | 20 | DigitalOut Track(p21); |
KwamsC | 10:cda57976225f | 21 | |
KwamsC | 10:cda57976225f | 22 | DigitalIn sw1(p5); // |
KwamsC | 10:cda57976225f | 23 | DigitalIn sw2(p30); // switches |
KwamsC | 10:cda57976225f | 24 | DigitalIn sw3(p29); // |
KwamsC | 10:cda57976225f | 25 | DigitalIn sw4(p28); // |
jasminealice | 0:57cbecaac770 | 26 | |
KwamsC | 10:cda57976225f | 27 | void mcpWriteReg(uint8_t address, uint8_t reg, uint8_t data); // Write an I2C register |
KwamsC | 10:cda57976225f | 28 | uint8_t mcpReadReg(uint8_t address, uint8_t reg); // Read an I2C register |
KwamsC | 10:cda57976225f | 29 | void initMcp0(void); |
KwamsC | 10:cda57976225f | 30 | |
KwamsC | 10:cda57976225f | 31 | unsigned int DarkRedtrain = 0x01; |
KwamsC | 10:cda57976225f | 32 | unsigned int DCCinst_forward = 0x68; //forward half speed |
KwamsC | 10:cda57976225f | 33 | |
KwamsC | 10:cda57976225f | 34 | //move forward |
KwamsC | 10:cda57976225f | 35 | |
KwamsC | 10:cda57976225f | 36 | //speed dial |
KwamsC | 10:cda57976225f | 37 | |
KwamsC | 10:cda57976225f | 38 | //stop |
KwamsC | 10:cda57976225f | 39 | |
KwamsC | 10:cda57976225f | 40 | //read switch out |
KwamsC | 10:cda57976225f | 41 | |
KwamsC | 10:cda57976225f | 42 | //read signal |
KwamsC | 10:cda57976225f | 43 | |
KwamsC | 10:cda57976225f | 44 | //display message |
KwamsC | 10:cda57976225f | 45 | |
KwamsC | 10:cda57976225f | 46 | //send command |
KwamsC | 10:cda57976225f | 47 | void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count); |
KwamsC | 10:cda57976225f | 48 | |
KwamsC | 10:cda57976225f | 49 | TextLCD lcd(p22, p21, p23, p24, p25, p26); // lcd |
jasminealice | 4:4b62680f91b5 | 50 | |
jasminealice | 5:49651a9f8ff7 | 51 | int main() { |
jasminealice | 5:49651a9f8ff7 | 52 | while(1){ |
KwamsC | 10:cda57976225f | 53 | unsigned int DCCaddress = 0x03; |
KwamsC | 10:cda57976225f | 54 | DCC_send_command(DCCaddress,DCCinst_forward,400); // forward half speed train address 3 |
jasminealice | 5:49651a9f8ff7 | 55 | float f = Ain.read(); //Read voltage value |
jasminealice | 5:49651a9f8ff7 | 56 | float Vin = f *3.3; |
jasminealice | 5:49651a9f8ff7 | 57 | lcd.printf("%.2f", Vin); |
jasminealice | 5:49651a9f8ff7 | 58 | lcd.printf("\n"); |
jasminealice | 5:49651a9f8ff7 | 59 | //myled=1; |
jasminealice | 5:49651a9f8ff7 | 60 | } |
jasminealice | 0:57cbecaac770 | 61 | } |
KwamsC | 10:cda57976225f | 62 | |
KwamsC | 10:cda57976225f | 63 | void mcpWriteReg(uint8_t address, uint8_t reg, uint8_t data){ |
KwamsC | 10:cda57976225f | 64 | char cmd[2];cmd[0] = reg; |
KwamsC | 10:cda57976225f | 65 | cmd[1] = data; |
KwamsC | 10:cda57976225f | 66 | i2c.write(address, cmd, 2); // Write 2 bytes to device on specified address |
KwamsC | 10:cda57976225f | 67 | } |
KwamsC | 10:cda57976225f | 68 | |
KwamsC | 10:cda57976225f | 69 | uint8_t mcpReadReg(uint8_t address, uint8_t reg){ |
KwamsC | 10:cda57976225f | 70 | char cmd[1]; |
KwamsC | 10:cda57976225f | 71 | cmd[0] = reg; |
KwamsC | 10:cda57976225f | 72 | i2c.write(address, cmd, 1); // Write address |
KwamsC | 10:cda57976225f | 73 | i2c.read(address, cmd, 1); // Read value (one byte) |
KwamsC | 10:cda57976225f | 74 | |
KwamsC | 10:cda57976225f | 75 | return cmd[0]; // Return the read value |
KwamsC | 10:cda57976225f | 76 | } |
KwamsC | 10:cda57976225f | 77 | |
KwamsC | 10:cda57976225f | 78 | void initMcp0(void){ |
KwamsC | 10:cda57976225f | 79 | mcpWriteReg(addr0, MCP_IODIRA, 0xff); // All inputs |
KwamsC | 10:cda57976225f | 80 | mcpWriteReg(addr0, MCP_IODIRB, 0xff); // All inputs |
KwamsC | 10:cda57976225f | 81 | } |
KwamsC | 10:cda57976225f | 82 | |
KwamsC | 10:cda57976225f | 83 | void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count) |
KwamsC | 10:cda57976225f | 84 | { |
KwamsC | 10:cda57976225f | 85 | unsigned __int64 command = 0x0000000000000000; // __int64 is the 64-bit integer type |
KwamsC | 10:cda57976225f | 86 | unsigned __int64 temp_command = 0x0000000000000000; |
KwamsC | 10:cda57976225f | 87 | unsigned __int64 prefix = 0x3FFF; // 14 "1" bits needed at start |
KwamsC | 10:cda57976225f | 88 | unsigned int error = 0x00; //error byte |
KwamsC | 10:cda57976225f | 89 | //calculate error detection byte with xor |
KwamsC | 10:cda57976225f | 90 | error = address ^ inst; |
KwamsC | 10:cda57976225f | 91 | //combine packet bits in basic DCC format |
KwamsC | 10:cda57976225f | 92 | command = (prefix<<28)|(address<<19)|(inst<<10)|((error)<<1)|0x01; |
KwamsC | 10:cda57976225f | 93 | //printf("\n\r %llx \n\r",command); |
KwamsC | 10:cda57976225f | 94 | int i=0; |
KwamsC | 10:cda57976225f | 95 | //repeat DCC command lots of times |
KwamsC | 10:cda57976225f | 96 | while(i < repeat_count) { |
KwamsC | 10:cda57976225f | 97 | temp_command = command; |
KwamsC | 10:cda57976225f | 98 | //loops through packet bits encoding and sending out digital pulses for a DCC command |
KwamsC | 10:cda57976225f | 99 | for (int j=0; j<64; j++) { |
KwamsC | 10:cda57976225f | 100 | if((temp_command&0x8000000000000000)==0) { //test packet bit |
KwamsC | 10:cda57976225f | 101 | //send data for a "0" bit |
KwamsC | 10:cda57976225f | 102 | Track=0; |
KwamsC | 10:cda57976225f | 103 | wait_us(100); |
KwamsC | 10:cda57976225f | 104 | Track=1; |
KwamsC | 10:cda57976225f | 105 | wait_us(100); |
KwamsC | 10:cda57976225f | 106 | //printf("0011"); |
KwamsC | 10:cda57976225f | 107 | } else { |
KwamsC | 10:cda57976225f | 108 | //send data for a "1"bit |
KwamsC | 10:cda57976225f | 109 | Track=0; |
KwamsC | 10:cda57976225f | 110 | wait_us(58); |
KwamsC | 10:cda57976225f | 111 | Track=1; |
KwamsC | 10:cda57976225f | 112 | wait_us(58); |
KwamsC | 10:cda57976225f | 113 | //printf("01"); |
KwamsC | 10:cda57976225f | 114 | } |
KwamsC | 10:cda57976225f | 115 | // next bit in packet |
KwamsC | 10:cda57976225f | 116 | temp_command = temp_command<<1; |
KwamsC | 10:cda57976225f | 117 | } |
KwamsC | 10:cda57976225f | 118 | i++; |
KwamsC | 10:cda57976225f | 119 | } |
KwamsC | 10:cda57976225f | 120 | } |