Ребята, где то накосячил с флагами. Подскажите кто знает? Программа простая, только выводами дёргать. В ИАРе 4,12 в симуляторе нормально работает, регистр Р-15 меняется на 0 и 1. Прерывание нормально идет, сначала одна половина, потом другая. В Протеусе не идёт и на железе не идёт, точнее идёт с одного вывода, а хотелось бы по-очереди.
Если просто под "переключатель" отдельно переменную выделить, то идёт. Но хотелось бы один бит пользовать для этой цели.
Код
#include<io2313.h>
#include<avr_macros.h>
#include<iomacro.h>
#include<intrinsics.h>
unsigned int pol;
unsigned char sampl, interval;
__regvar __no_init char flags @15;
#define set_polar flags|=(1<<0)
#define clr_polar flags&=~(1<<0)
void pausa (unsigned long int p)
{
while (p>0)
p--;
}
#pragma vector=TIMER1_COMP1_vect
__interrupt void MyInterrupt (void)
{
if(flags & (1 << 0))
{
PORTD_Bit2=0;
pausa(0x10);
PORTD_Bit0=0;pausa(pol);PORTD_Bit0=1;
pausa(0x15);
PORTD_Bit2;
pausa(interval);
PORTD_Bit3=0;pausa(sampl);PORTD_Bit3=1;
clr_polar;
}
else
{
PORTD_Bit2=0;pausa(0x10);
PORTD_Bit1=0;pausa(pol);PORTD_Bit1=1;
pausa(0x15);
PORTD_Bit2=1;
pausa(interval);
PORTD_Bit4=0;pausa(sampl);PORTD_Bit4=1;
set_polar;
}
return;
}
int main( void )
{
PORTD=0xFF;
DDRD=0xFF;
OCR1=0x6420;
TIMSK=0x40;
TCCR1B=0x09;
__enable_interrupt();
while(1)
{
}
}
Сообщение отредактировал Коляй - Nov 17 2006, 18:54