New project

Dependencies:   mbed TextLCD

Committer:
tanjinamicky
Date:
Wed Jun 06 11:44:35 2018 +0000
Revision:
13:78a2481fd65b
Parent:
12:75aab2bdb3a1
Child:
14:a5fd98a957e6
move forward and stop

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 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.
tanjinamicky 13:78a2481fd65b 19 DigitalOut Track(p21); // train track
KwamsC 10:cda57976225f 20
tanjinamicky 13:78a2481fd65b 21 AnalogIn detect_21(p15); // detectors pin d2, d21, d22
tanjinamicky 13:78a2481fd65b 22 AnalogIn detect_22(p16);
tanjinamicky 13:78a2481fd65b 23 AnalogIn detect_2(p17);
KwamsC 10:cda57976225f 24
KwamsC 10:cda57976225f 25 DigitalIn sw1(p5); //
KwamsC 10:cda57976225f 26 DigitalIn sw2(p30); // switches
KwamsC 10:cda57976225f 27 DigitalIn sw3(p29); //
KwamsC 10:cda57976225f 28 DigitalIn sw4(p28); //
jasminealice 0:57cbecaac770 29
KwamsC 10:cda57976225f 30 void mcpWriteReg(uint8_t address, uint8_t reg, uint8_t data); // Write an I2C register
KwamsC 10:cda57976225f 31 uint8_t mcpReadReg(uint8_t address, uint8_t reg); // Read an I2C register
KwamsC 10:cda57976225f 32 void initMcp0(void);
tanjinamicky 13:78a2481fd65b 33 void readVoltage();
tanjinamicky 13:78a2481fd65b 34 void readDetector();
KwamsC 10:cda57976225f 35
tanjinamicky 13:78a2481fd65b 36 unsigned int DCCaddress_darkRed = 0x01;
tanjinamicky 13:78a2481fd65b 37 unsigned int DCCaddress_lightRed = 0x03;
KwamsC 10:cda57976225f 38 unsigned int DCCinst_forward = 0x68; //forward half speed
KwamsC 10:cda57976225f 39
tanjinamicky 13:78a2481fd65b 40 unsigned int DCCinst_forward_stop = 0x60; //forward and stop 01100000
tanjinamicky 13:78a2481fd65b 41
KwamsC 10:cda57976225f 42 //move forward
KwamsC 10:cda57976225f 43
KwamsC 10:cda57976225f 44 //speed dial
KwamsC 10:cda57976225f 45
KwamsC 10:cda57976225f 46 //stop
KwamsC 10:cda57976225f 47
KwamsC 10:cda57976225f 48 //read switch out
KwamsC 10:cda57976225f 49
KwamsC 10:cda57976225f 50 //read signal
KwamsC 10:cda57976225f 51
KwamsC 10:cda57976225f 52 //display message
KwamsC 10:cda57976225f 53
KwamsC 10:cda57976225f 54 //send command
KwamsC 10:cda57976225f 55 void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count);
KwamsC 10:cda57976225f 56
KwamsC 10:cda57976225f 57 TextLCD lcd(p22, p21, p23, p24, p25, p26); // lcd
jasminealice 4:4b62680f91b5 58
jasminealice 5:49651a9f8ff7 59 int main() {
jasminealice 5:49651a9f8ff7 60 while(1){
tanjinamicky 13:78a2481fd65b 61 //unsigned int DCCaddress = 0x03;
tanjinamicky 13:78a2481fd65b 62 //unsigned int DCCaddress_darkRed = 0x01;
tanjinamicky 13:78a2481fd65b 63 readDetector();
tanjinamicky 13:78a2481fd65b 64 lcd.printf("Forward");
tanjinamicky 13:78a2481fd65b 65 DCC_send_command(DCCaddress_lightRed,DCCinst_forward,400); // forward half speed train address 3
tanjinamicky 13:78a2481fd65b 66 wait(0.5);
tanjinamicky 13:78a2481fd65b 67 lcd.printf("Stop");
tanjinamicky 13:78a2481fd65b 68 DCC_send_command(DCCaddress_lightRed,DCCinst_forward_stop,400); // forward half speed train address 3
tanjinamicky 13:78a2481fd65b 69 wait(1);
tanjinamicky 13:78a2481fd65b 70 //readVoltage();
tanjinamicky 13:78a2481fd65b 71 //myled=1;
tanjinamicky 13:78a2481fd65b 72 }
tanjinamicky 13:78a2481fd65b 73 }
tanjinamicky 13:78a2481fd65b 74
tanjinamicky 13:78a2481fd65b 75 void readDetector(){
tanjinamicky 13:78a2481fd65b 76 float val = detect_21.read();
tanjinamicky 13:78a2481fd65b 77 lcd.printf("%.2f", val);
tanjinamicky 13:78a2481fd65b 78 }
tanjinamicky 13:78a2481fd65b 79
tanjinamicky 13:78a2481fd65b 80 void readVoltage(){
jasminealice 5:49651a9f8ff7 81 float f = Ain.read(); //Read voltage value
jasminealice 5:49651a9f8ff7 82 float Vin = f *3.3;
jasminealice 5:49651a9f8ff7 83 lcd.printf("%.2f", Vin);
tanjinamicky 13:78a2481fd65b 84 wait(0.1);
jasminealice 5:49651a9f8ff7 85 lcd.printf("\n");
jasminealice 5:49651a9f8ff7 86 }
KwamsC 10:cda57976225f 87
KwamsC 10:cda57976225f 88 void mcpWriteReg(uint8_t address, uint8_t reg, uint8_t data){
KwamsC 10:cda57976225f 89 char cmd[2];cmd[0] = reg;
KwamsC 10:cda57976225f 90 cmd[1] = data;
KwamsC 10:cda57976225f 91 i2c.write(address, cmd, 2); // Write 2 bytes to device on specified address
KwamsC 10:cda57976225f 92 }
KwamsC 10:cda57976225f 93
KwamsC 10:cda57976225f 94 uint8_t mcpReadReg(uint8_t address, uint8_t reg){
KwamsC 10:cda57976225f 95 char cmd[1];
KwamsC 10:cda57976225f 96 cmd[0] = reg;
KwamsC 10:cda57976225f 97 i2c.write(address, cmd, 1); // Write address
KwamsC 10:cda57976225f 98 i2c.read(address, cmd, 1); // Read value (one byte)
KwamsC 10:cda57976225f 99
KwamsC 10:cda57976225f 100 return cmd[0]; // Return the read value
KwamsC 10:cda57976225f 101 }
KwamsC 10:cda57976225f 102
KwamsC 10:cda57976225f 103 void initMcp0(void){
KwamsC 10:cda57976225f 104 mcpWriteReg(addr0, MCP_IODIRA, 0xff); // All inputs
KwamsC 10:cda57976225f 105 mcpWriteReg(addr0, MCP_IODIRB, 0xff); // All inputs
KwamsC 10:cda57976225f 106 }
KwamsC 10:cda57976225f 107
KwamsC 10:cda57976225f 108 void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count)
KwamsC 10:cda57976225f 109 {
KwamsC 10:cda57976225f 110 unsigned __int64 command = 0x0000000000000000; // __int64 is the 64-bit integer type
KwamsC 10:cda57976225f 111 unsigned __int64 temp_command = 0x0000000000000000;
KwamsC 10:cda57976225f 112 unsigned __int64 prefix = 0x3FFF; // 14 "1" bits needed at start
KwamsC 10:cda57976225f 113 unsigned int error = 0x00; //error byte
KwamsC 10:cda57976225f 114 //calculate error detection byte with xor
KwamsC 10:cda57976225f 115 error = address ^ inst;
KwamsC 10:cda57976225f 116 //combine packet bits in basic DCC format
KwamsC 10:cda57976225f 117 command = (prefix<<28)|(address<<19)|(inst<<10)|((error)<<1)|0x01;
KwamsC 10:cda57976225f 118 //printf("\n\r %llx \n\r",command);
KwamsC 10:cda57976225f 119 int i=0;
KwamsC 10:cda57976225f 120 //repeat DCC command lots of times
KwamsC 10:cda57976225f 121 while(i < repeat_count) {
KwamsC 10:cda57976225f 122 temp_command = command;
KwamsC 10:cda57976225f 123 //loops through packet bits encoding and sending out digital pulses for a DCC command
KwamsC 10:cda57976225f 124 for (int j=0; j<64; j++) {
KwamsC 10:cda57976225f 125 if((temp_command&0x8000000000000000)==0) { //test packet bit
KwamsC 10:cda57976225f 126 //send data for a "0" bit
KwamsC 10:cda57976225f 127 Track=0;
KwamsC 10:cda57976225f 128 wait_us(100);
KwamsC 10:cda57976225f 129 Track=1;
KwamsC 10:cda57976225f 130 wait_us(100);
KwamsC 10:cda57976225f 131 //printf("0011");
KwamsC 10:cda57976225f 132 } else {
KwamsC 10:cda57976225f 133 //send data for a "1"bit
KwamsC 10:cda57976225f 134 Track=0;
KwamsC 10:cda57976225f 135 wait_us(58);
KwamsC 10:cda57976225f 136 Track=1;
KwamsC 10:cda57976225f 137 wait_us(58);
KwamsC 10:cda57976225f 138 //printf("01");
KwamsC 10:cda57976225f 139 }
KwamsC 10:cda57976225f 140 // next bit in packet
KwamsC 10:cda57976225f 141 temp_command = temp_command<<1;
KwamsC 10:cda57976225f 142 }
KwamsC 10:cda57976225f 143 i++;
KwamsC 10:cda57976225f 144 }
KwamsC 10:cda57976225f 145 }