Программирование STM8

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Мучитель микросхем
Сообщения: 418
Зарегистрирован: Вс апр 17, 2011 09:51:26
Откуда: Тула

Сообщение kvn234 »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=4168530#p4168530"]
kvn234 писал(а):Насчет 2мс не читал. В основном пишут в районе секунды.
Надо на DS ориентироваться, это значение сильно плавает от температуры камня.

Добавлено after 1 minute 19 seconds:
kvn234 писал(а):Я уже укоротил, стало получше.
Может все-таки проблема в схеме тоды?[/uquote]
Схемы как таковой нет. STM8L в панельки и подключен к ST_Link и через модуль ft232 к USB.

Просто хотел протестировать ADC.

Вопросы снимаю. Меня ADC STM8L не устраивает.

Для я уменьшения пульсаций и повышения стабильности измерений буду делать выносной модуль с ADC и DAC со связью по I2C.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 373
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

Одно время тоже ковырялся с АЦП на STM8L151C8
максимум что мне удалось добиться:
Спойлер

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

17:13:37.795 -> adc value: 2947
17:13:48.386 -> adc value: 2949
17:13:58.950 -> adc value: 2947
17:14:09.537 -> adc value: 2947
17:14:20.111 -> adc value: 2946
17:14:30.697 -> adc value: 2949
17:14:41.267 -> adc value: 2947
17:14:51.853 -> adc value: 2947
17:15:02.423 -> adc value: 2945
17:15:13.015 -> adc value: 2949
17:15:23.587 -> adc value: 2947
17:15:34.165 -> adc value: 2947
17:15:44.741 -> adc value: 2947
17:15:55.323 -> adc value: 2947
17:16:05.898 -> adc value: 2943
17:16:16.482 -> adc value: 2946
17:16:27.022 -> adc value: 2947
17:16:37.601 -> adc value: 2946
17:16:48.204 -> adc value: 2947
17:16:58.760 -> adc value: 2953
17:17:09.345 -> adc value: 2949
17:17:19.914 -> adc value: 2947
17:17:30.466 -> adc value: 2947
17:17:41.059 -> adc value: 2945
17:17:51.606 -> adc value: 2945
17:18:02.178 -> adc value: 2946
17:18:12.766 -> adc value: 2948
17:18:23.338 -> adc value: 2945
17:18:33.922 -> adc value: 2947
17:18:44.496 -> adc value: 2947
17:18:55.049 -> adc value: 2943
17:19:05.621 -> adc value: 2947
17:19:16.205 -> adc value: 2949
17:19:26.775 -> adc value: 2949
17:19:37.352 -> adc value: 2945
17:19:47.919 -> adc value: 2947
здесь SYSCLK=2MHz, используется одиночное преобразование, которое выполняется в WAIT режиме. Из периферии включено только АЦП, РТС, парочка UART'ов.
Питалово от МК. Думаю, что если бы сделал нормальное питание аналоговой части, то результат был бы лучше
блок инициалтзации АЦП, если возникнут вопросы:

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

 79     //===== ADC Setup =============
 80     adc_value=0;
 81     ADC1_CR1=0x08;                     //  12-bit resolution. enable interrupt
 82     ADC1_CR2=0x87;                  // set PRESC = CLK/2, SMTP = 7 (384 Cycles)
 83     ADC1_CR3=0;                     // reset all flags
 84     ADC1_CR1 |= 0x01;               // set ADON, enable ADC
 85     ADC1_SQR1=0x80;                 // Disable DMA
 86     ADC1_SQR2=0;
 87     ADC1_SQR3=0;
 88     ADC1_SQR4=(1<<2);               // Select  Channel =2
 89     ADC1_TRIGR4=(1<<2);             // Diasable Schmitt Trigger for Channel =2
Реклама
Мучитель микросхем
Сообщения: 418
Зарегистрирован: Вс апр 17, 2011 09:51:26
Откуда: Тула

Сообщение kvn234 »

[uquote="JackSmith",url="/forum/viewtopic.php?p=4177733#p4177733"]здесь SYSCLK=2MHz, используется одиночное преобразование. Из периферии включено только АЦП, РТС, парочка UART'ов.
Питалово от МК. Думаю, что если бы сделал нормальное питание аналоговой части, то результат был бы лучше[/uquote]
Из периферии включено только АЦП и UART.
У меня цикл одной передачи несколько мс.

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

while (1)
{
buf_dma_adc [0] = GetChannel(ADC_Channel_0);
buf_dma_adc [0] = GetChannel(ADC_Channel_0);
buf_dma_adc [1] = GetChannel(ADC_Channel_1);
buf_dma_adc [2] = GetChannel(ADC_Channel_2);
buf_dma_adc [3] = GetChannel(ADC_Channel_4);
buf_dma_adc [4] = GetChannel(ADC_Channel_Vrefint);

out_usart();
}
Пробовал одиночное преобразование и в цикле через DMA.
Считывал 4 канала и ADC_Channel_Vrefint для контроля стабильности питания.
Как видно скачки ADCRef незначительные (что говорит о стабильности питания).
Четыре входа ADC0, ADC1, ADC2 и ADC4 соединены и подключены к батарейки.
При этом наблюдаю скачки и разные показания по каналам(см. таблица на 105 стр.).

Меня это не устраивает, буду использовать INA226, да и ресурсов у STM8 маловато.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

kvn234, в одном китайском "вольтметре" на STM8 я обнаружил интересное подключение: в качестве опоры они измеряли падение напряжения на диоде. Соответственно, на эту опору и корректировали измерения. У STM32 удобней: там внутренняя опора есть.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 373
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

[uquote="kvn234",url="/forum/viewtopic.php?p=4178101#p4178101"]да и ресурсов у STM8 маловато.[/uquote]
это не баг, это фича. L серия предназначена для устройств с автономным питанием, поэтому периферия там урезана по максимуму. сравните с MSP430 там вообще все очень по спартански. зато чипы работают от батарейки годами.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

А вот интересно: насколько больше STM32L жрет, чем STM8L? А то, может, ну их нафиг, эти восьмибитки?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 373
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4178230#p4178230"]А вот интересно: насколько больше STM32L жрет, чем STM8L?[/uquote]
я не думаю, что большая разница будет. у меня stm8l151 в active-halt режиме потреблял 2.3 мкА. по даташиту на STM32L151x6/8, потребление в Standby режиме с РТС - 1.1 мкА. Даже в два раза меньше ;)
Мучитель микросхем
Сообщения: 418
Зарегистрирован: Вс апр 17, 2011 09:51:26
Откуда: Тула

Сообщение kvn234 »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4178187#p4178187"]Соответственно, на эту опору и корректировали измерения.[/uquote]

Корректировка измерений это следующий этап.
Сейчас меня больше не устраивает нестабильность измерений и разница между каналами.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

kvn234, а напряжение питания при этом стабильно? Температура чипа невысокая?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Мучитель микросхем
Сообщения: 418
Зарегистрирован: Вс апр 17, 2011 09:51:26
Откуда: Тула

Сообщение kvn234 »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4178319#p4178319"]kvn234, а напряжение питания при этом стабильно? Температура чипа невысокая?[/uquote]
Температура комнатная.
Для измерения опорного напряжения ADC, оно же напряжения питания в каждом цикли вместе с измерением 4х внешних каналов измерялся канал ADC_Channel_Vrefint.
В дальнейшем предполагалось рассчитать напряжение питания(опорное) для данного цикла и входное напряжение по каждому каналу.
Я уже писал о стабильности измерений по каналу ADC_Channel_Vrefint (см. стр.105 колонка ADCRef), это говорит о стабильности питания.
Измерения и передача по USART циклическая, несколько десятков раз в секунду (точно не скажу, схему разобрал).

Я для передачи USART использовал кольцевой буфер и прерывание. Т.е. передача шла одновременно с измерениями по внешним каналам. Возможно это повлияло на нестабильность показаний.
Спойлер

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

while (1)
{
				
	buf_dma_adc [0] = GetChannel(ADC_Channel_0);
	buf_dma_adc [1] = GetChannel(ADC_Channel_1);
	buf_dma_adc [2] = GetChannel(ADC_Channel_2);
	buf_dma_adc [3] = GetChannel(ADC_Channel_4);
	buf_dma_adc [4] = GetChannel(ADC_Channel_Vrefint);
				
	out_usart();
}

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

void out_usart(void)
{
 uint8_t i;
 uint8_t crc=':';
 uart_putc((uint8_t)crc);        //начало
 uart_putc(13);crc+=13; //длина посылки (без CRC)
 uart_putc(1); crc+=1; //код посылки 
 for(i=0;i<5;i++)
  {
	uart_putc((uint8_t)buf_dma_adc[i]);        crc+=(uint8_t)buf_dma_adc[i];
	uart_putc((uint16_t)buf_dma_adc[i]>>8); crc+=((uint16_t)buf_dma_adc[i]>>8);
  }
	
 uart_putc((uint8_t)crc);
}

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


#define TX_BUFFER_SIZE 16
volatile uint8_t tx_buffer[TX_BUFFER_SIZE];
volatile uint8_t tx_wr_index=0, tx_rd_index=0, tx_counter=0;

@far @interrupt void handler_usart1_tx(void)
{
	if (tx_counter )
   {
      --tx_counter;
      USART1->DR  = tx_buffer[tx_rd_index++];
			tx_rd_index &= (TX_BUFFER_SIZE - 1);
   }
 else USART1->CR2 &= ~(1 << 7);// при пустом буфере отключить прерывание
}

