Изучаю STM8l151 что означает "->"

Кто любит RISC в жизни, заходим, не стесняемся.
Serj_K
Опытный кот
Сообщения: 718
Зарегистрирован: Сб апр 14, 2012 16:11:35

Re: Изучаю STM8l151 что означает "->"

Сообщение Serj_K »

Myp3ik писал(а):Теперь нам нужно сбросить счетные регистры у таймеров на СТМ, это счетные регистры CNT и CNT. А как тогда компилятор поймет к какому таймеру относится конкретный CNT
Например вот так:

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

TIM1_CNTRH = 0;	TIM1_CNTRL = 0;
Без всяких указателей и никаких непоняток с тем, к какому таймеру относится CNTRH и CNTRL. Эти описания взяты из iostm8l151k6.h
Реклама
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: Изучаю STM8l151 что означает "->"

Сообщение Myp3ik »

Serj_K, может быть, потому как я эти СТМ8 в глаза никогда не видел 8)
Иван Сусанин - первый полупроводник :solder:
Реклама
Markusha
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт июл 23, 2015 17:33:48

Re: Изучаю STM8l151 что означает "->"

Сообщение Markusha »

Serj_K писал(а):Без всяких указателей и никаких непоняток с тем, к какому таймеру относится CNTRH и CNTRL
А разве с указателями есть непонятки?
Разве конструкция

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

TIM1->CNT
допускает трактовку, что CNT не относится к таймеру 1?
Вот вам пример, что указатели очень даже нужны, допустим есть структура с настроечными параметрами

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

typedef struct{
uint32_t param1;
uint32_t param2;
}settings;

settings params;

И есть функция которая принимает эту структуру в качестве аргумента

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

void function(settings params){
//что то делает
}
Доступ к членам будет params.param1 итд.

И есть функция которая принимает указатель на эту структуру

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

void function1(settings *params){
//что то делает
}
Доступ к членам будет params->param1 итд.

Теперь, когда мы вызываем

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

function(params);
мы заталкиваем в стек 8 байт данных (всю структуру), а при вызове

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

function1(&params);
только 4 байта (адрес).
Экономия стека налицо. А ведь структуры могут состоять из 10-ка членов.
На ПК то конечно можно целые классы в стек заталкивать, там памяти дофига.
А вот в МК стек может кончится и начать пороть уже память.
Правда есть нюанс, в первом случае params - копия данных и вы с членами params можете делать что хотите.
Во втором случае изменив член params, он будет изменен в том месте где находится.
P.S. На примере stm32...
Serj_K
Опытный кот
Сообщения: 718
Зарегистрирован: Сб апр 14, 2012 16:11:35

Re: Изучаю STM8l151 что означает "->"

Сообщение Serj_K »

Markusha писал(а):А разве с указателями есть непонятки?
У меня нет. Но человек создал эту тему, так как непонятки были у него.
Реклама
Эиком - электронные компоненты и радиодетали
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Изучаю STM8l151 что означает "->"

Сообщение king-live »

Доброго времени суток! Вот в IAR-е какая бы строчка не встречалась с такой комбинацией "->" , ругается и говорит не правильное написание.
И вот написал я программу переключения портов в зависимости от входа значения АЦП. Скачал библиотеку для работы с STM8 этой модели и похожие (rm0031_STM8). По нему настроил регистры АЦП. Настройка регистров в разных стилях, я так лучше понимаю регистры, но без указателей "->". Поэтому не ругайте, А помогите. В дебаггере (под ST-LINK) результаты АЦП получаются разными, но повтаряющиеся всего 3 значения в хоатичном порядке: 252,251,0. И в железе когда мигают светодиоды всё это отражается на мигании. Вот, что то не досмотрел, не до установил. И где формула по которому входное напряжение превращаются в цифру? Заранее спасибо!
Вход на ноге 12 (PD3) - STM8L151K4

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

#include "iostm8l151k4.h"

int result;
int long i,b;

void White()
{
b=result*20;  
for(i=0;i<b;i++) //Подождем...
   {
   ;
   }
}

