Jump to content

    

Recommended Posts

Quote

Чтобы выбрать канал - надо записать в сам Communications Register значение вида 0b00000xxx, где ххх - номер канала.

1.thumb.png.a35567fbb2e5aaf700b8043ee070b2b5.png

ну ка найдите здесь установку номера канала

Share this post


Link to post
Share on other sites
31 минуту назад, Zx80 сказал:

Но все равно возвращается один байт

Как он может возвращаться один, если такты для всех байтов генерите вы? Хотите читать 10 байтов - пошлите 10 байтов мусора, таков SPI.

Share this post


Link to post
Share on other sites
6 часов назад, Zx80 сказал:

Не представляю как Вам дать такую диаграмму. Осцилограф двулучевой. Скажу только что CS = 0 у меня завсегда

Если CS не используется, тогда паспорт требует программно сбрасывать интерфейс 4-мя пустыми байтами.

 

И далее, Вам здесь уже каждый первый ответил, действовать точно так же — чтобы прочитать 3 байта данных, требуется написать руками код, посылающий по SPI четыре байта, и вот этот код можно показать здесь вместо осциллограмм.

Share this post


Link to post
Share on other sites
spiInit();
InitAD7714();

DDRD |= (0<<DDD2);
PORTD |= (1<<PORTD2);

DDRD |= (1<<DDD6);
PORTD |= (0<<PORTD6); 


while (1)
      {     
          // Place your code here 

//          if(PIND.2 == 0)
//             PORTD.6 = 0;
//          else 
//             PORTD.6 = 1;

          unsigned char res[3]={255,255,255};
          if(PIND.2 == 0)
          {
             spiWrite(0x5C);
             
             spiWrite(0xFF);
             res[0] = spiRead();
             
             spiWrite(0xFF);
             res[1] = spiRead();
             
             spiWrite(0xFF);
             res[2] = spiRead();
             
             displayAD7714Result(res);   
          }
                       
          delay_ms(20);
      }
}

 

void InitAD7714()
{
//    spiWrite(0x27);        /* set the channel AIN6 and set the next operation as write to the filter high */
//    spiWrite(0x4F);        /* set Bipolar mode, 24 bits, boost off, all 4 MSBs of filterword to 1 */
//    spiWrite(0x37);        /* set the next operation as a write to the filter low register channel AIN6 */
//    spiWrite(0xA0);        /* max filter word allowed for low part of the filterword */
//    spiWrite(0x17);        /* set the operation as a write to the mode register */
//    spiWrite(0x20);        /* set gain to 1, burnout current off, no filter sync, and do a self calibration */

      spiWrite(0x24);        /* set the channel AIN1-AIN2 and set the next operation as write to the filter high */
      spiWrite(0x4F);        /* set Bipolar mode, 24 bits, boost off, all 4 MSBs of filterword to 1 */
      spiWrite(0x34);        /* set the channel AIN1-AIN2 the next operation as a write to the filter low register channel AIN1/AIN2 */
      spiWrite(0xA0);        /* max filter word allowed for low part of the filterword */
      spiWrite(0x14);        /* set the channel AIN1-AIN2 the operation as a write to the mode register.*/
      spiWrite(0x20);        /* set gain to 1, burnout current off, no filter sync, and do a self calibration */                     
}

 

void spiInit(void)
{
    /* Set MOSI, SCK, SS as output */          
    DDRB |= ((1<<SPI_DDR_MOSI) | (1<<SPI_DDR_SS) | (0<<SPI_DDR_MISO) | (1<<SPI_DDR_SCK));
    PORTB &= ~((1<<SPI_PORT_MOSI) | (1<<SPI_PORT_SS) | (1<<SPI_PORT_MISO) | (1<<SPI_PORT_SCK));
     
    /* Enable SPI, Master, set clock rate fck/16 */
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
    //SPDR = 0b00000000;
}
void spiWrite(unsigned char cData)
{
     /* Start transmission */
    SPDR = cData;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)));

}
unsigned char spiRead()
{
     /* Wait for reception complete */
    while(!(SPSR & (1<<SPIF)));
    /* Return data register */
    return SPDR;
}

Осцилограмма на SCK. Посылаются байты 0х5С, 0хFF, 0хFF, 0хFF. По идее я должен видеть байты результата на DOUT, но ничего там не вижу. Подскажите ?

sckpin.png.8fd3a694c0da978b20200d5ebf73cbc4.png

Edited by Zx80

Share this post


Link to post
Share on other sites

Привет.

Я в ступоре. Раз не работает решил записать одну команду и ее же прочитать. На SCK вижу такты для каждого из четырех комманд. На DIN вжу данные четырех комманд.

