Сб окт 14, 2017 09:19:18
Да. Правда непонятно зачем задействовать ещё одно прерывание.fulky писал(а):сделать по вектору TIMER1_COMPA и через сравнение с OCR1A??
F_CPU=8000000
OCR0A=250*F_CPU/1000000/8-1; задание 250мкс интервала
T_HOUR=3600*1000000/250
T_MIN=60*1000000/250
T_SEC=1000000/250
T1=HOUR1*T_HOUR+MIN1*T_MIN+SEC1*T_SEC
T2=HOUR2*T_HOUR+MIN2*T_MIN+SEC2*T_SEC
Вс окт 29, 2017 08:05:29
Вс окт 29, 2017 10:35:57
.include "m8def.inc"
.equ F_CPU=8000000 ;тактовая частота 8 МГц
.equ D=100000*F_CPU/1000000 ; для примера 100мс
.equ D_HIGH=$70 ; ячейки, хранящие задержку D/256
.equ D_MIDL=$71 ; ячейки, хранящие задержку D/256
.equ D_LOW =$72 ;
.cseg
.org 0
RJMP START ;переход на обработку сброса
.org 9
T0_OVER:
SUBI R27,BYTE1(1)
SBCI R26,BYTE2(1)
SBCI R25,BYTE3(1)
BRNE NO_DELAY
RET
NO_DELAY:
RETI
START:
LDI ZH, high(RAMEND) ;Инциализация стека
LDI ZL, low(RAMEND) ;
OUT SPH,ZH ;
OUT SPL,ZL ;
LDI R25,BYTE3(D/256) ; для примера
LDI R26,BYTE2(D/256) ; для примера
LDI R27,BYTE1(D/256) ;
STS D_HIGH,R25 ;
STS D_MIDL,R26 ;
STS D_LOW,R27 ;
GO:
LDS R25,D_HIGH ; загрузка D/256
LDS R26,D_MIDL ;
LDS R27,D_LOW
LDI R21,1<<SE
OUT MCUCR,R21
LDI R21,1<<TOIE0
OUT TIMSK,R21
OUT TIFR,R21
LDI R21,1<<CS00 ;F_CPU/1
OUT TCCR0,R21
SEI
WAIT:
SLEEP
BRIE WAIT
RJMP GO
.EXIT
Вс окт 29, 2017 11:57:13
Вс окт 29, 2017 12:17:35
а самому написать - не гуд?7seg писал(а):Есть у кого функция задержки времени без _delay_ms ,на таймере если еще и на нулевом то вобще гуд
ISR(TIMER0_OVF_vect){ // я дли примера взял по переполнению, можно любое иное прерывание
if(delay){
delay--;
timeout = 1;
}
}
#include <util/atomic.h>
void set_delay(uint16_t ms){
timeout = 0;
ATOMIC_BLOCK(ATOMIC_RESTORE_STATE){
delay = ms;
}
}
while(1){ // главный цикл
if(timeout){
PORTB ^= _BV(PB0); // мигаем светодиодом на порту PB0
set_delay(1000); // с периодом 2 секунды
}
// а тут занимается остальными делами в главном цикле
}
Вс окт 29, 2017 17:21:33
//==================
#ifndef SOFT_TIMERS_H
#define SOFT_TIMERS_H
#include "soft_timers.h"
#include "main_def_func.h"
//==================
//==================
#define ST_TCNT TCNT2
#define ST_TIMSK TIMSK
#define ST_OCIE OCIE2
#define ST_OCR OCR2
#define ST_TCCR TCCR2
#define CS0 CS20
#define CS1 CS21
#define CS2 CS22
//==================
//==================
typedef struct soft_timer
{
bool status;
u08 sys_tick_prev;
u16 cnt; // Counter.
u16 period; // Period.
} soft_timer;
//==================
//==================
void init_soft_timers (void);
#define handle_soft_timer(a) _handle_soft_timer (&a)
bool _handle_soft_timer (void *ptr_timer);
#define set_soft_timer(a,b,c) _set_soft_timer (&a, b, c)
void _set_soft_timer (void *ptr_timer, u16 time, u16 period);
#define reset_soft_timer(a) _reset_soft_timer (&a)
void _reset_soft_timer (void *ptr_timer);
//==================
//==================
extern bool tick;
void Main_Timer_Init (void);
bool Main_Get_Tick (void);
//==================
#endif
//==================
// Реализация программных таймеров.
// Примечание. Важно!!!!!!!!!!!!!!!
// При смене состояния конечного автомата нужно сбросить
// все таймеры, которые используются в этом состоянии. Иначе может быть
// следующая ситуация: если таймер уже использовался в
// текущем состоянии и флаг EN установлен, то по окончании времени
// выполнится соответствующий код.
//---------- Пример использования ----------
// set_soft_timer (ST_LED_2_BLINK, 50, 50); // Установка таймера.
// if (handle_soft_timer (ST_LED_2_BLINK)) // Проверка таймера.
//==================
//==================
#include "soft_timers.h"
//==================
//==================
static u08 sys_tick;
//==================
//==================
#pragma vector = TIMER2_COMP_vect
__interrupt void SysTimerComp (void)
{
ST_OCR += 250;
sys_tick++;
}
//==================
//==================
void init_soft_timers (void)
{
sys_tick = 0;
ST_TCNT = 0;
ST_OCR = 250;
ST_TCCR |= (1<<CS2);
set_bit (ST_TIMSK, ST_OCIE);
}
//----------
void _set_soft_timer (void *ptr_timer, u16 time, u16 period)
{
struct soft_timer *ptr = ptr_timer;
ptr -> status = true;
if (time == 0)
ptr -> sys_tick_prev = ~sys_tick;
else
ptr -> sys_tick_prev = sys_tick;
ptr -> cnt = time;
ptr -> period = period;
}
//----------
bool _handle_soft_timer (void *ptr_timer)
{
struct soft_timer *ptr = ptr_timer;
if (ptr -> status)
{
if (ptr -> sys_tick_prev != sys_tick)
{
ptr -> sys_tick_prev = sys_tick;
if (ptr -> cnt == 0)
{
if (ptr -> period != 0) ptr -> cnt = ptr -> period;
return true;
}
else
{
ptr -> cnt--;
if (ptr -> cnt == 0)
{
if (ptr -> period != 0) ptr -> cnt = ptr -> period;
return true;
}
}
}
}
return false;
}
void _reset_soft_timer (void *ptr_timer)
{
struct soft_timer *ptr = ptr_timer;
ptr -> status = 0;
ptr -> sys_tick_prev = 0;
ptr -> cnt = 0;
ptr -> period = 0;
}
//==================
Пн окт 30, 2017 02:07:19
Пн окт 30, 2017 07:42:45
ISR (TIMER0_OVF_vect)
{
TCNT0=125;
VarMS++;
if(VarMS==1000)
{
VarSS++;
VarMS=0;
}
if (VarSS==60)
{
VarMM++;
VarSS=0;
}
if (VarMM==60)
{
VarMM=0;
}
}
uint8_t FlagTImeON=0; //Флаг для захвата времени отсчета.
uint8_t TimeCountingON=0;//Время Отсчета
uint8_t FlagTImeOff=0;
uint8_t TimeCountingOff=0;
uint8_t OnAfterTimeSS(uint8_t TimeSS,uint8_t CurrentFlag)
{
if (FlagTImeON==0)
{
TimeCountingON=VarSS; //Время Отсчета
FlagTImeON=1;
}
uint8_t TimeCurrent=VarSS; //Текущие время
uint8_t OutFlag=0;
if ((TimeCurrent-TimeCountingON) == TimeSS)
{
OutFlag=1;
}
else OutFlag=CurrentFlag;
return OutFlag;
}
uint8_t OffAfterTimeSS(uint8_t TimeSS,uint8_t CurrentFlag)
{
if (FlagTImeOff==0)
{
TimeCountingOff=VarSS; //Время Отсчета
FlagTImeOff=1;
}
uint8_t TimeCurrent=VarSS; //Текущие время
uint8_t OutFlag=0;
if ((TimeCurrent-TimeCountingOff) == TimeSS)
{
OutFlag=0;
FlagTImeON=0;
}
else OutFlag=CurrentFlag;
return OutFlag;
}
}
Пн окт 30, 2017 10:16:48
Пн окт 30, 2017 10:32:40
Пн окт 30, 2017 10:59:23
Пн окт 30, 2017 11:19:45
Пн окт 30, 2017 13:19:14
Пн окт 30, 2017 14:04:13
Вт окт 31, 2017 08:59:04
Вт окт 31, 2017 09:12:06
volatile uint16_t VarMS=0;
volatile uint8_t VarSS=0;
volatile uint8_t VarMM=0;
ISR (TIMER0_OVF_vect)
{
TCNT0=125;
VarMS++;
if(VarMS==1000)
{
VarSS++;
VarMS=0;
}
if (VarSS==60)
{
VarMM++;
VarSS=0;
}
if (VarMM==60)
{
VarMM=0;
}
}
volatile uint8_t FlagTIme[10]={0};
volatile uint8_t TimeCountingON[10]={0};
uint8_t OnAfterTimeSS(uint8_t TimeSS,uint8_t CurrentFlag)
{
uint8_t NumberTimer=0;
if (CurrentFlag==0)
{
if (FlagTIme[NumberTimer]==0)
{
TimeCountingON[NumberTimer]=VarSS; //Время Отсчета
FlagTIme[NumberTimer]=1;
}
else
{
NumberTimer++;
if (NumberTimer==10)
{
NumberTimer=0;
}
}
}
uint8_t TimeCurrent=VarSS; //Текущие время
uint8_t OutFlag=0;
if ((TimeCurrent-TimeCountingON[NumberTimer]) == TimeSS)
{
OutFlag=1;
}
else
{
OutFlag=CurrentFlag;
}
return OutFlag;
}
Вт окт 31, 2017 10:46:01
ISR (TIMER0_OVF_vect)
{
for (i=0,i<10,i++)
{
if (M[i])
{
M[i]--;
if (!(M[i])) "действие";
};
};
}
void set_t (unsigned int time)
{
for (i=0,i<10,i++)
{
if (!(M[i])) {M[i]=time; break;};
};
}
Вт окт 31, 2017 13:34:46
Вт окт 31, 2017 13:51:09
Вт окт 31, 2017 13:57:02