void uart_putc(  char c ) 
{
	 while (tx_counter == TX_BUFFER_SIZE);
	
	 if (tx_counter || (USART1->CR2 & (1 << 7)))
		{
		 disableInterrupts();
		 tx_buffer[tx_wr_index++] = c;
		 tx_wr_index &= (TX_BUFFER_SIZE-1); 
		 ++tx_counter;  
		 enableInterrupts(); 
		}
	 else
		{
		  USART1->DR = c;
		}
	
		USART1->CR2 |= (1 << 7);//Разрешить прерывания
}
Мудрый кот
Сообщения: 1859
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="JackSmith",url="/forum/viewtopic.php?p=4178263#p4178263"]я не думаю, что большая разница будет. у меня stm8l151 в active-halt режиме потреблял 2.3 мкА. по даташиту на STM32L151x6/8, потребление в Standby режиме с РТС - 1.1 мкА. Даже в два раза меньше ;)[/uquote]
У меня вся схема (STM8L151 + nRF24L01+) в том же режиме сна = 0.9...1.0 мкА. Она же в "low power run"/"low power wait" на минимальной частоте = ~5мкА.
При Uпит = ~2.4V.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 373
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

[uquote="jcxz",url="/forum/viewtopic.php?p=4178823#p4178823"]У меня вся схема (STM8L151 + nRF24L01+) в том же режиме сна = 0.9...1.0 мкА. Она же в "low power run"/"low power wait" на минимальной частоте = ~5мкА.
При Uпит = ~2.4V.[/uquote]
у меня вольтаж 3.3 Вольт. 2.3 мкА это средняя цифра за 60 сек. там еще один раз МК просыпался, снимал данные с АЦП, передавал на UART и снова засыпал. Как то так:
Изображение Изображение

В low power wait с тактированием от LSE 38 кГц вышло 3мкА. low power run - 4.7мкА.
Родился
Сообщения: 1
Зарегистрирован: Пт май 13, 2022 08:33:19

Сообщение Migel Yka »

Коллеги, приветствую!
Поделитесь установщиком программы stm8 st visual develop ide.
STM не хочет делиться.
Спасибо
Родился
Сообщения: 16
Зарегистрирован: Вс мар 27, 2022 15:49:30

Сообщение Vladislav14 »

[uquote="Migel Yka",url="/forum/viewtopic.php?p=4230970#p4230970"]Коллеги, приветствую!
Поделитесь установщиком программы stm8 st visual develop ide.[/uquote]
Скачивал 1.03.2022, обновлял лицензию
https://disk.yandex.ru/d/1eq_QJid_5Jw5Q
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Добрый день. Решил помигать светодиодиком на STM8. В Platformio установил соответствующий пакет, и выбрал пример native-blink (пока пробую без библиотек). В коде примера смотрю на настройку пина, и вижу следующее (привожу лишь необходимые на мой взгляд куски:

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

#include "STM8S103F3.h"

#define LED_PORT   sfr_PORTB
#define LED_PIN    PIN5

// configure LED pin as output
  LED_PORT.DDR.byte = LED_PIN;    // input(=0) or output(=1)
  LED_PORT.CR1.byte = LED_PIN;    // input: 0=float, 1=pull-up; output: 0=open-drain, 1=push-pull
  LED_PORT.CR2.byte = LED_PIN;    // input: 0=no exint, 1=exint; output: 0=2MHz slope, 1=10MHz slope

То есть, для настройки пина на выход пуш-пулл с быстрыми фронтами, надо выставить соответвующий бит (5 по счету) в 3-х регистрах. И это делается этой хитрой конструкцией. Почему она для меня хитрая ? Потому что в AVR и PIC я привык выставлять биты конструкцией вида DDRB |= 1<<5;
Ну и сбрасывать соответственно похожим образом: DDRB &= ~(1<<5);
Залез в хидер, нашёл там union, внутри которого структура с битовыми полями.
Спойлер

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

/** Port A data direction register (DDR at 0x5002) */
  union {

    /// bytewise access to DDR
    uint8_t  byte;

    /// bitwise access to register DDR
    struct {
      BITFIELD_UINT   DDR0       : 1;      // bit 0
      BITFIELD_UINT   DDR1       : 1;      // bit 1
      BITFIELD_UINT   DDR2       : 1;      // bit 2
      BITFIELD_UINT   DDR3       : 1;      // bit 3
      BITFIELD_UINT   DDR4       : 1;      // bit 4
      BITFIELD_UINT   DDR5       : 1;      // bit 5
      BITFIELD_UINT   DDR6       : 1;      // bit 6
      BITFIELD_UINT   DDR7       : 1;      // bit 7
    };  // DDR bitfield

    /// register _PORT_DDR reset value
    #define sfr_PORT_DDR_RESET_VALUE   ((uint8_t) 0x00)

  } DDR;
но как сбрасывать, так и не понял.
Как с помощью этой конструкции сбросить бит в регистре ?
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

[uquote="Martian",url="/forum/viewtopic.php?p=4274000#p4274000"]...к биту можно обратиться как LED_PORT.DDR.DDR0 = 0[/uquote]
Вот, такое обращение с использованием битовых полей для меня логично и понятно)) Ранее с обьединениями дела не имел, лишь вскользь читал в Кернигане и Ричи.
То есть, для сброса бита при обращении к структуре объединения как к целому байту мне необходимо писать LED_PORT.DDR.byte &= ~(LED_PIN); ?
И правильно ли я понял, что установку битов лучше производить конструкцией типа LED_PORT.DDR.byte |= LED_PIN, иначе если делать как в примере, то все остальные биты регистра будут сбрасываться ?
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

