Ср ноя 08, 2017 06:24:36
uint8_t OnAfterTimeMS(uint32_t TimeVar,uint8_t Number,uint8_t CurrentFlag)
{
cli();
uint8_t OutFlag=0; //Переменная отвечает за RETURN f().
TIMER.TimeCurrent=TIMER.MS; //Присваиваем текущие значение МС
if (TIMER.Channel[Number].FlagTimersON==0) //Условия для захвата времени вызова функции и установки флага работы
{
TIMER.Channel[Number].TimeCountingON=TIMER.MS;
TIMER.Channel[Number].FlagTimersON=1;
}
uint32_t TimerToStart = TIMER.TimeCurrent-TIMER.Channel[Number].TimeCountingON;
if ((TimerToStart >= TimeVar)&((MAX_UINT32-TIMER.Channel[Number].TimeCountingON)>TimeVar)) //Если время до старта == TimeVar, то OutFlag=1 и обнуляем Флаг работы.
{
OutFlag=1;
TIMER.Channel[Number].FlagTimersON=0;
TIMER.TimeCurrent=0;
TIMER.Channel[Number].TimeCountingON=0;
TimerToStart=0;
}
else
{
OutFlag=CurrentFlag;
if (((MAX_UINT32-TIMER.Channel[Number].TimeCountingON)<TimeVar))
{
TIMER.MS=0;
TIMER.Channel[Number].TimeCountingON=0;
}
}
sei();
return OutFlag;
}
Ср ноя 08, 2017 06:52:50
Это происходит потому что условие проверок надо делать в прерывании ISR (TIMER0_OVF_vect). Тогда условие будет контролировать каждый тик таймера.7seg писал(а):Столкнулся только с одной проблемой при испытаниях кода переменная TIMER.MS была == uint16_t.
Если зафиксируем время допустим в 65530 TIMER.MS а TimeVar установим больше 5 то TIMER.MS обнулялся раньше чем выполниться условия (TimerToSTOP >= TimeVar) и соответственно происходил сбой в работе.
Ср ноя 08, 2017 08:58:57
R01TOP=OnAfterTimeMS(1200,1,R01TOP);
R01TOP=OFFAfterTimeMS(1300,2,R01TOP);
void Algoritm()
{
if (R01TOP==0)
{
R01TOP=OnAfterTimeMS(1200,1,R01TOP);
}
R01TOP=OFFAfterTimeMS(1300,2,R01TOP);
}
Ср ноя 08, 2017 09:01:49
Ср ноя 08, 2017 09:12:51
Ср ноя 08, 2017 09:14:50
Ср ноя 08, 2017 11:16:24
uint16_t TimeCountingON = 65530; // тик начала работы таймера
uint16_t MS = 0; // текущий тик (было переполнение)
// разница между текущим тиком и тиком начала работы таймера
uint16_t ticks_passed = MS - TimeCountingON; // ticks_passed будет 6!!!
Все работает как и задумывалось включение каждые 1300ms на 100ms.
/* включает/выключает что надо :-) */
void on_off (bool_t on)
{
.....
}
static soft_timer_t on_off_timer;
static bool_t on;
/*включение каждые 1300ms на 100ms*/
void Algoritm()
{
soft_timer_t *t = &on_off_timer;
if (soft_timer_expired (t)) { /* таймер истек */
/* переключаем */
on ^= 1; on_off (on);
/* и перезапускаем таймер */
soft_timer_arm (t, on ? 100 : 1200);
}
}
/* выключаем и стартуем таймер */
on_off (on = 0);
soft_timer_arm (&on_off_timer, 1200);
while(1)
{
SpiOutRegister();
Algoritm();
}
Ср ноя 08, 2017 14:18:16
Нет, не проще.viiv писал(а):Все работает как и задумывалось включение каждые 1300ms на 100ms.
Так не проще?
#define AMOUNT_TIMERS 6 //Количество используемых таймеров
Ср ноя 08, 2017 14:40:42
Ср ноя 08, 2017 15:11:18
// установка очередного таймера. если успешно, возвращает номер таймера, если не успешно, возвращает TIMER_ERROR
uint8_t set_timer(timer_t t);
// проверка указанного таймера. Если истек, возвращает 1, если не истек, возвращает 0, если номер не корректный - возвращает TIMER_ERROR
uint8_t timeout(uint8_t timer_id);
typedef uint16_t timer_t;
static timer_t timers[TIMER_CNT];
ISR(TIMER0_OVF_vect){
for(uint8_t i=0; i<TIMER_CNT; i++){
if(timers[i] != TIMER_FREE){
if(timers[i]) timers[i]--;
}
}
}
uint8_t set_timer(timer_t t){
if(t > TIMER_MAX) return TIMER_ERROR;
for(uint8_t i=0; i<TIMER_CNT; i++){
ATOMIC_BLOCK(ATOMICK_RESTORE_STATE){
if(timers[i] == TIMER_FREE){
timers[i] = t;
return i;
}
}
}
return TIMER_ERROR;
}
uint8_t timeout(uint8_t timer_id){
if(timer_id >= TIMER_CNT) return TIMER_ERROR;
ATOMIC_BLOCK(ATOMICK_RESTORE_STATE){
if(timers[timer_id] == TIMER_FREE) return TIMER_ERROR;
if(timers[timer_id] != 0) return 0;
else {
timers[timer_id] = TIMER_FREE;
return 1;
}
}
}
Чт ноя 09, 2017 03:00:05
Чт ноя 09, 2017 07:02:43
Чт ноя 09, 2017 07:35:15
Пт ноя 10, 2017 10:11:05
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 10.11.2017
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:
Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
PORTC.0=1;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State6=T State5=T State4=T State3=T State2=T State1=T State0=0
PORTC=0x00;
DDRC=0xff;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x07;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
}
}
Пт ноя 10, 2017 10:26:06
TCCR0=0x07;
Пт ноя 10, 2017 10:41:21
TCCR0=0x07;
Пт ноя 10, 2017 10:54:15
Пт ноя 10, 2017 11:57:38
Вт дек 05, 2017 17:57:11
Вс янв 14, 2018 14:08:22