CODE:
Chip type : ATtiny2313
Clock frequency : 4,000000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*****************************************************/
#include <tiny2313.h>
#include <delay.h>
unsigned char Direct=0;//Направление счета 0=вниз 0xFF=вверх
unsigned char cnt;
unsigned char Step=0;
//****************************************
//Здесь будут обработчики прерываний
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//Если не пройдены все шаги (Step>0)
if (Step)
{
cnt++;
//Каждый 20-й заход в прерывание
if (cnt==19)
{
cnt=0;
Step--;//Уменьшаем количество оставшихся шагов
if (Direct)
{
//Если вверх, то OCR0A надо увеличивать
OCR0A=0xFE-Step; //254-0
}
else
{
//Если вниз, то OCR0A надо уменьшать
if (!Step)
{
OCR0A=0xFF; //=255
}
else
{
OCR0A=Step;
}
}
}
}
}
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
// Place your code here
}
interrupt[EXT_INT0] void ext_int0_isr(void)
{
//прерывание возникает когда кнопка нажимается
Direct=~Direct;//Сменить направление счета
if (Direct)
{
Step=0xFE-OCR0A; //254-0
}
else
{
Step=OCR0A;
}
}
void Port_Init(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0b00000000;
DDRB=0b11111111;
PORTD=0b1111111;
DDRD=0b0000000;
}
void Timer0_Init(void)
{
/* биты регистра:
COM0A1 COM0A0 COM0B1 COM0B0 Reserved Reserved WGM01 WGM00 */
TCCR0A=0x83;
/* биты регистра:
FOC0A FOC0B Reserved Reserved WGM02 CS02 CS01 CS00 */
TCCR0B=0b00000001;
TCNT0=0x10;
OCR0A=0b11111111;
OCR0B=0b00000000;
/* биты регистра:
TOIE1 OCIE1A OCIE1B Reserved ICIE1 OCIE0B TOIE0 OCIE0A */
TIMSK=0x03;
}
/*{void Timer1_Init(void)
{
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
}/**/
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
Timer0_Init();
Port_Init();
GIMSK=0x40;
MCUCR=0x02;
#asm("SEI");
while (1)
{
#asm("wdr"); //Сброс сторожевого таймера
//----------------- ЭФФЕКТ : МИГАНИЕ ТРИЖДЫ В СЕКУНДУ - ЛЕВАЯ ФАРА, ПАУЗА, ПРАВАЯ ФАРА
if ((PIND.0==0)&(PIND.3==0))
{
PORTB.0=0; // off
delay_ms(300); // Задержка
PORTB.0=1; // on
delay_ms(300); // Задержка
PORTB.0=0; // off
delay_ms(300); // Задержка
PORTB.0=1; // on
delay_ms(300); // Задержка
PORTB.0=0; // off
delay_ms(300); // Задержка
PORTB.0=1; // on
delay_ms(300); // Задержка
PORTB.0=0; // off
delay_ms(700); // Задержка
PORTB.1=0; // off
delay_ms(300); // Задержка
PORTB.1=1; // on
delay_ms(300); // Задержка
PORTB.1=0; // off
delay_ms(300); // Задержка
PORTB.1=1; // on
delay_ms(300); // Задержка
PORTB.1=0; // off
delay_ms(300); // Задержка
PORTB.1=1; // on
delay_ms(300); // Задержка
PORTB.1=0; // off
delay_ms(700); // Задержка
}
};
}
Clock frequency : 4,000000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*****************************************************/
#include <tiny2313.h>
#include <delay.h>
unsigned char Direct=0;//Направление счета 0=вниз 0xFF=вверх
unsigned char cnt;
unsigned char Step=0;
//****************************************
//Здесь будут обработчики прерываний
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//Если не пройдены все шаги (Step>0)
if (Step)
{
cnt++;
//Каждый 20-й заход в прерывание
if (cnt==19)
{
cnt=0;
Step--;//Уменьшаем количество оставшихся шагов
if (Direct)
{
//Если вверх, то OCR0A надо увеличивать
OCR0A=0xFE-Step; //254-0
}
else
{
//Если вниз, то OCR0A надо уменьшать
if (!Step)
{
OCR0A=0xFF; //=255
}
else
{
OCR0A=Step;
}
}
}
}
}
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
// Place your code here
}
interrupt[EXT_INT0] void ext_int0_isr(void)
{
//прерывание возникает когда кнопка нажимается
Direct=~Direct;//Сменить направление счета
if (Direct)
{
Step=0xFE-OCR0A; //254-0
}
else
{
Step=OCR0A;
}
}
void Port_Init(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0b00000000;
DDRB=0b11111111;
PORTD=0b1111111;
DDRD=0b0000000;
}
void Timer0_Init(void)
{
/* биты регистра:
COM0A1 COM0A0 COM0B1 COM0B0 Reserved Reserved WGM01 WGM00 */
TCCR0A=0x83;
/* биты регистра:
FOC0A FOC0B Reserved Reserved WGM02 CS02 CS01 CS00 */
TCCR0B=0b00000001;
TCNT0=0x10;
OCR0A=0b11111111;
OCR0B=0b00000000;
/* биты регистра:
TOIE1 OCIE1A OCIE1B Reserved ICIE1 OCIE0B TOIE0 OCIE0A */
TIMSK=0x03;
}
/*{void Timer1_Init(void)
{
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
}/**/
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
Timer0_Init();
Port_Init();
GIMSK=0x40;
MCUCR=0x02;
#asm("SEI");
while (1)
{
#asm("wdr"); //Сброс сторожевого таймера
//----------------- ЭФФЕКТ : МИГАНИЕ ТРИЖДЫ В СЕКУНДУ - ЛЕВАЯ ФАРА, ПАУЗА, ПРАВАЯ ФАРА
if ((PIND.0==0)&(PIND.3==0))
{
PORTB.0=0; // off
delay_ms(300); // Задержка
PORTB.0=1; // on
delay_ms(300); // Задержка
PORTB.0=0; // off
delay_ms(300); // Задержка
PORTB.0=1; // on
delay_ms(300); // Задержка
PORTB.0=0; // off
delay_ms(300); // Задержка
PORTB.0=1; // on
delay_ms(300); // Задержка
PORTB.0=0; // off
delay_ms(700); // Задержка
PORTB.1=0; // off
delay_ms(300); // Задержка
PORTB.1=1; // on
delay_ms(300); // Задержка
PORTB.1=0; // off
delay_ms(300); // Задержка
PORTB.1=1; // on
delay_ms(300); // Задержка
PORTB.1=0; // off
delay_ms(300); // Задержка
PORTB.1=1; // on
delay_ms(300); // Задержка
PORTB.1=0; // off
delay_ms(700); // Задержка
}
};
}