на DOUT вижу ноль. Ау помогите.

      spiWrite(0x24);        /* команда установить канал AIN1-AIN2. И передать данные в старшую часть фильтра.
      spiWrite(0xAA);        /* данные для старшей части фильтра   
      spiWrite(0x2C);        /* прочитать данные из старшей части фильтра
      spiWrite(0xAA);		 /* байт толкатель для генерации SCK

поменял чип и увидел на DOUT

NewFile0.png.c99d028607f1bb662e9cb7bf7b20a249.png

эт че получается чип паленый. Я не палил. А что это за шум перед переходом в ноль ? Случайно этот выход не открытый коллектор ?

Edited by Zx80

Share this post


Link to post
Share on other sites
35 минут назад, Zx80 сказал:

помогите

Да уже много раз пробовали — начиная с того, чтобы выкинуть нерабочую схему, и заканчивая сбросом — всё без толку.

Share this post


Link to post
Share on other sites
6 часов назад, Zx80 сказал:

эт че получается чип паленый. Я не палил. А что это за шум перед переходом в ноль ? Случайно этот выход не открытый коллектор ?

нет - это схема переходит в z-состояние и разряжается емкость монтажа.

Share this post


Link to post
Share on other sites

Plain, ваши ответы всегда напоминают ответы продавцов, "покупайте что мы привезли, никого не волнует то что вам надо"

Quote

Да уже много раз пробовали — начиная с того, чтобы выкинуть нерабочую схему, и заканчивая сбросом — всё без толку.

 

Edited by Zx80

Share this post


Link to post
Share on other sites
19 часов назад, Zx80 сказал:

Plain, ваши ответы всегда напоминают ответы продавцов, "покупайте что мы привезли, никого не волнует то что вам надо"

 

А Ваши вопросы напоминают вопросы прогульщика уроков.

30.12.2021 в 14:50, Zx80 сказал:

 На SCK вижу такты для каждого из четырех комманд. На DIN вжу данные четырех комманд.

 Ау помогите.

эт че получается чип паленый.

 

Напоминаю Вам п.2.1.в Правил форума.

Share this post


Link to post
Share on other sites
Quote

Да уже много раз пробовали — начиная с того, чтобы выкинуть нерабочую схему, и заканчивая сбросом — всё без толку.

Извините, а как мне реагировать на первую часть этой фразы повторяемой с не виданным упорством. Я же ответил, задание мне сделать именно на AD7714. Что не понятного, зачем тогда такой ответ? Про сброс разговора не было, сброс у меня организован. Я сократил поле до записи одной команды, и ее чтения, в ответ в 50й раз у вас чип не такой. Что ж это за помощь(совет) ?

Share this post


Link to post
Share on other sites
2 часа назад, Zx80 сказал:

в ответ в 50й раз у вас чип не такой. Что ж это за помощь(совет) ?

Так Вы ещё и читать не умеете? Тогда все советы будут бесполезными. Где, хоть раз (!?) Вам написали, что у Вас "чип не такой"?

Share this post


Link to post
Share on other sites
2 часа назад, Zx80 сказал:

зачем тогда такой ответ?

Совет был — выбросить ОУ и прочее, затем подключить датчик правильно и в мост, для измерений на переменном токе, и добавить защиту на каждый из 6-ти входных контактов, а советов выкинуть AD7714 лично я не давал — отличный АЦП, если прочитать его паспорт и затем делать так, как там написано. И ещё, Вы сразу сказали, что оригинальный экземпляр платы у Вас издох от неосторожного с ней обращения — Ваше право полагать, что её немецкие авторы тут не при чём, но другие участники форума уверены в обратном.

Share this post


Link to post
Share on other sites

Привет. Давайте так, у меня два топика - ацп и оу. В теме про ацп, обсуждаем ацп, в теме про оу обсуждаем оу. Не влазит слон в рот, давайте его есть по кускам. Я так и начал. Привел инициализацию старшей части фильтра и попытку ее считать.

   spiWrite(0x24);        /* команда установить канал AIN1-AIN2. И передать данные в старшую часть фильтра.
      spiWrite(0xAA);        /* данные для старшей части фильтра   
      spiWrite(0x2C);        /* прочитать данные из старшей части фильтра
      spiWrite(0xFF);		 /* байт толкатель для генерации SCK
      
void spiWrite(unsigned char cData)
{
     /* Start transmission */
    SPDR = cData;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)));

}

unsigned char spiRead()
{
     /* Wait for reception complete */
    while(!(SPSR & (1<<SPIF)));
    /* Return data register */
    return SPDR;
}

осцилограмму на SCK показываю, что вижу такты на эти команды.

sckpin.png.8fd3a694c0da978b20200d5ebf73cbc4.png

На выводе DOUT вижу ноль, с некоторым различием при смене экземпляра чипа. Всего одна команда, всего одно считывание. Подскажете мою ошибку.

Share this post


Link to post
Share on other sites
6 hours ago, Zx80 said:

На выводе DOUT вижу ноль, с некоторым различием при смене экземпляра чипа. Всего одна команда, всего одно считывание. Подскажете мою ошибку.

1. Вы бы двумя каналами осциллографа работали и приводили осциллограммы с двух каналов.

2. Вы не привели марку микроконтроллера. И обычно у AVR один SPI. И по нему же он прошивается. Если вы после 

    прошивки МК не передергиваете питание или не подаете сброс на АЦП, то возможно АЦП рассинхронизирован.

    Вам уже тут советовали отправлять 4-е фиктивных байта по SPI, чтобы восстановить синхронизацию.

3. Может у вас просто короткое замыкание по линии DOUT АЦП или наоборот обрыв или непропай.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.