Например вот так:Myp3ik писал(а):Теперь нам нужно сбросить счетные регистры у таймеров на СТМ, это счетные регистры CNT и CNT. А как тогда компилятор поймет к какому таймеру относится конкретный CNT
Код: Выделить всё
TIM1_CNTRH = 0; TIM1_CNTRL = 0;Например вот так:Myp3ik писал(а):Теперь нам нужно сбросить счетные регистры у таймеров на СТМ, это счетные регистры CNT и CNT. А как тогда компилятор поймет к какому таймеру относится конкретный CNT
Код: Выделить всё
TIM1_CNTRH = 0; TIM1_CNTRL = 0;А разве с указателями есть непонятки?Serj_K писал(а):Без всяких указателей и никаких непоняток с тем, к какому таймеру относится CNTRH и CNTRL
Код: Выделить всё
TIM1->CNTКод: Выделить всё
typedef struct{
uint32_t param1;
uint32_t param2;
}settings;
settings params;
Код: Выделить всё
void function(settings params){
//что то делает
}
Код: Выделить всё
void function1(settings *params){
//что то делает
}
Код: Выделить всё
function(params);Код: Выделить всё
function1(¶ms);У меня нет. Но человек создал эту тему, так как непонятки были у него.Markusha писал(а):А разве с указателями есть непонятки?
Код: Выделить всё
#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();
}
}
Проекты не сложные, они просто логически решаемые на микроконтроллерах! Нужно было просто быстро написать программу ну и что бы она надёжна работала! Нету времени ни сейчас, не было его и в прошлом на то, чтобы красиво и "умно" что то написать. Работает программа, заказчику нравится ну и хорошо! Все вокруг рады! Один раз на форуме мне показали как работает АЦП в 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;Заколотил в эклипсе в вызове функции вместо 0x80, 0b10000000 - ошибок сборки нет. Смотрите вашу IDE.king-live писал(а):а вот так можно ошибки нет;Код: Выделить всё
PB_DDR=0b11111111;Код: Выделить всё
PB_DDR=255;
Итак, поместив в ADC1_CR1 71 (0b01000111) мы поднимаем биты в (OVERIEO) Overrun interrupt enable, однако настройки прерывания не видно, и по дефолту контроллер возможно бесконечно начнет вызывать прерывание (не помню в стм8 аппаратно флаги сбрасываются или софтово) CONT (Continuous conversion mode) то есть АЦП будет лупашить без остановки START (Conversion start) запустить, ADON (включить АЦП). Тут уже косяк, надо АЦП сначала настроить, а потом подымать бит Conversion start.king-live писал(а):Код: Выделить всё
ADC1_CR1=71; ADC1_CR3=19; 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;
Код: Выделить всё
#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(;;){
}
}
Вот это меня насторожило! А есть разве определённая очерёдность в STM8, что настраивать первым? Попробую с другого конца настроить. Кстати в AVR Studio сначало настраивал АЦП, потом порты и затем немного задержки, чтобы все успели настроиться. Привычка!Вы настраиваете порты после старта АЦП.
Код: Выделить всё
#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();
}
}
Тупизм какой то! А разве можно помыть руки не открыв кран с водой? Или вы сначала программируете контроллер а потом подаете питание? на все ваши вопросы ответы находятся в даташите на МК!!!king-live писал(а): А есть разве определённая очерёдность в STM8, что настраивать первым?
Вы таки попробуйте настроить АЦП хотя-бы с помощью либы SPL от ST, добьетесь работоспосбности, потом посмотрите какие биты куда загоняются, подумаете, разберетесь.king-live писал(а):......
В жизни нельзя, но мы сейчас говорим о настройке STM8. А конкретно о настройке АЦП и портов ввода вывода в STM8. Вы поробуйте в AVR Studio сначала настроить порты, и потом АЦП - работает. Попробуйте наоборот, сначало настроить АЦП, а потом порты - работает. Так что ??!! оказывается можно вымыть руки не открывая крана с водой, но это не в реальной жизни. Если вы такой "мудрый" optima, как вы направили меня туда, где я не нашёл ответа? Вы "optima" когда начали учиться в 1 классе, Вам учитель дал азбуку в "зубы" и сказал наверное - там всё есть, ищите сами, но что бы завтра мне прочли басню Крылова! Когда Вам выдавали учебник в начале учебного года у Вас же не брали экзамен через неделю по всем темам этого учебника, Вы его учили год, с помощью учителя! Так зачем "умничать". Сюда приходят за помощью, а не за направлением куда либо! И вы не ответили ни на один из вышеперечисленных вопросов.......!Тупизм какой то! А разве можно помыть руки не открыв кран с водой?
Код: Выделить всё
//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;}
}Учитывая STM, особенно stm32, не забудьте добавить: сначала затактировать, все, начиная с порта ввода-вывода и AFIO, заканчивая целевым блоком переферииARV писал(а):может помочь простая логика: