Мелкие вопросы по МК и ПЛИС.
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Мелкие вопросы по МК и ПЛИС.
Всем привет. На stm32f3-discovery АЦП имеют верхний предел в 3,3В, а нужно измерять 5В. Можно ли применить преобразователь логических уровней?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Что Вы имеете в виду под фразой "преобразователь логических уровней" ? Если это обычный резистивный делитель, то можно.
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Мелкие вопросы по МК и ПЛИС.
Про делитель я спрашивал уже у того, кто мне эту задачку задал) Мне сказали, что сопротивление самого датчика внесёт погрешность (как я понял, постоянную) и почему-то такая схема не будет работать на "больших" частотах (до 1кГц).
Предложили собрать схему на ОУ. Пока есть время, хочу поискать готовые решения.
Предложили собрать схему на ОУ. Пока есть время, хочу поискать готовые решения.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Если для датчика нужен высокоимпедансный вход, то решение с ОУ самое правильное.
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Мелкие вопросы по МК и ПЛИС.
Есть такой вот датчик и stm32f3d.
Я просто не понял про высокоимпедансный вход. Это, типо, точный АЦП?)
Я просто не понял про высокоимпедансный вход. Это, типо, точный АЦП?)
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
FireProoF писал(а):Я просто не понял про высокоимпедансный вход.
Всё просто - https://www.yandex.ru/yandsearch?clid=9 ... 63204370.1
Re: Мелкие вопросы по МК и ПЛИС.
Немножко уводящая в сторону ссылка. Z - состояние имеет смысл для логических выходов. В данном случае, как я понял, речь идет об АЦП. И для него высокий импеданс - в переводе на рабоче-крестьянский язык - это просто высокое входное сопротивление АЦП, не нагружающее нижнее плечо делителя и не искажающее таким образом коэффициент передачи. Частотные свойства останутся приемлемыми, если не сильно задирать номиналы резисторов делителя, да и подкорректировать их можно емкостью, как делают, к примеру, в выносных делителях осциллов.
Конечно, если вход многофункциональный, логическую часть его следует перевести в Z - состояние, чтоб не мешала.
Конечно, если вход многофункциональный, логическую часть его следует перевести в Z - состояние, чтоб не мешала.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Да, затупил немного, прошу прощения
Конечно же, я имел в виду - высокой входное сопротивление.
ПыСы. До сегодняшнего дня, я думал, что высокоимпедансное - это с высоким сопротивлением. А оказывается, это Z-состояние
Конечно же, я имел в виду - высокой входное сопротивление.
ПыСы. До сегодняшнего дня, я думал, что высокоимпедансное - это с высоким сопротивлением. А оказывается, это Z-состояние

