Выбрать главу

Автор: 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); /* Отобразить полученный байт на светодиодах, подключенных к порту В */

}