ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
phreaking<br />
ЕСЛИ НАУЧИШЬСЯ РИСОВАТЬ СИМВОЛЫ, СМОЖЕШЬ ДЕЛАТЬ ЗАБАВНЫЕ АНИМАЦИИ. ЭТО — ПАКМЕН<br />
ВЫВОДИМ, ЧТО ИГРАЕТ В ВИНАМПЕ<br />
с АВРками. Мы используем прерывания, поэтому подключаем и<br />
«interrupt.h».<br />
Хедер «hd44780.h» нужен для работы с дисплеем. В нем описаны<br />
прототипы функций обмена данными с контроллером HD44780.<br />
Рекомендую изучить их самостоятельно; посмотри также файл<br />
«hd44780.c», в котором описаны сами функции. Это и есть готовый<br />
модуль, о котором я писал выше. В статье нет места, чтобы<br />
рассказывать, как он работает, но на диске ты его найдешь.<br />
Открой даташит по дисплею, сравни с функциями и пойми, как<br />
они устроены.<br />
Определим глобальные переменные:<br />
Определяем глобальные переменные<br />
volatile char buf[200]; // Áóôåð<br />
volatile int bufsize = 0; // Äëèíà ñòðîêè<br />
volatile char ready = 0; // Ïîëó÷åíà ëè ñòðîêà?<br />
Массив «buf» — это буфер, куда складываем получаемую строку;<br />
«bufsize» — длина строки (увеличиваем эту переменную с каждым полученным<br />
байтом). А «ready» — это просто флаг, который будет указывать,<br />
получена ли строка полностью.<br />
Но я не просто так выбрал именно этот пример! Тут есть один<br />
хитрый момент. Обрати внимание на директиву «volatile».<br />
Сейчас я тебе расскажу про очень популярную ошибку среди<br />
новичков, чтобы ты ее не повторял. Дело в том, что у компилятора<br />
Си очень хитрый оптимизатор, но им надо уметь пользоваться.<br />
Если в коде встречается условие, которое ну никак не<br />
выполнится, по мнению компилятора, то оптимизатор легко<br />
может вырезать его из программы. Такое условие, например,<br />
— изменение переменной, которая не меняется в коде программы.<br />
Но ведь эта глобальная переменная может изменяться по<br />
прерыванию! Вот директива «volatile» и указывает именно на<br />
то, что переменная может непроизвольно изменяться внешними<br />
силами. Далее я покажу пример именно такого кода. Опишем<br />
функцию-прерывание.<br />
XÀÊÅÐ 07 /127/ 09<br />
WINAVR ОТЛИЧНО РАБОТАЕТ В СОЧЕТАНИИ С AVR<br />
STUDIO<br />
Обработчик прерывания<br />
ISR(USART_RXC_vect)<br />
{<br />
int b;<br />
b = UDR; // Ïîëó÷àåì ýòè äàííûå<br />
if (((b == 13) || (b == 10))<br />
&& (bufsize > 0)) ready = 1;<br />
if ((b != 13) && (b != 10)<br />
&& (bufsize < sizeof(buf)-1))<br />
buf[bufsize++] = b;<br />
}<br />
Здесь ты уже должен все понимать. Получаем один байт данных. Если<br />
это не символ завершения строки, то заносим его в массив и увеличиваем<br />
счетчик длины строки; иначе пишем в переменную «ready» единицу,<br />
107