Чт авг 17, 2017 18:31:43
Чт авг 17, 2017 21:13:21
Пт авг 18, 2017 16:05:01
Пт авг 18, 2017 22:59:05
unsigned char out_1=0, out_2=0, out_3=0, out_4=0, out_5=0, out_6=0;
bit na,nb,nc,nd,ne,nf;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
na=1;
nb=1;
nc=1;
nd=1;
ne=1;
nf=1;
TCNT0=0x00; //обнуляем счетный регистр
out_1=0;
out_2=0;
out_3=0; //обнуляем все выходы!!!
out_4=0;
out_5=0;
out_6=0;
}
// Timer 0 output compare interrupt service routine
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
out_1++;
out_2++;
out_3++;
out_4++;
out_5++;
out_6++;
if (na==1) {
if (out_1>30) { //время включения симистора
PORTC.2=1;
delay_us(30);
PORTC.2=0;
out_1=0;
na=0;
}
};
if (nb==1) {
if (out_2>50) {
PORTC.3=1;
delay_us(30);
PORTC.3=0;
out_2=0;
nb=0;
}
};
if (nc==1) {
if (out_3>150) {
PORTC.4=1;
delay_us(30);
PORTC.4=0;
out_3=0;
nc=0;
}
};
if (nd==1) {
if (out_4>0) {
PORTC.5=1;
delay_us(30);
PORTC.5=0;
out_4=0;
nd=0;
}
};
if (ne==1) {
if (out_5>0) {
PORTC.6=1;
delay_us(30);
PORTC.6=0;
out_5=0;
ne=0;
}
};
if (nf==1) {
if (out_6>0) {
PORTC.7=1;
delay_us(30);
PORTC.7=0;
out_6=0;
nf=0;
}
};
};
void main(void)
{
DDRC=0b11111100;
PORTC=0b00000000;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: faling Edge
// INT1: Off
// INT2: Off
GICR|=(0<<INT1) | (1<<INT0) | (0<<INT2);
MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);
GIFR=(0<<INTF1) | (1<<INTF0) | (0<<INTF2);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 921,600 kHz
// Mode: CTC top=OCR0
// OC0 output: Disconnected
// Timer Period: 0,050998 ms
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (1<<WGM01) | (0<<CS02) | (1<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0=0x2E; //100us
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (1<<OCIE0) | (0<<TOIE0);
#asm("sei") // Global enable interrupts
};
Сб авг 19, 2017 07:55:42
Сб авг 19, 2017 08:55:08
Сб авг 19, 2017 12:25:56
Сб авг 19, 2017 14:57:24
Вс авг 20, 2017 15:39:53
#define F_CPU 16000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#define DimPort PORTC
#define DimDDR DDRC
#define ch0 (1<<0)
#define ch1 (1<<1)
#define ch2 (1<<2)
#define ch3 (1<<3)
#define ch4 (1<<4)
#define ch5 (1<<5)
#define Presc 3 //предделитель таймера на 64
#define us100 (F_CPU/64*0.0001)// значение таймера, до которого досчитает до 100 мкс
#define Tim0Start {TCCR0=Presc | (1<<WGM01);}
#define Tim0Stop {TCCR0=0;}
#define PhaseLimit 90
//******************************************
volatile uint8_t PhaseCh [6]={20,25,30,40,60,255};
volatile uint8_t PhaseCount=0;
//*****************************************
//сработал детектор
ISR (INT0_vect)
{
Tim0Start; //запуск таймера
PhaseCount=0;
}
//----------
//
ISR (TIMER0_COMP_vect)
{
uint8_t BufPort=DimPort;
BufPort&=~(ch5|ch4|ch3|ch2|ch1|ch0);
PhaseCount++;
if (PhaseCount>PhaseLimit) {Tim0Stop;}
else
{
if (PhaseCount==PhaseCh[0]) BufPort|=ch0;
if (PhaseCount==PhaseCh[1]) BufPort|=ch1;
if (PhaseCount==PhaseCh[2]) BufPort|=ch2;
if (PhaseCount==PhaseCh[3]) BufPort|=ch3;
if (PhaseCount==PhaseCh[4]) BufPort|=ch4;
if (PhaseCount==PhaseCh[5]) BufPort|=ch5;
}
DimPort=BufPort;
}
//*****************************************************************
int main(void)
{
//настройка порта для управления симисторами
DimDDR=ch0|ch1|ch2|ch3|ch4|ch5;
//настройка таймера на 100мкс
OCR0=us100;
//TCCR0=1<<WGM01; //стс
TIMSK=1<<OCIE0;
//настройка внешнего прерывания от детектора
MCUCR=(1<<ISC01) | (1<<ISC00);//фронт
GICR=(1<<INT0);
asm("sei");
while(1)
{
}
}
Вс авг 20, 2017 21:57:06
Пн авг 21, 2017 06:15:43
Пн авг 21, 2017 08:49:09
#define us100 (F_CPU/64*0.0001)// значение таймера, до которого досчитает до 100 мкс
#define us100 (F_CPU/64*0.0001-1)// значение таймера, до которого досчитает до 100 мкс
Пн авг 21, 2017 09:21:03
Я эту ошибку у себя потом увидел. Прикинул что при ограничении 91, за период вылезти не должно (конечно еще зависит от детектора). Лень было уже потом телефоном исправлять. Не сомневался, что именно Вы на нее укажете , честно сказать, думал это произойдет раньше, видимо из-за воскресенья произошла задержка .akl писал(а):Таймер отсчитает не 100, а 104мкс.
Пт сен 01, 2017 21:23:28