/*****************************************************************
// Fajlenev : MCP3202.c
// Verzio : 1.0
// Ismerteto : SPI hasznalata MCP3202 ADC IC-vel
// es 74HC595 shift regiszterrel
// 2011 Majus 14.
******************************************************************/
#include <avr/io.h>
#include <util/delay.h>
#define SPI_PORT PORTB
#define SPI_DDR DDRB
#define SPI_74HC595_CS PB2 // 74HC595 SPI-t aktivalo Chip Select lab
#define SPI_MCP3202_CS PB1 // MCP3202 SPI-t aktivalo Chip Select lab
#define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
void SPI_74HC595_Write(unsigned char adatki)
{
// 74HC595 SPI bekapcsolasa (CS lab logikai alacsony szint)
SPI_PORT &= ~(1<<SPI_74HC595_CS);
_delay_us(1);
// Adattranszfer elinditasa (MOSI)
SPDR = adatki;
// Varakozas amig az adattranszfer befejezodik
while(!(SPSR & (1<<SPIF)));
// 74HC595 SPI kikapcsolasa, Latch kimenetek bekapcsolasa
SPI_PORT |= (1<<SPI_74HC595_CS);
}
unsigned char SPI_MCP3202_WriteRead()
{
unsigned char adatbe_h;
unsigned char adatbe_l;
// MCP3202 SPI bekapcsolasa (CS logikai alacsony szint)
SPI_PORT &= ~(1<<SPI_MCP3202_CS);
_delay_us(1);
// Adattranszfer elinditasa (MOSI)
SPDR = 0b00000001;
// Varakozas amig az adattranszfer befejezodik
while(!(SPSR & (1<<SPIF)));
// Adattranszfer elinditasa (MOSI)
SPDR = 0b10100000;
// Varakozas amig az adattranszfer befejezodik
while(!(SPSR & (1<<SPIF)));
// Beerkezett adat;
adatbe_h = SPDR;
// Adattranszfer elinditasa (MOSI)
SPDR = 0b00000000;
// Varakozas amig az adattranszfer befejezodik
while(!(SPSR & (1<<SPIF)));
// Beerkezett adat;
adatbe_l = SPDR;
// MCP3202 SPI kikapcsolasa (CS logikai magas szint)
SPI_PORT |= (1<<SPI_MCP3202_CS);
// A beerkezett adatokbol az ADC eredmeny eloallitasa
// A 12 bites eredmeny atkonvertalasa 8 bit-esre(osztas 16-al)
return (adatbe_l | (adatbe_h &= 0b00001111)<<8 ) / 16;
}
int main(void)
{
unsigned char kijelzo;
unsigned char adc;
// AVR ATMega8 SPI periferia beallitasa
// MOSI es SCK kimenet, a tobbi bemenet
SPI_DDR = (1<<PB3)|(1<<PB5)|(1<<PB2)|(1<<PB1);
// MCP3202 SPI kikapcsolasa (CS logikai magas szint)
SPI_PORT |= (1<<SPI_MCP3202_CS);
// 74HC595 SPI kikapcsolasa (CS logikai magas szint)
SPI_PORT |= (1<<SPI_74HC595_CS);
// SPI engedelyezese, Master mod, SPI orajel beallitasa
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
// 74HC595 shift regiszter reszetelese
SPI_74HC595_Write(0);
while(1)
{
// Az MCP3202-vel mert ADC ertek lekerdezese SPI-n keresztul
adc = SPI_MCP3202_WriteRead();
// A mert ertektol fuggoen kulonbozo szamu LED bekapcsolasa
if(adc<28)
{ kijelzo = 0b00000000; }
else if(adc<56)
{ kijelzo = 0b00000001; }
else if(adc<85)
{ kijelzo = 0b00000011; }
else if(adc<113)
{ kijelzo = 0b00000111; }
else if(adc<142)
{ kijelzo = 0b00001111; }
else if(adc<170)
{ kijelzo = 0b00011111; }
else if(adc<199)
{ kijelzo = 0b00111111; }
else if(adc<227)
{ kijelzo = 0b001111111; }
else
{ kijelzo = 0b11111111; }
// A kivant mintazat kijelzese az 74HC595 shift regiszter-rel
SPI_74HC595_Write(kijelzo);
_delay_ms(100);
}
return 0;
}