New project

Dependencies:   mbed TextLCD

Committer:
jasminealice
Date:
Tue Jun 12 15:02:44 2018 +0000
Revision:
21:31647d80614f
Parent:
12:75aab2bdb3a1
Comments for logic

Who changed what in which revision?

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