Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PRE-INFORME
1. Enunciado:
7.1 Configurar uno de los microcontroladores como maestro y el otro como
esclavo SPI (usar el modo 3). El maestro realiza la lectura de un voltaje analógico
(en un potenciómetro) y envía este valor por el puerto SPI. El esclavo recibe el valor
enviado desde el maestro SPI y muestra el valor en un LCD y también lo envía por
el puerto serial para que se visualice en un terminal serial.
2. Código:
* Lab_7_Master.c
*
* Created: 15/05/2022 23:28:16
* Author : Soto
*/
#define F_CPU 16000000UL // 16MHz
#include <avr/io.h>
#include <util/delay.h>
#define DD_SS DDB1
#define SPI_SS PB1 // PINB1 SS
#define DD_MOSI DDB3 //MOSI PINB3
#define DD_MISO DDB4 //MISO PINB4
#define DD_SCK DDB5 // SCK EN PINB5
#define DDR_SPI DDRB // CONFIGURACION PUERTO B
void SPI_MasterInit(void)
{
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); //MOSI y SCK SALIDA
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0); //SPI ENEABLE,MASTER, F_CPU/16,
}
uint8_t SPI_Transfer(uint8_t cData)
{
SPDR = cData; // CUANDO SE LEE EL DATO COMIENZA LA TRANSMISIÓN
while(!(SPSR & (1<<SPIF))); // ESPERAMOS A QUE TERMINE
return(SPDR);
}
int main(void)
{
uint8_t spi_rx, spi_tx;
uint16_t valor_adc1;
uint8_t unidad, decena, centena, u_mil;
int main(void)
{
uint8_t spi_rx;
SPI_SlaveInit();
lcdInit();
lcdGotoxy(0,0);
lcdPrint("VALOR ADC1: ");
lcdGotoxy(0,1);
while (1)
{
spi_rx = SPI_Transfer(0x10);
if(spi_rx == 10) // SI NUEVA LÍNEA
{
lcdPrint(" ");
lcdGotoxy(0,1);
tx_uart(spi_rx);
}
else if(spi_rx == 13) // SI VUELTA DE CARRO
{
tx_uart(spi_rx);
}
else
{
lcdData(spi_rx);
tx_uart(spi_rx);
}
}
return (0);
}
// CONFIGURACIÓN LCD
void lcdWrite4(uint8_t dato) //Enviar nibble alto a D4-D7.
{
//LCD_DPRT = (LCD_DPRT & 0x0F) | (dato & 0xF0); //Enviar el nibble alto a
D4-D7.
void lcdData(uint8_t data) //OJO solo parte del puerto es del LCD. |=.
{
LCD_PORT_RS |= (1<<LCD_RS); //RS = 1 para datos.
lcdWrite4(data); //Nibble alto.
_delay_us(100);
lcdWrite4(data << 4); //Nibble bajo.
_delay_us(100);
}
void lcdGotoxy(uint8_t x, uint8_t y)
{
uint8_t firstCharAdr[] = {0x80, 0xC0, 0x94, 0xD4};
lcdCommand(firstCharAdr[y] + x);
_delay_us(100);
}
void lcdPrint(char * str)
{
uint8_t i = 0;
while(str[i] != 0)
{
lcdData(str[i]);
i++;
}
}
void lcdInit(void)
{
LCD_DDR_D4 |= (1<<LCD_D4);
LCD_DDR_D5 |= (1<<LCD_D5);
LCD_DDR_D6 |= (1<<LCD_D6);
LCD_DDR_D7 |= (1<<LCD_D7);
LCD_DDR_RS |= (1<<LCD_RS);
LCD_DDR_EN |= (1<<LCD_EN);
_delay_ms(50); //Espera inicialización de encendido de LCD.
LCD_PORT_EN &= ~(1<<LCD_EN); //LCD_EN = 0
LCD_PORT_RS &= ~(1<<LCD_RS); //RS = 0 para comandos.
lcdWrite4(0x30);
_delay_ms(5);
lcdWrite4(0x30);
_delay_us(100);
lcdWrite4(0x30);
_delay_us(100);
lcdWrite4(0x20);
_delay_us(100);
lcdCommand(0x28); //2 lineas, caracter 5x7.
lcdCommand(0x0C); //Display ON, cursor OFF.
lcdCommand(0x01); //Limpiar LCD.
_delay_ms(2);
lcdCommand(0x06); //Desplazar cursor a la derecha.
}
3. Simulación: