Вт мар 02, 2021 14:49:32
Сб мар 06, 2021 17:32:26
Вт мар 09, 2021 07:47:53
Пт апр 09, 2021 04:42:17
Ср апр 21, 2021 23:33:31
Пт апр 22, 2022 14:20:50
#include <avr/io.h>
#include <avr/interrupt.h>
//----------
// Управление портом B
//----------
#ifdef PORTB
#define PORTB_OUT_ALL() (DDRB = 0xFF);
#define PORTB_IN_ALL() (DDRB = 0x00);
// Настройка порта B на выход по пинам
#define PORTB_OUT(x) (DDRB |= (1 << x))
// Настройка порта B на вход по пинам
#define PORTB_IN(x) (DDRB &= ~(1 << x))
// Вывод в порт B по пинам 1
#define PORTB_ON(x) (PORTB |= (1 << x))
// Вывод в порт B по пинам 0
#define PORTB_OFF(x) (PORTB &= ~(1 << x))
// Чтение из порта B по пинам
#define PORTB_RD(x) (PINB & (1 << x))
// Инвертирование битов порта B
#define PORTB_XOR(x) (PORTB ^= (1 << x))
// Вывод значения в порт
#define PORTB_DATA_OUT(b) PORTB = b
// Чтение из порта
#define PORTB_DATA_IN() PINB
//----------
#define EN1 1
#define EN2 2
#define IN 3
#define RVRS 0
#endif
char i = 1;
uint16_t steps = 0;
char flag_STOP = 1;
char flag_RVRS = 0;
ISR(TIMER2_COMP_vect)
{
PORTB ^= (1 << EN1)|(1 << EN2);
if(!i) {PORTB_XOR(IN); i = 2;} else;
i--;
steps--;
OCR2 = 0x25;
}
ISR(INT0_vect)
{
}
void setup(void)
{
asm("wdr");
MCUCSR &= ~(1<<WDRF); /* Clear WDRF in MCUSR */
WDTCR |= (1<<WDCE) | (1<<WDE); /* Write logical one to WDCE and WDE */
/* Keep old prescaler setting to prevent unintentional time-out */
WDTCR = 0x00; /* Turn off WDT */
//----------
PORTB_IN(RVRS);
PORTB_ON(RVRS);
PORTB_OUT(EN1); //PB1, PB2 out
PORTB_OUT(EN2);
PORTB_OUT(IN);
PORTB_OFF(EN1);
PORTB_OFF(EN2);
PORTB_OFF(IN);
//--------Timer2-------------------
TCCR2 = 0; // set entire TCCR2A register to 0
TCNT2 = 0x00; // initialize counter value to 0xFF
// 256 presc. toggle OC2 PWM Pfase Correct
TIMSK |= (1 << OCIE2);
OCR2 = 0x25; // 500Hz 0x25 для тактов
sei();
}
int main(void)
{
setup();
while(flag_STOP)
{
if(PORTB_RD(0))
{
PORTB_ON(EN1); PORTB_OFF(EN2); PORTB_ON(IN); flag_RVRS = 1; TCCR2 |=(1 << WGM21)|(1 << CS22)|(1<< CS21)|(1<< CS20); steps = 477;
} else
{
PORTB_ON(EN2); PORTB_OFF(EN1); PORTB_OFF(IN); flag_RVRS = 0; TCCR2 |=(1 << WGM21)|(1 << CS22)|(1<< CS21)|(1<< CS20); steps = 477;
}
while (steps){};
PORTB &= ~(1 << EN1)|(1 << EN2);
TCCR2 = 0;
flag_STOP = 0;
}
}