Здравствуйте уважаемые Коты! Совсем недавно начал изучать программирование микроконтроллеров. Вот на практике решил подружить мегу8 и ad7730. Инилизацию ad7730 проходит, rdy после инилизации в нуле. А вот с чтением данных из нее и выводом на LCD у меня проблемы! Явно делаю что-то не так... Подскажите пожалуста.
Вот код 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);
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);
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);
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++) {
PORT_SPI |=(1<<adc_sclk);
_delay_ms(1);
if(PIN_SPI & (1 << adc_dout))byte++;
byte <<= 1;
_delay_ms(1);
PORT_SPI &=~(1<<adc_sclk);
}
_delay_ms(1);
adc_spi(0x30);
return byte;
}
ISR(TIMER1_OVF_vect)
{
TCNT1H=0xFC;
TCNT1L=0xF2;
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);
TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10);
TCNT1 = 64456;
}
int main(void)
{
DDRD=0xff;
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)
{
}
}