Например TDA7294

Форум РадиоКот • Просмотр темы - Програмный SPI и АЦП AD7730
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб июл 26, 2025 16:14:18

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Програмный SPI и АЦП AD7730
СообщениеДобавлено: Вт янв 24, 2017 22:48:33 
Первый раз сказал Мяу!

Зарегистрирован: Вс фев 05, 2012 17:41:28
Сообщений: 31
Рейтинг сообщения: 0
Здравствуйте уважаемые Коты! Совсем недавно начал изучать программирование микроконтроллеров. Вот на практике решил подружить мегу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)
   {
   }
}



Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмный SPI и АЦП AD7730
СообщениеДобавлено: Ср янв 25, 2017 17:34:33 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Почему отказались от специально обученного аппаратного SPI?

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмный SPI и АЦП AD7730
СообщениеДобавлено: Ср янв 25, 2017 21:14:10 
Первый раз сказал Мяу!

Зарегистрирован: Вс фев 05, 2012 17:41:28
Сообщений: 31
Рейтинг сообщения: 0
С ним АЦП почему-то не проходил инилизацию. И частоту тактового сигнала менял, и порядок передачи данных менял, дня три потерял... Пока не написал вручную.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмный SPI и АЦП AD7730
СообщениеДобавлено: Чт янв 26, 2017 08:31:47 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 392
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7013
Откуда: Ижевск
Рейтинг сообщения: 0
viewtopic.php?f=20&t=56014

_________________
Docendo discimus


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмный SPI и АЦП AD7730
СообщениеДобавлено: Чт янв 26, 2017 12:53:47 
Первый раз сказал Мяу!

Зарегистрирован: Вс фев 05, 2012 17:41:28
Сообщений: 31
Рейтинг сообщения: 0
Видел я этот топик, не помогло.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмный SPI и АЦП AD7730
СообщениеДобавлено: Чт янв 26, 2017 13:21:11 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 392
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7013
Откуда: Ижевск
Рейтинг сообщения: 0
Цитата:
с чтением данных из нее и выводом на LCD у меня проблемы

Сначала победите ЖКИ.

_________________
Docendo discimus


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Програмный SPI и АЦП AD7730
СообщениеДобавлено: Чт янв 26, 2017 14:47:22 
Первый раз сказал Мяу!

Зарегистрирован: Вс фев 05, 2012 17:41:28
Сообщений: 31
Рейтинг сообщения: 0
С чтением данных проблемы, а с выводом все в порядке, я не правильно написал.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y