[uquote="Martian",url="/forum/viewtopic.php?p=4274031#p4274031"]... да, но только со сдвигом единички, то есть, (1 <<LED_PIN).[/uquote]
Ну, учитывая, что в хидере пины представлены битовыми масками, а не порядковыми номерами битов, то наверное все таки без единичек))

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

/*-------------------------------------------------------------------------
  FOR CONVENIENT PIN ACCESS
-------------------------------------------------------------------------*/

#define PIN0     0x01
#define PIN1     0x02
#define PIN2     0x04
#define PIN3     0x08
#define PIN4     0x10
#define PIN5     0x20
#define PIN6     0x40
#define PIN7     0x80
Спасибо за ответы.
Родился
Сообщения: 16
Зарегистрирован: Вс мар 27, 2022 15:49:30

Сообщение Vladislav14 »

Да, тут всё правильно ответили - через CR1 и CR2 задаются режимы работ, в ODR пишется собственно байт на выход порта. Но не стОит останавливаться на этом, есть ещё и альтернативные функции... лучше не программно дёргать, а к таймеру подключить. У меня, например, в управляшке для бесколлекторного мотора TIM2 работает генератором сигнала (TIM2_OC2Init(TIM2_OCMODE_TOGGLE, TIM2_OUTPUTSTATE_ENABLE,CCR2_Val, TIM2_OCPOLARITY_HIGH); - переключает выход с программируемой частотой), а первый таймер - частотомер - захватывает фронты с датчика и измеряет скорость вращения.
Прорезались зубы
Сообщения: 210
Зарегистрирован: Чт мар 07, 2013 23:56:36

Сообщение Proton78 »

Здравствуйте! Подскажите как в STM8S103 заставить работать АЦП2. В нете везде примеры только с АЦП1. Мне же нужно реализовать два независимых канала измерения. Однин на АЦП1 как "Сторож" напряжения. Второй на АЦП2 измерение температуры. Перерыл кучу инфы, так и не получилось заставить измерять по АЦП2. Брал за основу исходник с АЦП1 - измерения происходят нормально. Перенастраиваю исходник на АЦП2 - и не работает. Компилятор SDCC.


uint16_t ADC_read(uint8_t channel)
{
/* Configure ADC channel */

ADC2_TDRL = 0x03; //отключить триггеры шмитта каналы 0 и 1
// ADC2_TDRH = 0xFF; //отключить триггеры шмитта


ADC2_CSR = channel;

/* Right-align data */
//ADC1_CR2 |= (1 << ADC1_CR2_ALIGN); // включить выравнивание по правому краю
ADC2_CR2 |= (1 << ADC2_CR2_ALIGN); // включить выравнивание по правому краю



//ADC2_CSR |= (1 << ADC2_CSR_EOCIE); // включить формирование прерываний


/* Wake ADC from power down */

// ADC1_CR1 |= (1 << ADC1_CR1_ADON); //включить питание на АЦП1, второй повтор начнет преобразование
ADC2_CR1 |= (1 << ADC2_CR1_ADON); //включить питание на АЦП2, второй повтор начнет преобразование


uint8_t adcH, adcL;
// ADC1_CR1 |= (1 << ADC1_CR1_ADON); //начать преобразование
ADC2_CR1 |= (1 << ADC2_CR1_ADON); //начать преобразование


// ждем окончание преобразования
// while (!(ADC2_CSR & (1 << ADC2_CSR_EOC)));

adcL = ADC2_DRL;
adcH = ADC2_DRH;
ADC2_CSR &= ~(1 << ADC2_CSR_EOC); // clear EOC flag

return (adcL | (adcH << 8));

}
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Proton78 писал(а):STM8S103 заставить работать АЦП2
Ну надо как-то в него добавить второй АЦП, так как их там один. :)
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

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