AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
26.02.2014, 13:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
ATmega16 + SPI + AD7705
Добрый день. Есть даташит, и несколько кодов на Си с примерами. Не могу всё увязать в голове. Хочу AD7705 связать с микрухой. Помогите с ней разобраться. Вот что имею:
PHP код:
|
//CS - PORTA.0
// DRDY - PORT_A.1
//RESET - PORTA.2
#define SET_BIT(A,B) A|=(1‹‹B); // //PINC.5
#define CLEAR_BIT(A,B) A&=~(1‹‹B);
#define BIT(n) (1‹‹n)
void InitSPI(void)
{
// setup SPI I/O pins
SET_BIT(PORTB, 7); // set SCK hi
SET_BIT(DDRB, 7); // set SCK as output
CLEAR_BIT(DDRB, 6); // set MISO as input
SET_BIT(DDRB, 5); // set MOSI as output
SET_BIT(DDRB, 4); // SS must be output for Master mode to work
//SPE – включает/выключает модуль SPI. Если бит установлен в 1, модуль SPI включен.
//MSTR – определяет режим работы микроконтроллера. Если бит установлен в 1, микроконтроллер работает в режиме Master (ведущий). Если бит сброшен – в режиме Slave (ведомый). Обычно микроконтроллер работает в режиме master.
//SPR1 и SPR0 – определяют частоту тактового сигнала SPI модуля, то есть скорость обмена. Максимально возможная скорость обмена всегда указывается в спецификации периферийного устройства.
//2457.6 kHz / 16
SPCR = BIT(SPE)|BIT(MSTR)|BIT(SPR0);//16
}
#define EnADC CLEAR_BIT(PORTA,0) //CS притягиваем к земле
#define DisADC SET_BIT(PORTA,0) //CS отпускаем от земли
#define ResetAdc CLEAR_BIT(PORTA,2);delay(10);SET_BIT(PORTA,2) // выполняем RESET AD7705
void AdcWr(unsigned char d)
{
SPDR = d;
/*
SPIF – флаг прерывания от SPI. Он устанавливается в 1 по окончании передачи байта данных.
Если разрешены прерывания модуля, одновременно с установкой этого флага генерируется прерывание от SPI.
Также этот флаг устанавливается в 1 при переводе микроконтроллера из режима master в режим slave с помощью вывода SS.
Сброс флага происходит аппаратно, при вызове подпрограммы обработки прерывания или после
чтения регистра SPSR с последующим обращением к регистру данных SPDR.
*/
while(!(SPSR&BIT(SPIF)));
}
void InitAdc(void)
{
InitSPI();
ResetAdc;
EnADC;
AdcWr(0x21); // 0010 0001 - Active Channel is Ain2(+)/Ain2(−), next operation as write to the clock register
AdcWr(0x4); // 0000 0100 - //master clock enabled, 2.4576MHz Clock, set output rate to 20Hz
AdcWr(0x10); // 0001 0000 - Active Channel is Ain1(+)/Ain1(−), next operation as write to the setup register
AdcWr(0b0011 1110); // 0011 1110 - normal mode, 128 scale, unipolar,BUFFER ON, FSYNC off
//while(PIND&4);
//DisADC;
//GICR |= BIT(INT0);
//MCUCR |= BIT(ISC01);
}
|
С SPI не работал, но микрухи связывал по примерам распространенным в интернете. Помогите дописать код. Пишу в Атмел Студио 6. В даташите(AD7705) не понял на странице 36 не понял пример на Си.Инициализацию вроде правильно написал, а как дальше считывать не понял...
Последний раз редактировалось miwutka; 26.02.2014 в 14:10.
|
|
|
|
27.02.2014, 15:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: ATmega16 + SPI + AD7705
админ, думаю тему можно удалять... Тут походу с этим никто не шуршал
|
|
|
|
04.03.2014, 23:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,784
Сказал спасибо: 2,911
Сказали Спасибо 3,118 раз(а) в 2,109 сообщении(ях)
|
Re: ATmega16 + SPI + AD7705
|
|
|
|
04.03.2014, 23:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: ATmega16 + SPI + AD7705
Спасибо. На днях попробую. отпишусь.
|
|
|
|
08.03.2014, 13:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: ATmega16 + SPI + AD7705
ForcePoint, спасибо, всё заработало после прочтения статьи на форуме. правильно инициировал СПИ и сигнал DRDY пришлось отключить от МК. У меня такая функция while ((PORTB&0x01)==1) - на порте 1 жду готовности АЦП. Там сигнал инверсный, я в них путаюсь. Может надо на 0 проверять? Подскажите что б уже всё корректно работало.
|
|
|
|
08.03.2014, 14:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,784
Сказал спасибо: 2,911
Сказали Спасибо 3,118 раз(а) в 2,109 сообщении(ях)
|
Re: ATmega16 + SPI + AD7705
Сообщение от miwutka
|
ForcePoint, ... Подскажите что б уже всё корректно работало.
|
Не подскажу, сам не работал с этом АЦП.
|
|
|
|
26.03.2014, 13:56
|
|
Гражданин KAZUS.RU
Регистрация: 26.12.2005
Сообщений: 586
Сказал спасибо: 23
Сказали Спасибо 68 раз(а) в 45 сообщении(ях)
|
Re: ATmega16 + SPI + AD7705
Сообщение от miwutka
|
Подскажите что б уже всё корректно работало.
|
Вот вырезал из своего проекта. Пишу в ИАР
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:52.
|
|