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

Zx80

Участник
  • Постов

    128
  • Зарегистрирован

  • Посещение

Весь контент Zx80


  1. Собственно не работает потому что пропадают импульсы DRDY, как только я ее инициализирую
  2. 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 */ } Включаю, работает, сбрасываю - работает. Без инициализации
  3. На сегодня есть детали, но как это устранить пока не соображу. Заметил что когда я шью, я вынимаю MOSI и MISO из разъема. Так вот если вынуть MOSI и MISO из разъема и сбросить, а потом вставить все запускается в полном объеме. Потом обнаружил что достаточно MISO оставить, выдергнуть MOSI, перезапустить, вставить MOSI и все заработает. Но вот не пойму как это влияет и как это реализовать прогррамно правильно. Собственно не пойму где затык, я SPI перед стартом конфигурю, но это же конфигурится Атмега. После сброса питания не работает. Стоит после включения вынуть MOSI, нажать сброс процессора, вставить MOSI и все начинает работать. И если я включаю, вынимаю MOSI сбрасываю, программа не выполняя InitAD7714(); переходит в цикл и потом отдает мне результат оцифровки с непонятно какими настройками. Но блин почему тогда милливольты сходятся ?
  4. Новый этап, и старый затык. Еще на этапе разбирательства заметил такой глюк. Если я зашиваю программу в Атмегу, все работает, уже даже меряет. Но вот нажимаю сброс и мерять перестает. Кто подскажет куда идти рыть ? Спрашивается чем отличается сброс и дальнейший старт от старта после того как я программу зашил. Программа же одна и та же, старт вроде как ничем не отличается, но тем не менее измерять после рестарта перестает ?
  5. Таки разобрался. Кому интересно смотри отличия. 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); } }
  6. Сейчас положил на датчик телефон. Показыает V = 000 000 032 Пересчитываю, натикало - 8192. По расчету Uвх=1.2мВ. Лезу меряю, да 1.2мВ. Вот и вопрос про порядок байтов. Или где я бажу ? При разгруженном датчике V = 000 000 008 По расчету Uвх = 0.3 мВ лезу меряю 0.5 мВ. И потом я когда датчик нагружаю я же вижу как растут значения байт. Не, откуда там отрицательное если еще расчет сходится ? Да вопрос собственно в порядке байт, почему считываю младший, старший, средний ?
  7. Вот расчет, датчик загружен, на входах 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мВ на датчике. Но вот почему у меня такая путаница с байтами ?
  8. Вот смотрите, мой текст программы 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 );) это средний байт. Подскажите где собака порылась ?
  9. У меня два чипа 7714. Один из них на выходе ничего не дает(кучу времени убил), на втором есть. Подскажите, как читать данные - в смысле какой из байтов выталкивается первым (старший, младший)?
  10. Atmega16, где у меня отписано, про несколько SPI ? SPI по сути сдвиговый регистр. Три байта команды - они же три синхронизации. Четверый байт синхронизации присутствует. Конечно сброс присутствует. Ну конечно все проверено, тем более если смотрели осцилограмма на DOUT есть, но странная.
  11. Привет. Давайте так, у меня два топика - ацп и оу. В теме про ацп, обсуждаем ацп, в теме про оу обсуждаем оу. Не влазит слон в рот, давайте его есть по кускам. Я так и начал. Привел инициализацию старшей части фильтра и попытку ее считать. 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 показываю, что вижу такты на эти команды. На выводе DOUT вижу ноль, с некоторым различием при смене экземпляра чипа. Всего одна команда, всего одно считывание. Подскажете мою ошибку.
  12. Извините, а как мне реагировать на первую часть этой фразы повторяемой с не виданным упорством. Я же ответил, задание мне сделать именно на AD7714. Что не понятного, зачем тогда такой ответ? Про сброс разговора не было, сброс у меня организован. Я сократил поле до записи одной команды, и ее чтения, в ответ в 50й раз у вас чип не такой. Что ж это за помощь(совет) ?
  13. Plain, ваши ответы всегда напоминают ответы продавцов, "покупайте что мы привезли, никого не волнует то что вам надо"
  14. Привет. Я в ступоре. Раз не работает решил записать одну команду и ее же прочитать. На SCK вижу такты для каждого из четырех комманд. На DIN вжу данные четырех комманд. на DOUT вижу ноль. Ау помогите. spiWrite(0x24); /* команда установить канал AIN1-AIN2. И передать данные в старшую часть фильтра. spiWrite(0xAA); /* данные для старшей части фильтра spiWrite(0x2C); /* прочитать данные из старшей части фильтра spiWrite(0xAA); /* байт толкатель для генерации SCK поменял чип и увидел на DOUT эт че получается чип паленый. Я не палил. А что это за шум перед переходом в ноль ? Случайно этот выход не открытый коллектор ?
  15. 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, но ничего там не вижу. Подскажите ?
  16. Нашел у себя ошибку. Я должен читать по коменде 0х5С а не по 0х5F. Возвращаемое значение изменилось. Но все равно возвращается один байт.
  17. ну ка найдите здесь установку номера канала
  18. я выше показал как я выбираю канал согласно таблиц, если я не прав, покажите, поправьте
  19. Великолепно. Вы написали тоже, что и я. Посмотрите, у меня три обращения к коммуникационному регистру коде. Красный обращение к коммуникационному регистру, синий - вторая посылка, пишем данные
  20. Не представляю как Вам дать такую диаграмму. Осцилограф двулучевой. Скажу только что CS = 0 у меня завсегда. А насчет канала. spi(0x24); коммуникационный регистр. 0х24 = 00100100 У меня 4 - 100 Пишу в старшую часть регистра фильта. Это в примере 0х27 00100111, тут да 111
  21. Вот не пойму с каким периодом он должен возвращать вывод DRDY в 1 ? Т.е сколько раз в секунду он обновляет значение, чем это определяется ? Последовательность на DRDY fCLKÊIN = 2.4576MHz Period = 1/fCLKÊIN = 4.07мкс. Если я не читаю чип он должен сам на 500 циклов т.е.(4.07мкс*500=0.2мс) возвращать вывод DRDY в 1. Ну да те 9 клеток по 20мкс те 500 циклов = 0.18мс Добавил команду считывания регистра данных. 0х5F. Вижу что выдает такты на 8 бит. Данные на DOUT соответствующие тактам SCK Почему вы решили что 7канал ? Я по даташиту настраивал и настраивал AIN1-AIN2 дифференц вход.
  22. Подскажите как должено быть видно на осцилографе возвращаемые с АЦП данные. Там же 24бита, это три байта. Возврат данных сказано начинается после спадающего фронта DRDY по команде 0х5F. Событию падения DRDY вызывает прерывание, в нем посылаю 0х5F, становлюсь на DOUT. Что то возвращает, но по виду это один байт. Посылал 0х5F 0х5F 0х5F получал три копии одного и того же байта. И вот еще не пойму, на верхней осцилограмме ноль на DRDY занимает 99% времени, это как данные доступны 99% времени ?
  23. инициализация spi(0x24); /* set the channel AIN1-AIN2 and set the next operation as write to the filter high */ spi(0x4F); /* set Bipolar mode, 24 bits, boost off, all 4 MSBs of filterword to 1 */ spi(0x34); /* set the next operation as a write to the filter low register channel AIN1/AIN2 */ spi(0xA0); /* max filter word allowed for low part of the filterword */ spi(0x14); /* set the operation as a write to the mode register */ spi(0x20); /* set gain to 1, burnout current off, no filter sync, and do a self calibration вкл питания, сброс, инициализация. Я не читаю. По идее должен видеть ноль пока не опрошу данные, а в итоге (импульс послед) вероятно возбуждение. При чем при сбросах иногда вижу устойчивый ноль (данные готовы). Че у меня не так ?
  24. Привет. Подключил по даташиту AD7714. Привожу скриншоты осцилограмм на DRDY. Вижу что цифрует, но не могу по даташиту определить правильные ли длительности. Подскажите плиз как разобраться.
  25. Вот фраза из моего поста. Тут четко поставлен вопрос
×
×
  • Создать...