/*****************************************************************
Fecha: Setiembre del 2010.
Programa: Setea un valor en un potenciómetro digital MCP41010.
Cristal: 4Mhz.
Programador: PK2-ISP.
*****************************************************************/
#include <avr/io.h> // Definiciones de hardware.
// Declaramos funciones utilizadas.
void spi_init(uint8_t velocidad); // Inicia el bus SPI y setea velocidad de trabajo.
uint8_t spi_write(uint8_t dato); // Escribe un dato en el bus SPI.
// Definimos los pines para la comunicación SPI.
#define SDI PINB5 // Pin B5 como MOSI.
#define SDO PINB6 // Pin B4 como MISO.
#define SCK PINB7 // Pin B7 como SCK.
void spi_init(uint8_t velocidad) {
if (velocidad==1) { // Si velocidad = 1, la velocidad del bus es máxima.
PORTB |= (1<<SDO)|(1<<PINB4);
DDRB = (1<<SCK)|(1<<SDI)|(1<<PINB4);
USICR = (1<<USIWM0)|(1<<USICS1)|(1<<USICLK);
PORTB &= ~(1<<PINB4); // Habilitamos esclavo.
} else { // Si velocidad es 0....
PORTB |= (1<<PINB4); // Deshabilitamos esclavo.
DDRB &= ~((1<<SCK)|(1<<SDO)|(1<<SDI)|(1<<PINB4));
USICR = 0;
}
}
uint8_t spi_write(uint8_t dato) {
USIDR = dato; // Carga el dato a enviar.
USISR = (1<<USIOIF);
do {
USICR = (1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC); // Configuramos la USI.
} while ((USISR & (1<<USIOIF)) == 0); // En caso de que termine de enviar el dato, retorna el valor
// De USIDR.
return USIDR;
}
int main(void) {
DDRB = 0x07; // PB0--PB3 como salidas.
PORTB = 0x00; // Limpiamos el puerto B.
while(1) {
spi_init(1); // Iniciamos las comunicaciones con el esclavo MCP41010.
spi_write(0x11); // Cargamos byte de comando.
if(spi_write(0x11)==1) { // Si todavía no termina de mandar el dato..
PORTB = 0x01; // Espera a mandarlo....
}
else
spi_write(0x80); // Seteamos valor del potenciómetro digital.
if(spi_write(0x11)==1) { // Si todavía no termina de mandar el dato..
PORTB = 0x01; // Espera a mandarlo....
}
else
spi_init(0); // Apagamos el potenciometro.
}
}