int main( void )
{
CLK_PCKENR2=1;
//ADC1_CR1_bit.ADON = 1; //включим преобразователь
//ADC1_CR1_bit.CONT = 1; //включим преобразователь
//ADC1_SQR1_bit.DMAOFF = 1; //вырубим контроллер DMA

ADC1_SR=0;
ADC1_CR1=71;
ADC1_CR3=19;
ADC1_SQR3=17;
//ADC1_TRIGR1=16;
//ADC1_TRIGR3=16;
  
PD_DDR = 247;   // Ножка PD3 конфигурируется на ввод ADC_19
PD_CR1 = 247;   

PC_DDR = 255;   // Ножки PC7 конфигурируется на выход
PC_CR1 = 255;   

PA_DDR = 255;   // Ножки PA7 конфигурируется на ввод
PA_CR1 = 255;   

PB_DDR = 255;   // Ножки PB7 конфигурируется на ввод
PB_CR1 = 255;   


for(i=0;i<10000;i++) //Подождем...
   {
   ;
   }


while(1)
     {
     PD_ODR=~PD_ODR; //Переключим светодиод
     PA_ODR=~PA_ODR; //Переключим светодиод
     PB_ODR=~PB_ODR; //Переключим светодиод
     PC_ODR=~PC_ODR; //Переключим светодиод
 
     result=ADC1_DRL;
     White();
     }
}

Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Изучаю STM8l151 что означает "->"

Сообщение ARV »

видит бог, я не верю в то, что вы много лет делали разные сложные проекты!
по стилю вашего кода я не могу в это поверить! извините...

я с STM8 никогда дел не имел, но сдается мне, что вот это
ADC1_CR1=71;
ADC1_CR3=19;
ADC1_SQR3=17;

не соответствует вот этому:
//ADC1_CR1_bit.ADON = 1; //включим преобразователь
//ADC1_CR1_bit.CONT = 1; //включим преобразователь
//ADC1_SQR1_bit.DMAOFF = 1; //вырубим контроллер DMA

как бы я сомневаюсь, что для включения АЦП в регистр надо записать число 71... это как бы установка сразу 4-х битов, а судя по комментам надо всего 2...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Изучаю STM8l151 что означает "->"

Сообщение king-live »

видит бог, я не верю в то, что вы много лет делали разные сложные проекты!
по стилю вашего кода я не могу в это поверить! извините...
Проекты не сложные, они просто логически решаемые на микроконтроллерах! Нужно было просто быстро написать программу ну и что бы она надёжна работала! Нету времени ни сейчас, не было его и в прошлом на то, чтобы красиво и "умно" что то написать. Работает программа, заказчику нравится ну и хорошо! Все вокруг рады! Один раз на форуме мне показали как работает АЦП в AVR и мне этого хватает по сегодняшний день! И потом очень много литературы по AVRкам. А по STM8 сколько учебников? - ноль. Есть только его Даташит и вот этот вспомогательный rm0031_STM8.
как бы я сомневаюсь, что для включения АЦП в регистр надо записать число 71... это как бы установка сразу 4-х битов, а судя по комментам надо всего 2...
ну правильно, следующии строчки и не активны, в программе не используются.
//ADC1_CR1_bit.ADON = 1; //включим преобразователь
//ADC1_CR1_bit.CONT = 1; //включим преобразователь
//ADC1_SQR1_bit.DMAOFF = 1; //вырубим контроллер DMA
Их я не стал удалять для того, чтобы видели "спецы", что и такой стиль я использую для настройки регистров.

Ну так мне нужно, что бы кто нибудь указал где кроется ошибка. То что что то не правильно, видно и так по работе железа!

И ещё один вопрос? почему нельзя писать (представить) в порт следующее? к примеру эта строчка даёт ошибку на синтаксис С/С++;

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

PB_DDR=0b11111111;
а вот так можно ошибки нет;

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

PB_DDR=255;
В AVR Studio проблем не было в каком виде представлять (записать) значение в порт или в переменную. Заранее спасибо!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Изучаю STM8l151 что означает "->"

Сообщение ARV »

хоть я не считаю себя спецом, но я увидел ваши комментарии и сделал вывод, что они поясняют, что делается в следующих строках - и это вызвало у меня подозрения, ибо комментарии не соответствуют активным операторам. я не знаю, что именно вы хотели, и потому не могу судить, верно или нет вы поступили.

