--- si-utf8.txt 2009-07-03 00:45:34.000000000 +0400 +++ si-utf8-new.txt 2009-07-03 01:12:03.000000000 +0400 @@ -10,7 +10,7 @@ Вообще, классическим считается создание make файла в котором бы были описаны все зависимости. И это, наверное, правильно. Но мне, выросшему на полностью интегрированных IDE вроде uVision или AVR Studio этот подход является глубоко чуждым. Поэтому буду делать по своему, все средствами студии. Тыкай в кнопку с шестеренкой. -Это настройки твоего проекта, а точнее настройки автоматической генерации make файла. На первой странице надо всего лишь вписать частоту на которой будет работать твой МК. Это зависит от фьюз битов, так что считаем что частота у нас 80000000Гц. +Это настройки твоего проекта, а точнее настройки автоматической генерации make файла. На первой странице надо всего лишь вписать частоту на которой будет работать твой МК. Это зависит от фьюз битов, так что считаем что частота у нас 8000000Гц. Следующим шагом будет настройка путей. Первым делом добавь туда директорию твоего проекта -- будешь туда подкладывать сторонние библиотеки. Make файл сгенерирован, его ты можешь поглядеть в папке default в своем проекте, просто пробегись глазами, посмотри что там есть. @@ -43,7 +43,7 @@ int main(void) { -return 0; + return 0; } Все, первая простейшая программа написана, не беда что она ничего не делает. Разберем что же мы сделали. @@ -53,9 +53,9 @@ int main(void) { -unsigned char i; + unsigned char i; -return 0; + return 0; } unsigned значит беззнаковый. Дело в том, что в двоичном представлении у нас старший бит отводится под знак, а значит в один байт (char) влазит число не более +/-127, но если знак отбросить то влезет уже от 0 до 255. Обычно знак не нужен. Так что unsigned. i - это всего лишь имя переменной. Не более того. @@ -64,21 +64,24 @@ Делаем так: +#include + +#define BAUDRATE 9600L +#define BAUDDIVIDER (F_CPU/(16 * BAUDRATE) - 1) +#define HI(x) ((x) >> 8) +#define LO(x) ((x) & 0xFF) + int main(void) { -unsigned char i; + unsigned char i; -#define XTAL 8000000L -#define baudrate 9600L -#define bauddivider (XTAL/(16*baudrate)-1) -#define HI(x) ((x)>>8) -#define LO(x) ((x)& 0xFF) - -UBRRL = LO(bauddivider); -UBRRH = HI(bauddivider); -UCSRA = 0; -UCSRB = 1<" это посереьзней. Компилятор говорит нам, что переменная препроцессора F_CPU не определена. Длительность задержки зависит от частоты процессора, а частоту то мы не указали. Не вопрос, добавляй куда нибудь в начало, но обязательно ПЕРЕД #include , иначе тебе еще три варнига будет - компилятор читает программу сверху вниз, а именно в delay.h ему потребовалась эта переменная. У меня вот так: -#define F_CPU 8000000L +// неправильное решение!!! должно быть определено в мейке для gcc ключь -DF_CPU=8000000UL, +// создаваемые студией мейки емнип прописывают. #include #include @@ -283,13 +290,14 @@ Отрывай от нее все причиндалы, они нужны только на этапе описания, и вставляй в код, не забыв указать задержку. Вот так вот: while(1) - { - i++; - LED_PORT=0< Оформляется прерывание в WinAVR как + ISR(вектор прерывания) { } @@ -352,76 +361,90 @@ Для определения байта можно применить конструкцию Switch-case В итоге, получилась такая вещь: + ISR(USART_RXC_vect) { -switch(UDR) + switch(UDR) { - case '1': LED_PORT = 1< +#include + +// повторять не буду +#define BAUDRATE 9600L +#define BAUDDIVIDER (F_CPU/(16 * BAUDRATE) - 1) +#define HI(x) ((x) >> 8) +#define LO(x) ((x) & 0xFF) + #define LED1 0 #define LED2 1 #define LED_PORT PORTB #define LED_DDR DDRB - -#include -#include - ISR(USART_RXC_vect) { -switch(UDR) + switch(UDR) { - case '1': LED_PORT = 1<>8) -#define LO(x) ((x)& 0xFF) - -UBRRL = LO(bauddivider); -UBRRH = HI(bauddivider); -UCSRA = 0; -UCSRB = 1<