#include
#include
#include
#ifdef AVR_ATmega103
#define AVR_MEGA 1
#else
#ifdef AVR_ATmega603
#define AVR_MEGA 2
#else
#ifdef AVR_ATmega161
#define AVRMEGA 3
#else
#define AVR_MEGA 0
#endif
#endif
#endif
typedef unsigned char u08;
SIGNAL(SIG_INTERRUPTO)
/* Обработчик внешнего прерывания into */{
register u08 led = mp(PORTB);
if (led & 1)
led &= ~
0x0f; elseled |= 0x0f;
out(led, PORTB);
/* Зажечь светодиоды */}
SIGNAL(SIG_INTERRUPT1)
/* Обработчик внешнего прерывания int1 */{
register u08 led = inp(PORTB);
if (led & 0x80)
led &= ~
0xf0;else
led |= 0xf0;
outp(led, PORTB);
/* Зажечь светодиоды */}
int main(void)
{
outp(0xff, DDRB);
/* Все линии порта В на вывод (светодиоды) */outp(0x00, DDRD); /
* Все линии порта D на ввод (кнопки) */#if AVR_MEGA
outp((1<
#else
outp((1<
outp((1<
#endif
sei();
/* Разрешить прерывания */for (;;) {}
/* Бесконечный цикл */}
Автор:
Иллюстрация применения UART. Работает совместно с программой terminal или подобной.
Формат UART: 9600 бод, 8 битов, 1 стоп-бит, без проверки четности.
Текст программы:
#include
#include
#include
#define F_CPU 4000000
/* 4 МГц */#define UART_BAUD_RATE 9600
/* 9600 бод */#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*161)-1)
typedef unsigned char u08;
typedef char s08;
typedef unsigned short u16;
typedef short s16;
static volatile u08 *uart_data_ptr;
static volatile u08 uart_counter;
SIGNAL(SIG_UART_TRANS)
/* Обработчик прерывания UART txd готов */{
uart_data_ptr++;
if (--uart_counter)
outp(*uart_data_ptr, UDR);
/* Записать байт в буфер данных */}
SIGNAL(SIG_UART_RECV)
/* Обработчик прерывания "прием завершен" */{
register char led;
led = inp(UDR);
/* Прочитать байт из буфера данных UART */outp(~
led, PORTB); /* Отобразить полученный байт на светодиодах, подключенных к порту В */}
void uart_send(u08 *buf, u08
{
if (!uart_counter)
{ «Записать первый байт в буфер данных */uart_data_ptr = buf;
uart_counter = size;
outp(*buf, UDR);
}
}
void uart_init(void)
/* Инициализировать UART */{ /* разрешить прерывания RxD/TxD */
outp((1<
/* установить скорость */
outp((uD8)UART_BAUD_SELECT, UBRR);
}
int main(void)
}
outp(0xff,DDRB);
/* Все линии порта В на вывод */outp(0x00, PORTB);
/* Зажечь светодиоды */uart_init();
sei();
/* Разрешить прерывания */for (;;)
{ /* Бесконечный цикл */uart_send("Serlal Data from AVR received###", 32);
}
}
Автор:
Читает и записывает EEPROM. При возникновении прерывания UART «передача завершена», содержимое EEPROM пересылается на компьютер. После получения байта от компьютера прерывание «прием завершен» отображает полученный байт на светодиодах и сохраняет его в EEPROM. Формат UART: 9600 бод, 8 битов, 1 стоп-бит, без проверки четности.