Автор: Volker Oth.
Мигает светодиодами, подключенными к порту В под управлением таймера 0.
Текст программы:
#include <io.h>
#include <interrupt.h>
#include <signal.h>
unsigned char led;
SIGNAL(SIG_OVERFLOW0) /* Обработчик прерывания переполнения таймера 0 */
{
outp("led, PORTB); /* Инвертировать выходные линии. 0 — светодиод горит */
led <<= 1; /* К следующему светодиоду */
if (!led) /* Переполнение; начать снова с линии В0 */
led = 1;
outp(0, TCNT0); /* Сбросить таймер, для возможности повторного «прерывания */
}
int main(void) {
{
outp(0xff,DDRB); /* Все выводы порта В работают на вывод */
outp((1<<TOIE0), TIMSK); /* Разрешить прерывание по переполнению таймера 0 */
outp(0, TCNT0); /* Сбросить (обнулить) TCNTO */
outp(5. TCCR0); /* Включить предварительное деление СК/1024 */
led = 1; /* Инициализация начального состояния светодиодов» */
sei(); /* Разрешить прерывания «/
for (;;) {} /* Бесконечный цикл */
Иллюстрация использования внешних прерываний INT0 и INT1 и препроцессора
Автор: Volker Oth.
Текст программы:
#include <io.h>
#include <signal.h>
#include <interrupt.h>
#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; else
led |= 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<<INT0)|(1<<INT1),EIMSK); /* Разрешить внешние прерывания into, inti */
#else
outp((1<<INT0)|(1<<INT1),GIMSK); /* Разрешить внешние прерывания into, inti */
outp((1<<ISC01)|(1<<ISC10)|(1<<ISC11),MCUCR); /* По спаду: int0, no нарастанию: int1 */
#endif
sei(); /* Разрешить прерывания */
for (;;) {} /* Бесконечный цикл */
}
Иллюстрация применения UART
Автор: Volker Oth.
Иллюстрация применения UART. Работает совместно с программой terminal или подобной.
Формат UART: 9600 бод, 8 битов, 1 стоп-бит, без проверки четности.
Текст программы:
#include <io.h>
#include <interrupt.h>
#include <signal.h>
#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); /* Отобразить полученный байт на светодиодах, подключенных к порту В */
}