winex писал(а):
PD3 и PD1 это константы библиотечные или пользовательские?
Они объявлены в avr\io.h , который - часть библиотеки avr-libc, в свою очередь которая входит в WinAVR. То есть это - стандартные библиотечные константы.
winex писал(а):
эквивалентно ли это?
Эквивалентно.
Только в случае регистров ввода-вывода лучше всё равно использовать имена битов: во-первых так легче понять что именно делают указаные биты, а во-вторых в других микроконтроллерах положения битов в регистрах может поменяться(хотя такое бывает редко), и в случае если биты указаны не по именам, то придётся исправлять их вручную.
Хотя в случае портов ввода-вывода можно писать и (1<<3), так как там и так понятно, что это - третий пин в порту. А вот в регистрах например USART лучше использовать имена регистров(кроме регистра скорости, где все 8 бит - одно число, а не набор флагов).
Twilo писал(а):не совсем эквивалентно. константы библиотечные. это эквивалентно (1<<0b00000100) | (1<<0b00000001)
А вот (1<<0b00000100) и (1<<3) - неэквивалентно, потому что 0b00000100 - это 4 в двоичной записи(а (1<<4) уж ни как не равно (1<<3) ). А вот (1<<0b00000001) - эквивалентно (1<<1) (0b00000001 = 1).
winex писал(а):Во-вторых если в WinAVR(он же AVR GCC и компилятор в AVR Studio) включаешь прерывания, то нужно задать обработчик прерываний по умолчанию:
Я почитал про прерывания, как понял они срабытывают по какому-то событию. А какое у меня тут событие, кроме прекращение передачи в УСАПП.
BADISR_vect - это обработчик для всех прерываний для которых не указан свой обработчик. А EMPTY_INTERRUPT обозначет, что обработчик пуст.
Это эквивалентно
Такой обработчик нужен на случай, если какие-то прерывания окажутся включенными, а обработчиков для них не будет. В WinAVR в случае, если для прерывания нет обработчика, при его срабатывании произойдёт сброс контроллера(точнее код начнёт выполняться с нулевого адреса, а вот регистры ввода-вывода не сбросятся).
winex писал(а):Подскажите, пожалуйста, как в AVR Studio эмулировать прерывания.
Если имеется в виду симулятор в AVR Studio, то в нём прерывание сработает при наступлении соответствующего события. Только в AVR Studio эмулируется далеко не вся переферия, так что что-нибудь вполне может не работать. Лучше проверять на реальном контроллере.
winex писал(а):#pragma interrupt_handler USART1_TX_interrupt:33
void USART1_TX_interrupt(void)
Во-первых в WinAVR (и соответсвенно в AVR Studio) прерывания описываются по другому:
Код: Выделить всё
ISR(USART_TXC_VECT)
{
//обработчик прерывания
}
И если посмотришь warning'и то там скорее всего есть сообщение, что директива #pragma interrupt_handler проигнорирована.
И вообще этот код компилится?
Вообще советую сначала заставить мигать светодиод(и убедиться в том что он действительно мигает), а уже потом браться за UART.