что касается 0b00001111, то в любой книжке по Си написано, что двоичные константы по стандарту языка не поддерживаются. то есть компилятор не обязан это понимать, хотя некоторые умеют. это нестандартная фича, не ждите ее поддержки от всех.

а вот стандартные для языка Си следует ожидать от любого компилятора, и в случае отсутствия их поддержки бить тревогу.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Markusha
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт июл 23, 2015 17:33:48

Re: Изучаю STM8l151 что означает "->"

Сообщение Markusha »

king-live писал(а):

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

PB_DDR=0b11111111;
а вот так можно ошибки нет;

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

PB_DDR=255;
Заколотил в эклипсе в вызове функции вместо 0x80, 0b10000000 - ошибок сборки нет. Смотрите вашу IDE.
king-live писал(а):

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

ADC1_CR1=71;
ADC1_CR3=19;
ADC1_SQR3=17;
Итак, поместив в ADC1_CR1 71 (0b01000111) мы поднимаем биты в (OVERIEO) Overrun interrupt enable, однако настройки прерывания не видно, и по дефолту контроллер возможно бесконечно начнет вызывать прерывание (не помню в стм8 аппаратно флаги сбрасываются или софтово) CONT (Continuous conversion mode) то есть АЦП будет лупашить без остановки START (Conversion start) запустить, ADON (включить АЦП). Тут уже косяк, надо АЦП сначала настроить, а потом подымать бит Conversion start.
Поместив в ADC1_CR3 19 0b00010011, в даташте биты 0-4 это Channel selection, ок, выбрали канал 19.
НО! Преобразование у нас однако уже запущено ранее, что в этом случае произойдет одним инженерам ST известно.
Записали в ADC1_SQR3 17, вот тут непонятно, накой сейчас там что-то менять?
king-live писал(а):

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

PD_DDR = 247;   // Ножка PD3 конфигурируется на ввод ADC_19
PD_CR1 = 247;   

PC_DDR = 255;   // Ножки PC7 конфигурируется на выход
PC_CR1 = 255;   

PA_DDR = 255;   // Ножки PA7 конфигурируется на ввод
PA_CR1 = 255;   

PB_DDR = 255;   // Ножки PB7 конфигурируется на ввод
PB_CR1 = 255;   
Вы настраиваете порты после старта АЦП.


Рабочий код от STM8S208, с использованием говнолибы SPL

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

#define AIN0_GPIO       GPIOB
#define AIN0_PIN        GPIO_PIN_7
#define AIN1_GPIO       GPIOB
#define AIN1_PIN        GPIO_PIN_6
int main(void){
  uint32_t result;
  GPIO_Init(AIN0_GPIO,AIN0_PIN,GPIO_MODE_IN_PU_NO_IT);//channel 1
  GPIO_Init(AIN1_GPIO,AIN1_PIN,GPIO_MODE_IN_PU_NO_IT);//channel 2
  ADC2_DeInit();
  ADC2_PrescalerConfig(ADC2_PRESSEL_FCPU_D4);
  ADC2_SchmittTriggerConfig(ADC2_SCHMITTTRIG_CHANNEL7,DISABLE);
  ADC2_SchmittTriggerConfig(ADC2_SCHMITTTRIG_CHANNEL6,DISABLE);
  ADC2_Cmd(ENABLE);  
  ADC2_ConversionConfig(ADC2_CONVERSIONMODE_SINGLE,ADC2_Channel,ADC2_ALIGN_RIGHT);
  ADC2_StartConversion();
  while ( ADC2_GetFlagStatus()==RESET ); // wait
  ADC2_ClearFlag();
  result=ADC2_GetConversionValue();
  for(;;){
  }
}
Я не увмдел даже смысла в выложенном коде, даже для тестов... Это троллинг что-ли такой?
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Изучаю STM8l151 что означает "->"

Сообщение king-live »

Вы настраиваете порты после старта АЦП.
Вот это меня насторожило! А есть разве определённая очерёдность в STM8, что настраивать первым? Попробую с другого конца настроить. Кстати в AVR Studio сначало настраивал АЦП, потом порты и затем немного задержки, чтобы все успели настроиться. Привычка!
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Изучаю STM8l151 что означает "->"

Сообщение king-live »

