STM8S103 и энкодер

На примере STM8S103F3

Инициализация

TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, 0xFFFF, 0);
TIM1_EncoderInterfaceConfig(TIM1_ENCODERMODE_TI12, TIM1_ICPOLARITY_FALLING, TIM1_ICPOLARITY_FALLING);
TIM1_Cmd(ENABLE);

0xFFFF максимальное значение, до которого будет крутиться энкодер. Далее переходит в ноль и начинается все сначала.

Получение текущего положения

position = TIM1_GetCounter();


Подключение

И не забываем

Ещё один программный таймер

Решил тоже поучаствовать в конкурсе «у кого таймер проще» :)
Это даже не велосипед, а так, самокат :)

Времени расписывать особо нет, поэтому буду краток.
Да и пояснять особо нечего.
typedef enum eTimerStatus
{
	etsTimerIDLE = 0,
	etsTimerCount,
	etsTimerEvent
} eTimerStatus;

typedef struct stTimer
{
	volatile ShortTimer *Count;
	volatile eTimerStatus Status;
} stTimer;

Это базовые определения. Теперь функционал:

#include "Timers.h"

/**
*	\brief Пул таймеров
*/
static ShortTimer volatile TimersPool[eTimersNumber];
static eTimerStatus volatile TimersStatusPool[eTimersNumber];

void TickTimers()
{
	for(int i=0; i < eTimersNumber; i++)
	{
		if(TimersPool[i] > 0)
		{
			TimersPool[i] --;
			if(0 == TimersPool[i])
			{
				TimersStatusPool[i] = etsTimerEvent;
			}
		}
	}
}

void StartTimer(eTimerIndex timer, ShortTimer period_ms)
{
	TimersPool[timer] = period_ms;
	TimersStatusPool[timer] = etsTimerCount;
}

eTimerStatus GetTimerStatus(eTimerIndex timer)
{
	if(etsTimerEvent == TimersStatusPool[timer])
	{
		TimersStatusPool[timer] = etsTimerIDLE;
		return(etsTimerEvent);		
	}
	else
	{
		return(TimersStatusPool[timer]);
	}
}

ShortTimer GetTimerCount(eTimerIndex timer){
	return(TimersPool[timer]);
}


Ну и пример использования.
typedef unsigned int ShortTimer;

typedef enum eTimerIndex
{
	eADC1Timer = 0,
	eADC2Timer,
	eADC3Timer,
	eADCProcessTimer,
	eChanDiapSwitchDelayTimer,
	eModbusTimer,
	eTimersNumber
} eTimerIndex;

void SysTick_Handler(void){

	TickTimers();
}

void main(){
    ...
    StartTimer(eADCProcessTimer, 5);

    while (1){
	...
	if(etsTimerEvent == GetTimerStatus(eADCProcessTimer)){
	    ProcessADC();
	    StartTimer(eADCProcessTimer, 5);
	}
        ...
    }
}


Если что непонятно (что вряд ли), спрашивайте, добавлю.
Главное удобство в простоте использования. Нужен ещё один таймер — добавили имя в enum eTimerIndex и можно пользоваться.

PS: Сейчас глянул ещё раз — а зачем мне вообще stTimer? Наверно, изначально что-то другое задумывал. Ну да ладно.

Генерация синуса 50 Гц на AVR. Макетирование.

Начало здесь.

Руки чесались проверить идею, поэтому решил быстро собрать макет из подручных материалов. Генератор импульсов прошил в старую макетку с ATMega168PA:



Исходник и вспомогательная таблица есть в первой части статьи.

UPD: Осциллограммы!


Больше картинок!

Таймер для экспонирования фоторезиста

Доброго времени суток!
Развитие современных технологий толкнуло к освоению изготовления печатных плат с помощью фоторезиста. Печатаем фотошаблон, накатываем фоторезист, делаем из них бутерброд… Теперь нужно экспонировать. Как измерять время экспозиции? Можно, конечно, бегать с часами и дергать вилку из розетки. Но это не true way. Наш метод — изготовление таймера. Под катом пост на тему «Я и мой сраный таймер»


Читать дальше

Программный таймер. Применение HAL

Сначала небольшая предыстория. Пользовался я раньше, значит, только прAVRославными контроллерами, да команды им посылал исключительно на богоугодном ассемблере. Все бы хорошо, но с портируемостью у асма, как известно, есть проблемы. В большинстве случаев, перенос какого-то куска интеллектуального труда с одного камня на другой подразумевал написание с нуля этого самого куска, но в реалиях периферии текущего мк. Вроде бы и несложно, да и обычно не особо напряжно, но как всегда есть НО. Проснулся интерес у меня к STMовским камням — обилие вкусной периферии плюс интересные цены прельщали (речь идет о STM8 и STM32). Вот тут-то я и задумался о том, что тут пора вспоминать С, да и изобретать свои велосипеды кроссплатформенно. Ибо каждый раз переписывать какое-нибудь типовое программное решение под другую архитектуру или модель контроллера, возможно и полезно с точки зрения тренировки и оптимизации, но грустно с точки зрения потраченного времени и сил. Такие вот дела.

А начал я, как следует из заголовка, с самого простого и необходимого модуля — программных таймеров.


Читать дальше

Кухонный таймер на ATTiny13

Мир вам!
Сразу ответы на вопросы:
— велосипед изобретал, так как жена попросила. Механический для неё тикает громко. :)
— "ATTiny13 — это же такая древность!" А куда мне его девать ещё, если он за несколько лет никуда не пригодился? К тому же в единственном экземпляре.


Читать дальше

Многозадачный программный таймер, ver 2.0

Программный таймер, некогда описанный мною в блоге здесь неожиданно получил продолжение. Так как в системе с ARM на борту присутствуют приоритеты прерываний, стало необходимостью выживать в данных условиях. Ну обо всем по порядку:


Читать дальше

Мои поделки: Часы-Будильник-Таймер-Секундомер на МК ATtiny85V [май-октябрь 2013]

Хорошая задачка — лучший учитель! Каждый джедай, в ученичестве, должен: «помигать LED-иком», «собрать Часики/Таймер» и «сделать Термометр» — это уже, практически, сложившаяся традиция! :) Все мы начинали с КРЕНок…
Здесь, представлена моя первая электронная разработка на микроконтроллере: в которой я «собрал Часы-Таймер».

Внешний вид Устройства

Содержание:

Далее, будет много фоток (все кликабельны и ведут на полноразмерное изображение)...

Читать дальше

Таймер на tiny13 и STLED316

AVR
Надоело мне бегать и следить за часами при засветке фоторезиста или паяльной маски. Да и вообще… И сделал для себя таймер в корпусе от Pilot. Может, кто помнит, был такой тройник. Там как раз много места под фильтр есть.


Читать дальше

Многозадачный программный таймер.

В мире микроконтроллеров, как и в мире вообще — существуют разного рода задачи. Какие-то требуют немедленного исполнения, какие-то могут подождать. Но есть и такие, которые возникают крайне редко, но их количество может быть внушительным. Вот о реализации таких задач (последних) мы и поговорим. Чтобы «убить» 7 мух(, а может быть и великанов) одним ударом — будем использовать программный таймер на базе одного аппаратного. Так как все задачи — «медленноприходящие» (интересно, есть такое слово в русском языке?) — настроим аппаратный таймер таким образом, чтобы тикал он несколько раз в секунду (например, 50 или даже 500). И создадим массив структур, в каждой из которых будет лежать вся информация по каждому программному таймеру отдельно. Итак, рассмотрим чего добился:

Читать дальше