Вот код C#. Atmel Studio 6.
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include "lcd_lib.c"
long int ADC_data=0;
char lcd_buffer[];
unsigned char b,i=0;
#define adc_sclk PC0
#define adc_cs PC1
#define adc_rdy PC2
#define adc_dout PC3
#define adc_din PC4
#define adc_on PC5
#define DDR_SPI DDRC
#define PORT_SPI PORTC
#define PIN_SPI PINC
void adc_spi (unsigned char byte)
{
PORT_SPI &=~(1<<adc_cs);
_delay_us(10);
for (i=0;i<8;i++){
if (byte & 0x80)
PORT_SPI |= (1<<adc_din);
else
PORT_SPI &= ~ (1<<adc_din);
byte <<= 1;
_delay_us(1);
PORT_SPI |= (1<<adc_sclk);
_delay_us(1);
//byte |= PIN_SPI & (1 << adc_rdy);
PORT_SPI &=~(1<<adc_sclk);
}
PORT_SPI |=(1<<adc_cs);
}
void adc_spi_16bit (unsigned long cod16)
{
PORT_SPI &=~(1<<adc_cs);
_delay_us(10);
for (i=0;i<16;i++){
if (cod16 & 0x8000)
PORT_SPI |= (1<<adc_din);
else
PORT_SPI &= ~ (1<<adc_din);
cod16 <<= 1;
_delay_us(1);
PORT_SPI |= (1<<adc_sclk);
_delay_us(1);
//cod16 |= PIN_SPI & (1 << adc_rdy);
PORT_SPI &=~(1<<adc_sclk);
}
PORT_SPI |=(1<<adc_cs);
}
void adc_spi_24bit (unsigned long cod24)
{
PORT_SPI &=~(1<<adc_cs);
_delay_us(10);
for (i=0;i<24;i++){
if (cod24 & 0x800000)
PORT_SPI |= (1<<adc_din);
else
PORT_SPI &= ~ (1<<adc_din);
cod24 <<= 1;
_delay_us(1);
PORT_SPI |= (1<<adc_sclk);
_delay_us(1);
//cod24 |= PIN_SPI & (1 << adc_rdy);
PORT_SPI &=~(1<<adc_sclk);
}
PORT_SPI |=(1<<adc_cs);
}
void adc_init (){
DDR_SPI = 0b00110011;
_delay_ms(20);
PORT_SPI |=(1<<adc_on);
_delay_ms(100);
adc_spi (0x03);
adc_spi_24bit(0x800010);
adc_spi(0x04);
adc_spi(0x23);
adc_spi(0x02);
adc_spi_16bit(0xb180);
while (PIN_SPI & (1 << adc_rdy));
lcd_clr();
lcd_home();
lcd_string("ADC step1 ok!");
adc_spi(0x02);
adc_spi_16bit(0x9180);
while (PIN_SPI & (1 << adc_rdy));
lcd_clr();
lcd_home();
lcd_string("ADC step2 ok!");
while (PIN_SPI & (1 << adc_rdy));
lcd_clr();
lcd_home();
lcd_string("ADC init ok!");
}
unsigned long SPI_rd() {
_delay_ms(1);
adc_spi(0x02);
_delay_ms(1);
adc_spi_16bit(0x2180);
_delay_ms(1);
adc_spi(0x21);
PORT_SPI &= ~ (1<<adc_din);
while (PIN_SPI & (1 << adc_rdy));
char i;
long byte;
_delay_ms(1); // формируем паузу
for (i=0; i<24; i++) { // цикл на 24 бит
PORT_SPI |=(1<<adc_sclk); // формируем фронт
_delay_ms(1);
if(PIN_SPI & (1 << adc_dout))byte++; // читаем бит и записываем его
///if (i!=23)byte<<1; // двигаем байт
byte <<= 1;
_delay_ms(1);
PORT_SPI &=~(1<<adc_sclk);
}
_delay_ms(1);
adc_spi(0x30);
return byte; // вернули, что прочли
}
/*ISR(TIMER0_OVF_vect)
{
TCNT0=0xB2; //раз в 0,01 сек
ADC_data=SPI_rd();
}*/
ISR(TIMER1_OVF_vect)
{
TCNT1H=0xFC; //установить начальное
TCNT1L=0xF2; //состояние таймера Т1
//PORTB^=(0x01);
ADC_data=SPI_rd();
lcd_clr();
lcd_gotoxy( 0,0 );
sprintf( lcd_buffer,"U= %lu",ADC_data);
lcd_gotoxy( 0,0 );
lcd_string(lcd_buffer);
}
void init_timer (void)
{
TIMSK=(1<<TOIE0)|(1<<TOIE1); //Разрешить прерывания по переполнению таймера 0
//TCCR0=(1<<CS00)|(1<<CS01)|(0<<CS02); //Делитель =/64
TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10); // настраиваем делитель
TCNT1 = 64456;
}
int main(void)
{
DDRD=0xff; //Инициализация portD
PORTD=0x00;
DDRB |=(1<<PB0);
PORT_SPI |=(1<<adc_cs);
lcd_init();
lcd_clr();
lcd_home();
lcd_string("Loading...");
adc_init();
sei();
init_timer();
while(1)
{
}
}



