New project

Dependencies:   mbed TextLCD

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?

UserRevisionLine numberNew 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 }