Перейти к содержанию
    

Quote

Вы не привели марку микроконтроллера. И обычно у AVR один SPI. И по нему же он прошивается. Если вы после прошивки МК не передергиваете питание или не подаете сброс на АЦП

Atmega16, где у меня отписано, про несколько SPI ?

Quote

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

SPI по сути сдвиговый регистр. Три байта команды - они же три синхронизации. Четверый байт синхронизации присутствует.

Конечно сброс присутствует.

Quote

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

Ну конечно все проверено, тем более если смотрели осцилограмма на DOUT есть, но странная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня два чипа 7714. Один из них на выходе ничего не дает(кучу времени убил), на втором есть. Подскажите, как читать данные - в смысле какой из байтов выталкивается первым (старший, младший)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разве из Figure 6 не понятно? На стр.33 даташите есть даже примеры функций общения с микросхемой. Ничего загадочного.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Quote

Ничего загадочного.

Вот смотрите, мой текст программы

lcd_init(16);

SpiInit();
InitGreen_pin();
InitRstAD7714_pin();


CS_pin_Hight();
Creen_pin_Low();

ResetAD7714();
InitAD7714();

while (1)
    {   
        // Place your code here
         
        while(DRDY == 1);
            
        bytesArray[0] = spiWrite( 0x5C );
        bytesArray[1] = spiWrite( 0xFF );
        bytesArray[2] = spiWrite( 0xFF );
        
        displayAD7714Bytes(bytesArray[0], bytesArray[1], bytesArray[2]);
        
        delay_ms(10);              
    }
}

void displayAD7714Bytes(unsigned char msb, unsigned char mib, unsigned char lsb)
{
    char lcd_buffer[30];
    lcd_gotoxy(0,0);
    lcd_clear();
    sprintf(lcd_buffer,"U = %03d %03d %03d", msb, mib, lsb);
    lcd_puts(lcd_buffer);
}

На входе AIN1-AIN2 у меня сейчас в максимуме, когда датчик загружен 10мВ. Опора 2.5в.

Когда датчик разгружен на входе 0.57мВ. На индикаторе я вижу V = 000 000 016. Слегка прикоснулся к датчику V = 253 000 016. Чуть сильнее придавил он переходит  V = 050 000 017 Когда я полностью его загружаю (10мВ) я вижу V = 255 001 000 или V = 255 000 254. Складывается впечатление, что первый принятый байт (bytesArray[0] = spiWrite( 0x5C );) это младший байт, второй принятый байт (bytesArray[1] = spiWrite( 0xFF );) это старший байт, и наконец третий принятый байт (bytesArray[2] = spiWrite( 0xFF );) это средний байт. Подскажите где собака порылась ?

Изменено пользователем Zx80

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Quote

Ничего загадочного.

Вот расчет, датчик загружен, на входах AIN1-AIN2 10.6В Индикатор показывает V = 255 001 023.  Теперь если учесть что 255 это младший байт, 024 средний, 001 старший. Переводим в HEX

получаем 0х01 0х017 0х0FF что равно 71679 в десятичном. Цена разряда 2.5 вольта / 2 в степени 24.     2.5/16777216= 0,0000001490116119384765625 вольта. У меня набежало 71679 тогда напряжение на входах Uвх = 0,0000001490116119384765625 * 71679 = 0,0106810033321380615234375 вольта. Т.е. мои 10.6мВ на датчике. Но вот почему у меня такая путаница с байтами ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

47 минут назад, Zx80 сказал:

я вижу V = 255 001 000 или V = 255 000 254. Складывается впечатление, что первый принятый байт (bytesArray[0] = spiWrite( 0x5C );) это младший байт

А может, отрицательное значение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас положил на датчик телефон. Показыает V = 000 000 032  Пересчитываю, натикало - 8192. По расчету Uвх=1.2мВ. Лезу меряю, да 1.2мВ. Вот и вопрос про порядок байтов. Или где я бажу ?

Quote

я вижу V = 255 001 000 или V = 255 000 254. Складывается впечатление, что первый принятый байт (bytesArray[0] = spiWrite( 0x5C );) это младший байт

А может, отрицательное значение?

При разгруженном датчике V = 000 000 008 По расчету Uвх = 0.3 мВ лезу меряю 0.5 мВ. И потом я когда датчик нагружаю я же вижу как растут значения байт. Не, откуда там отрицательное если еще расчет сходится ? Да вопрос собственно в порядке байт, почему считываю младший, старший, средний ?

Изменено пользователем Zx80
Исправление вопроса

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Quote

Ничего загадочного.

Таки разобрался. Кому интересно смотри отличия.

while (1)
    {   
        // Place your code here
         
        while(DRDY == 1);
          
        spiWrite( 0x5C );
               
        bytesArray[0] = spiWrite( 0xFF );
        bytesArray[1] = spiWrite( 0xFF );
        bytesArray[2] = spiWrite( 0xFF );
        
        displayAD7714Bytes(bytesArray[0], bytesArray[1], bytesArray[2]);
        
        delay_ms(10);              
    }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Новый этап, и старый затык. Еще на этапе разбирательства заметил такой глюк. Если я зашиваю программу в Атмегу, все работает, уже даже меряет. Но вот нажимаю сброс и мерять перестает. Кто подскажет куда идти рыть ? Спрашивается чем отличается сброс и дальнейший старт от старта после того как я программу зашил. Программа же одна и та же, старт вроде как ничем не отличается, но тем не менее измерять после рестарта перестает ?

Изменено пользователем Zx80
грамматическая ошибка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На сегодня есть детали, но как это устранить пока не соображу. Заметил что когда я шью, я вынимаю MOSI и MISO из разъема. Так вот если вынуть MOSI и MISO из разъема и сбросить, а потом вставить все запускается в полном объеме. Потом обнаружил что достаточно MISO оставить, выдергнуть MOSI, перезапустить, вставить MOSI и все заработает. Но вот не пойму как это влияет и как это реализовать прогррамно правильно. Собственно не пойму где затык, я SPI перед стартом конфигурю, но это же конфигурится Атмега.

Quote

А после снятия и подачи питания?

После сброса питания не работает. Стоит после включения вынуть MOSI, нажать сброс процессора, вставить MOSI и все начинает работать.

И если я включаю, вынимаю MOSI сбрасываю, программа не выполняя InitAD7714(); переходит в цикл и потом отдает мне результат оцифровки с непонятно какими настройками. Но блин почему тогда милливольты сходятся ?

Изменено пользователем Zx80
Ответ на вопрос А после снятия и подачи питания?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Cупер, выше моего понимания, убрал из программы InitAD7714();

void InitAD7714()
{         
      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 */                   
}

Включаю, работает, сбрасываю - работает. Без инициализации

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно не работает потому что пропадают импульсы DRDY, как только я ее инициализирую

Изменено пользователем Zx80

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Quote

Что-то у Вас там загадки сплошные. Надо код перетрахивать...

вот моя функция записи.

unsigned char spiWrite(unsigned char cData)
{   
     /* Start transmission */
    cs_Low();
    delay_us(5);
    
    SPDR = cData;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF))); 
    
    delay_us(5);   
    cs_Hight();
        
    return(SPDR);    
}

Советуете записать для теста только один регистр ? Пробовал, повторю сообщю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...