// Микроконтроллер: A190S2313
#include
#include «macros.h>
// Инициализация портов ввода/вывода
void init_ports(void)
{
DDRB = 0xFF; // Порт В работает на вывод
PORTB = 0xFF;
DDRD = 0x00; // Порт D работает на ввод
PORTD = 0x00;
}
// Временная задержка
void delay()
{
unsigned char a, b;
for (a = 1; a; a++)
for (b = 1; b; b++):
}
void main(void)
{
init_ports(); // Инициализация портов
PORTB = 0xff; // Погасили все светодиоды
delay();
PORTB = 0x00; // Зажгли все светодиоды
delay();
}
4.4. Компилятор языка С AVR GCC
Этот компилятор принципиально отличается от описанных выше тем, что он бесплатно распространяется, но при этом не имеет вообще никаких ограничений. Дело в том, что первоначальный вариант компилятора существовал (и существует) для операционной системы Линукс, практически, это — тот же компилятор, адаптированный для работы в среде Windows. По этой причине им несколько непривычно пользоваться, но он имеет достаточно неплохие характеристики.
Нижеприведенные программы идут в комплекте с свободно распространяемым компилятором AYR GCC.
Автор:
Мигает светодиодами на плате STK200.
Текст программы:
#include
typedef unsigned char u08;
int main(void)
{
u08 led, i, j, k;
outp(0xff.DDRB); /* Все выводы порта В работают на вывод
led = 1; /* Инициализировать начальное состояние */
for (;;) {
outp("led, PORTB); /* Инвертировать выход. 0 — светодиод включен */
led <<= 1; /* К следующему светодиоду */
if (!led) /* Переполнение: снова начать с линии В0 */
led = 1;
for (i=0; i<255; i++) /* Цикл формирования временной задержки */
for(j=0; j<255;j++) /* Вложенный цикл формирования временной задержки */
k++; /* Произвольное действие чтобы чем-то "занять" микроконтроллер */
}
}
Автор:
Мигает светодиодами, подключенными к порту В под управлением таймера 0.
Текст программы:
#include
#include
#include
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<
outp(0, TCNT0); /* Сбросить (обнулить) TCNTO */
outp(5. TCCR0); /* Включить предварительное деление СК/1024 */
led = 1; /* Инициализация начального состояния светодиодов» */
sei(); /* Разрешить прерывания «/
for (;;) {} /* Бесконечный цикл */
Автор:
Текст программы: