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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Рена
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт ноя 29, 2013 06:26:40

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

Сообщение Рена »

Помогите увеличить число разрядов на индикатор.
Надо задействовать порт В целиком, а не только первые четыре.
Displaying variable voltage on a bar of LEDs using STM8S-DISCOVERY (AN3280)
Спойлер

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

/**
  ******************************************************************************
  * @file main.c
  * @brief Displaying variable voltage on a bar of LEDs Application example.
  * @author STMicroelectronics - MCD Application Team
  * @version 2.0.0
  * @date 15-MAR-2011
  ******************************************************************************
  *
  * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>
  * @image html logo.bmp
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"                // file needed only for registers mask 
#include "parameter.h"
/**
  * @addtogroup ADC1_Example1
  * @{
  */

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

#define ALL_LEDs ((u8)0x0F)				// LEDs mask 

/* Private macro -------------------------------------------------------------*/

#define switch_all_LEDs_on		{ GPIOB->ODR|= ALL_LEDs; }	//LEDs control : all on
#define switch_all_LEDs_off	  { GPIOB->ODR&=~ALL_LEDs; }    //LEDs control : all off

/* Private variables ---------------------------------------------------------*/
	u8  temp_AD_H;					   // temporary registers for reading ADC result (MSB)
	u8  temp_AD_L;             // temporary registers for reading ADC result (LSB)
	u8	ADInit;						     // flag for ADC initialized
	u8	ADSampRdy;				     // flag for filed of samples ready
	u8  AD_samp;						   // counter of stored samples
	u16 AD_sample[NUMB_SAMP];	 // store samples field 
	u16 AD_avg_value;				   // average of ADC result
	
	u8 peak_memo;					     // variables for peak level detector
	u8 peak_filt;					     // variables for peak level detector*/

/* Private function prototypes -----------------------------------------------*/
/**
  * @brief Count average of samples stored in the u16 field
  * @par Parameters:
  *  *p: pointer to the begin of the field
  * smp: number of samples in the field
  * @retval Average u16 value
  */
u16 u16_average(u16 *p, u8 smp) { 
	u8 i;
	u16 sum;
	
	for(i=0, sum= 0; i < smp; ++i)
		sum+= *p++;		
	return sum / smp;
}
/* -------------------------------------------------------------------------- */
/**
  * @brief Prepare data for four LED bar of signal and peak indicator
  * @par Parameters:
  * val: Level of the mesured signal [0-4]
  * @retval 4 bits (low nibble) of the composite bar graph information
  */
u8 signal_and_peak_level(u8 val) {
	u8 signal;
	u8 peak;
	
	switch(val) {
		case 0: peak= 0; signal=  0; break;	//set peak and signal levels
		case 1: peak= 1; signal=  1; break;
		case 2: peak= 2; signal=  3; break;
		case 3: peak= 4; signal=  7; break;
		case 4: peak= 8; signal= 15; break;
		default: peak= signal= 15;
	};
	if(peak_filt == 0) {									// slow fall of peak level indicator 
		if(peak_memo) {
			peak_memo>>= 1;
			peak_filt= PEAK_FILTER;
		};
	}
	else
		--peak_filt;
	if(peak >= peak_memo) {				       // check the highest level value
		peak_memo= peak;					         // and copy it to peak indicator
		peak_filt= PEAK_FILTER;			       // with fall speed refresh
	};
	return (signal | peak_memo);		     // return bar graph information
}

/* Public functions ----------------------------------------------------------*/
/**
  * @brief Validation firmware main entry point.
  * @par Parameters:
  * None
  * @retval void None
  */  
