Ejemplos de programación en C: sockets TCP, LCD, I2C y SPI en sistemas embebidos

Informática y Telecomunicaciones4,47 KB

Ejemplo de cliente TCP con sockets en C (socket-inet.c)

// Ejemplo socket-inet.c

#include <stdlib.h>

#include <stdio.h>

#include <netinet/in.h>

#include <netdb.h>

#include <sys/socket.h>

#include <unistd.h>

#include <string.h>

void get_home_page(int socket_fd)

{

char buffer[10000];

ssize_t number_characters_read;

sprintf(buffer, "GET /\n");

write(socket_fd, buffer, strlen(buffer));

while (1) {

number_characters_read = read(socket_fd, buffer, 10000);

if (number_characters_read == 0)

return;

fwrite(buffer, sizeof(char), number_characters_read, stdout);

}

}



int main(int argc, char* const argv[])

{

int socket_fd;

struct sockaddr_in name;

struct hostent* hostinfo;

socket_fd = socket(PF_INET, SOCK_STREAM, 0);

name.sin_family = AF_INET;

hostinfo = gethostbyname(argv[1]);

if (hostinfo == NULL)

return 1;

else

name.sin_addr = *((struct in_addr *) hostinfo->h_addr);

name.sin_port = htons(80);

if (connect(socket_fd, (struct sockaddr *) &name, sizeof(struct sockaddr_in)) == -1) {

perror("connect");

return 1;

}

get_home_page(socket_fd);

Ejercicio AVR1: impresión de un valor de 8 bits en LCD

Realizar la función void imprime_char(unsigned char valor) que emplee la función de escritura de un carácter ASCII en la pantalla LCD, lcd_putch(). La función debe imprimir una variable de 8 bits en formato decimal, es decir, debe sacar un máximo de cinco caracteres que pueden ser desde el '0' hasta el '9' en función del número que se le pase. Por ejemplo, si la variable valor contiene el número 45 en decimal, mostraría por pantalla: "045".

void imprime_char(unsigned char valor) {

lcd_putch((valor/100)+'0'); // centenas

lcd_putch((valor/10)%10+'0'); // decenas

lcd_putch(valor%10+'0'); // unidades

}

Ejercicio P2 (pendiente): protocolo I2C y control del AD5722

Función i2c_byte

void i2c_byte(unsigned char x) {

unsigned char i;

i = 0x80;

do {

SCL_CERO;

I2C_DELAY;

if (x & i) SDA_UNO;

else SDA_CERO;

I2C_DELAY;

SCL_UNO;

I2C_DELAY;

I2C_DELAY;

i >>= 1;

} while (i != 0);

SCL_CERO;

I2C_DELAY;

}

Inicialización del AD5722

void ad5722_init(void) {

// pone SS como salida

DDRB |= (1 << SPI_SS);

// pone SS a uno para iniciar

PORTB |= (1 << SPI_SS);

SPI.begin();

delay(100);

// Inicializa configuración del dispositivo

spi_write24(0x10, 0x00, 0x05); // 0001 0000 0000 0000 0000 0101 POWER REGISTER

spi_write24(0x1C, 0x00, 0x00); // 0001 1100 0000 0000 0000 0000 CONTROL REGISTER

}

Escritura en el DAC

void ad5722_dac(uint8_t dac, uint8_t valor) {

uint8_t cod1, cod2;

cod1 = ((valor << 4) >> 8) & 0xFF;

cod2 = (valor << 4) & 0xFF;

spi_write24(dac << 1, cod1, cod2);

}

Descargar

PDF Word HTML