Re: Мелкие вопросы по МК и ПЛИС.
привет
микроконтроллер ATmega64A
правильно ли я понимаю что на вывод AVCC подается +5В напряжения питания?
вот из даташита:
AV CC is the supply voltage pin for Port F and the A/D Converter. It should be externally connected to V CC ,
even if the ADC is not used. If the ADC is used, it should be connected to V CC through a low-pass filter
и еще вопрос, нужно ко всем выводам питания которые обозначены на рисунке подводить напряжение питания? или можно только к одному выводу GND подвести минус, и к одному VCC плюс? или ко всем GND и VCC тянуть напряжение питания?
микрокотроллера у меня еще нет на руках
микроконтроллер ATmega64A
правильно ли я понимаю что на вывод AVCC подается +5В напряжения питания?
вот из даташита:
AV CC is the supply voltage pin for Port F and the A/D Converter. It should be externally connected to V CC ,
even if the ADC is not used. If the ADC is used, it should be connected to V CC through a low-pass filter
и еще вопрос, нужно ко всем выводам питания которые обозначены на рисунке подводить напряжение питания? или можно только к одному выводу GND подвести минус, и к одному VCC плюс? или ко всем GND и VCC тянуть напряжение питания?
микрокотроллера у меня еще нет на руках
- Вложения
-
- nnnnvvvv.png
- (102.42 КБ) 382 скачивания
- КРАМ
- Друг Кота
- Сообщения: 25150
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Мелкие вопросы по МК и ПЛИС.
Питание и земли ОБЯЗАТЕЛЬНО подводить ко всем выводам питания и земли.
Эти выводы делают для разгрузки внутренних шин.
На вход аналогового питания подают либо само питание, либо его же, но через фильтр.
Аналоговую землю соединяют с цифровой землей в районе самого этого пина, но тонким проводником. При этом все аналоговые земли соединяют именно с аналоговой землей контроллера. Таким образом образуется ДВЕ земли. Чистая и грязная.
Эти выводы делают для разгрузки внутренних шин.
На вход аналогового питания подают либо само питание, либо его же, но через фильтр.
Аналоговую землю соединяют с цифровой землей в районе самого этого пина, но тонким проводником. При этом все аналоговые земли соединяют именно с аналоговой землей контроллера. Таким образом образуется ДВЕ земли. Чистая и грязная.
Re: Мелкие вопросы по МК и ПЛИС.
КРАМ, спасибо за развернутый ответ. интересно
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Мелкие вопросы по МК и ПЛИС.
Всем привет. Кто-нибудь может портировать участок кода, отвечающий за запуск SPI на stm32f1 на stm32f3?
А то я уже 500й раз ищу баг, и глаза уже замылились.
Переписал вот так:
Но CS при передаче не дергается(
Спойлер
Код: Выделить всё
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;//включить тактирование альтернативных функций
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;//включить тактирование порта А
//вывод управления SS: выход двухтактный, общего назначения,50MHz
GPIOA->CRL |= GPIO_CRL_MODE4; //
GPIOA->CRL &= ~GPIO_CRL_CNF4; //
GPIOA->BSRR = GPIO_BSRR_BS4; //
//вывод SCK: выход двухтактный, альтернативная функция, 50MHz
GPIOA->CRL |= GPIO_CRL_MODE5; //
GPIOA->CRL &= ~GPIO_CRL_CNF5; //
GPIOA->CRL |= GPIO_CRL_CNF5_1; //
//вывод MISO: вход цифровой с подтягивающим резистором, подтяжка к плюсу
GPIOA->CRL &= ~GPIO_CRL_MODE6; //
GPIOA->CRL &= ~GPIO_CRL_CNF6; //
GPIOA->CRL |= GPIO_CRL_CNF6_1; //
GPIOA->BSRR = GPIO_BSRR_BS6; //
//вывод MOSI: выход двухтактный, альтернативная функция, 50MHz
GPIOA->CRL |= GPIO_CRL_MODE7; //
GPIOA->CRL &= ~GPIO_CRL_CNF7; //
GPIOA->CRL |= GPIO_CRL_CNF7_1; //
//настроить модуль SPI
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //подать тактирование
SPI1->CR2 = 0x0000; //
SPI1->CR1 = SPI_CR1_MSTR; //контроллер должен быть мастером,конечно
SPI1->CR1 |= SPI_CR1_BR_0; //для начала зададим маленькую скорость
SPI1->CR1 |= SPI_CR1_SSI;
SPI1->CR1 |= SPI_CR1_SSM;
SPI1->CR1 |= SPI_CR1_SPE; //разрешить работу модуля SPIА то я уже 500й раз ищу баг, и глаза уже замылились.
Переписал вот так:
Спойлер
Код: Выделить всё
GPIO_InitTypeDef gpio;
SPI_InitTypeDef spi;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
//GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_5);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_5);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_5);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_5);/**/
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_Pin = /*GPIO_Pin_12 | */GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;//GPIO_PuPd_DOWN;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &gpio);
gpio.GPIO_Mode = GPIO_Mode_OUT;
gpio.GPIO_Pin = GPIO_Pin_12;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_PuPd = GPIO_PuPd_DOWN;//GPIO_PuPd_DOWN;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &gpio);
SPI_I2S_DeInit(SPI2);
spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi.SPI_DataSize = SPI_DataSize_8b;
spi.SPI_CPOL = SPI_CPOL_Low;
spi.SPI_CPHA = SPI_CPHA_1Edge;
spi.SPI_NSS = SPI_NSS_Soft;
spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
spi.SPI_FirstBit = SPI_FirstBit_MSB;
spi.SPI_CRCPolynomial = 7;
spi.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI2, &spi);
/* Configure the RX FIFO Threshold */
SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_QF);
SPI_Cmd(SPI2, ENABLE);Но CS при передаче не дергается(
- Studentos
- Первый раз сказал Мяу!
- Сообщения: 29
- Зарегистрирован: Пт апр 15, 2016 20:41:44
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Здравствуйте, вопрос новичка. В цикле чтения при обмене данными в шине микропроцессорной системы присутствуют такие вещи как sync, din, rply. Что это, отдельные разряды шины и для чего ?
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Мелкие вопросы по МК и ПЛИС.
Всем привет. К stm32 подключено несколько датчиков. Данные записываются как только проходит цикл опроса. Так вот некоторые датчики опрашиваются не всегда, поэтому частота опроса разная. Вопрос: можно ли использовать счётчик таймера для выставления отметок времени в логе?
Re: Мелкие вопросы по МК и ПЛИС.
Studentos писал(а): В цикле чтения при обмене данными в шине микропроцессорной системы присутствуют такие вещи как sync, din, rply. Что это, отдельные разряды шины и для чего ?
Я понимаю, тема секретная,
Re: Мелкие вопросы по МК и ПЛИС.
Ребят, подскажите чем можно прошить MBM29F800BA-70PFTN? Флешка на одном девайсе.
Re: Мелкие вопросы по МК и ПЛИС.
В Proteuse неправильно задается рабочая частота AVR. В файле прошивки задана частота 14МГц для ATmega16A, остальные настройки фабричные, схема для проверки работоспособности мигания светодиодом. В свойствах ATmega16 выставляю:
CKOPT = (1) Unprogrammed
BOOTRST = (1) Unprogrammed
CKSEL Fuses = (0001) Int. RC 1MHz
Boot Loader Size = (00) 1024 words
SUT Fuses = (10)
Clock Frequency = 14000000
В программе светодиод мигает каждые 500мс, соответственно через каждые 500мс сбрасывается WDT, в протеусе же выдает ресет ATmega каждые 2 с лишним секунды, так и настроен WDT.
Как настроить протеус, чтобы частота совпадала с частотой прошивки?
CKOPT = (1) Unprogrammed
BOOTRST = (1) Unprogrammed
CKSEL Fuses = (0001) Int. RC 1MHz
Boot Loader Size = (00) 1024 words
SUT Fuses = (10)
Clock Frequency = 14000000
В программе светодиод мигает каждые 500мс, соответственно через каждые 500мс сбрасывается WDT, в протеусе же выдает ресет ATmega каждые 2 с лишним секунды, так и настроен WDT.
Как настроить протеус, чтобы частота совпадала с частотой прошивки?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
CKSEL Fuses = Ext.Crystal High Freq.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Мелкие вопросы по МК и ПЛИС.
Теперь светодиод мигает вместо через 14 сек. (как было при CKSEL Fuses = (0001) Int. RC 1MHz), после функции delay_ms(500);, а через 2 сек. ATmega настроена на 14МГц.
Re: Мелкие вопросы по МК и ПЛИС.
Есть подпрограмма для шины I2C, как сделать, чтобы от мастера (ATmega64) пересылались несколько переменных на slave (ATmega16).
// TWI ATmega64
TWAR=0x0E;
TWBR=0x3E; //dec=3E для Fclk=14MHz; TWBR=((F_cpu/F_scl)-16)/(2*4^TWPS) => TWBR=((14000000/100000)-16)/(2*4^0)=62
TWCR=0x04;
//TWSR=0x00; //TWPS1=0, TWPS0=0
//TWDR=0x00;
// TWI ATmega16
TWAR=0x0E;
TWBR=0x3E;
TWCR=0x05;
//TWSR=0x00; //TWPS1=0, TWPS0=0
//TWDR=0x00;
// TWI ATmega64
TWAR=0x0E;
TWBR=0x3E; //dec=3E для Fclk=14MHz; TWBR=((F_cpu/F_scl)-16)/(2*4^TWPS) => TWBR=((14000000/100000)-16)/(2*4^0)=62
TWCR=0x04;
//TWSR=0x00; //TWPS1=0, TWPS0=0
//TWDR=0x00;
// TWI ATmega16
TWAR=0x0E;
TWBR=0x3E;
TWCR=0x05;
//TWSR=0x00; //TWPS1=0, TWPS0=0
//TWDR=0x00;
Спойлер
Код: Выделить всё
//ATmega64 pins
/*******************************************************************************************
* Подпрограммы управления шиной I2C *
*
*******************************************************************************************/
/*******************************************************************************************
* Объявление констант и включения заголовочных файлов для системы TWI *
*
*******************************************************************************************/
#define SDA_PORT PORTD_Bit1
#define SCL_PORT PORTD_Bit0
#define SDA_PIN PIND_Bit1
#define SCL_PIN PIND_Bit0
#define SDA_DDR DDRD_Bit1
#define SCL_DDR DDRD_Bit0
//Инициализация программной шины I2C
void i2c_init_soft(void)
{
SDA_DDR=0; //изначально линии SDA
SCL_DDR=0; //и SCL в высокоимпедансном состоянии
SDA_PORT=0; //и на них поддерживается за счет внешних резисторов
SCL_PORT=0; //высокий уровень
while (SDA_PIN==0)
{
counter_twi++;
if (counter_twi>=1000)
{
asm("wdr");
counter_twi=0;
break;
}
}
}
//Возвращает уровень линии SDA
unsigned char in_sda(void)
{
if(SDA_PIN==1)
return 1;
else
return 0;
}
//Устанавливает линию SDA на вход или выход
void sda_io(unsigned char io_c)
{
if(io_c)
SDA_DDR=1;
else
SDA_DDR=0;
}
//Устанавливает уровень на линии SCL
void scl_set(unsigned char set_c)
{
if(set_c)
{
SCL_PORT=1;
}
else
{
SCL_PORT=0;
}
}
//Устанавливает уровень на линии SDA
void sda_set(unsigned char set_c)
{
if(set_c)
{
SDA_PORT=1;
}
else
{
SDA_PORT=0;
}
}
//Задержка
void i2c_delay(void)
{
delay_us(10);
}
//Формирует условие "СТАРТ"
void i2c_start_soft(void)
{
sda_io(0);
while (SDA_PIN==0)
{
counter_twi++;
if (counter_twi>=100000)
{
counter_twi=0;
break;
}
}
SCL_DDR=1;
sda_io(1);
sda_set(1);i2c_delay();
scl_set(1);i2c_delay();
sda_set(0);i2c_delay();
scl_set(0);i2c_delay();
delay_us(20);
}
//Формирует условие "СТОП"
void i2c_stop_soft(void)
{
sda_io(1);
scl_set(0);i2c_delay();
sda_set(0);i2c_delay();
scl_set(1);i2c_delay();
sda_set(1);i2c_delay();
sda_io(0);
delay_us(20);
}
//Посылка байта
char i2c_tx_soft(unsigned char byte)//write
{
char tx_ok;
sda_io(1);
for(unsigned char i=0;i<8;i++)
{
if(byte&0x80)
{
sda_set(1);i2c_delay();
}
else
{
sda_set(0);i2c_delay();
}
scl_set(1);i2c_delay();
scl_set(0);i2c_delay();
byte<<=1;
}
sda_io(0);i2c_delay();
scl_set(1);i2c_delay();
if (SDA_PIN==0)
tx_ok=1;
else
tx_ok=0;
scl_set(0);i2c_delay();i2c_delay();i2c_delay();
return tx_ok;
}
//Прием байта, если last_byte=0, то принимаем последний байт и подтверждение от мастера не нужно
unsigned char i2c_rx_soft(unsigned char last_byte)//read
{
unsigned char data=0;
unsigned char mask=0x80;
sda_io(0);
for(unsigned char i=0;i<8;i++)
{
scl_set(1);i2c_delay();
if(in_sda())
data=data+mask;
mask>>=1;i2c_delay();
scl_set(0);i2c_delay();
}
sda_io(1);i2c_delay();
if(last_byte)
{
sda_set(0);i2c_delay();
}
else
{
sda_set(1);i2c_delay();
}
scl_set(1);i2c_delay();
scl_set(0);i2c_delay();
return data;
}