Вот отрубил настройку этого регистра ADC1_SQR3=17;

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

#include "iostm8l151k4.h"

int result;
int long i,b;

void White()
{
b=result*20;  
for(i=0;i<b;i++) //Подождем...
   {
   ;
   }
}

int main( void )
{
CLK_PCKENR2=1;
ADC1_CR3=19;
//ADC1_SQR3=17;
ADC1_CR1=71;
  
PD_DDR = 247;   // Ножка PD3 конфигурируется на ввод ADC_19
PD_CR1 = 247;   

PC_DDR = 255;   // Ножки PC7 конфигурируется на выход
PC_CR1 = 255;   

PA_DDR = 255;   // Ножки PA7 конфигурируется на ввод
PA_CR1 = 255;   

PB_DDR = 255;   // Ножки PB7 конфигурируется на ввод
PB_CR1 = 255;   

for(i=0;i<10000;i++) //Подождем...
   {
   ;
   }

while(1)
     {
     PD_ODR=~PD_ODR; //Переключим светодиод
     PA_ODR=~PA_ODR; //Переключим светодиод
     PB_ODR=~PB_ODR; //Переключим светодиод
     PC_ODR=~PC_ODR; //Переключим светодиод
 
     result=ADC1_DRL;
     White();
     }
}


теперь значение result всегда равно 125. Не работает АЦП. Может дело в прерывании, но пока не соображаю где копать. Кстати как и где включается Aref (эталонное напряжение для сравнения с входящим с порта напряжением) Есть два регистра ADC_SQR1, ADC_TRIGR1 (reset value), где что то указывает на CHSEL_S VREFINT и VREFINTON. Вот что это такое?

Кстати от очерёдности настройки сначало АЦП, потом порты и наоборот, ничего не изменилось!
Аватара пользователя
optima
Прорезались зубы
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Re: Изучаю STM8l151 что означает "->"

Сообщение optima »

king-live писал(а): А есть разве определённая очерёдность в STM8, что настраивать первым?
Тупизм какой то! А разве можно помыть руки не открыв кран с водой? Или вы сначала программируете контроллер а потом подаете питание? на все ваши вопросы ответы находятся в даташите на МК!!!
Markusha
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт июл 23, 2015 17:33:48

Re: Изучаю STM8l151 что означает "->"

Сообщение Markusha »

king-live писал(а):
......
Вы таки попробуйте настроить АЦП хотя-бы с помощью либы SPL от ST, добьетесь работоспосбности, потом посмотрите какие биты куда загоняются, подумаете, разберетесь.
Очень не люблю тыкать в мануал, но таки, RTFM, блин.
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Изучаю STM8l151 что означает "->"

Сообщение king-live »

Тупизм какой то! А разве можно помыть руки не открыв кран с водой?
В жизни нельзя, но мы сейчас говорим о настройке STM8. А конкретно о настройке АЦП и портов ввода вывода в STM8. Вы поробуйте в AVR Studio сначала настроить порты, и потом АЦП - работает. Попробуйте наоборот, сначало настроить АЦП, а потом порты - работает. Так что ??!! оказывается можно вымыть руки не открывая крана с водой, но это не в реальной жизни. Если вы такой "мудрый" optima, как вы направили меня туда, где я не нашёл ответа? Вы "optima" когда начали учиться в 1 классе, Вам учитель дал азбуку в "зубы" и сказал наверное - там всё есть, ищите сами, но что бы завтра мне прочли басню Крылова! Когда Вам выдавали учебник в начале учебного года у Вас же не брали экзамен через неделю по всем темам этого учебника, Вы его учили год, с помощью учителя! Так зачем "умничать". Сюда приходят за помощью, а не за направлением куда либо! И вы не ответили ни на один из вышеперечисленных вопросов.......! :)
Аватара пользователя
optima
Прорезались зубы
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Re: Изучаю STM8l151 что означает "->"

Сообщение optima »

Вовсе не считаю себя мудрым! я такой же первоклассник как и вы, Но если вы не нашли ответа там куда я вас отправил, то это вовсе не значит что их там нет!
Порой мануал приходится перечитывать и не один раз и не два, что бы понять элементарные вещи, поверьте это гораздо полезнее нежели ждать чьей то помощи!
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Изучаю STM8l151 что означает "->"

