Ejemplos de programación en C: sockets TCP, LCD, I2C y SPI en sistemas embebidos
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);
}