Есть микроконтроллер ATtiny13A PU. Знаю, что по умолчанию он работает на частоте 1.2 МГц. Поэтому поменял бит CKDIV8 (4 бит) в младшем фьюз-байте на 1. Через avrdude и программатор usbasp прошил. Сейчас такие биты:
Low Fuse: 0b01111010
High Fuse: 0b11111111
Далее, пишу код на MPLAB X IDE. На всякий случай объявил:
Код: Выделить всё
#define F_CPU 9600000UL
Код: Выделить всё
int main(void)
{
cli();
DDRB|=_BV(PB0);
outputHigh();
TCNT0=0;
TCCR0A=0x02;
TCCR0B=0x01;
OCR0A=0x01;
TIMSK0|=1<<OCIE0A;
sei();
while(1)
{
}
}
И функция обработки прерывания:
Код: Выделить всё
ISR(TIM0_COMPA_vect)
{
if(isHigh==1)
{
isHigh=0;
outputLow();
}
else
{
isHigh=1;
outputHigh();
}
}
Код: Выделить всё
typedef unsigned int bool;
bool isHigh=1;
inline void outputHigh(void)
{
PORTB|=_BV(PB0);
}
inline void outputLow(void)
{
PORTB&=~_BV(PB0);
}
В результате, осциллограф показывает не то что я ожидал. Осциллограф показывает чередование каждые, примерно, 4 микросекунды. При этом, как-то, изображение сигнала на левой половине экрана то показывается, то пропадает. А изредка и вообще показывает какой-то другой сигнал (низкий уровень по длинной прямой и где-то может что-то поднялось на короткий промежуток времени).
Конечно, может быть дело в самом осциллографе. Но в нём есть встроенный генератор, где я выставил его на сигналы прямоугольной формы с частотой 9.6 МГц и подключил щуп. Он всё это улавливал. Да, там форма сигнала вызывала вопросы (далеко не прямоугольной формы он их отображал), но в остальном всё работало и временные интервалы меня более чем устраивали. И весь экран был забит сигналом (а не только правая часть). И он был устойчив, ничего не пропадало.
Ну и стоит ещё сказать, что питаю я микроконтроллер от 5 вольт. В начале я пробовал не трогать ножку сброса. Но так же и пробовал подключать её к плюсу питания через резистор на 1 кОм. Разницы никакой. С другой стороны, какая может быть разница, если микроконтроллер должен сбрасываться от сигнала низкого уровня на этой ножке.
В общем, вопрос вот в чём, может у меня что-то в коде не так?