Сообщение king-live »

Ну вот говорите "мануал"! Да мануал хорошо и читать его надо и понимать надо! Но вот то, как я его понял....., отсюда и вылез вышеописанный код! Ну этот код и надо исправить. А возвращаясь раз за разом опять к мануалу и не видеть выхода из тупика, можно спокойно выйти в коридор вылить всю злость на фирму ST и выкинуть к чертям эти микрухи и не возвращаться больше к ним. Но..... надо, надо потому что после них уже будет STM32. Atmel выслал моей фирме всякую вкуснятину бесплатно (для изучения), только чтобы перешли на их продукт. Люблю я их, за их поддержку в любом вопросе! Кстати общаюсь с ними, через преводчик, благо в инете их полно! А вот ST на мои вопросы никак не отреагировал!

Попробую SPL от ST........ но вот аппаратно я уже не пойму ничего (в первое время), всё написанно абстрактно.
Markusha
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт июл 23, 2015 17:33:48

Re: Изучаю STM8l151 что означает "->"

Сообщение Markusha »

Разумеется, почитать - попробовать - неполучилось - виноват производитель. А потом почитать, почитать, почитать и ОПА заработало.В 95 случаях из 100 виноват не производитель, а непонимание пользователя. Остальное - рано или поздно будет внесено в errata.
Не переживайте - разберетесь, так или иначе :))
Serj_K
Опытный кот
Сообщения: 718
Зарегистрирован: Сб апр 14, 2012 16:11:35

Re: Изучаю STM8l151 что означает "->"

Сообщение Serj_K »

У меня сделано так: в начале программы инит портов, в том числе для АЦП

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

//PD0, PD4 - analog, джойстик - входы с подтяжкой
  PD_ODR = 0x04;	PD_DDR = 0x0e;
Затем настраивается АЦП

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

#include <iostm8l151k6.h>
void init_adc()
{
  ADC1_CR1 = 0x20;		//EOC interrupt disabled, 10 bit, ADC OFF
  ADC1_CR2 = 0x04;		//48 ADC clock cycles, Triggers disabled, software start enabled.
  ADC1_CR3 = 0;
  ADC1_TRIGR2 = 0x40;	//schmitt trigger disable AIN22 - UBAT
  ADC1_TRIGR3 = 0x04;	//schmitt trigger disable AIN10 - LEVEL
  ADC1_SQR1 = 0x80;	//DMA OFF
  ADC1_SQR2 = 0x40;	//начинаем с измерения напряжения батареи
  ADC1_SQR3 = 0;
  ADC1_SQR4 = 0;
  ADC1_CR1_bit.ADON = 1;//включаем АЦП, Single conversion mode
}
Когда нужно - вызываю

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

void adc_single_measure()
{
  ADC1_CR1_bit.START = 1;	//запустить преобразование АЦП
  while (!(ADC1_SR & MASK_ADC1_SR_EOC))	{};	//ждём окончания преобразования АЦП
  adc_res = ADC1_DRH << 8;	adc_res |= ADC1_DRL;
}
Когда нужно поменять вход

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

void adc_set_input(uchar input)
{
  if (input == UBAT)	{ADC1_SQR2 = 0x40;	ADC1_SQR3 = 0;}
  else					{ADC1_SQR2 = 0;		ADC1_SQR3 = 0x04;}
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Изучаю STM8l151 что означает "->"

Сообщение ARV »

для определения последовательности настройки периферии может помочь простая логика: поры - это источники сигналов, АЦП - это обработчики сигналов. логично сначала обеспечить себя сигналами, а потом заняться их обработкой, т.е. сначала настроить порты, а потом АЦП.

не смотря на то, что можно (и в некоторых случаях даже предпочтительнее) строить дом, начиная с крыши, все-таки более традиционен вариант строительства сначала стен...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Markusha
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт июл 23, 2015 17:33:48

Re: Изучаю STM8l151 что означает "->"

Сообщение Markusha »

ARV писал(а):может помочь простая логика:
Учитывая STM, особенно stm32, не забудьте добавить: сначала затактировать, все, начиная с порта ввода-вывода и AFIO, заканчивая целевым блоком переферии :)) :))
Ответить

Вернуться в «ARM»