void main(void) {
	u8 leds;
// 								*** GPIO INIT ***
	GPIOB->ODR&=~ALL_LEDs; 				// LEDs - as push-pull outputs, all off
	GPIOB->DDR|= ALL_LEDs;				// 
	GPIOB->CR1|= ALL_LEDs;
	
	GPIOC->DDR|= 0x02;						// PC.1 as push-pull outputs
	GPIOC->CR1|= 0x02;
		
	GPIOE->CR1&=~0x40;					  // PE.6 as a floating input
	GPIOE->DDR&=~0x40;
	
// 								*** ADC INITIALIZATION ***
	TIM1->ARRH= (u8)(AUTORELOAD >> 8);		          // set autoreload register for trigger period
	TIM1->ARRL= (u8)(AUTORELOAD);				            // 
	TIM1->CCR1H= (u8)((AUTORELOAD-AD_STAB) >> 8);   // set compare register for trigger period
	TIM1->CCR1L= (u8)(AUTORELOAD-AD_STAB);
	TIM1->CR1|= TIM1_CR1_ARPE;					            // auto reload register is buferred
	
	TIM1->CR2= (4<<4) & TIM1_CR2_MMS;		            // CC1REF is used as TRGO
	TIM1->CCMR1= (6<<4) & TIM1_CCMR_OCM;	          // CC1REF in PWM 1 mode
	TIM1->IER|= TIM1_IER_CC1IE;				              // CC1 interrupt enable
	TIM1->CCER1|= TIM1_CCER1_CC1P;			            // CC1 negative polarity
	TIM1->CCER1|= TIM1_CCER1_CC1E;			            // CC1 output enable
	TIM1->BKR|= TIM1_BKR_MOE;												
	
	TIM1->SMCR|=  TIM1_SMCR_MSM;				            // synchronization of TRGO with ADC
	
	TIM1->CR1|= TIM1_CR1_CEN;					              // timer 1 enable
		
	ADC1->CSR= ADC1_CSR_EOCIE | (9 & ADC1_CSR_CH);  // ADC EOC interrupt enable, channel 9
	ADC1->CR1= 4<<4 & ADC1_CR1_SPSEL;			          // master clock/8, single conversion
	ADC1->CR2= ADC1_CR2_EXTTRIG;					          // external trigger on timer 1 TRGO, left alignment
	ADC1->TDRH= 2;									                // disable Schmitt trigger on AD input 9
	ADC1->TDRL= 0;                                  //

  // init ADC variables
	AD_samp= 0;						                          // number of stored samples 0
	ADInit= TRUE;                                   // ADC initialized 
	ADSampRdy= FALSE;                               // No sample 
	
	ADC1->CR1|= ADC1_CR1_ADON;					            // ADC on

	enableInterrupts();							                // enable all interrupts 
	
// 								*** MAIN LOOP ***	
	while (1) {
		if (ADSampRdy == TRUE) {				                     // field of ADC samples is ready?
			AD_avg_value= u16_average(&AD_sample[0], AD_samp); // average of samples
			
			AD_samp= 0;								                         // reinitalize ADC variables
			ADSampRdy= FALSE;
						
			leds= signal_and_peak_level((u8)((AD_avg_value + 128) / 256)); // setting LED status
			
			GPIOB->ODR&= leds | (~ALL_LEDs);	// LEDs settings in according to LED status
			GPIOB->ODR|= leds;
		};
	};
}
/**
  * @}
  */

/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
Реклама
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

Рена писал(а):Надо задействовать порт В целиком, а не только первые четыре.
А что конкретно не выходит?
Реклама
Аватара пользователя
Рена
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт ноя 29, 2013 06:26:40

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

Сообщение Рена »

Хотел подключить остальные вывода PB4-PB7 на св. диоды чтобы индикация входного напряжения была не 4,. а 8 светодиодов.
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

Ну так, купите паяльник и подключите. Или не паяется никак? Возможно флюса недостатошно?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Рена
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт ноя 29, 2013 06:26:40

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

Сообщение Рена »

Программно
Реклама
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

"Мочи мочало, начинай сначала..." ©

Что конкретно не выходит "программно"? Целые не целятся? Массивы не массивятся? 'Goto' огрызается, типа "сам пошел"? Какие были предприняты действия, к чему они привели и что не получилось?

ЗЫ
В коде понравилась индусская тема - "if (ADSampRdy == TRUE)"... Как-то половинчато написано, нет завершенности...
Надо было так написать:

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

    if (
         (ADSampRdy == TRUE) && 
         (ADSampRdy != FALSE)
       )
Реклама
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

скажите, в IAR есть ли возможность в коде определить тип МК под который идет компилирование?
на подобие того, как в атмел студии дефайнятся специальные переменные препроцессора о наличию которых можно установить конкретный МК
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

А при чем здесь йяр или студия? :shock: Ни тот, ни другая понятия не имеют, как можно протелепатить тип м/к. Тем более, что это невозможно никак.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Какие глубокие познания!!!

Хватит флудить. FAKIR.
"Я не даю готовых решений, я заставляю думать!"(С)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

axillent писал(а):скажите, в IAR есть ли возможность в коде определить тип МК под который идет компилирование?
Тип МК задается в свойствах проекта, а не в коде. Там же можно задавать глобальные дифайны, по которым уже строить условную компиляцию кода.
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 953
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

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

Сообщение GARMIN »

Изображение
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

a5021 писал(а): Тип МК задается в свойствах проекта, а не в коде. Там же можно задавать глобальные дифайны
где задается тимп МК мне известно
в атмел студии тип МК тоже задается в свойствах проекта
однако после определения типа МК студия автоматически передает препроцессору специально определенные дефайны по которым в коде можно узнать тип МК
например так:

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

#if defined(__AVR_ATmega128A__)
есть ли подобное (автоматическое и стандартное) в STM8?
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

Pnjom-Penb писал(а):Ни тот, ни другая понятия не имеют, как можно протелепатить тип м/к. Тем более, что это невозможно никак.
вы ни там ни там не работали? зачем гадаете?
в студии тип МК задается в свойствах проекта после чего определить в коде тип МК пустяшное дело
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

axillent писал(а):в студии тип МК задается в свойствах проекта после чего определить в коде тип МК пустяшное дело
Вот именно! Тип МК - задается! То есть, не ЙАР (которых, кстати, разных - вагон и маленькая тележка), а именно вы задаете тип мк. Надеюсь, не нужно пояснять, как определить опции компилятора/линкера, с которыми они запускаются из IDE? :)
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

Pnjom-Penb писал(а):Вот именно!
это не имеет отношения к моему вопросу
мне нужно в коде при условной компиляции знать тип МК, я нигде не писал, что тип должен угадываться, мне нужен стандартный механизм как у атмела
но похоже такого нет
в отличии от атмела у которого для любого МК достаточно указать тип МК в опциях проекта, а потом работает универсальная строка кода

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

#include <avr/io.h>
для STM8 в IAR нужно не только указать тип МК в опциях проекта, но и включить хидер под конкретное семейство, например:

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

#include <iostm8s103f3.h> 
в лучшем случае я могу сослаться на дефайн который определяется в этом специфичном хидере, например __IOSTM8S103F3_H__
тогда после 1. указания типа МК в проекте 2. включения нужного хидера для семейства 3. смогу понять в условной компиляции какое семейство
ну или ручками задавать свой дефайн

смотрю документацию на програмирование Си для STM8 в IAR, тоже не вижу никаких стандартных дефайнов
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

В AVR тип контроллера тоже не задаётся, он жестко прописан в соответствующем хидере. И если его не подключить, узнать тип контроллера будет проблематично.

с STM такой финт не прокатывает, поскольку подход несколько другой - ядро отделено от периферии и выбираются раздельно, и если вам надо что-то условно компилировать то привязываться к конкретному контроллеру не имеет смысла - либо будет что-то зависеть только от конкретного семейства, либо от конкретной периферии - к этому и надо цепляться а не к конкретной модели контроллера.
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

axillent писал(а):для STM8 в IAR нужно не только
Это первое упоминание о том, какой именно ЙАР имелся ввиду. Для IAR-AVR существуют "io<CPU>.h" файлы с макросами типа "__IOM1281_H", а в IAR-STM8 - "iostm8<CPU>.h" и макросы типа "__IOSTM8S103F2_H__". В любом случае, эти инклуды задаются вручную, а в проекте запросто м.б. указано "STM8 - unspecified". Какого-то способа, работающего одинаково во всех ЙАРах не встречал, потому и намекнул, что задается не ЙАРом (а рабочим окружением). :dont_know:

"Потому и не кусают" ©
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 953
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

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

Сообщение GARMIN »

Изображение
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

И когда в опциях проекта задан, как в примере GARMIN'а, дефайн "STM8S103", это сразу же можно увидеть и в строке запуска компилятора, где появляется ключ "-D STM8S103", о чем вчера и было сказано.
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

Alexeyslav писал(а):В AVR тип контроллера тоже не задаётся, он жестко прописан в соответствующем хидере. И если его не подключить, узнать тип контроллера будет проблематично.
Все наоборот. Я об этом выше уже два раза написал. Сначала выставляется руками тип в проекте, потом руками включается io.h именно этот, а не под конкретный МК
И дальше внутри по условной компиляции все автоматом подтянется под нужный МК
Т.е. Определить ручками МК нужно только в свойствах проекта, в любых других местах определить можно автоматически

Я не просто так на студию сослался. Так сложилось, что использую и avr и стал осваивать stm. Собираю библиотеку универсальную под avr8/stm8/stm32. Там планирую описывать преднастроенные драйверы некоторых переферий. Но это можно делать только в привязке к конкретному МК. С атмелом просто ставлю условия с дефайнами определяющими тип мк. А вот с stm8 по итогу обсуждения здесь выходит проще в исходнике ручками свой дефайн указывать
Ответить

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