реклама на сайте
подробности

 
 
> Перенос проекта с AVR на stm8l
Kalyan
сообщение Sep 11 2011, 21:19
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 108
Регистрация: 4-11-10
Пользователь №: 60 656



Доброго всем времени суток! У меня есть проект написан под AVR в IARe. Я его переношу на stm8l. Возникла проблема с функцией __delay_cycles(). Такой ф-ции для stm8l в файлике intrinsic.h нету. Посмотрел я в AVR® IAR C/C++ Compiler Reference Guide for Atmel® Corporation’s исходника этой ф-ции там нет. Может кто-то знает где взять исходник или как написать что-то подобное. как эту задержку в циклах привязять к времени? Помогите пожалуйста!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
N1X
сообщение Sep 13 2011, 12:35
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 5-05-10
Из: Гомель, Беларусь
Пользователь №: 57 090



Прошу прощения если не в тему, но если нужна привязка ко времени и есть свободный аппаратный таймер, то не проще ли так?
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...

Сообщение отредактировал N1X - Sep 13 2011, 12:42
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 03:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01428 секунд с 7
ELECTRONIX ©2004-2016