Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перенос проекта с AVR на stm8l
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > STM8
Kalyan
Доброго всем времени суток! У меня есть проект написан под AVR в IARe. Я его переношу на stm8l. Возникла проблема с функцией __delay_cycles(). Такой ф-ции для stm8l в файлике intrinsic.h нету. Посмотрел я в AVR® IAR C/C++ Compiler Reference Guide for Atmel® Corporation’s исходника этой ф-ции там нет. Может кто-то знает где взять исходник или как написать что-то подобное. как эту задержку в циклах привязять к времени? Помогите пожалуйста!!
Xenia
Ознакомьтесь с темой:
http://electronix.ru/forum/index.php?showt...hl=delay_cycles
Она хоть и про ARM, но для STM8, возможно, тоже годиться.
N1X
Прошу прощения если не в тему, но если нужна привязка ко времени и есть свободный аппаратный таймер, то не проще ли так?
CODE
/*****************************************
Модуль таймеров
Автор: N1X
Дата: 09.2011
******************************************/
#ifndef TIMERS_h
#define TIMERS_h
#include <iostm8s105c4.h>

#define MAXLTIMERS 2 //Кол-во программных таймеров

//Список локальных таймеров:
#define LCD_LTIMER 0 //Имена для упрощения ))) кому как больше нравится, можно enum прикрутить
#define MAINTIMER 1

//Экспортируемые функции:
void TimersInit(void); //Инициализация аппаратуры
void StartLTimer(unsigned char TimerID); //Обнуляет таймер TimerID
unsigned int GetLTimer(unsigned char TimerID); //Возвращает текущее значение нужного таймера
#endif


CODE
#include "timers.h"
#include <intrinsics.h>

volatile unsigned int LTimers[MAXLTIMERS];

void TimersInit(void)
{
//CLK_PCKENR1 |= ?; //Вкл. тактирование таймера 3
TIM3_PSCR = 0; //Делитель выключен
TIM3_ARRH = 0x3e; //Считаем до 16000
TIM3_ARRL = 0x80;
TIM3_IER = 0x01; //Прер. по переполнению вкл.
TIM3_CR1_CEN = 1; //Включаем счетчик
__enable_interrupt();
}

void StartLTimer(unsigned char TimerID)
{
LTimers[TimerID] = 0;
}

unsigned int GetLTimer(unsigned char TimerID)
{
return(LTimers[TimerID]);
}

#pragma vector=TIM3_OVR_UIF_vector
__interrupt void TIM3_Int(void)
{
TIM3_SR1_UIF = 0;
unsigned char i;
for (i=0; i < MAXLTIMERS; i++)
LTimers[i]++;
}


В данном примере при 16 МГц тактовой имеем инкремент таймеров каждую мс... Итого точность хода, + не обязательно тупо ждать в цикле, а можно делать че-нить полезное... Хотя мелкие задержки так делать расточительно, постоянные прерывания...

Использовать вообще просто, чтобы запустить ожидание вызываем StartLTimer и переодически проверяем значение функцией GetLTimer...
scifi
ИМХО, функции типа delay_cycles() - враги, ибо поощряют небрежный стиль программирования. Программу следует проектировать так, чтобы она минимально зависела от точных задержек. Те немногие места, где они абсолютно необходимы, следует изолировать и привязывать к аппаратным таймерам.
Перенос программы на другой МК - хороший повод переписать её, улучшив её архитектуру.
Kalyan
scifi, я наверное прислушаюсь к вам и переделаю задержку под таймер. Спасибо..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.