Програмный SPI и АЦП AD7730

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 05, 2012 17:41:28

Сообщение RIMUS1989i »

Здравствуйте уважаемые Коты! Совсем недавно начал изучать программирование микроконтроллеров. Вот на практике решил подружить мегу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);

		//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)
	{
	}
}

Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Почему отказались от специально обученного аппаратного SPI?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 05, 2012 17:41:28

Сообщение RIMUS1989i »

С ним АЦП почему-то не проходил инилизацию. И частоту тактового сигнала менял, и порядок передачи данных менял, дня три потерял... Пока не написал вручную.
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Docendo discimus
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 05, 2012 17:41:28

Сообщение RIMUS1989i »

Видел я этот топик, не помогло.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

с чтением данных из нее и выводом на LCD у меня проблемы
Сначала победите ЖКИ.
Docendo discimus
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс фев 05, 2012 17:41:28

Сообщение RIMUS1989i »

С чтением данных проблемы, а с выводом все в порядке, я не правильно написал.
Ответить

Вернуться в «AVR»