Страница 60 из 130

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

Добавлено: Сб дек 19, 2015 08:35:06
oleg110592
OKF писал(а):потому как корпус датчика неразборной.
OKF писал(а):После разборки, внутри обнаружился msp430
кто мешает применить msp430? Цены на msp430G2 вполне гуманны http://ru.aliexpress.com/item/NEW-MSP43 ... 38134.html

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

Добавлено: Сб дек 19, 2015 10:15:51
OKF
Никто. Это один из примеров компактности, низкопотребляемости и уличного исполнения.
"Неразборной" - это для них, а не для нас!

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

Добавлено: Сб дек 19, 2015 10:24:03
Alexeyslav
А кто-то катается на велике в -40 да хотябы даже в -20... Оно-то конечно...
Применить MSP430 могут помешать обстоятельства. Не будешь же изучать совершенно новую архитектуру, ещё один язык, еще одну среду только лишь для одного проекта.

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

Добавлено: Сб дек 19, 2015 11:58:06
scorpi_0n
OKF писал(а):Это один из примеров компактности, низкопотребляемости и уличного исполнения.
Вот именно что один из примеров. Микрочип уже давно включился в борьбу за низкое энергопотребление со своей XLP. И для простых применений типа подрыгать ногой или передать что-то по UART ещё не факт что MSP будет более удачным в этом смысле.
Alexeyslav писал(а): Применить MSP430 могут помешать обстоятельства. Не будешь же изучать совершенно новую архитектуру, ещё один язык, еще одну среду только лишь для одного проекта.
Это да. Хотя там страшного ничего и нет тот же Си тот же ИАР но одноразовость действительно оптимизма не вселяет.
STM8/STM32 с лёгкостью покрывают большинство повседневных задач. Поэтому заморачиваться на что-то другое без особой на то причины и смысла никакого нет.

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

Добавлено: Сб дек 19, 2015 12:06:52
OKF
Alexeyslav писал(а):А кто-то катается на велике в -40 да хотябы даже в -20...
Не катается. Но проверить работоспособность могу. Нужно только дождаться -20. В Крыму.

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

Добавлено: Сб дек 19, 2015 12:57:48
scorpi_0n
И уж если пошёл разговор о потреблении. Может кому будет интересно.

Старый вброс от Микрочип от 2009г.
http://ww1.microchip.com/downloads/en/A ... 01267a.pdf

Ответная истерика от TI от 2009г.
http://www.ti.com/lit/wp/slay015/slay015.pdf

А это уже более свежее состояние XLP от Микрочип от 2013г.
http://ww1.microchip.com/downloads/en/D ... 09941F.pdf
Прямо уже TI не указан но "Competitor" как бы намекает. Как можно заметить уже не всё так однозначно. Микрочип явно старается как может и даже у него неплохо получается.

Чтение регистра TIM3_CNTR на STM8

Добавлено: Вс дек 27, 2015 22:33:40
Alex2016
Всем привет, котаны. Помогите пожалуйста начинающему нубасу. :)

Надо сделать декодер для RC5 протокола, в руках оказался камень stm8s105c6...Столкнулся вот с такой проблемой, по алгоритму выполнения надо считывать временные интервалы между внешними прерываниями на выводе PB7, решил использовать таймер TIM3, судя по документации на камень, у таймера есть регистры TIM3_CNTRH и TIM3_CNTRL они помечены как R/W и служат для хранения текущего значения счетчика.

Для получения значения использую вот такую строчку

