Zx80 0 4 января, 2022 Опубликовано 4 января, 2022 · Жалоба Quote Вы не привели марку микроконтроллера. И обычно у AVR один SPI. И по нему же он прошивается. Если вы после прошивки МК не передергиваете питание или не подаете сброс на АЦП Atmega16, где у меня отписано, про несколько SPI ? Quote Вам уже тут советовали отправлять 4-е фиктивных байта по SPI, чтобы восстановить синхронизацию. SPI по сути сдвиговый регистр. Три байта команды - они же три синхронизации. Четверый байт синхронизации присутствует. Конечно сброс присутствует. Quote Может у вас просто короткое замыкание по линии DOUT АЦП или наоборот обрыв или непропай. Ну конечно все проверено, тем более если смотрели осцилограмма на DOUT есть, но странная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zx80 0 21 января, 2022 Опубликовано 21 января, 2022 · Жалоба У меня два чипа 7714. Один из них на выходе ничего не дает(кучу времени убил), на втором есть. Подскажите, как читать данные - в смысле какой из байтов выталкивается первым (старший, младший)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 6 21 января, 2022 Опубликовано 21 января, 2022 · Жалоба Разве из Figure 6 не понятно? На стр.33 даташите есть даже примеры функций общения с микросхемой. Ничего загадочного. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zx80 0 24 января, 2022 Опубликовано 24 января, 2022 (изменено) · Жалоба 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 );) это средний байт. Подскажите где собака порылась ? Изменено 24 января, 2022 пользователем Zx80 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zx80 0 24 января, 2022 Опубликовано 24 января, 2022 · Жалоба 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мВ на датчике. Но вот почему у меня такая путаница с байтами ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 6 24 января, 2022 Опубликовано 24 января, 2022 · Жалоба 47 минут назад, Zx80 сказал: я вижу V = 255 001 000 или V = 255 000 254. Складывается впечатление, что первый принятый байт (bytesArray[0] = spiWrite( 0x5C );) это младший байт А может, отрицательное значение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zx80 0 24 января, 2022 Опубликовано 24 января, 2022 (изменено) · Жалоба Сейчас положил на датчик телефон. Показыает 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 мВ. И потом я когда датчик нагружаю я же вижу как растут значения байт. Не, откуда там отрицательное если еще расчет сходится ? Да вопрос собственно в порядке байт, почему считываю младший, старший, средний ? Изменено 24 января, 2022 пользователем Zx80 Исправление вопроса Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zx80 0 24 января, 2022 Опубликовано 24 января, 2022 · Жалоба 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 0 24 января, 2022 Опубликовано 24 января, 2022 (изменено) · Жалоба Новый этап, и старый затык. Еще на этапе разбирательства заметил такой глюк. Если я зашиваю программу в Атмегу, все работает, уже даже меряет. Но вот нажимаю сброс и мерять перестает. Кто подскажет куда идти рыть ? Спрашивается чем отличается сброс и дальнейший старт от старта после того как я программу зашил. Программа же одна и та же, старт вроде как ничем не отличается, но тем не менее измерять после рестарта перестает ? Изменено 24 января, 2022 пользователем Zx80 грамматическая ошибка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 6 24 января, 2022 Опубликовано 24 января, 2022 · Жалоба А после снятия и подачи питания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zx80 0 25 января, 2022 Опубликовано 25 января, 2022 (изменено) · Жалоба На сегодня есть детали, но как это устранить пока не соображу. Заметил что когда я шью, я вынимаю MOSI и MISO из разъема. Так вот если вынуть MOSI и MISO из разъема и сбросить, а потом вставить все запускается в полном объеме. Потом обнаружил что достаточно MISO оставить, выдергнуть MOSI, перезапустить, вставить MOSI и все заработает. Но вот не пойму как это влияет и как это реализовать прогррамно правильно. Собственно не пойму где затык, я SPI перед стартом конфигурю, но это же конфигурится Атмега. Quote А после снятия и подачи питания? После сброса питания не работает. Стоит после включения вынуть MOSI, нажать сброс процессора, вставить MOSI и все начинает работать. И если я включаю, вынимаю MOSI сбрасываю, программа не выполняя InitAD7714(); переходит в цикл и потом отдает мне результат оцифровки с непонятно какими настройками. Но блин почему тогда милливольты сходятся ? Изменено 25 января, 2022 пользователем Zx80 Ответ на вопрос А после снятия и подачи питания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zx80 0 25 января, 2022 Опубликовано 25 января, 2022 · Жалоба 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 */ } Включаю, работает, сбрасываю - работает. Без инициализации Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zx80 0 25 января, 2022 Опубликовано 25 января, 2022 (изменено) · Жалоба Собственно не работает потому что пропадают импульсы DRDY, как только я ее инициализирую Изменено 25 января, 2022 пользователем Zx80 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 6 25 января, 2022 Опубликовано 25 января, 2022 · Жалоба Что-то у Вас там загадки сплошные. Надо код перетрахивать... Попробуйте найти в функции инициализации строку/строки, ответственную за это, путём последовательного исключения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zx80 0 26 января, 2022 Опубликовано 26 января, 2022 · Жалоба 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); } Советуете записать для теста только один регистр ? Пробовал, повторю сообщю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться