Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение FireProoF »

Всем привет. На stm32f3-discovery АЦП имеют верхний предел в 3,3В, а нужно измерять 5В. Можно ли применить преобразователь логических уровней?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Аlex »

Что Вы имеете в виду под фразой "преобразователь логических уровней" ? Если это обычный резистивный делитель, то можно.
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение FireProoF »

Про делитель я спрашивал уже у того, кто мне эту задачку задал) Мне сказали, что сопротивление самого датчика внесёт погрешность (как я понял, постоянную) и почему-то такая схема не будет работать на "больших" частотах (до 1кГц).
Предложили собрать схему на ОУ. Пока есть время, хочу поискать готовые решения.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Аlex »

Если для датчика нужен высокоимпедансный вход, то решение с ОУ самое правильное.
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение FireProoF »

Есть такой вот датчик и stm32f3d.
Я просто не понял про высокоимпедансный вход. Это, типо, точный АЦП?)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Аlex »

FireProoF писал(а):Я просто не понял про высокоимпедансный вход.

Всё просто - https://www.yandex.ru/yandsearch?clid=9 ... 63204370.1
:)
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Jack_A »

Немножко уводящая в сторону ссылка. Z - состояние имеет смысл для логических выходов. В данном случае, как я понял, речь идет об АЦП. И для него высокий импеданс - в переводе на рабоче-крестьянский язык - это просто высокое входное сопротивление АЦП, не нагружающее нижнее плечо делителя и не искажающее таким образом коэффициент передачи. Частотные свойства останутся приемлемыми, если не сильно задирать номиналы резисторов делителя, да и подкорректировать их можно емкостью, как делают, к примеру, в выносных делителях осциллов.
Конечно, если вход многофункциональный, логическую часть его следует перевести в Z - состояние, чтоб не мешала.
Изображение
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Аlex »

Да, затупил немного, прошу прощения :oops:
Конечно же, я имел в виду - высокой входное сопротивление.

ПыСы. До сегодняшнего дня, я думал, что высокоимпедансное - это с высоким сопротивлением. А оказывается, это Z-состояние :facepalm:
креазот
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср фев 04, 2015 21:08:59

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 тянуть напряжение питания?
микрокотроллера у меня еще нет на руках
Вложения
nnnnvvvv.png
(102.42 КБ) 382 скачивания
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25150
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение КРАМ »

Питание и земли ОБЯЗАТЕЛЬНО подводить ко всем выводам питания и земли.
Эти выводы делают для разгрузки внутренних шин.
На вход аналогового питания подают либо само питание, либо его же, но через фильтр.
Аналоговую землю соединяют с цифровой землей в районе самого этого пина, но тонким проводником. При этом все аналоговые земли соединяют именно с аналоговой землей контроллера. Таким образом образуется ДВЕ земли. Чистая и грязная.
креазот
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср фев 04, 2015 21:08:59

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение креазот »

КРАМ, спасибо за развернутый ответ. интересно
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение FireProoF »

Всем привет. Кто-нибудь может портировать участок кода, отвечающий за запуск SPI на stm32f1 на stm32f3?
Спойлер

Код: Выделить всё

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: Мелкие вопросы по МК и ПЛИС.

Сообщение Studentos »

Здравствуйте, вопрос новичка. В цикле чтения при обмене данными в шине микропроцессорной системы присутствуют такие вещи как sync, din, rply. Что это, отдельные разряды шины и для чего ?
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение FireProoF »

Всем привет. К stm32 подключено несколько датчиков. Данные записываются как только проходит цикл опроса. Так вот некоторые датчики опрашиваются не всегда, поэтому частота опроса разная. Вопрос: можно ли использовать счётчик таймера для выставления отметок времени в логе?
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Jack_A »

Studentos писал(а): В цикле чтения при обмене данными в шине микропроцессорной системы присутствуют такие вещи как sync, din, rply. Что это, отдельные разряды шины и для чего ?

Я понимаю, тема секретная, :) но хоть намеком - что за шина, что за микропр. система ?
Изображение
hostmit
Родился
Сообщения: 2
Зарегистрирован: Сб июл 25, 2015 09:44:18

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение hostmit »

Ребят, подскажите чем можно прошить MBM29F800BA-70PFTN? Флешка на одном девайсе.
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение service47 »

В 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.
Как настроить протеус, чтобы частота совпадала с частотой прошивки?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ARV »

CKSEL Fuses = Ext.Crystal High Freq.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение service47 »

Теперь светодиод мигает вместо через 14 сек. (как было при CKSEL Fuses = (0001) Int. RC 1MHz), после функции delay_ms(500);, а через 2 сек. ATmega настроена на 14МГц.
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение service47 »

Есть подпрограмма для шины 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;
Спойлер

Код: Выделить всё

//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;
}





Ответить

Вернуться в «Разные вопросы по МК»