
Protocolos de comunicación serie
main.cpp@0:3d07e16d44b2, 2017-03-17 (annotated)
- Committer:
- AndresQuesada
- Date:
- Fri Mar 17 08:14:43 2017 +0000
- Revision:
- 0:3d07e16d44b2
Protocolos de comunicaci?n serie;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AndresQuesada | 0:3d07e16d44b2 | 1 | /*CONFIGURACION MAESTRO |
AndresQuesada | 0:3d07e16d44b2 | 2 | Mediante las palancas(1,2,3) seleccionamos el modo de comunicacion |
AndresQuesada | 0:3d07e16d44b2 | 3 | La cuarta palanca sirve para hacer un or con 1 o 2 al uart |
AndresQuesada | 0:3d07e16d44b2 | 4 | SPI y uart estan preparados para 10 segundos de demo mediante timer |
AndresQuesada | 0:3d07e16d44b2 | 5 | SPI Maestro transmite la lectura del sensor de temperatura conectado a l pin 20 |
AndresQuesada | 0:3d07e16d44b2 | 6 | al equipo esclavo |
AndresQuesada | 0:3d07e16d44b2 | 7 | |
AndresQuesada | 0:3d07e16d44b2 | 8 | */ |
AndresQuesada | 0:3d07e16d44b2 | 9 | #include "mbed.h" |
AndresQuesada | 0:3d07e16d44b2 | 10 | #include "TextLCD.h" |
AndresQuesada | 0:3d07e16d44b2 | 11 | TextLCD lcd(p21, p22, p23, p24, p25, p26); // rs, rw, d4, d5, d6, d7 |
AndresQuesada | 0:3d07e16d44b2 | 12 | //------CONFIGURACION PINES DE TR/RE----------------- |
AndresQuesada | 0:3d07e16d44b2 | 13 | SPI ser_port(p5, p6, p7); //mosi, miso, sclk |
AndresQuesada | 0:3d07e16d44b2 | 14 | I2C i2c_port(p9, p10);//SDA,SCL |
AndresQuesada | 0:3d07e16d44b2 | 15 | Serial async_port(p13, p14); //CAMBIADOS AL 13 Y 14///set up TX and RX on pins 28 and 27 |
AndresQuesada | 0:3d07e16d44b2 | 16 | //-------CONFIGURACION LEDS-------------------------------- |
AndresQuesada | 0:3d07e16d44b2 | 17 | DigitalOut red_led(p19); //red led |
AndresQuesada | 0:3d07e16d44b2 | 18 | DigitalOut green_led(p28); //green led |
AndresQuesada | 0:3d07e16d44b2 | 19 | DigitalOut strobe(p11); //a strobe to trigger the scope |
AndresQuesada | 0:3d07e16d44b2 | 20 | DigitalOut cs(p12); //this acts as “slave select” |
AndresQuesada | 0:3d07e16d44b2 | 21 | //----------------SELECT SPI----AL P8 DEL ESCLAVO |
AndresQuesada | 0:3d07e16d44b2 | 22 | DigitalOut selec(p27);//para seleccionar CONECTAR AL PIN8 DEL ESCLAVO |
AndresQuesada | 0:3d07e16d44b2 | 23 | //-------CONFIGURACION INTERRUPTORES |
AndresQuesada | 0:3d07e16d44b2 | 24 | DigitalIn pulsa15(p15);//palanca PARA 1 o 2 |
AndresQuesada | 0:3d07e16d44b2 | 25 | InterruptIn buttonp16(p16);//palanca para modos de transmision |
AndresQuesada | 0:3d07e16d44b2 | 26 | InterruptIn buttonp17(p17); |
AndresQuesada | 0:3d07e16d44b2 | 27 | InterruptIn buttonp18(p18); |
AndresQuesada | 0:3d07e16d44b2 | 28 | //---------VAARIABLE CONVERSION VOLTAJE |
AndresQuesada | 0:3d07e16d44b2 | 29 | float milivolts; |
AndresQuesada | 0:3d07e16d44b2 | 30 | //-----Entrada termometro |
AndresQuesada | 0:3d07e16d44b2 | 31 | AnalogIn tem(p20); |
AndresQuesada | 0:3d07e16d44b2 | 32 | //---------TIMER------------------------- |
AndresQuesada | 0:3d07e16d44b2 | 33 | Timer t2; // define Timer with name “t” |
AndresQuesada | 0:3d07e16d44b2 | 34 | //-------CARACTERES DE INTERCAMBIO |
AndresQuesada | 0:3d07e16d44b2 | 35 | char switch_word ; //word we will send |
AndresQuesada | 0:3d07e16d44b2 | 36 | char recd_val; //value return from slave |
AndresQuesada | 0:3d07e16d44b2 | 37 | const int addr = 0x52; //the I2C slave address, an arbitrary even number <-- ojo con esto |
AndresQuesada | 0:3d07e16d44b2 | 38 | //--------FUNCIONES------------------ |
AndresQuesada | 0:3d07e16d44b2 | 39 | void comprueba(){ |
AndresQuesada | 0:3d07e16d44b2 | 40 | red_led=0; //preset both to 0 |
AndresQuesada | 0:3d07e16d44b2 | 41 | green_led=0; |
AndresQuesada | 0:3d07e16d44b2 | 42 | lcd.cls();//limpiamos el charco |
AndresQuesada | 0:3d07e16d44b2 | 43 | recd_val=recd_val & 0x03; //AND out unwanted bits |
AndresQuesada | 0:3d07e16d44b2 | 44 | if (recd_val==1) |
AndresQuesada | 0:3d07e16d44b2 | 45 | { red_led=1; |
AndresQuesada | 0:3d07e16d44b2 | 46 | lcd.printf("LLega %c \n\r",recd_val); |
AndresQuesada | 0:3d07e16d44b2 | 47 | wait(0.5); |
AndresQuesada | 0:3d07e16d44b2 | 48 | }//no debe de salir |
AndresQuesada | 0:3d07e16d44b2 | 49 | if (recd_val==2) |
AndresQuesada | 0:3d07e16d44b2 | 50 | { green_led=1; |
AndresQuesada | 0:3d07e16d44b2 | 51 | lcd.printf("El valor enviado es 2"); |
AndresQuesada | 0:3d07e16d44b2 | 52 | wait(0.5);} |
AndresQuesada | 0:3d07e16d44b2 | 53 | if (recd_val==3){ |
AndresQuesada | 0:3d07e16d44b2 | 54 | red_led=1; |
AndresQuesada | 0:3d07e16d44b2 | 55 | green_led=1; |
AndresQuesada | 0:3d07e16d44b2 | 56 | lcd.printf("El valor enviado es 3"); |
AndresQuesada | 0:3d07e16d44b2 | 57 | wait(0.5); |
AndresQuesada | 0:3d07e16d44b2 | 58 | } |
AndresQuesada | 0:3d07e16d44b2 | 59 | |
AndresQuesada | 0:3d07e16d44b2 | 60 | } |
AndresQuesada | 0:3d07e16d44b2 | 61 | void i2cpP(){ |
AndresQuesada | 0:3d07e16d44b2 | 62 | |
AndresQuesada | 0:3d07e16d44b2 | 63 | /*Remember, you will need a pull-up resistor on sda and scl. |
AndresQuesada | 0:3d07e16d44b2 | 64 | All drivers on the I2C bus are required to be open collector, and |
AndresQuesada | 0:3d07e16d44b2 | 65 | so it is necessary for pull up resistors to be used on the two signals. |
AndresQuesada | 0:3d07e16d44b2 | 66 | A typical value for the pullup resistors is around 2.2k ohms, |
AndresQuesada | 0:3d07e16d44b2 | 67 | connected between the pin and 3v3. https://developer.mbed.org/handbook/I2C*/ |
AndresQuesada | 0:3d07e16d44b2 | 68 | lcd.printf("Prueba i2cp"); |
AndresQuesada | 0:3d07e16d44b2 | 69 | wait(2); |
AndresQuesada | 0:3d07e16d44b2 | 70 | lcd.cls(); |
AndresQuesada | 0:3d07e16d44b2 | 71 | lcd.printf("COMIENZO "); |
AndresQuesada | 0:3d07e16d44b2 | 72 | //send a single byte of data, in correct I2C package |
AndresQuesada | 0:3d07e16d44b2 | 73 | i2c_port.start(); //force a start condition |
AndresQuesada | 0:3d07e16d44b2 | 74 | i2c_port.write(addr); //send the address |
AndresQuesada | 0:3d07e16d44b2 | 75 | i2c_port.write(switch_word); //send one byte of data, ie switch_word |
AndresQuesada | 0:3d07e16d44b2 | 76 | i2c_port.stop(); //force a stop condition |
AndresQuesada | 0:3d07e16d44b2 | 77 | wait(0.002); |
AndresQuesada | 0:3d07e16d44b2 | 78 | lcd.printf("POST WAIT"); |
AndresQuesada | 0:3d07e16d44b2 | 79 | //receive a single byte of data, in correct I2C package |
AndresQuesada | 0:3d07e16d44b2 | 80 | i2c_port.start(); |
AndresQuesada | 0:3d07e16d44b2 | 81 | i2c_port.write(addr | 0x01); //send address, with R/W bit set to Read <-- ojo con esto |
AndresQuesada | 0:3d07e16d44b2 | 82 | recd_val=i2c_port.read(addr); //Read and save the received byte |
AndresQuesada | 0:3d07e16d44b2 | 83 | i2c_port.stop(); //force a stop condition |
AndresQuesada | 0:3d07e16d44b2 | 84 | comprueba(); |
AndresQuesada | 0:3d07e16d44b2 | 85 | |
AndresQuesada | 0:3d07e16d44b2 | 86 | |
AndresQuesada | 0:3d07e16d44b2 | 87 | } |
AndresQuesada | 0:3d07e16d44b2 | 88 | void spiP(){ |
AndresQuesada | 0:3d07e16d44b2 | 89 | lcd.printf("Prueba spi"); |
AndresQuesada | 0:3d07e16d44b2 | 90 | wait(2); |
AndresQuesada | 0:3d07e16d44b2 | 91 | lcd.cls(); |
AndresQuesada | 0:3d07e16d44b2 | 92 | t2.reset();// reseteamos el timer |
AndresQuesada | 0:3d07e16d44b2 | 93 | t2.start(); //start the timer |
AndresQuesada | 0:3d07e16d44b2 | 94 | while(t2.read()<10) |
AndresQuesada | 0:3d07e16d44b2 | 95 | { |
AndresQuesada | 0:3d07e16d44b2 | 96 | milivolts = (tem / 1023.0) * 500;// /5000*10 |
AndresQuesada | 0:3d07e16d44b2 | 97 | cs = 0; //select slave |
AndresQuesada | 0:3d07e16d44b2 | 98 | ser_port.write(milivolts); |
AndresQuesada | 0:3d07e16d44b2 | 99 | cs = 1; |
AndresQuesada | 0:3d07e16d44b2 | 100 | } |
AndresQuesada | 0:3d07e16d44b2 | 101 | /* |
AndresQuesada | 0:3d07e16d44b2 | 102 | cs = 0; //select slave |
AndresQuesada | 0:3d07e16d44b2 | 103 | recd_val=ser_port.write(switch_word); //send switch_word and receive data |
AndresQuesada | 0:3d07e16d44b2 | 104 | cs = 1; |
AndresQuesada | 0:3d07e16d44b2 | 105 | wait(0.01); |
AndresQuesada | 0:3d07e16d44b2 | 106 | //set leds according to incoming word from slave |
AndresQuesada | 0:3d07e16d44b2 | 107 | |
AndresQuesada | 0:3d07e16d44b2 | 108 | */ |
AndresQuesada | 0:3d07e16d44b2 | 109 | // comprueba(); |
AndresQuesada | 0:3d07e16d44b2 | 110 | |
AndresQuesada | 0:3d07e16d44b2 | 111 | } |
AndresQuesada | 0:3d07e16d44b2 | 112 | void uartP(){ |
AndresQuesada | 0:3d07e16d44b2 | 113 | lcd.printf("Prueba uart"); |
AndresQuesada | 0:3d07e16d44b2 | 114 | wait(2); |
AndresQuesada | 0:3d07e16d44b2 | 115 | lcd.cls(); |
AndresQuesada | 0:3d07e16d44b2 | 116 | t2.reset();// reseteamos el timer |
AndresQuesada | 0:3d07e16d44b2 | 117 | t2.start(); //start the timer |
AndresQuesada | 0:3d07e16d44b2 | 118 | while(t2.read()<10) |
AndresQuesada | 0:3d07e16d44b2 | 119 | { |
AndresQuesada | 0:3d07e16d44b2 | 120 | strobe =1; //short strobe pulse |
AndresQuesada | 0:3d07e16d44b2 | 121 | wait_us(10); |
AndresQuesada | 0:3d07e16d44b2 | 122 | strobe=0; |
AndresQuesada | 0:3d07e16d44b2 | 123 | // lcd.printf("POST STROBE"); |
AndresQuesada | 0:3d07e16d44b2 | 124 | wait(2); |
AndresQuesada | 0:3d07e16d44b2 | 125 | async_port.putc(switch_word); //transmit switch_word |
AndresQuesada | 0:3d07e16d44b2 | 126 | if (async_port.readable()==1) //is there a character to be read? |
AndresQuesada | 0:3d07e16d44b2 | 127 | recd_val=async_port.getc(); //if yes, then read it |
AndresQuesada | 0:3d07e16d44b2 | 128 | // lcd.printf("PRECOMPRUEBA"); |
AndresQuesada | 0:3d07e16d44b2 | 129 | wait(2); |
AndresQuesada | 0:3d07e16d44b2 | 130 | comprueba(); |
AndresQuesada | 0:3d07e16d44b2 | 131 | // lcd.printf("POSTCOMPRUEBA"); |
AndresQuesada | 0:3d07e16d44b2 | 132 | wait(2); |
AndresQuesada | 0:3d07e16d44b2 | 133 | } |
AndresQuesada | 0:3d07e16d44b2 | 134 | t2.stop();//paramos el timer |
AndresQuesada | 0:3d07e16d44b2 | 135 | } |
AndresQuesada | 0:3d07e16d44b2 | 136 | |
AndresQuesada | 0:3d07e16d44b2 | 137 | int main() { |
AndresQuesada | 0:3d07e16d44b2 | 138 | lcd.printf("Prueba "); |
AndresQuesada | 0:3d07e16d44b2 | 139 | async_port.baud(9600); |
AndresQuesada | 0:3d07e16d44b2 | 140 | while(1) { |
AndresQuesada | 0:3d07e16d44b2 | 141 | switch_word=0xa0; //set up a recognizable output pattern |
AndresQuesada | 0:3d07e16d44b2 | 142 | if (pulsa15==1) |
AndresQuesada | 0:3d07e16d44b2 | 143 | switch_word=switch_word | 0x01; //OR in lsb |
AndresQuesada | 0:3d07e16d44b2 | 144 | if (pulsa15==0) |
AndresQuesada | 0:3d07e16d44b2 | 145 | switch_word=switch_word | 0x02; //OR in next lsb |
AndresQuesada | 0:3d07e16d44b2 | 146 | buttonp16.rise(&i2cpP); |
AndresQuesada | 0:3d07e16d44b2 | 147 | buttonp17.rise(&spiP); |
AndresQuesada | 0:3d07e16d44b2 | 148 | buttonp18.rise(&uartP); |
AndresQuesada | 0:3d07e16d44b2 | 149 | |
AndresQuesada | 0:3d07e16d44b2 | 150 | } |
AndresQuesada | 0:3d07e16d44b2 | 151 | |
AndresQuesada | 0:3d07e16d44b2 | 152 | |
AndresQuesada | 0:3d07e16d44b2 | 153 | } |