Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Помогите составить прогу...

Страниц (1): [1]
 

1. Doctor X - 12 Февраля, 2009 - 19:21:44 - перейти к сообщению
Итак, программа следующая:
кнопка подключена к порту pc5 (ножка 28)
После её нажатия включается таймер на 5 минут, в это время на ножке PD0 (2) импульсы 80 Гц, Тимп.- 150 мкс,
на ножке PD1 (3) 5 Гц, Импульсы- меандр,
на ножке PD2 (4) 5Гц, Импульсы- меандр,
на ножке PD3 (5) - просто высокий уровень.

По истечении пяти минут подаётся высокий уровень на ногу PD7 (13) на 2 секунды, и схема выключается.
Если нажать кнопку во время выполнения программы, схема выключится тоже.
После выключения повторное нажатие на кнопку вновь запускает программу.

Контроллер ATMEGA8, частота кварца 8 МГц.

Заранее благодарю за все умные мысли.
2. VCOM - 13 Февраля, 2009 - 09:06:37 - перейти к сообщению
Вот примерно так:

CODE:

#include <iom8.h>
#include <inavr.h>

#define SETBIT(ADDR,BIT) (ADDR |=(1<<BIT))
#define CLRBIT(ADDR,BIT) (ADDR &=~(1<<BIT))
#define CHECKBIT(ADDR, BIT) (ADDR & (1<<BIT))
#define TOGGLEBIT(ADDR, BIT) (ADDR ^= (1 << BIT))
#define Xtal 8000000

unsigned char ok_gen;
unsigned int count1,count2;

#pragma vector=TIMER1_COMPA_vect
__interrupt void timer1_compa_isr(void)
{
if(ok_gen==1)
{
count1++;
count2++;
if(count1==2000)
{
SETBIT(PORTD,1);
SETBIT(PORTD,2);
}
if(count1==4000)
{
CLRBIT(PORTD,1);
CLRBIT(PORTD,2);
count1=0;
}
if(count2<3)
{
SETBIT(PORTD,0)
}
else
{
CLRBIT(PORTD,0)
}
if(count2==250){count2=0;}
}
}

void main(void)
{
asm("cli");
DDRC=0xDF;
PORTC=0x20;
DDRD=0xFF;
PORTD=0x00;

TCCR1A=0x00;
TCCR1B=0x01;
OCR1A=0x018F;
TIMSK=0x10; //Прерывания по 50 мкс

asm("sei");

for(;;)
{
if(CHECKBIT(PINC,5)
{
if(ok_gen==1)
{
CLRBIT(PORTD,3);
ok_gen=0;
}
else
{
SETBIT(PORTD,3);
ok_gen=1;
}
}
__delay_cycles(0.5*Xtal);
}
}
3. Doctor X - 13 Февраля, 2009 - 17:28:54 - перейти к сообщению
Огромное спасибо.