unsigned short Timer_value |= ((TIM3_CNTRH << 8)|TIM3_CNTRL);
Но получаю только нулевое значение :cry:
в доке на на камень, никаких "особенностей" по регистру нет, errata тоже молчит :(

Подскажите пожалуйста, в чем может быть причина такого поведения. Код ниже.
(пилил на IAR 1.40.1 под 7 виндой)


#include "iostm8s105c6.h"

void InitialiseInternalSystemClock()
{
CLK_ECKR = 0; // очистка регистра внешнего тактирования
CLK_ICKR = 0; // очистка регистра внетреннего тактирования(сбрасывание делителя частоты)
CLK_ICKR_HSIEN = 1; // подключаем внутренний высокоскоростной генератор

while (CLK_ICKR_HSIRDY == 0) {} // ожидание устойчивой работы внетреннего высокоскоростного генератора

CLK_CKDIVR = 0; // максимальная частота работы генератора
CLK_PCKENR1 = 0xff; // TIM3 => врубаем все
CLK_PCKENR2 = 0xff; //
CLK_CCOR = 0; // отключения подачи на ножку тактового сигнала
CLK_HSITRIMR = 0; // выключить калибровку генератора
CLK_SWR = 0xe1; // HSI выбран как источник тактирования
CLK_SWCR = 0; // сброс флага переключения
CLK_SWCR_SWEN = 1; // переключиться на HSI
while (CLK_SWCR_SWBSY != 0) {} // ожидание переключения
}


unsigned char MIN_THRESHOLD_SHORT_PULSE = 889;
unsigned char MAX_THRESHOLD_SHORT_PULSE = 1333;
unsigned char MIN_THRESHOLD_LONG_PULSE =1334;
unsigned char MAX_THRESHOLD_LONG_PULSE = 2220;


unsigned short RC5_buffer = 0;
unsigned char bit_counter = 0;
unsigned char not_korr = 0;
unsigned char centre = 0;

unsigned short Timer_value = 0;

#pragma vector=0x06
__interrupt void EXTI_PB7(void) //Обработчик прерывания
{
//TIM3_CR1_CEN = 1;
not_korr = 1;
Timer_value = ((TIM3_CNTRH << 8) | TIM3_CNTRL); // ВОТ ЗДЕСЬ НИЧЕГО НЕ ПРОИСХОДИТ.
TIM3_CNTRL = 0;
TIM3_CNTRH = 0;

if(bit_counter == 0)
{
TIM3_CR1_CEN = 1;
RC5_buffer |= (PB_IDR_bit.IDR7 << bit_counter);
bit_counter++;
centre = 1;
}
else
{
// ОБРАБОТКА КОРОТКОГО ИМПУЛЬСА
if((Timer_value > MIN_THRESHOLD_SHORT_PULSE) && (Timer_value < MAX_THRESHOLD_SHORT_PULSE))
{
if(centre == 1)
{
centre = 0;
not_korr = 0;
}
else
{
centre = 1;
RC5_buffer |= (~PB_IDR_bit.IDR7 << bit_counter);
bit_counter++;
not_korr = 0;
}
}
// ОБРАБОТКА ДЛИННОГО ИМПУЛЬСА
if((Timer_value > MIN_THRESHOLD_LONG_PULSE) && (Timer_value < MAX_THRESHOLD_LONG_PULSE))
{
RC5_buffer |= (~PB_IDR_bit.IDR7 << bit_counter);
bit_counter++;
not_korr = 0;
}
if( not_korr == 1)
{
TIM4_CR1_CEN = 0; RC5_buffer = 0; bit_counter = 0; // Ошибка чтения
}
if(bit_counter == 14)
{
TIM4_CR1_CEN = 0;
RC5_buffer = 0;
}
TIM4_CR1_CEN = 1;
}
}



void PB7_Interrupt_init()
{
PB_DDR_bit.DDR7=0; //0-вход
PB_CR1_bit.C17=1; //1-подтяжка
PB_CR2_bit.C27=1; //1-прерывания разрешены

EXTI_CR1_bit.PBIS = 3; // 11: Rising and falling edge
}

void TIM3_init()
{
TIM3_PSCR = 4; // Делитель 2^4 = 16 => 1 МГц
TIM3_ARRH = 0;
TIM3_ARRL = 0;
//TIM3_IER_UIE = 1; // Включаем флаг обновления таймера (разрешить прерывания)
TIM3_CR1_CEN = 1; // включаем таймер

}



int main( void )
{
asm("sim");
InitialiseInternalSystemClock();
PB7_Interrupt_init();
TIM3_init();
asm("rim");
while (1)
{

}

return 0;
}

Re: Чтение регистра TIM3_CNTR на STM8

Добавлено: Пн дек 28, 2015 03:05:43
Pnjom-Penb
Alex2016 писал(а):// ВОТ ЗДЕСЬ НИЧЕГО НЕ ПРОИСХОДИТ.
Хотите сказать, что в остальных местах что-то происходит? Что за компилятор, который молчит на такое:

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

unsigned char MIN_THRESHOLD_SHORT_PULSE = 889;
unsigned char MAX_THRESHOLD_SHORT_PULSE = 1333; 
unsigned char MIN_THRESHOLD_LONG_PULSE =1334; 
unsigned char MAX_THRESHOLD_LONG_PULSE = 2220;
, и чего Вы ждете от переменных, инициализированных таким вот боком? Точно ли при этом MAX больше MIN? :)))

Кроме того, Вы уверены, что процедура "EXTI_PB7" вообще вызывается?

P.S. Если Timer_value меняется в прерывании, то она волатильная и скрывать этот факт от компилятора означает ставить себе грабли на будущее. ;)

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

Добавлено: Пн дек 28, 2015 08:44:51
Alex2016
Что за компилятор, который молчит на такое:
unsigned char MIN_THRESHOLD_SHORT_PULSE = 889;
unsigned char MAX_THRESHOLD_SHORT_PULSE = 1333;
unsigned char MIN_THRESHOLD_LONG_PULSE =1334;
unsigned char MAX_THRESHOLD_LONG_PULSE = 2220;
:facepalm: действительно, такие значения в char не влезут, заменил на unsigned short :oops:
Но IARовский компилятор не агрился на такую писанину :dont_know:
Кроме того, Вы уверены, что процедура "EXTI_PB7" вообще вызывается?
Да, выполнение кода заходит в обработчик прерывания, когда нажимаешь на кнопку пульта,я тестировал в дебаге.
Если Timer_value меняется в прерывании, то она волатильная и скрывать этот факт от компилятора означает ставить себе грабли на будущее.
Вот за этот совет, вялики дзякуй :beer:

P.s оказывается, что чтение из счетного регистра буферизирован :))
вместо:

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

volatile unsigned short Timer_value |= ((TIM3_CNTRH << 8)|TIM3_CNTRL);
Корректнее писать:

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

Timer_value = TIM3_CNTRH << 8;
Timer_value |= TIM3_CNTRL;

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

Добавлено: Пн дек 28, 2015 21:46:38
Pnjom-Penb
Alex2016 писал(а):Но IARовский компилятор не агрился на такую писанину :dont_know:
Вы из тех, кто считает, что warnings придумали трусы? А Pe069 и вовсе действует на Вас, как красная тряпка на быка? :)))
Alex2016 писал(а):Корректнее писать:

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

...
Timer_value |= TIM3_CNTRL;
Это присвоение упомянуто уже трижды - один раз как "равно" и дважды, как "или равно" - а зачем побитово ИЛИть с предыдущим значением? А теперь вот еще и только с младшей его частью...? :shock:

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

Добавлено: Пт янв 01, 2016 20:11:44
Alexeyslav
Ну так первой строчкой мы установили старшую часть (TIM3_CNTRH сдвинутый на 8 бит) младшая при этом равна нулю. Второй строчкой OR-им младшую часть в ту же переменную, а по нулям значение очень хорошо ложится 1 в 1.

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

Добавлено: Пт янв 01, 2016 23:01:06
Pnjom-Penb
Alexeyslav писал(а):Ну так первой строчкой мы установили старшую часть (TIM3_CNTRH сдвинутый на 8 бит) младшая при этом равна нулю. Второй строчкой OR-им младшую часть в ту же переменную, а по нулям значение очень хорошо ложится 1 в 1.
Вы тоже не поняли моего вопроса. О том, что младший разряд, при сдвиге к старшим, заполняется нулями, даше хреновые-химеры знают, не надо никого равнять с ними - вопрос конечно же был о другом:
Alex2016 писал(а):Изображение
Как я уже говорил, это присвоение было упомянуто трижды и все три раза по-разному... так вот было интересно - нафига было в процитированном варианте ИЛИть-то с битами предыдущего результата?

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

Добавлено: Пт янв 01, 2016 23:47:19
HHIMERA
Ещё раз... к чему твои дурные вопросы??? ТС не дочитал референс... пробовал выпутаться из ситуации по разному... там что угодно можно было увидеть... Когда ему указали на порядок чтения-записи...он указал решение в послесловии...
И вообще... тебе не кажется странным... что тебя вообще никто не понимает... похоже что и даже ты сам???

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

Добавлено: Пт янв 01, 2016 23:55:54
Pnjom-Penb
HHIMERA писал(а):вообще никто не понимает
Меньшинство - это не никто. И по-мне - лучше быть с ними, чем с тем большинством, что типа тебя.

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

Добавлено: Пт янв 15, 2016 10:16:11
service47
Как сделать такое же от STM32, но для STM8 в IAR:
Спойлер

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



#define F_APB1 20000000UL
void delay_ms(uint16_t delay)
{
    TIM14->PSC = F_APB1 / 1000 + 1; //устанавливаем предделитель
    TIM14->ARR = delay; //устанавливаем значение переполнения таймера, а значит и значение при котором генерируется Событие обновления
    TIM14->EGR |= TIM_EGR_UG; //Генерируем Событие обновления для записи данных в регистры PSC и ARR
    TIM14->CR1 |= (TIM_CR1_CEN | TIM_CR1_OPM); //Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM
    while ((TIM14->CR1 & TIM_CR1_CEN) != 0);
}
void delay_mc(uint16_t delay)
{
    TIM14->PSC = F_APB1 / 1000000 + 1; //устанавливаем предделитель
    TIM14->ARR = delay; //устанавливаем значение переполнения таймера, а значит и значение при котором генерируется Событие обновления
    TIM14->EGR |= TIM_EGR_UG; //Генерируем Событие обновления для записи данных в регистры PSC и ARR
    TIM14->CR1 |= (TIM_CR1_CEN | TIM_CR1_OPM); //Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM
    while ((TIM14->CR1 & TIM_CR1_CEN) != 0);
}



    GPIO_ResetBits(GPIOA, GPIO_Pin_14);
    GPIO_SetBits(GPIOF, GPIO_Pin_0);

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

Добавлено: Пт янв 15, 2016 11:30:37
oleg110592
service47 писал(а):Как сделать такое же...
можно как нибудь так:

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

void delay_1ms()
{
    TIM2->SR1 &= ~TIM2_SR1_UIF;
    TIM2->PSCR = 0x06; // //Предделитель на 2^6=64 16000000/64 = 250000 Hz
    TIM2->ARRH = 0; ///Значение перезагрузки 250000/250 = 1000 Гц
    TIM2->ARRL = 250;
    TIM2->CR1 |= TIM2_CR1_CEN; // Разрешаем счет.
    while((TIM2->SR1 & TIM2_SR1_UIF)==0);
}

uint16_t c = 500; //delay 500ms
    while(--c)
    {
        delay_1ms();
    }

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

Добавлено: Пт янв 15, 2016 13:54:19
service47
Спасибо, а как это сделать для STM8:
Спойлер

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

void Configure_PA0(void) 
{
    /* Set variables used */
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
  
    // Enable clock for GPIOA 
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    // Enable clock for SYSCFG 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    
    // Set pin as input 
    PA_DDR_bit.DDR0 = 0; // Set PA0 as input
    PA_ODR_bit.ODR0 = 0; // Latch "1" in output register
    PA_CR1_bit.C10  = 1; // Input with pull-up
    PA_CR2_bit.C20  = 0; // External interrupt disabled
    //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    //GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // Tell system that you will use PA0 for EXTI_Line0 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
    EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line1 | EXTI_Line2 | EXTI_Line3 | EXTI_Line4
                          | EXTI_Line5 | EXTI_Line6 | EXTI_Line7 | EXTI_Line8
                          | EXTI_Line9 | EXTI_Line10 | EXTI_Line11 | EXTI_Line12
                          | EXTI_Line13 | EXTI_Line14 | EXTI_Line15 | EXTI_Line16
                          | EXTI_Line17 | EXTI_Line18 | EXTI_Line19 | EXTI_Line20
                          | EXTI_Line21 | EXTI_Line22 | EXTI_Line23 | EXTI_Line25
                          | EXTI_Line26 | EXTI_Line27 | EXTI_Line31);/**/
    // PA13 is connected to EXTI_Line0 
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    // Enable interrupt 
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    // Interrupt mode 
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    // Triggers on rising and falling edge 
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    // Add to EXTI 
    EXTI_Init(&EXTI_InitStructure);
 
    // Разрешаем прерывания в периферии для выводов 0
    EXTI->IMR |=(EXTI_IMR_MR0);
   /* 
    // Configure external interrupts
    CPU_CFG_GCR_bit.AL = 1; // Interrupt-only activation level (IRET causes the CPU to go back to Halt mode)
    EXTI_CR1_bit.P0IS = 0x02; // EXTI0 on falling edge only
    //ITC_SPR3_bit.VECT8SPR  = 0x03; // EXTI0 IRQ level 3 (high priority) (EXTI0 IRQ = Vector 8)
    asm("RIM"); // Enable global interrupts (enable priorities)
    */
    // Add IRQ vector to NVIC 
    // PA0 is connected to EXTI_Line0, which has EXTI0_IRQn vector 
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
    // Set priority 
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
    // Set sub priority 
    //NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
    // Enable interrupt 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    // Add to NVIC 
    NVIC_Init(&NVIC_InitStructure);
    NVIC_EnableIRQ(EXTI0_1_IRQn);
    NVIC_SetPriority(EXTI0_1_IRQn,0);
}

 GPIO_ResetBits(GPIOA, GPIO_Pin_14);
 GPIO_SetBits(GPIOF, GPIO_Pin_0);

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

Добавлено: Пт янв 15, 2016 14:36:32
oleg110592
см. STM8S/A Standard peripheral library http://www.st.com/web/catalog/tools/FM1 ... 4/PF258009
пример в папке FWLib\examples\EXTI

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

Добавлено: Пт янв 15, 2016 16:32:20
HHIMERA
service47 писал(а):Как сделать такое же от STM32, но для STM8 в IAR:
Да строчку в строчку... Для TIM1 уж точно... Для других таймеров... с учётом особенностей прескалера... Таймера то похожи...
А вообще... смысла в этом никакого нет... только минус таймер... Этот идиотизм только для Мега-Пых ногодрыга и годится...

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

Добавлено: Пн янв 18, 2016 13:09:21
service47
В проекте добавлены:
Спойлер

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

#include "stm8l15x_conf.h"
#include "stm8l15x_it.h"

#include "stm8l15x.h"

#include "stm8l15x_adc.h"
#include "stm8l15x_aes.h"
#include "stm8l15x_beep.h"
#include "stm8l15x_clk.h"
#include "stm8l15x_comp.h"
#include "stm8l15x_dac.h"
#include "stm8l15x_dma.h"
#include "stm8l15x_exti.h"
#include "stm8l15x_flash.h"
#include "stm8l15x_gpio.h"
#include "stm8l15x_i2c.h"
#include "stm8l15x_irtim.h"
#include "stm8l15x_itc.h"
#include "stm8l15x_iwdg.h"
#include "stm8l15x_lcd.h"
#include "stm8l15x_pwr.h"
#include "stm8l15x_rst.h"
#include "stm8l15x_rtc.h"
#include "stm8l15x_spi.h"
#include "stm8l15x_syscfg.h"
#include "stm8l15x_tim1.h"
#include "stm8l15x_tim2.h"
#include "stm8l15x_tim3.h"
#include "stm8l15x_tim4.h"
#include "stm8l15x_tim5.h"
#include "stm8l15x_usart.h"
#include "stm8l15x_wfe.h"
#include "stm8l15x_wwdg.h"
Файлы .с тоже добавлены. Но:
Error[Pe020]: identifier "TIM1_SR1_bit" is undefined
Error[Pe020]: identifier "TIM1_CR1" is undefined и т.д.

Если же добавить из самого IAR'а:
#include "iostm8.h"
#include <iostm8l051f3.h>
и закомментировать:
//#include "stm8l15x.h"
то:
Error[Pe256]: invalid redeclaration of type name "__BITS_PA_ODR" (declared at line 45 of "D:\...\iostm8l051f3.h 45

Какие файлы должны быть добавлены для STM8L051F3?