Доброго времени суток
Пишу в связке CodeVisionAVR + Proteus 7 программу для вентильного двигателя (он же BLDC). С датчиками Холла, с прерываниями, с даташитом avr492.
В качестве контроллера выбрал Atmega8.
Суть проблемы:Никак не получается приручить switch (да и порты, судя по всему). Если раскомментировать присваивание PORTD=PINC (и закомментировать switch), то привод вращается. Не так, как хотелось бы, но вращается.
А через свитч - не получается. Привод стоит. Хотелось бы выяснить, в чем проблема и что я сделал не так.
Код:
Спойлер
Код:
#include <mega8.h>
#define UH PORTD.0
#define UL PORTD.1
#define VL PORTD.2
#define WL PORTD.3
#define VH PORTD.4
#define WH PORTD.5
#define START PINB.2
#define STOP PINB.0
#define REVERS PINB.1
#define HALL1 PINC.0
#define HALL2 PINC.1
#define HALL3 PINC.2
//unsigned char tmp=0;
// char flag=1;
void port_init()
{
//PORTD=0x01;
DDRD=0b11111111;
DDRC=0;
PORTC=0xFF;
DDRB=0;
PORTB=0xFF;
}
void timer_init()
{
TCCR2=0x01;
TIMSK=0x40;
TCNT2=0x30;
}
void pwm_init()
{ OCR2=0x00;
// TCCR2=(1<<COM21)|(1<<WGM20)|(1<<WGM21)|(1<<CS20);
};
interrupt [TIM2_OVF] void overflow_timer2 (void)
{
char tmp;
tmp = PINC;
//PORTD = PINC;
switch (tmp)
{
case 0b00000101: PORTD=0b00000101; break;
case 0b00000001: PORTD=0b00001001; break;
case 0b00000011: PORTD=0b00011000; break;
case 0b00000010: PORTD=0b00010010; break;
case 0b00000110: PORTD=0b00100010; break;
case 0b00000100: PORTD=0b00100001; break;
}
#asm("sei")
}
void main()
{
port_init();
timer_init();
pwm_init();
#asm("sei")
while (1)
{};
}
Сам проект+схема в протеусе: