Цитата(Oleg_IT @ Dec 22 2008, 20:50)

С той простенькой программой при оптимизации меандра на выходе нет, а без оптимизации есть.
А что есть вместо меандра? Точнее плз ;>
У меня с той простенькой программой при оптимизации -Os меандр есть, по крайней мере я вижу что порт переключается...
Насчет Вашей новой программы, с учетом советов предыдущих ораторов, можно написать как-то так:
Код
#include <avr/io.h>
#include <avr/interrupt.h>
typedef unsigned char U8;
typedef unsigned short U16;
typedef unsigned long U32;
typedef volatile unsigned char V8;
typedef volatile unsigned short V16;
typedef volatile unsigned long V32;
#define ConstCntCycleImp 5
#define ConstCntCycleWithoutImp 3
#define CountIn_1_Min 5
#define CountIn_1_Max 10
#define PORT_W PORTA
typedef struct tagDEVICE_CONTEXT
{
U8 Flag;
V8 Start;
U8 CountIn_1;
U8 CountCycleImp;
} TDEVICE_CONTEXT, *PDEVICE_CONTEXT;
TDEVICE_CONTEXT devContext = { 0 };
ISR (TIMER0_COMP_vect)
{
TCNT0 = 0x00;
if (devContext.Flag == 1)
{
PORTA ^= 0x01;
if ((PINA & 0x02) == 0)
devContext.CountIn_1++;
devContext.CountCycleImp++;
if (devContext.CountCycleImp == ConstCntCycleImp)
{
PORTA &=~ 0x01;
devContext.Flag = 0;
devContext.CountCycleImp = 0;
devContext.Start = 1;
return;
}
}
else
{
devContext.CountCycleImp++;
if (devContext.CountCycleImp == ConstCntCycleWithoutImp)
{
devContext.Flag = 1;
devContext.CountCycleImp = 0;
}
}
}
////////////////////// MAIN ///////////////////
int main(void)
{
TCCR0 = (1 << CS00);
TCNT0 = 0x00;
OCR0 = 0x50;
TIMSK |= (1 << OCIE0);
DDRA = 0xFD;
PORTA = 0xFF;
sei();
while (1)
{
if (devContext.Start == 1)
{
devContext.Start = 0;
if (devContext.CountIn_1 < CountIn_1_Min)
PORT_W |= 0x04;
if (devContext.CountIn_1 > CountIn_1_Max)
PORT_W &=~ 0x04;
devContext.CountIn_1 = 0;
}
}
return 0;
}
Я не знаю значений Ваших констант, поэтому поставьте какие должны быть. Работает абсолютно одинаково, с оптимизацией и без нее. Что я поменял:
1. Сгруппировал все переменные в одну структуру (удобнее писать программу, т.к. не нужно помнить все переменные, можно помнить только имя одной структуры остальное сделает Code Completion, и удобнее отлаживать - в watch достаточно написать только имя структуры и видно сразу все переменные).
2. Объявил типы в удобной форме (вместо длинючих "volatile unsigned char", ведь много удобнее и понятнее написать V8).
3. Объявил поле Start как volatile, чтобы компилятор не выбрасывал обращения к этой переменной на свое усмотрение.