Jasmine Karlsson
/
train_rail
New project
main.cpp@16:55c3c5727f14, 2018-06-08 (annotated)
- Committer:
- jasminealice
- Date:
- Fri Jun 08 11:43:36 2018 +0000
- Revision:
- 16:55c3c5727f14
- Parent:
- 15:8d96f7a06103
- Child:
- 17:b7b5f40cebff
Working code forward and reverse
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 | 14:a5fd98a957e6 | 5 | #include "mcp23017.h" |
jasminealice | 15:8d96f7a06103 | 6 | #include "train.h" |
KwamsC | 10:cda57976225f | 7 | |
jasminealice | 16:55c3c5727f14 | 8 | //Board 1 |
KwamsC | 10:cda57976225f | 9 | |
jasminealice | 16:55c3c5727f14 | 10 | /*---------------------------------------------------------------------------- |
jasminealice | 16:55c3c5727f14 | 11 | Pin definitions |
jasminealice | 16:55c3c5727f14 | 12 | *----------------------------------------------------------------------------*/ |
KwamsC | 14:a5fd98a957e6 | 13 | DigitalOut myled(LED1); |
KwamsC | 14:a5fd98a957e6 | 14 | DigitalOut myled2(LED2); |
KwamsC | 14:a5fd98a957e6 | 15 | DigitalOut myled3(LED3); |
KwamsC | 14:a5fd98a957e6 | 16 | DigitalOut myled4(LED4); |
KwamsC | 14:a5fd98a957e6 | 17 | |
KwamsC | 14:a5fd98a957e6 | 18 | TextLCD lcd(p22, p21, p23, p24, p25, p26); // lcd |
KwamsC | 14:a5fd98a957e6 | 19 | |
jasminealice | 16:55c3c5727f14 | 20 | //AnalogIn Ain(p20); // pot. met. |
jasminealice | 16:55c3c5727f14 | 21 | DigitalOut Track(p20); // train track |
KwamsC | 10:cda57976225f | 22 | |
KwamsC | 14:a5fd98a957e6 | 23 | /* Train detectors d2, d21, d22 (trainstation) */ |
jasminealice | 16:55c3c5727f14 | 24 | // detect_21(p17); |
jasminealice | 16:55c3c5727f14 | 25 | //DigitalIn detect_22(p16); |
jasminealice | 16:55c3c5727f14 | 26 | //DigitalIn detect_2(p15); |
KwamsC | 10:cda57976225f | 27 | |
KwamsC | 14:a5fd98a957e6 | 28 | /* Switch Definitions */ |
jasminealice | 16:55c3c5727f14 | 29 | DigitalIn sw1(p29); |
jasminealice | 16:55c3c5727f14 | 30 | DigitalIn sw2(p30); |
jasminealice | 16:55c3c5727f14 | 31 | DigitalIn sw3(p11); |
jasminealice | 16:55c3c5727f14 | 32 | DigitalIn sw4(p12); |
jasminealice | 16:55c3c5727f14 | 33 | //InterruptIn sw1(p5); |
jasminealice | 16:55c3c5727f14 | 34 | //InterruptIn inter0(p12); |
jasminealice | 16:55c3c5727f14 | 35 | //InterruptIn inter1(p13); |
KwamsC | 14:a5fd98a957e6 | 36 | |
KwamsC | 14:a5fd98a957e6 | 37 | /*---------------------------------------------------------------------------- |
KwamsC | 14:a5fd98a957e6 | 38 | Train movement |
KwamsC | 14:a5fd98a957e6 | 39 | *----------------------------------------------------------------------------*/ |
KwamsC | 10:cda57976225f | 40 | |
KwamsC | 14:a5fd98a957e6 | 41 | //move backwards/reverse |
jasminealice | 16:55c3c5727f14 | 42 | const unsigned int DCCinst_reverse = 0x48; //reverse speed |
KwamsC | 14:a5fd98a957e6 | 43 | |
jasminealice | 15:8d96f7a06103 | 44 | //speed dial forward |
jasminealice | 16:55c3c5727f14 | 45 | const unsigned int DCCinst_step2 = 0x72; //step 2 |
jasminealice | 16:55c3c5727f14 | 46 | const unsigned int DCCinst_step4 = 0x73; //step 4 |
jasminealice | 16:55c3c5727f14 | 47 | unsigned int DCCinst_step6 = 0x68; //step 6 1/4 speed |
jasminealice | 16:55c3c5727f14 | 48 | const unsigned int DCCinst_step13 = 0x78; //step 13 1/2 speed |
jasminealice | 16:55c3c5727f14 | 49 | const unsigned int DCCinst_step20 = 0x75; //step 20 3/4 speed |
jasminealice | 16:55c3c5727f14 | 50 | const unsigned int DCCinst_step28 = 0x7F; //step 28 Full speed |
KwamsC | 14:a5fd98a957e6 | 51 | |
KwamsC | 14:a5fd98a957e6 | 52 | //stop |
jasminealice | 16:55c3c5727f14 | 53 | const unsigned int DCCinst_stop = 0x40; //forward and stop 01100000 |
KwamsC | 10:cda57976225f | 54 | |
jasminealice | 16:55c3c5727f14 | 55 | /* Functions definition */ |
jasminealice | 16:55c3c5727f14 | 56 | void readVoltage(); |
jasminealice | 16:55c3c5727f14 | 57 | bool readDetector(); |
jasminealice | 16:55c3c5727f14 | 58 | bool readSwitch(); |
jasminealice | 16:55c3c5727f14 | 59 | void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count); //send command |
jasminealice | 16:55c3c5727f14 | 60 | |
KwamsC | 10:cda57976225f | 61 | |
jasminealice | 16:55c3c5727f14 | 62 | /*---------------------------------------------------------------------------- |
jasminealice | 16:55c3c5727f14 | 63 | Main |
jasminealice | 16:55c3c5727f14 | 64 | *----------------------------------------------------------------------------*/ |
jasminealice | 16:55c3c5727f14 | 65 | int main() { |
jasminealice | 16:55c3c5727f14 | 66 | /*sw1.rise(&testInterupt2); |
jasminealice | 16:55c3c5727f14 | 67 | sw1.fall(&testInterupt); |
jasminealice | 16:55c3c5727f14 | 68 | inter0.rise(&riseFunction); |
jasminealice | 16:55c3c5727f14 | 69 | inter1.rise(&riseFunction);*/ |
jasminealice | 16:55c3c5727f14 | 70 | while(1){ |
jasminealice | 16:55c3c5727f14 | 71 | |
jasminealice | 16:55c3c5727f14 | 72 | /* Train Definitions */ |
jasminealice | 16:55c3c5727f14 | 73 | unsigned int DCCaddress_darkRed = 0x01; |
jasminealice | 16:55c3c5727f14 | 74 | //unsigned int DCCaddress_lightRed = 0x03; |
jasminealice | 16:55c3c5727f14 | 75 | lcd.printf("Start the journey"); |
jasminealice | 16:55c3c5727f14 | 76 | wait(0.2); |
jasminealice | 16:55c3c5727f14 | 77 | if(readSwitch()){ |
jasminealice | 16:55c3c5727f14 | 78 | lcd.cls(); |
jasminealice | 16:55c3c5727f14 | 79 | lcd.printf("Forward"); |
jasminealice | 16:55c3c5727f14 | 80 | DCC_send_command(DCCaddress_darkRed,DCCinst_step13,10); // forward half speed train address 3 |
jasminealice | 16:55c3c5727f14 | 81 | }else{ |
jasminealice | 16:55c3c5727f14 | 82 | lcd.cls(); |
jasminealice | 16:55c3c5727f14 | 83 | lcd.printf("Reverse"); |
jasminealice | 16:55c3c5727f14 | 84 | DCC_send_command(DCCaddress_darkRed,DCCinst_reverse,10); // forward half speed train address 3 |
jasminealice | 16:55c3c5727f14 | 85 | } |
jasminealice | 16:55c3c5727f14 | 86 | |
jasminealice | 16:55c3c5727f14 | 87 | |
jasminealice | 16:55c3c5727f14 | 88 | } |
jasminealice | 16:55c3c5727f14 | 89 | } |
KwamsC | 10:cda57976225f | 90 | |
KwamsC | 10:cda57976225f | 91 | |
KwamsC | 14:a5fd98a957e6 | 92 | /*---------------------------------------------------------------------------- |
KwamsC | 14:a5fd98a957e6 | 93 | Functions |
KwamsC | 14:a5fd98a957e6 | 94 | *----------------------------------------------------------------------------*/ |
jasminealice | 4:4b62680f91b5 | 95 | |
jasminealice | 16:55c3c5727f14 | 96 | /* |
jasminealice | 15:8d96f7a06103 | 97 | void testInterupt(){ |
jasminealice | 15:8d96f7a06103 | 98 | lcd.cls(); |
jasminealice | 15:8d96f7a06103 | 99 | myled = 1; |
jasminealice | 15:8d96f7a06103 | 100 | lcd.printf("In interupt function"); |
jasminealice | 15:8d96f7a06103 | 101 | lcd.printf("%d", sw1.read()); |
jasminealice | 15:8d96f7a06103 | 102 | myled4 = 0; |
jasminealice | 15:8d96f7a06103 | 103 | } |
jasminealice | 15:8d96f7a06103 | 104 | |
jasminealice | 15:8d96f7a06103 | 105 | void testInterupt2(){ |
jasminealice | 15:8d96f7a06103 | 106 | lcd.cls(); |
jasminealice | 15:8d96f7a06103 | 107 | myled = 0; |
jasminealice | 15:8d96f7a06103 | 108 | lcd.printf("In interupt2 function"); |
jasminealice | 15:8d96f7a06103 | 109 | lcd.printf("%d", sw1.read()); |
jasminealice | 15:8d96f7a06103 | 110 | myled4 = 1; |
jasminealice | 15:8d96f7a06103 | 111 | } |
jasminealice | 15:8d96f7a06103 | 112 | |
jasminealice | 15:8d96f7a06103 | 113 | void riseFunction(){ |
jasminealice | 15:8d96f7a06103 | 114 | lcd.printf("In rise function"); |
jasminealice | 15:8d96f7a06103 | 115 | lcd.printf("%d", inter1.read()); |
jasminealice | 15:8d96f7a06103 | 116 | } |
jasminealice | 15:8d96f7a06103 | 117 | |
jasminealice | 15:8d96f7a06103 | 118 | void fallFunction(){ |
jasminealice | 15:8d96f7a06103 | 119 | lcd.printf("In fall function"); |
jasminealice | 15:8d96f7a06103 | 120 | lcd.printf("%d", inter1.read()); |
jasminealice | 16:55c3c5727f14 | 121 | }*/ |
jasminealice | 16:55c3c5727f14 | 122 | |
jasminealice | 16:55c3c5727f14 | 123 | |
jasminealice | 16:55c3c5727f14 | 124 | |
jasminealice | 15:8d96f7a06103 | 125 | |
jasminealice | 16:55c3c5727f14 | 126 | bool readSwitch(){ |
jasminealice | 16:55c3c5727f14 | 127 | int val = sw1.read(); |
jasminealice | 16:55c3c5727f14 | 128 | lcd.printf("%d", val); |
jasminealice | 16:55c3c5727f14 | 129 | if(val == 1) |
jasminealice | 16:55c3c5727f14 | 130 | return true; |
jasminealice | 16:55c3c5727f14 | 131 | else |
jasminealice | 16:55c3c5727f14 | 132 | return false; |
tanjinamicky | 13:78a2481fd65b | 133 | } |
tanjinamicky | 13:78a2481fd65b | 134 | |
jasminealice | 15:8d96f7a06103 | 135 | bool readDetector(){ |
jasminealice | 16:55c3c5727f14 | 136 | /*int val1 = detect_2.read(); |
jasminealice | 15:8d96f7a06103 | 137 | if(val1 == 1) |
jasminealice | 15:8d96f7a06103 | 138 | { |
jasminealice | 15:8d96f7a06103 | 139 | lcd.cls(); |
jasminealice | 15:8d96f7a06103 | 140 | lcd.printf("Detect 2: "); |
jasminealice | 15:8d96f7a06103 | 141 | lcd.printf("%d", val1); |
jasminealice | 15:8d96f7a06103 | 142 | return true; |
tanjinamicky | 13:78a2481fd65b | 143 | } |
jasminealice | 15:8d96f7a06103 | 144 | |
jasminealice | 15:8d96f7a06103 | 145 | int val2 = detect_21.read(); |
jasminealice | 15:8d96f7a06103 | 146 | if(val2 == 1) |
jasminealice | 15:8d96f7a06103 | 147 | { |
jasminealice | 15:8d96f7a06103 | 148 | lcd.cls(); |
jasminealice | 15:8d96f7a06103 | 149 | lcd.printf("Detect 21: "); |
jasminealice | 15:8d96f7a06103 | 150 | lcd.printf("%d", val2); |
jasminealice | 15:8d96f7a06103 | 151 | return true; |
jasminealice | 15:8d96f7a06103 | 152 | } |
jasminealice | 16:55c3c5727f14 | 153 | |
jasminealice | 15:8d96f7a06103 | 154 | int val3 = detect_22.read(); |
jasminealice | 15:8d96f7a06103 | 155 | if(val3 == 1) |
jasminealice | 15:8d96f7a06103 | 156 | { |
jasminealice | 15:8d96f7a06103 | 157 | lcd.cls(); |
jasminealice | 15:8d96f7a06103 | 158 | lcd.printf("Detect 22: "); |
jasminealice | 15:8d96f7a06103 | 159 | lcd.printf("%d", val3); |
jasminealice | 15:8d96f7a06103 | 160 | return true; |
jasminealice | 16:55c3c5727f14 | 161 | }*/ |
jasminealice | 16:55c3c5727f14 | 162 | // return false; |
jasminealice | 15:8d96f7a06103 | 163 | } |
tanjinamicky | 13:78a2481fd65b | 164 | |
tanjinamicky | 13:78a2481fd65b | 165 | void readVoltage(){ |
jasminealice | 16:55c3c5727f14 | 166 | /*float f = Ain.read(); //Read voltage value |
jasminealice | 5:49651a9f8ff7 | 167 | float Vin = f *3.3; |
jasminealice | 5:49651a9f8ff7 | 168 | lcd.printf("%.2f", Vin); |
tanjinamicky | 13:78a2481fd65b | 169 | wait(0.1); |
jasminealice | 16:55c3c5727f14 | 170 | lcd.printf("\n");*/ |
KwamsC | 10:cda57976225f | 171 | } |
KwamsC | 10:cda57976225f | 172 | |
KwamsC | 10:cda57976225f | 173 | void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count) |
KwamsC | 10:cda57976225f | 174 | { |
KwamsC | 10:cda57976225f | 175 | unsigned __int64 command = 0x0000000000000000; // __int64 is the 64-bit integer type |
KwamsC | 10:cda57976225f | 176 | unsigned __int64 temp_command = 0x0000000000000000; |
KwamsC | 10:cda57976225f | 177 | unsigned __int64 prefix = 0x3FFF; // 14 "1" bits needed at start |
KwamsC | 10:cda57976225f | 178 | unsigned int error = 0x00; //error byte |
KwamsC | 10:cda57976225f | 179 | //calculate error detection byte with xor |
KwamsC | 10:cda57976225f | 180 | error = address ^ inst; |
KwamsC | 10:cda57976225f | 181 | //combine packet bits in basic DCC format |
KwamsC | 10:cda57976225f | 182 | command = (prefix<<28)|(address<<19)|(inst<<10)|((error)<<1)|0x01; |
KwamsC | 10:cda57976225f | 183 | //printf("\n\r %llx \n\r",command); |
KwamsC | 10:cda57976225f | 184 | int i=0; |
KwamsC | 10:cda57976225f | 185 | //repeat DCC command lots of times |
KwamsC | 10:cda57976225f | 186 | while(i < repeat_count) { |
KwamsC | 10:cda57976225f | 187 | temp_command = command; |
KwamsC | 10:cda57976225f | 188 | //loops through packet bits encoding and sending out digital pulses for a DCC command |
KwamsC | 10:cda57976225f | 189 | for (int j=0; j<64; j++) { |
KwamsC | 10:cda57976225f | 190 | if((temp_command&0x8000000000000000)==0) { //test packet bit |
KwamsC | 10:cda57976225f | 191 | //send data for a "0" bit |
KwamsC | 10:cda57976225f | 192 | Track=0; |
KwamsC | 10:cda57976225f | 193 | wait_us(100); |
KwamsC | 10:cda57976225f | 194 | Track=1; |
KwamsC | 10:cda57976225f | 195 | wait_us(100); |
KwamsC | 10:cda57976225f | 196 | } else { |
KwamsC | 10:cda57976225f | 197 | //send data for a "1"bit |
KwamsC | 10:cda57976225f | 198 | Track=0; |
KwamsC | 10:cda57976225f | 199 | wait_us(58); |
KwamsC | 10:cda57976225f | 200 | Track=1; |
KwamsC | 10:cda57976225f | 201 | wait_us(58); |
KwamsC | 10:cda57976225f | 202 | } |
KwamsC | 10:cda57976225f | 203 | // next bit in packet |
KwamsC | 10:cda57976225f | 204 | temp_command = temp_command<<1; |
KwamsC | 10:cda57976225f | 205 | } |
KwamsC | 10:cda57976225f | 206 | i++; |
KwamsC | 10:cda57976225f | 207 | } |
KwamsC | 10:cda57976225f | 208 | } |