Страница 1 из 1

Помогите с функцией millis()

Добавлено: Вт фев 08, 2011 19:07:49
alexval2006
Помогите реализовать функцию millis() на AVR GCC atmega8 эта функция есть в платформе ARDUINO я хоте лбы реализовать нечто аналогичное в авр студии на си
Вот что написано о ней в описании среды Ардуино
Описание:
Возвращает количество миллисекунд, прошедшее с момента запуска платформой данной программы. Это число переполнится(и счет снова начнется от нуля) примерно через 50 дней.
Входной параметр отсутствует
Следует помнить, что тип возвращаемой переменной unsigned long, и могут возникать ошибки, если программист попытается совершить математическими операции с переменными других типов.
Пример её использования в ардуино
unsigned long time;

void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Time: ");
time = millis();
// Отправляем по UART время прошедшее с момента старта программы
Serial.println(time);
// пауза в 1 секунду. Для уменьшения обмена по уарт.
delay(1000);
}
Я так понимаю мне наверно нужно что то с таймером сделать посоветуйте как мне решить эту проблему

Re: Помогите с функцией millis()

Добавлено: Вт фев 08, 2011 19:25:54
ARV
настройте таймер на прерывание каждую миллисекунду, заведите переменную volatile uint32_t CNT32, которую инкрементируйте по прерыванию таймера, и тогда ваша функция будет выглядеть элементарно:

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

#include <util/atomic.h>
uint32_t millis(void){
   ATOMIC_BLOCK(ATOMIC_RESTORE_STATE){
      return CNT32;
   }
}

Re: Помогите с функцией millis()

Добавлено: Вт фев 08, 2011 21:51:08
alexval2006
спасибо :)