В контроллерах он сделан на основе логических вентилей и RC-цепей. Изменение частоты производится путем изменения порога переключения вентилей.
Примерно так.
принцип понял.КРАМ писал(а):В контроллерах он сделан на основе логических вентилей и RC-цепей. Изменение частоты производится путем изменения порога переключения вентилей.
Код: Выделить всё
inline void IDLE()
{
MCUCR|=1<<5;
__sleep();
}Видимо, не сбрасывается.If an enabled interrupt occurs while the MCU is in a sleep mode, the MCU wakes up. The MCU is then halted for four cycles in addition to the start-up time, it executes the interrupt routine, and resumes execution from the instruction following SLEEP. The contents of the Register File and SRAM are unaltered when the device wakes up from sleep.
Код: Выделить всё
CLT
SEI
WAIT:
SLEEP
BRTC WAIT
CLI
CLT
, то если вдруг проц сглючит и он каким-то образом выполнит в прерывании команду sleep (нолик там на единичку в коде команды или счетчике команд поменялся), то будет плохо. Или сторожевой таймер спасет? Правда проц за это время может дров наломать...Alexeyslav писал(а):В прерывании использовать режим сна опасно - ведь из сна контроллер выходит по прерыванию, а из следующего он еще не вышел... прерывания-то запрещены
Ну это же не совсем настройка режима. Ведь в принципе, этот бит "лишний" - можно было бы сделать так, что "не хочешь юзать сон - не пиши команду sleep", но его ввели для надежности. Или я что-то не понял?akl писал(а):Никогда, без необходимости, не сбрасываю установленный режим работы.
Код: Выделить всё
outi UBRR0L, low(XTAL/(8*BAUDRATE)-1)
outi UBRR0H, high(XTAL/(8*BAUDRATE)-1)
outi UCSR0A, (1<<U2X0)
outi UCSR0B, (1<<TXEN0)
outi UCSR0C, (1<<UCSZ01)|(1<<UCSZ00)Код: Выделить всё
outi UBRRL, low(XTAL/(8*BAUDRATE)-1)
outi UBRRH, high(XTAL/(8*BAUDRATE)-1)
outi UCSRA, (1<<U2X)
outi UCSRB, (1<<RXCIE)|(1<<RXEN)
outi UCSRC, (1<<UCSZ1)|(1<<UCSZ0)Код: Выделить всё
.equ XTAL = 1000000
.equ BAUDRATE = 9600